subscriber.rs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // These tests require the thread-local scoped dispatcher, which only works when
  2. // we have a standard library. The behaviour being tested should be the same
  3. // with the standard lib disabled.
  4. //
  5. // The alternative would be for each of these tests to be defined in a separate
  6. // file, which is :(
  7. #![cfg(feature = "std")]
  8. use tracing::{
  9. field::display,
  10. span::{Attributes, Id, Record},
  11. subscriber::{with_default, Interest, Subscriber},
  12. Event, Level, Metadata,
  13. };
  14. use tracing_mock::*;
  15. #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
  16. #[test]
  17. fn event_macros_dont_infinite_loop() {
  18. // This test ensures that an event macro within a subscriber
  19. // won't cause an infinite loop of events.
  20. struct TestSubscriber;
  21. impl Subscriber for TestSubscriber {
  22. fn register_callsite(&self, _: &Metadata<'_>) -> Interest {
  23. // Always return sometimes so that `enabled` will be called
  24. // (which can loop).
  25. Interest::sometimes()
  26. }
  27. fn enabled(&self, meta: &Metadata<'_>) -> bool {
  28. assert!(meta.fields().iter().any(|f| f.name() == "foo"));
  29. tracing::event!(Level::TRACE, bar = false);
  30. true
  31. }
  32. fn new_span(&self, _: &Attributes<'_>) -> Id {
  33. Id::from_u64(0xAAAA)
  34. }
  35. fn record(&self, _: &Id, _: &Record<'_>) {}
  36. fn record_follows_from(&self, _: &Id, _: &Id) {}
  37. fn event(&self, event: &Event<'_>) {
  38. assert!(event.metadata().fields().iter().any(|f| f.name() == "foo"));
  39. tracing::event!(Level::TRACE, baz = false);
  40. }
  41. fn enter(&self, _: &Id) {}
  42. fn exit(&self, _: &Id) {}
  43. }
  44. with_default(TestSubscriber, || {
  45. tracing::event!(Level::TRACE, foo = false);
  46. })
  47. }
  48. #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
  49. #[test]
  50. fn boxed_subscriber() {
  51. let (subscriber, handle) = subscriber::mock()
  52. .new_span(
  53. span::mock().named("foo").with_field(
  54. field::mock("bar")
  55. .with_value(&display("hello from my span"))
  56. .only(),
  57. ),
  58. )
  59. .enter(span::mock().named("foo"))
  60. .exit(span::mock().named("foo"))
  61. .drop_span(span::mock().named("foo"))
  62. .done()
  63. .run_with_handle();
  64. let subscriber: Box<dyn Subscriber + Send + Sync + 'static> = Box::new(subscriber);
  65. with_default(subscriber, || {
  66. let from = "my span";
  67. let span = tracing::span!(
  68. Level::TRACE,
  69. "foo",
  70. bar = format_args!("hello from {}", from)
  71. );
  72. span.in_scope(|| {});
  73. });
  74. handle.assert_finished();
  75. }
  76. #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
  77. #[test]
  78. fn arced_subscriber() {
  79. use std::sync::Arc;
  80. let (subscriber, handle) = subscriber::mock()
  81. .new_span(
  82. span::mock().named("foo").with_field(
  83. field::mock("bar")
  84. .with_value(&display("hello from my span"))
  85. .only(),
  86. ),
  87. )
  88. .enter(span::mock().named("foo"))
  89. .exit(span::mock().named("foo"))
  90. .drop_span(span::mock().named("foo"))
  91. .event(
  92. event::mock()
  93. .with_fields(field::mock("message").with_value(&display("hello from my event"))),
  94. )
  95. .done()
  96. .run_with_handle();
  97. let subscriber: Arc<dyn Subscriber + Send + Sync + 'static> = Arc::new(subscriber);
  98. // Test using a clone of the `Arc`ed subscriber
  99. with_default(subscriber.clone(), || {
  100. let from = "my span";
  101. let span = tracing::span!(
  102. Level::TRACE,
  103. "foo",
  104. bar = format_args!("hello from {}", from)
  105. );
  106. span.in_scope(|| {});
  107. });
  108. with_default(subscriber, || {
  109. tracing::info!("hello from my event");
  110. });
  111. handle.assert_finished();
  112. }