mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-01-11 07:22:58 +00:00
131 lines
3.9 KiB
Rust
131 lines
3.9 KiB
Rust
// These tests require the thread-local scoped dispatcher, which only works when
|
|
// we have a standard library. The behaviour being tested should be the same
|
|
// with the standard lib disabled.
|
|
//
|
|
// The alternative would be for each of these tests to be defined in a separate
|
|
// file, which is :(
|
|
#![cfg(feature = "std")]
|
|
use tracing::{
|
|
field::display,
|
|
span::{Attributes, Id, Record},
|
|
subscriber::{with_default, Interest, Subscriber},
|
|
Event, Level, Metadata,
|
|
};
|
|
|
|
use tracing_mock::*;
|
|
|
|
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
|
|
#[test]
|
|
fn event_macros_dont_infinite_loop() {
|
|
// This test ensures that an event macro within a subscriber
|
|
// won't cause an infinite loop of events.
|
|
struct TestSubscriber;
|
|
impl Subscriber for TestSubscriber {
|
|
fn register_callsite(&self, _: &Metadata<'_>) -> Interest {
|
|
// Always return sometimes so that `enabled` will be called
|
|
// (which can loop).
|
|
Interest::sometimes()
|
|
}
|
|
|
|
fn enabled(&self, meta: &Metadata<'_>) -> bool {
|
|
assert!(meta.fields().iter().any(|f| f.name() == "foo"));
|
|
tracing::event!(Level::TRACE, bar = false);
|
|
true
|
|
}
|
|
|
|
fn new_span(&self, _: &Attributes<'_>) -> Id {
|
|
Id::from_u64(0xAAAA)
|
|
}
|
|
|
|
fn record(&self, _: &Id, _: &Record<'_>) {}
|
|
|
|
fn record_follows_from(&self, _: &Id, _: &Id) {}
|
|
|
|
fn event(&self, event: &Event<'_>) {
|
|
assert!(event.metadata().fields().iter().any(|f| f.name() == "foo"));
|
|
tracing::event!(Level::TRACE, baz = false);
|
|
}
|
|
|
|
fn enter(&self, _: &Id) {}
|
|
|
|
fn exit(&self, _: &Id) {}
|
|
}
|
|
|
|
with_default(TestSubscriber, || {
|
|
tracing::event!(Level::TRACE, foo = false);
|
|
})
|
|
}
|
|
|
|
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
|
|
#[test]
|
|
fn boxed_subscriber() {
|
|
let (subscriber, handle) = subscriber::mock()
|
|
.new_span(
|
|
span::mock().named("foo").with_field(
|
|
field::mock("bar")
|
|
.with_value(&display("hello from my span"))
|
|
.only(),
|
|
),
|
|
)
|
|
.enter(span::mock().named("foo"))
|
|
.exit(span::mock().named("foo"))
|
|
.drop_span(span::mock().named("foo"))
|
|
.done()
|
|
.run_with_handle();
|
|
let subscriber: Box<dyn Subscriber + Send + Sync + 'static> = Box::new(subscriber);
|
|
|
|
with_default(subscriber, || {
|
|
let from = "my span";
|
|
let span = tracing::span!(
|
|
Level::TRACE,
|
|
"foo",
|
|
bar = format_args!("hello from {}", from)
|
|
);
|
|
span.in_scope(|| {});
|
|
});
|
|
|
|
handle.assert_finished();
|
|
}
|
|
|
|
#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
|
|
#[test]
|
|
fn arced_subscriber() {
|
|
use std::sync::Arc;
|
|
|
|
let (subscriber, handle) = subscriber::mock()
|
|
.new_span(
|
|
span::mock().named("foo").with_field(
|
|
field::mock("bar")
|
|
.with_value(&display("hello from my span"))
|
|
.only(),
|
|
),
|
|
)
|
|
.enter(span::mock().named("foo"))
|
|
.exit(span::mock().named("foo"))
|
|
.drop_span(span::mock().named("foo"))
|
|
.event(
|
|
event::mock()
|
|
.with_fields(field::mock("message").with_value(&display("hello from my event"))),
|
|
)
|
|
.done()
|
|
.run_with_handle();
|
|
let subscriber: Arc<dyn Subscriber + Send + Sync + 'static> = Arc::new(subscriber);
|
|
|
|
// Test using a clone of the `Arc`ed subscriber
|
|
with_default(subscriber.clone(), || {
|
|
let from = "my span";
|
|
let span = tracing::span!(
|
|
Level::TRACE,
|
|
"foo",
|
|
bar = format_args!("hello from {}", from)
|
|
);
|
|
span.in_scope(|| {});
|
|
});
|
|
|
|
with_default(subscriber, || {
|
|
tracing::info!("hello from my event");
|
|
});
|
|
|
|
handle.assert_finished();
|
|
}
|