@@ -381,29 +381,41 @@ mod tests {
381381 use std:: sync:: mpsc;
382382
383383 #[ test]
384- fn collection_triggered_by_interval ( ) {
385- // Arrange
386- let interval = std:: time:: Duration :: from_millis ( 1 ) ;
387- let exporter = InMemoryMetricsExporter :: default ( ) ;
388- let reader = PeriodicReader :: builder ( exporter. clone ( ) , runtime:: TokioCurrentThread )
389- . with_interval ( interval)
390- . build ( ) ;
391- let ( sender, receiver) = mpsc:: channel ( ) ;
384+ fn collection_triggered_by_interval_tokio_current ( ) {
385+ collection_triggered_by_interval_helper ( runtime:: TokioCurrentThread ) ;
386+ }
392387
393- // Act
394- let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
395- let meter = meter_provider. meter ( "test" ) ;
396- let _counter = meter
397- . u64_observable_counter ( "testcounter" )
398- . with_callback ( move |_| {
399- sender. send ( ( ) ) . expect ( "channel should still be open" ) ;
400- } )
401- . init ( ) ;
388+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
389+ async fn collection_triggered_by_interval_from_tokio_multi_one_thread_on_runtime_tokio ( ) {
390+ collection_triggered_by_interval_helper ( runtime:: Tokio ) ;
391+ }
402392
403- // Assert
404- receiver
405- . recv ( )
406- . expect ( "message should be available in channel, indicating a collection occurred" ) ;
393+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 2 ) ]
394+ async fn collection_triggered_by_interval_from_tokio_multi_two_thread_on_runtime_tokio ( ) {
395+ collection_triggered_by_interval_helper ( runtime:: Tokio ) ;
396+ }
397+
398+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 1 ) ]
399+ async fn collection_triggered_by_interval_from_tokio_multi_one_thread_on_runtime_tokio_current ( )
400+ {
401+ collection_triggered_by_interval_helper ( runtime:: TokioCurrentThread ) ;
402+ }
403+
404+ #[ tokio:: test( flavor = "multi_thread" , worker_threads = 2 ) ]
405+ async fn collection_triggered_by_interval_from_tokio_multi_two_thread_on_runtime_tokio_current ( )
406+ {
407+ collection_triggered_by_interval_helper ( runtime:: TokioCurrentThread ) ;
408+ }
409+
410+ #[ tokio:: test( flavor = "current_thread" ) ]
411+ #[ ignore = "See issue https://github.com/open-telemetry/opentelemetry-rust/issues/2056" ]
412+ async fn collection_triggered_by_interval_from_tokio_current_on_runtime_tokio ( ) {
413+ collection_triggered_by_interval_helper ( runtime:: Tokio ) ;
414+ }
415+
416+ #[ tokio:: test( flavor = "current_thread" ) ]
417+ async fn collection_triggered_by_interval_from_tokio_current_on_runtime_tokio_current ( ) {
418+ collection_triggered_by_interval_helper ( runtime:: TokioCurrentThread ) ;
407419 }
408420
409421 #[ test]
@@ -424,4 +436,31 @@ mod tests {
424436 matches!( result. unwrap_err( ) , MetricsError :: Other ( err) if err == "reader is not registered" )
425437 ) ;
426438 }
439+
440+ fn collection_triggered_by_interval_helper < RT > ( runtime : RT )
441+ where
442+ RT : crate :: runtime:: Runtime ,
443+ {
444+ let interval = std:: time:: Duration :: from_millis ( 1 ) ;
445+ let exporter = InMemoryMetricsExporter :: default ( ) ;
446+ let reader = PeriodicReader :: builder ( exporter. clone ( ) , runtime)
447+ . with_interval ( interval)
448+ . build ( ) ;
449+ let ( sender, receiver) = mpsc:: channel ( ) ;
450+
451+ // Act
452+ let meter_provider = SdkMeterProvider :: builder ( ) . with_reader ( reader) . build ( ) ;
453+ let meter = meter_provider. meter ( "test" ) ;
454+ let _counter = meter
455+ . u64_observable_counter ( "testcounter" )
456+ . with_callback ( move |_| {
457+ sender. send ( ( ) ) . expect ( "channel should still be open" ) ;
458+ } )
459+ . init ( ) ;
460+
461+ // Assert
462+ receiver
463+ . recv ( )
464+ . expect ( "message should be available in channel, indicating a collection occurred" ) ;
465+ }
427466}
0 commit comments