@@ -31,6 +31,7 @@ use std::{
3131 sync:: { Arc , Mutex } ,
3232 thread,
3333} ;
34+ use tokio:: { runtime:: Handle , task} ;
3435
3536/// Serialize from A should equal Serialize from B
3637#[ allow( dead_code) ]
@@ -217,7 +218,7 @@ async fn create_span_from_context() {
217218}
218219
219220#[ test]
220- fn crossprocess_test ( ) {
221+ fn cross_process_test ( ) {
221222 let tracer = Tracer :: new ( "service" , "instance" , PrintReporter :: new ( ) ) ;
222223 let mut context1 = tracer. create_trace_context ( ) ;
223224 assert_eq ! ( context1. service( ) , "service" ) ;
@@ -239,6 +240,7 @@ fn crossprocess_test() {
239240
240241 let span3 = context2. last_span ( ) . unwrap ( ) ;
241242
243+ assert_eq ! ( context1. trace_id( ) , context2. trace_id( ) ) ;
242244 assert_eq ! ( span3. span_id, 0 ) ;
243245 assert_eq ! ( span3. parent_span_id, -1 ) ;
244246 assert_eq ! ( span3. refs. len( ) , 1 ) ;
@@ -259,6 +261,58 @@ fn crossprocess_test() {
259261 }
260262}
261263
264+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
265+ async fn cross_process_test_1 ( ) {
266+ let propagation = Mutex :: new ( String :: new ( ) ) ;
267+
268+ MockReporter :: with (
269+ |reporter| {
270+ let tracer = Tracer :: new ( "service1" , "instance1" , reporter) ;
271+ let mut context = tracer. create_trace_context ( ) ;
272+ let _span1 = context. create_entry_span ( "entry_1" ) ;
273+ let _span2 = context. create_exit_span ( "exit_1" , "peer_1" ) ;
274+ * propagation. try_lock ( ) . unwrap ( ) = encode_propagation ( & context, "exit_1" , "peer_1" ) ;
275+ tracer
276+ } ,
277+ |segment1| {
278+ let propagation = propagation. lock ( ) . unwrap ( ) . clone ( ) ;
279+ task:: block_in_place ( move || {
280+ Handle :: current ( ) . block_on ( async move {
281+ MockReporter :: with (
282+ |reporter| {
283+ let tracer = Tracer :: new ( "service2" , "instance2" , reporter) ;
284+ let mut context = tracer. create_trace_context ( ) ;
285+ let _span1 = context. create_entry_span_with_propagation (
286+ "entry_1" ,
287+ & decode_propagation ( & propagation) . unwrap ( ) ,
288+ ) ;
289+ tracer
290+ } ,
291+ |segment2| {
292+ assert_eq ! ( segment1. trace_id, segment2. trace_id) ;
293+ assert_eq ! (
294+ segment2. spans[ 0 ] . refs[ 0 ] ,
295+ SegmentReference {
296+ ref_type: RefType :: CrossProcess as i32 ,
297+ trace_id: segment1. trace_id. clone( ) ,
298+ parent_trace_segment_id: segment1. trace_segment_id. clone( ) ,
299+ parent_span_id: 1 ,
300+ parent_service: segment1. service. clone( ) ,
301+ parent_service_instance: segment1. service_instance. clone( ) ,
302+ parent_endpoint: segment1. spans[ 0 ] . operation_name. clone( ) ,
303+ network_address_used_at_peer: segment1. spans[ 0 ] . peer. clone( ) ,
304+ }
305+ ) ;
306+ } ,
307+ )
308+ . await ;
309+ } ) ;
310+ } ) ;
311+ } ,
312+ )
313+ . await ;
314+ }
315+
262316#[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
263317async fn cross_threads_test ( ) {
264318 MockReporter :: with_many (
0 commit comments