@@ -318,6 +318,9 @@ mod tests {
318
318
use super :: * ;
319
319
use crate :: error:: ddog_trace_exporter_error_free;
320
320
use crate :: trace_exporter:: AgentResponse ;
321
+ use datadog_trace_utils:: span_v04:: Span ;
322
+ use httpmock:: prelude:: * ;
323
+ use httpmock:: MockServer ;
321
324
use std:: { borrow:: Borrow , mem:: MaybeUninit } ;
322
325
323
326
#[ test]
@@ -608,4 +611,121 @@ mod tests {
608
611
assert_eq ! ( error. unwrap( ) . code, ErrorCode :: InvalidInput ) ;
609
612
}
610
613
}
614
+
615
+ #[ test]
616
+ // Ignore because it seems, at least in the version we're currently using, miri can't emulate
617
+ // libc::socket function.
618
+ #[ cfg_attr( miri, ignore) ]
619
+ fn exporter_send_check_rate_test ( ) {
620
+ unsafe {
621
+ let server = MockServer :: start ( ) ;
622
+
623
+ let _mock = server. mock ( |when, then| {
624
+ when. method ( POST )
625
+ . header ( "Content-type" , "application/msgpack" )
626
+ . path ( "/v0.4/traces" ) ;
627
+ then. status ( 200 ) . body (
628
+ r#"{
629
+ "rate_by_service": {
630
+ "service:foo,env:staging": 1.0,
631
+ "service:,env:": 0.8
632
+ }
633
+ }"# ,
634
+ ) ;
635
+ } ) ;
636
+
637
+ let cfg = TraceExporterConfig {
638
+ url : Some ( server. url ( "/" ) ) ,
639
+ tracer_version : Some ( "0.1" . to_string ( ) ) ,
640
+ language : Some ( "lang" . to_string ( ) ) ,
641
+ language_version : Some ( "0.1" . to_string ( ) ) ,
642
+ language_interpreter : Some ( "interpreter" . to_string ( ) ) ,
643
+ hostname : Some ( "hostname" . to_string ( ) ) ,
644
+ env : Some ( "env-test" . to_string ( ) ) ,
645
+ version : Some ( "1.0" . to_string ( ) ) ,
646
+ service : Some ( "test-service" . to_string ( ) ) ,
647
+ input_format : TraceExporterInputFormat :: V04 ,
648
+ output_format : TraceExporterOutputFormat :: V04 ,
649
+ compute_stats : false ,
650
+ } ;
651
+
652
+ let mut ptr: MaybeUninit < Box < TraceExporter > > = MaybeUninit :: uninit ( ) ;
653
+ let mut ret =
654
+ ddog_trace_exporter_new ( NonNull :: new_unchecked ( & mut ptr) . cast ( ) , Some ( & cfg) ) ;
655
+
656
+ let exporter = ptr. assume_init ( ) ;
657
+
658
+ assert_eq ! ( ret, None ) ;
659
+
660
+ let data = rmp_serde:: to_vec_named :: < Vec < Vec < Span > > > ( & vec ! [ vec![ ] ] ) . unwrap ( ) ;
661
+ let traces = ByteSlice :: new ( & data) ;
662
+ let mut response = AgentResponse { rate : 0.0 } ;
663
+
664
+ ret = ddog_trace_exporter_send ( Some ( exporter. as_ref ( ) ) , traces, 0 , Some ( & mut response) ) ;
665
+ assert_eq ! ( ret, None ) ;
666
+ assert_eq ! ( response. rate, 0.8 ) ;
667
+
668
+ ddog_trace_exporter_free ( exporter) ;
669
+ }
670
+ }
671
+
672
+ #[ test]
673
+ // Ignore because it seems, at least in the version we're currently using, miri can't emulate
674
+ // libc::socket function.
675
+ #[ cfg_attr( miri, ignore) ]
676
+ fn exporter_send_empty_array_test ( ) {
677
+ // Test added due to ensure the exporter is able to send empty arrays because some tracers
678
+ // (.NET) ping the agent with the aforementioned data type.
679
+ unsafe {
680
+ let server = MockServer :: start ( ) ;
681
+
682
+ let mock_traces = server. mock ( |when, then| {
683
+ when. method ( POST )
684
+ . header ( "Content-type" , "application/msgpack" )
685
+ . path ( "/v0.4/traces" ) ;
686
+ then. status ( 200 ) . body (
687
+ r#"{
688
+ "rate_by_service": {
689
+ "service:foo,env:staging": 1.0,
690
+ "service:,env:": 0.8
691
+ }
692
+ }"# ,
693
+ ) ;
694
+ } ) ;
695
+
696
+ let cfg = TraceExporterConfig {
697
+ url : Some ( server. url ( "/" ) ) ,
698
+ tracer_version : Some ( "0.1" . to_string ( ) ) ,
699
+ language : Some ( "lang" . to_string ( ) ) ,
700
+ language_version : Some ( "0.1" . to_string ( ) ) ,
701
+ language_interpreter : Some ( "interpreter" . to_string ( ) ) ,
702
+ hostname : Some ( "hostname" . to_string ( ) ) ,
703
+ env : Some ( "env-test" . to_string ( ) ) ,
704
+ version : Some ( "1.0" . to_string ( ) ) ,
705
+ service : Some ( "test-service" . to_string ( ) ) ,
706
+ input_format : TraceExporterInputFormat :: V04 ,
707
+ output_format : TraceExporterOutputFormat :: V04 ,
708
+ compute_stats : false ,
709
+ } ;
710
+
711
+ let mut ptr: MaybeUninit < Box < TraceExporter > > = MaybeUninit :: uninit ( ) ;
712
+ let mut ret =
713
+ ddog_trace_exporter_new ( NonNull :: new_unchecked ( & mut ptr) . cast ( ) , Some ( & cfg) ) ;
714
+
715
+ let exporter = ptr. assume_init ( ) ;
716
+
717
+ assert_eq ! ( ret, None ) ;
718
+
719
+ let data = vec ! [ 0x90 ] ;
720
+ let traces = ByteSlice :: new ( & data) ;
721
+ let mut response = AgentResponse { rate : 0.0 } ;
722
+
723
+ ret = ddog_trace_exporter_send ( Some ( exporter. as_ref ( ) ) , traces, 0 , Some ( & mut response) ) ;
724
+ mock_traces. assert ( ) ;
725
+ assert_eq ! ( ret, None ) ;
726
+ assert_eq ! ( response. rate, 0.8 ) ;
727
+
728
+ ddog_trace_exporter_free ( exporter) ;
729
+ }
730
+ }
611
731
}
0 commit comments