@@ -749,3 +749,95 @@ fn test_termination() -> Result<()> {
749749
750750 Ok ( ( ) )
751751}
752+
753+ #[ test]
754+ fn test_timeout_result ( ) -> Result < ( ) > {
755+ test_init ( ) ;
756+
757+ let pcx = ParseContext :: new ( & PACKAGE_GRAPH ) ;
758+ let expr = Filterset :: parse (
759+ "test(/^test_slow_timeout/)" . to_owned ( ) ,
760+ & pcx,
761+ FiltersetKind :: Test ,
762+ )
763+ . unwrap ( ) ;
764+ let test_filter = TestFilterBuilder :: new (
765+ RunIgnored :: Only ,
766+ None ,
767+ TestFilterPatterns :: default ( ) ,
768+ vec ! [ expr] ,
769+ )
770+ . unwrap ( ) ;
771+
772+ let test_list = FIXTURE_TARGETS . make_test_list (
773+ "with-timeout-success" ,
774+ & test_filter,
775+ & TargetRunner :: empty ( ) ,
776+ ) ?;
777+ let config = load_config ( ) ;
778+ let profile = config
779+ . profile ( "with-timeout-success" )
780+ . expect ( "with-timeout-success config is valid" ) ;
781+ let build_platforms = BuildPlatforms :: new_with_no_target ( ) . unwrap ( ) ;
782+ let profile = profile. apply_build_platforms ( & build_platforms) ;
783+
784+ let runner = TestRunnerBuilder :: default ( )
785+ . build (
786+ & test_list,
787+ & profile,
788+ vec ! [ ] ,
789+ SignalHandlerKind :: Noop ,
790+ InputHandlerKind :: Noop ,
791+ DoubleSpawnInfo :: disabled ( ) ,
792+ TargetRunner :: empty ( ) ,
793+ )
794+ . unwrap ( ) ;
795+
796+ let ( instance_statuses, run_stats) = execute_collect ( runner) ;
797+ assert_eq ! (
798+ run_stats. passed_timed_out, 3 ,
799+ "3 tests timed out and passed"
800+ ) ;
801+ for test_name in [
802+ "test_slow_timeout" ,
803+ "test_slow_timeout_2" ,
804+ "test_slow_timeout_subprocess" ,
805+ ] {
806+ let ( _, instance_value) = instance_statuses
807+ . iter ( )
808+ . find ( |& ( & ( _, name) , _) | name == test_name)
809+ . unwrap_or_else ( || panic ! ( "{test_name} should be present" ) ) ;
810+ let valid = match & instance_value. status {
811+ InstanceStatus :: Skipped ( _) => panic ! ( "{test_name} should have been run" ) ,
812+ InstanceStatus :: Finished ( run_statuses) => {
813+ // This test should not have been retried since retries aren't configured.
814+ assert_eq ! (
815+ run_statuses. len( ) ,
816+ 1 ,
817+ "{test_name} should have been run exactly once" ,
818+ ) ;
819+ let run_status = run_statuses. last_status ( ) ;
820+ // The test should have taken less than 5 seconds (most relevant for
821+ // test_slow_timeout_subprocess -- without job objects it gets stuck on Windows
822+ // until the subprocess exits.)
823+ assert ! (
824+ run_status. time_taken < Duration :: from_secs( 5 ) ,
825+ "{test_name} should have taken less than 5 seconds, actually took {:?}" ,
826+ run_status. time_taken
827+ ) ;
828+ run_status. result
829+ == ExecutionResult :: Timeout {
830+ result : SlowTimeoutResult :: Pass ,
831+ }
832+ }
833+ } ;
834+ if !valid {
835+ panic ! (
836+ "for test_slow_timeout, mismatch in status: expected timeout, actual {:?}" ,
837+ instance_value. status
838+ ) ;
839+ }
840+ }
841+
842+ Ok ( ( ) )
843+ }
0 commit comments