Skip to content

Commit efa0169

Browse files
authored
mock: add doctests for on_register_dispatch negative cases (#3416)
## Motivation In order to add a regression test, #3379 added support to `tracing-mock` to expect calls to `on_register_dispatch` for both mock subscribers and mock layers. A negative integration test for the layer case was included in #3415. However, there are no negative doctests for this (and as per my own suggestion, there's no negative test for the subscriber method either as I wasn't sure it was possible). ## Solution After a bit of thought, I realised that we could include a negative test for the `MockSubscriber`. This change adds that test as a doctest, since we have those in almost all of our documentation and also includes the already written negative test for the `MockLayer` to a doctest.
1 parent a093858 commit efa0169

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

tracing-mock/src/layer.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,50 @@ impl MockLayerBuilder {
671671
/// handle.assert_finished();
672672
/// ```
673673
///
674+
/// If the `on_register_dispatch` call doesn't make it to the `MockLayer`,
675+
/// in case it's wrapped in another Layer that doesn't forward the call,
676+
/// then the expectation will fail.
677+
///
678+
/// ```should_panic
679+
/// # use std::marker::PhantomData;
680+
///
681+
/// # use tracing::{Event, Subscriber};
682+
/// # use tracing_mock::layer;
683+
/// # use tracing_subscriber::{
684+
/// # layer::{Context, SubscriberExt},
685+
/// # util::SubscriberInitExt,
686+
/// # Layer,
687+
/// # };
688+
///
689+
/// struct WrapLayer<S: Subscriber, L: Layer<S>> {
690+
/// inner: L,
691+
/// _pd: PhantomData<S>,
692+
/// }
693+
///
694+
/// impl<S: Subscriber, L: Layer<S>> Layer<S> for WrapLayer<S, L> {
695+
/// fn on_register_dispatch(&self, subscriber: &tracing::Dispatch) {
696+
/// // Doesn't forward to `self.inner`
697+
/// let _ = subscriber;
698+
/// }
699+
///
700+
/// fn on_event(&self, event: &Event<'_>, ctx: Context<'_, S>) {
701+
/// self.inner.on_event(event, ctx)
702+
/// }
703+
/// }
704+
/// let (layer, handle) = layer::mock().on_register_dispatch().run_with_handle();
705+
/// let wrap_layer = WrapLayer {
706+
/// inner: layer,
707+
/// _pd: PhantomData::<_>,
708+
/// };
709+
///
710+
/// let subscriber = tracing_subscriber::registry().with(wrap_layer).set_default();
711+
///
712+
/// // The layer's on_register_dispatch is called when the subscriber is set as default
713+
/// drop(subscriber);
714+
///
715+
/// handle.assert_finished();
716+
/// ```
717+
///
674718
/// [`Layer::on_register_dispatch`]: tracing_subscriber::layer::Layer::on_register_dispatch
675719
pub fn on_register_dispatch(mut self) -> Self {
676720
self.expected.push_back(Expect::OnRegisterDispatch);

tracing-mock/src/subscriber.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,58 @@ where
827827
/// handle.assert_finished();
828828
/// ```
829829
///
830+
///
831+
/// ```should_panic
832+
/// use tracing_mock::{subscriber};
833+
///
834+
/// struct WrapSubscriber<S: tracing::Subscriber> {
835+
/// inner: S,
836+
/// }
837+
///
838+
/// impl<S: tracing::Subscriber> tracing::Subscriber for WrapSubscriber<S> {
839+
/// # fn enabled(&self, metadata: &tracing::Metadata<'_>) -> bool {
840+
/// # self.inner.enabled(metadata)
841+
/// # }
842+
/// # fn new_span(&self, span: &tracing_core::span::Attributes<'_>) -> tracing_core::span::Id {
843+
/// # self.inner.new_span(span)
844+
/// # }
845+
/// # fn record(&self, span: &tracing_core::span::Id, values: &tracing_core::span::Record<'_>) {
846+
/// # self.inner.record(span, values)
847+
/// # }
848+
/// # fn record_follows_from(
849+
/// # &self,
850+
/// # span: &tracing_core::span::Id,
851+
/// # follows: &tracing_core::span::Id,
852+
/// # ) {
853+
/// # self.inner.record_follows_from(span, follows)
854+
/// # }
855+
/// # fn event(&self, event: &tracing::Event<'_>) {
856+
/// # self.inner.event(event)
857+
/// # }
858+
/// # fn enter(&self, span: &tracing_core::span::Id) {
859+
/// # self.inner.enter(span)
860+
/// # }
861+
/// # fn exit(&self, span: &tracing_core::span::Id) {
862+
/// # self.inner.exit(span)
863+
/// # }
864+
/// // All other Subscriber methods implemented to forward correctly.
865+
///
866+
/// fn on_register_dispatch(&self, subscriber: &tracing::Dispatch) {
867+
/// // Doesn't forward to `self.inner`
868+
/// let _ = subscriber;
869+
/// }
870+
/// }
871+
///
872+
/// let (subscriber, handle) = subscriber::mock().on_register_dispatch().run_with_handle();
873+
/// let wrap_subscriber = WrapSubscriber { inner: subscriber };
874+
///
875+
/// tracing::subscriber::with_default(wrap_subscriber, || {
876+
/// // The subscriber's on_register_dispatch is called when set as default
877+
/// });
878+
///
879+
/// handle.assert_finished();
880+
/// ```
881+
///
830882
/// [`Subscriber::on_register_dispatch`]: tracing::Subscriber::on_register_dispatch
831883
pub fn on_register_dispatch(mut self) -> Self {
832884
self.expected.push_back(Expect::OnRegisterDispatch);

0 commit comments

Comments
 (0)