@@ -1289,9 +1289,9 @@ macro_rules! test_definitions {
12891289/// Adapted from [`test_definitions`].
12901290macro_rules! coverage_test_alias {
12911291 ( $name: ident {
1292- alias_and_mode: $alias_and_mode: expr,
1293- default : $default: expr,
1294- only_hosts: $only_hosts: expr $( , ) ?
1292+ alias_and_mode: $alias_and_mode: expr, // &'static str
1293+ default : $default: expr, // bool
1294+ only_hosts: $only_hosts: expr $( , ) ? // bool
12951295 } ) => {
12961296 #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
12971297 pub struct $name {
@@ -1309,6 +1309,8 @@ macro_rules! coverage_test_alias {
13091309 const ONLY_HOSTS : bool = $only_hosts;
13101310
13111311 fn should_run( run: ShouldRun <' _>) -> ShouldRun <' _> {
1312+ // Register the mode name as a command-line alias.
1313+ // This allows `x test coverage-map` and `x test coverage-run`.
13121314 run. alias( $alias_and_mode)
13131315 }
13141316
@@ -1319,8 +1321,7 @@ macro_rules! coverage_test_alias {
13191321 }
13201322
13211323 fn run( self , builder: & Builder <' _>) {
1322- Coverage { compiler: self . compiler, target: self . target }
1323- . run_unified_suite( builder, Self :: MODE )
1324+ Coverage :: run_coverage_tests( builder, self . compiler, self . target, Self :: MODE ) ;
13241325 }
13251326 }
13261327 } ;
@@ -1449,11 +1450,20 @@ host_test!(RunMakeFullDeps {
14491450
14501451default_test ! ( Assembly { path: "tests/assembly" , mode: "assembly" , suite: "assembly" } ) ;
14511452
1452- /// Custom test step that is responsible for running the coverage tests
1453- /// in multiple different modes.
1453+ /// Coverage tests are a bit more complicated than other test suites, because
1454+ /// we want to run the same set of test files in multiple different modes,
1455+ /// in a way that's convenient and flexible when invoked manually.
1456+ ///
1457+ /// This combined step runs the specified tests (or all of `tests/coverage`)
1458+ /// in both "coverage-map" and "coverage-run" modes.
14541459///
1455- /// Each individual mode also has its own alias that will run the tests in
1456- /// just that mode.
1460+ /// Used by:
1461+ /// - `x test coverage`
1462+ /// - `x test tests/coverage`
1463+ /// - `x test tests/coverage/trivial.rs` (etc)
1464+ ///
1465+ /// (Each individual mode also has its own step that will run the tests in
1466+ /// just that mode.)
14571467#[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
14581468pub struct Coverage {
14591469 pub compiler : Compiler ,
@@ -1464,24 +1474,41 @@ impl Coverage {
14641474 const PATH : & ' static str = "tests/coverage" ;
14651475 const SUITE : & ' static str = "coverage" ;
14661476
1467- fn run_unified_suite ( & self , builder : & Builder < ' _ > , mode : & ' static str ) {
1477+ /// Runs the coverage test suite (or a user-specified subset) in one mode.
1478+ ///
1479+ /// This same function is used by the multi-mode step ([`Coverage`]) and by
1480+ /// the single-mode steps ([`CoverageMap`] and [`CoverageRun`]), to help
1481+ /// ensure that they all behave consistently with each other, regardless of
1482+ /// how the coverage tests have been invoked.
1483+ fn run_coverage_tests (
1484+ builder : & Builder < ' _ > ,
1485+ compiler : Compiler ,
1486+ target : TargetSelection ,
1487+ mode : & ' static str ,
1488+ ) {
1489+ // Like many other test steps, we delegate to a `Compiletest` step to
1490+ // actually run the tests. (See `test_definitions!`.)
14681491 builder. ensure ( Compiletest {
1469- compiler : self . compiler ,
1470- target : self . target ,
1492+ compiler,
1493+ target,
14711494 mode,
14721495 suite : Self :: SUITE ,
14731496 path : Self :: PATH ,
14741497 compare_mode : None ,
1475- } )
1498+ } ) ;
14761499 }
14771500}
14781501
14791502impl Step for Coverage {
14801503 type Output = ( ) ;
1504+ // We rely on the individual CoverageMap/CoverageRun steps to run themselves.
14811505 const DEFAULT : bool = false ;
1506+ // When manually invoked, try to run as much as possible.
1507+ // Compiletest will automatically skip the "coverage-run" tests if necessary.
14821508 const ONLY_HOSTS : bool = false ;
14831509
14841510 fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
1511+ // Take responsibility for command-line paths within `tests/coverage`.
14851512 run. suite_path ( Self :: PATH )
14861513 }
14871514
@@ -1492,20 +1519,27 @@ impl Step for Coverage {
14921519 }
14931520
14941521 fn run ( self , builder : & Builder < ' _ > ) {
1495- self . run_unified_suite ( builder, CoverageMap :: MODE ) ;
1496- self . run_unified_suite ( builder, CoverageRun :: MODE ) ;
1522+ // Run the specified coverage tests (possibly all of them) in both modes.
1523+ for mode in [ CoverageMap :: MODE , CoverageRun :: MODE ] {
1524+ Self :: run_coverage_tests ( builder, self . compiler , self . target , mode) ;
1525+ }
14971526 }
14981527}
14991528
1500- // Aliases for running the coverage tests in only one mode.
1529+ // Runs `tests/coverage` in "coverage-map" mode only.
1530+ // Used by `x test` and `x test coverage-map`.
15011531coverage_test_alias ! ( CoverageMap {
15021532 alias_and_mode: "coverage-map" ,
15031533 default : true ,
15041534 only_hosts: false ,
15051535} ) ;
1536+ // Runs `tests/coverage` in "coverage-run" mode only.
1537+ // Used by `x test` and `x test coverage-run`.
15061538coverage_test_alias ! ( CoverageRun {
15071539 alias_and_mode: "coverage-run" ,
15081540 default : true ,
1541+ // Compiletest knows how to automatically skip these tests when cross-compiling,
1542+ // but skipping the whole step here makes it clearer that they haven't run at all.
15091543 only_hosts: true ,
15101544} ) ;
15111545
0 commit comments