@@ -442,3 +442,110 @@ impl TraceHandler for TelemetryTraceHandler {
442442 ) ;
443443 }
444444}
445+
446+ #[ cfg( test) ]
447+ mod tests {
448+ use super :: * ;
449+ use std:: sync:: Arc ;
450+
451+ struct TestTraceHandler {
452+ spans : Arc < Mutex < Vec < SpanDatum > > > ,
453+ events : Arc < Mutex < Vec < TraceEvent > > > ,
454+ }
455+
456+ impl TraceHandler for TestTraceHandler {
457+ fn process_span ( & self , sd : SpanDatum ) {
458+ self . spans . lock ( ) . push ( sd) ;
459+ }
460+
461+ fn process_event ( & self , event : TraceEvent ) {
462+ self . events . lock ( ) . push ( event) ;
463+ }
464+ }
465+
466+ fn setup_subscriber ( ) -> ( ProfilingSubscriber , Arc < Mutex < Vec < SpanDatum > > > , Arc < Mutex < Vec < TraceEvent > > > ) {
467+ let spans = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
468+ let events = Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ;
469+ let handler = TestTraceHandler {
470+ spans : spans. clone ( ) ,
471+ events : events. clone ( ) ,
472+ } ;
473+ let test_subscriber = ProfilingSubscriber :: new_with_handler (
474+ Box :: new ( handler) ,
475+ "test_target"
476+ ) ;
477+ ( test_subscriber, spans, events)
478+ }
479+
480+ #[ test]
481+ fn test_span ( ) {
482+ let ( sub, spans, events) = setup_subscriber ( ) ;
483+ let _sub_guard = tracing:: subscriber:: set_default ( sub) ;
484+ let span = tracing:: info_span!( target: "test_target" , "test_span1" ) ;
485+ assert_eq ! ( spans. lock( ) . len( ) , 0 ) ;
486+ assert_eq ! ( events. lock( ) . len( ) , 0 ) ;
487+ let _guard = span. enter ( ) ;
488+ assert_eq ! ( spans. lock( ) . len( ) , 0 ) ;
489+ assert_eq ! ( events. lock( ) . len( ) , 0 ) ;
490+ drop ( _guard) ;
491+ drop ( span) ;
492+ assert_eq ! ( spans. lock( ) . len( ) , 1 ) ;
493+ assert_eq ! ( events. lock( ) . len( ) , 0 ) ;
494+ let sd = spans. lock ( ) . remove ( 0 ) ;
495+ assert_eq ! ( sd. name, "test_span1" ) ;
496+ assert_eq ! ( sd. target, "test_target" ) ;
497+ let time: u128 = sd. overall_time . as_nanos ( ) ;
498+ assert ! ( time > 0 ) ;
499+ }
500+
501+ #[ test]
502+ fn test_span_parent_id ( ) {
503+ let ( sub, spans, _events) = setup_subscriber ( ) ;
504+ let _sub_guard = tracing:: subscriber:: set_default ( sub) ;
505+ let span1 = tracing:: info_span!( target: "test_target" , "test_span1" ) ;
506+ let _guard1 = span1. enter ( ) ;
507+ let span2 = tracing:: info_span!( target: "test_target" , "test_span2" ) ;
508+ let _guard2 = span2. enter ( ) ;
509+ drop ( _guard2) ;
510+ drop ( span2) ;
511+ let sd2 = spans. lock ( ) . remove ( 0 ) ;
512+ drop ( _guard1) ;
513+ drop ( span1) ;
514+ let sd1 = spans. lock ( ) . remove ( 0 ) ;
515+ assert_eq ! ( sd1. id, sd2. parent_id. unwrap( ) )
516+ }
517+
518+ #[ test]
519+ fn test_event ( ) {
520+ let ( sub, _spans, events) = setup_subscriber ( ) ;
521+ let _sub_guard = tracing:: subscriber:: set_default ( sub) ;
522+ tracing:: event!( target: "test_target" , tracing:: Level :: INFO , "test_event" ) ;
523+ let mut te1 = events. lock ( ) . remove ( 0 ) ;
524+ assert_eq ! ( te1. visitor. 0 . remove( & "message" . to_owned( ) ) . unwrap( ) , "test_event" . to_owned( ) ) ;
525+ }
526+
527+ #[ test]
528+ fn test_event_parent_id ( ) {
529+ let ( sub, spans, events) = setup_subscriber ( ) ;
530+ let _sub_guard = tracing:: subscriber:: set_default ( sub) ;
531+
532+ // enter span
533+ let span1 = tracing:: info_span!( target: "test_target" , "test_span1" ) ;
534+ let _guard1 = span1. enter ( ) ;
535+
536+ // emit event
537+ tracing:: event!( target: "test_target" , tracing:: Level :: INFO , "test_event" ) ;
538+
539+ //exit span
540+ drop ( _guard1) ;
541+ drop ( span1) ;
542+
543+ // check span is not emitted separately
544+ assert ! ( events. lock( ) . is_empty( ) ) ;
545+
546+ let sd1 = spans. lock ( ) . remove ( 0 ) ;
547+
548+ // Check span contains the event
549+ assert_eq ! ( sd1. events. len( ) , 1 ) ;
550+ }
551+ }
0 commit comments