@@ -613,8 +613,8 @@ impl FileStreamMetrics {
613613mod tests {
614614 use crate :: file_scan_config:: { FileScanConfig , FileScanConfigBuilder } ;
615615 use crate :: morsel:: test_utils:: {
616- BatchId , MockMorselizer , MockPlanner , MorselEventsBuilder , MorselId ,
617- MorselObserver , PlannerId ,
616+ BatchId , IoFutureId , MockMorselizer , MockPlanner , MorselEventsBuilder , MorselId ,
617+ MorselObserver , PlannerId , ReturnPlanBuilder ,
618618 } ;
619619 use crate :: tests:: make_partition;
620620 use crate :: { PartitionedFile , TableSchema } ;
@@ -815,6 +815,49 @@ mod tests {
815815 Ok ( ( ) )
816816 }
817817
818+ #[ tokio:: test]
819+ async fn morsel_framework_single_planner_single_io_then_morsel ( ) -> Result < ( ) > {
820+ let observer = MorselObserver :: new ( ) ;
821+ let morselizer = MockMorselizer :: new ( )
822+ . with_file (
823+ "file1.parquet" ,
824+ MockPlanner :: builder ( )
825+ . with_id ( PlannerId ( 0 ) )
826+ . return_plan ( ReturnPlanBuilder :: new ( ) . with_io ( IoFutureId ( 100 ) , 1 ) )
827+ . return_morsel ( MorselId ( 10 ) , 42 )
828+ . return_none ( )
829+ . build ( ) ,
830+ )
831+ . with_observer ( observer. clone ( ) ) ;
832+
833+ let config = test_config ( vec ! [ "file1.parquet" ] ) ;
834+ insta:: assert_snapshot!( run_stream( morselizer, config) . await . unwrap( ) , @r"
835+ **** Batch: 42
836+ **** Done
837+ " ) ;
838+
839+ assert_eq ! (
840+ observer. events( ) ,
841+ MorselEventsBuilder :: new( )
842+ . morselize_file( "file1.parquet" )
843+ . planner_created( PlannerId ( 0 ) )
844+ . planner_called( PlannerId ( 0 ) )
845+ . io_future_created( PlannerId ( 0 ) , IoFutureId ( 100 ) )
846+ . io_future_polled( PlannerId ( 0 ) , IoFutureId ( 100 ) )
847+ . io_future_polled( PlannerId ( 0 ) , IoFutureId ( 100 ) )
848+ . io_future_resolved( PlannerId ( 0 ) , IoFutureId ( 100 ) )
849+ . planner_called( PlannerId ( 0 ) )
850+ . morsel_produced( PlannerId ( 0 ) , MorselId ( 10 ) )
851+ . planner_called( PlannerId ( 0 ) )
852+ . morsel_stream_started( MorselId ( 10 ) )
853+ . morsel_stream_batch_produced( MorselId ( 10 ) , BatchId ( 42 ) )
854+ . morsel_stream_finished( MorselId ( 10 ) )
855+ . build( )
856+ ) ;
857+
858+ Ok ( ( ) )
859+ }
860+
818861 fn test_config ( file_names : Vec < & str > ) -> FileScanConfig {
819862 let file_group = file_names
820863 . into_iter ( )
0 commit comments