@@ -27,7 +27,7 @@ use crate::utils::helpers::{
27
27
linker_args, linker_flags, t, target_supports_cranelift_backend, up_to_date,
28
28
} ;
29
29
use crate :: utils:: render_tests:: { add_flags_and_try_run_tests, try_run_tests} ;
30
- use crate :: { CLang , DocTests , GitRepo , Mode , envify} ;
30
+ use crate :: { CLang , DocTests , GitRepo , Mode , PathSet , envify} ;
31
31
32
32
const ADB_TEST_DIR : & str = "/data/local/tmp/work" ;
33
33
@@ -1185,53 +1185,6 @@ macro_rules! test {
1185
1185
} ;
1186
1186
}
1187
1187
1188
- /// Declares an alias for running the [`Coverage`] tests in only one mode.
1189
- /// Adapted from [`test`].
1190
- macro_rules! coverage_test_alias {
1191
- (
1192
- $( #[ $attr: meta] ) * // allow docstrings and attributes
1193
- $name: ident {
1194
- alias_and_mode: $alias_and_mode: expr, // &'static str
1195
- default : $default: expr, // bool
1196
- only_hosts: $only_hosts: expr // bool
1197
- $( , ) ? // optional trailing comma
1198
- }
1199
- ) => {
1200
- $( #[ $attr] ) *
1201
- #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
1202
- pub struct $name {
1203
- pub compiler: Compiler ,
1204
- pub target: TargetSelection ,
1205
- }
1206
-
1207
- impl $name {
1208
- const MODE : & ' static str = $alias_and_mode;
1209
- }
1210
-
1211
- impl Step for $name {
1212
- type Output = ( ) ;
1213
- const DEFAULT : bool = $default;
1214
- const ONLY_HOSTS : bool = $only_hosts;
1215
-
1216
- fn should_run( run: ShouldRun <' _>) -> ShouldRun <' _> {
1217
- // Register the mode name as a command-line alias.
1218
- // This allows `x test coverage-map` and `x test coverage-run`.
1219
- run. alias( $alias_and_mode)
1220
- }
1221
-
1222
- fn make_run( run: RunConfig <' _>) {
1223
- let compiler = run. builder. compiler( run. builder. top_stage, run. build_triple( ) ) ;
1224
-
1225
- run. builder. ensure( $name { compiler, target: run. target } ) ;
1226
- }
1227
-
1228
- fn run( self , builder: & Builder <' _>) {
1229
- Coverage :: run_coverage_tests( builder, self . compiler, self . target, Self :: MODE ) ;
1230
- }
1231
- }
1232
- } ;
1233
- }
1234
-
1235
1188
#[ derive( Debug , Copy , Clone , Hash , PartialEq , Eq , Ord , PartialOrd ) ]
1236
1189
pub struct RunMakeSupport {
1237
1190
pub compiler : Compiler ,
@@ -1473,99 +1426,96 @@ impl Step for RunMake {
1473
1426
1474
1427
test ! ( Assembly { path: "tests/assembly" , mode: "assembly" , suite: "assembly" , default : true } ) ;
1475
1428
1476
- /// Coverage tests are a bit more complicated than other test suites, because
1477
- /// we want to run the same set of test files in multiple different modes,
1478
- /// in a way that's convenient and flexible when invoked manually.
1479
- ///
1480
- /// This combined step runs the specified tests (or all of `tests/coverage`)
1481
- /// in both "coverage-map" and "coverage-run" modes.
1482
- ///
1483
- /// Used by:
1484
- /// - `x test coverage`
1485
- /// - `x test tests/coverage`
1486
- /// - `x test tests/coverage/trivial.rs` (etc)
1487
- ///
1488
- /// (Each individual mode also has its own step that will run the tests in
1489
- /// just that mode.)
1490
- #[ derive( Debug , Clone , PartialEq , Eq , Hash ) ]
1429
+ /// Runs the coverage test suite at `tests/coverage` in some or all of the
1430
+ /// coverage test modes.
1431
+ #[ derive( Debug , Clone , PartialEq , Eq , PartialOrd , Ord , Hash ) ]
1491
1432
pub struct Coverage {
1492
1433
pub compiler : Compiler ,
1493
1434
pub target : TargetSelection ,
1435
+ pub mode : & ' static str ,
1494
1436
}
1495
1437
1496
1438
impl Coverage {
1497
1439
const PATH : & ' static str = "tests/coverage" ;
1498
1440
const SUITE : & ' static str = "coverage" ;
1499
-
1500
- /// Runs the coverage test suite (or a user-specified subset) in one mode.
1501
- ///
1502
- /// This same function is used by the multi-mode step ([`Coverage`]) and by
1503
- /// the single-mode steps ([`CoverageMap`] and [`CoverageRun`]), to help
1504
- /// ensure that they all behave consistently with each other, regardless of
1505
- /// how the coverage tests have been invoked.
1506
- fn run_coverage_tests (
1507
- builder : & Builder < ' _ > ,
1508
- compiler : Compiler ,
1509
- target : TargetSelection ,
1510
- mode : & ' static str ,
1511
- ) {
1512
- // Like many other test steps, we delegate to a `Compiletest` step to
1513
- // actually run the tests. (See `test_definitions!`.)
1514
- builder. ensure ( Compiletest {
1515
- compiler,
1516
- target,
1517
- mode,
1518
- suite : Self :: SUITE ,
1519
- path : Self :: PATH ,
1520
- compare_mode : None ,
1521
- } ) ;
1522
- }
1441
+ const ALL_MODES : & [ & str ] = & [ "coverage-map" , "coverage-run" ] ;
1523
1442
}
1524
1443
1525
1444
impl Step for Coverage {
1526
1445
type Output = ( ) ;
1527
- /// We rely on the individual CoverageMap/CoverageRun steps to run themselves.
1528
- const DEFAULT : bool = false ;
1529
- /// When manually invoked, try to run as much as possible.
1446
+ const DEFAULT : bool = true ;
1530
1447
/// Compiletest will automatically skip the "coverage-run" tests if necessary.
1531
1448
const ONLY_HOSTS : bool = false ;
1532
1449
1533
- fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
1534
- // Take responsibility for command-line paths within `tests/coverage`.
1535
- run. suite_path ( Self :: PATH )
1450
+ fn should_run ( mut run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
1451
+ // Support various invocation styles, including:
1452
+ // - `./x test coverage`
1453
+ // - `./x test tests/coverage/trivial.rs`
1454
+ // - `./x test coverage-map`
1455
+ // - `./x test coverage-run -- tests/coverage/trivial.rs`
1456
+ run = run. suite_path ( Self :: PATH ) ;
1457
+ for mode in Self :: ALL_MODES {
1458
+ run = run. alias ( mode) ;
1459
+ }
1460
+ run
1536
1461
}
1537
1462
1538
1463
fn make_run ( run : RunConfig < ' _ > ) {
1539
1464
let compiler = run. builder . compiler ( run. builder . top_stage , run. build_triple ( ) ) ;
1465
+ let target = run. target ;
1466
+
1467
+ // List of (coverage) test modes that the coverage test suite will be
1468
+ // run in. It's OK for this to contain duplicates, because the call to
1469
+ // `Builder::ensure` below will take care of deduplication.
1470
+ let mut modes = vec ! [ ] ;
1471
+
1472
+ // From the pathsets that were selected on the command-line (or by default),
1473
+ // determine which modes to run in.
1474
+ for path in & run. paths {
1475
+ match path {
1476
+ PathSet :: Set ( _) => {
1477
+ for mode in Self :: ALL_MODES {
1478
+ if path. assert_single_path ( ) . path == Path :: new ( mode) {
1479
+ modes. push ( mode) ;
1480
+ break ;
1481
+ }
1482
+ }
1483
+ }
1484
+ PathSet :: Suite ( _) => {
1485
+ modes. extend ( Self :: ALL_MODES ) ;
1486
+ break ;
1487
+ }
1488
+ }
1489
+ }
1490
+
1491
+ // Skip any modes that were explicitly skipped/excluded on the command-line.
1492
+ // FIXME(Zalathar): Integrate this into central skip handling somehow?
1493
+ modes. retain ( |mode| !run. builder . config . skip . iter ( ) . any ( |skip| skip == Path :: new ( mode) ) ) ;
1494
+
1495
+ // FIXME(Zalathar): Make these commands skip all coverage tests, as expected:
1496
+ // - `./x test --skip=tests`
1497
+ // - `./x test --skip=tests/coverage`
1498
+ // - `./x test --skip=coverage`
1499
+ // Skip handling currently doesn't have a way to know that skipping the coverage
1500
+ // suite should also skip the `coverage-map` and `coverage-run` aliases.
1540
1501
1541
- run. builder . ensure ( Coverage { compiler, target : run. target } ) ;
1502
+ for mode in modes {
1503
+ run. builder . ensure ( Coverage { compiler, target, mode } ) ;
1504
+ }
1542
1505
}
1543
1506
1544
1507
fn run ( self , builder : & Builder < ' _ > ) {
1545
- // Run the specified coverage tests (possibly all of them) in both modes.
1546
- Self :: run_coverage_tests ( builder, self . compiler , self . target , CoverageMap :: MODE ) ;
1547
- Self :: run_coverage_tests ( builder, self . compiler , self . target , CoverageRun :: MODE ) ;
1548
- }
1549
- }
1550
-
1551
- coverage_test_alias ! {
1552
- /// Runs the `tests/coverage` test suite in "coverage-map" mode only.
1553
- /// Used by `x test` and `x test coverage-map`.
1554
- CoverageMap {
1555
- alias_and_mode: "coverage-map" ,
1556
- default : true ,
1557
- only_hosts: false ,
1558
- }
1559
- }
1560
- coverage_test_alias ! {
1561
- /// Runs the `tests/coverage` test suite in "coverage-run" mode only.
1562
- /// Used by `x test` and `x test coverage-run`.
1563
- CoverageRun {
1564
- alias_and_mode: "coverage-run" ,
1565
- default : true ,
1566
- // Compiletest knows how to automatically skip these tests when cross-compiling,
1567
- // but skipping the whole step here makes it clearer that they haven't run at all.
1568
- only_hosts: true ,
1508
+ let Self { compiler, target, mode } = self ;
1509
+ // Like other compiletest suite test steps, delegate to an internal
1510
+ // compiletest task to actually run the tests.
1511
+ builder. ensure ( Compiletest {
1512
+ compiler,
1513
+ target,
1514
+ mode,
1515
+ suite : Self :: SUITE ,
1516
+ path : Self :: PATH ,
1517
+ compare_mode : None ,
1518
+ } ) ;
1569
1519
}
1570
1520
}
1571
1521
0 commit comments