@@ -61,3 +61,49 @@ fn layer_multiple_expectations() {
6161 drop ( _subscriber) ;
6262 handle. assert_finished ( ) ;
6363}
64+
65+ #[ cfg( feature = "tracing-subscriber" ) ]
66+ #[ test]
67+ #[ should_panic( expected = "expected on_register_dispatch to be called" ) ]
68+ fn layer_on_register_dispatch_not_propagated ( ) {
69+ use tracing:: error;
70+ use tracing_mock:: layer;
71+ use tracing_subscriber:: { layer:: SubscriberExt , util:: SubscriberInitExt , Layer } ;
72+
73+ /// A layer that wraps another layer but does NOT propagate on_register_dispatch
74+ struct BadLayer < L > {
75+ inner : L ,
76+ }
77+
78+ impl < S , L > Layer < S > for BadLayer < L >
79+ where
80+ S : tracing_core:: Subscriber ,
81+ L : Layer < S > ,
82+ {
83+ // Intentionally NOT implementing on_register_dispatch to test the failure case
84+ // The default implementation does nothing, so the inner layer won't receive the call
85+
86+ fn on_event (
87+ & self ,
88+ event : & tracing_core:: Event < ' _ > ,
89+ ctx : tracing_subscriber:: layer:: Context < ' _ , S > ,
90+ ) {
91+ self . inner . on_event ( event, ctx) ;
92+ }
93+ }
94+
95+ let ( mock_layer, handle) = layer:: named ( "inner" )
96+ . on_register_dispatch ( )
97+ . run_with_handle ( ) ;
98+
99+ let bad_layer = BadLayer { inner : mock_layer } ;
100+
101+ let _subscriber = tracing_subscriber:: registry ( ) . with ( bad_layer) . set_default ( ) ;
102+
103+ // This event will be sent to the mock layer, which expects on_register_dispatch first
104+ error ! ( "send an event" ) ;
105+
106+ drop ( _subscriber) ;
107+
108+ handle. assert_finished ( ) ;
109+ }
0 commit comments