Remove hard-coded subshard numbers from the test runner (#75189)
This commit is contained in:
parent
bad5df55cb
commit
21f89fe0f2
@ -55,13 +55,6 @@ final List<String> flutterTestArgs = <String>[];
|
|||||||
|
|
||||||
final bool useFlutterTestFormatter = Platform.environment['FLUTTER_TEST_FORMATTER'] == 'true';
|
final bool useFlutterTestFormatter = Platform.environment['FLUTTER_TEST_FORMATTER'] == 'true';
|
||||||
|
|
||||||
|
|
||||||
/// The number of Cirrus jobs that run build tests in parallel.
|
|
||||||
///
|
|
||||||
/// WARNING: if you change this number, also change .cirrus.yml
|
|
||||||
/// and make sure it runs _all_ shards.
|
|
||||||
const int kBuildTestShardCount = 2;
|
|
||||||
|
|
||||||
const String kShardKey = 'SHARD';
|
const String kShardKey = 'SHARD';
|
||||||
const String kSubshardKey = 'SUBSHARD';
|
const String kSubshardKey = 'SUBSHARD';
|
||||||
|
|
||||||
@ -77,12 +70,6 @@ const String kSubshardKey = 'SUBSHARD';
|
|||||||
int get webShardCount => Platform.environment.containsKey('WEB_SHARD_COUNT')
|
int get webShardCount => Platform.environment.containsKey('WEB_SHARD_COUNT')
|
||||||
? int.parse(Platform.environment['WEB_SHARD_COUNT'])
|
? int.parse(Platform.environment['WEB_SHARD_COUNT'])
|
||||||
: 8;
|
: 8;
|
||||||
|
|
||||||
/// The number of shards the long-running Web tests are split into.
|
|
||||||
///
|
|
||||||
/// WARNING: this number must match the shard count in LUCI configs.
|
|
||||||
const int kWebLongRunningTestShardCount = 3;
|
|
||||||
|
|
||||||
/// Tests that we don't run on Web for compilation reasons.
|
/// Tests that we don't run on Web for compilation reasons.
|
||||||
//
|
//
|
||||||
// TODO(yjbanov): we're getting rid of this as part of https://github.com/flutter/flutter/projects/60
|
// TODO(yjbanov): we're getting rid of this as part of https://github.com/flutter/flutter/projects/60
|
||||||
@ -405,10 +392,7 @@ Future<void> _runBuildTests() async {
|
|||||||
],
|
],
|
||||||
]..shuffle(math.Random(0));
|
]..shuffle(math.Random(0));
|
||||||
|
|
||||||
if (!await _runShardRunnerIndexOfTotalSubshard(tests)) {
|
await _runShardRunnerIndexOfTotalSubshard(tests);
|
||||||
// TODO(jmagman): Remove fallback once LUCI configs are migrated to d+_d+ subshard format.
|
|
||||||
await _selectIndexedSubshard(tests, kBuildTestShardCount);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> _runExampleProjectBuildTests(FileSystemEntity exampleDirectory) async {
|
Future<void> _runExampleProjectBuildTests(FileSystemEntity exampleDirectory) async {
|
||||||
@ -844,8 +828,6 @@ Future<void> _runWebUnitTests() async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Coarse-grained integration tests running on the Web.
|
/// Coarse-grained integration tests running on the Web.
|
||||||
///
|
|
||||||
/// These tests are sharded into [kWebLongRunningTestShardCount] shards.
|
|
||||||
Future<void> _runWebLongRunningTests() async {
|
Future<void> _runWebLongRunningTests() async {
|
||||||
final List<ShardRunner> tests = <ShardRunner>[
|
final List<ShardRunner> tests = <ShardRunner>[
|
||||||
() => _runGalleryE2eWebTest('debug'),
|
() => _runGalleryE2eWebTest('debug'),
|
||||||
@ -856,10 +838,7 @@ Future<void> _runWebLongRunningTests() async {
|
|||||||
() => _runGalleryE2eWebTest('release', canvasKit: true),
|
() => _runGalleryE2eWebTest('release', canvasKit: true),
|
||||||
];
|
];
|
||||||
await _ensureChromeDriverIsRunning();
|
await _ensureChromeDriverIsRunning();
|
||||||
if (!await _runShardRunnerIndexOfTotalSubshard(tests)) {
|
await _runShardRunnerIndexOfTotalSubshard(tests);
|
||||||
// TODO(jmagman): Remove fallback once LUCI configs are migrated to d+_d+ subshard format.
|
|
||||||
await _selectIndexedSubshard(tests, kWebLongRunningTestShardCount);
|
|
||||||
}
|
|
||||||
await _stopChromeDriver();
|
await _stopChromeDriver();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1475,37 +1454,6 @@ Future<String> verifyVersion(File file) async {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parse (zero-)index-named subshards and equally distribute [tests]
|
|
||||||
/// between them. Last shard should end in "_last" to catch mismatches
|
|
||||||
/// between `.cirrus.yml` and `test.dart`. See [selectShard] for naming details.
|
|
||||||
///
|
|
||||||
/// Examples:
|
|
||||||
/// build_tests-0-linux
|
|
||||||
/// build_tests-1-linux
|
|
||||||
/// build_tests-2_last-linux
|
|
||||||
Future<void> _selectIndexedSubshard(List<ShardRunner> tests, int numberOfShards) async {
|
|
||||||
final int testsPerShard = tests.length ~/ numberOfShards;
|
|
||||||
final Map<String, ShardRunner> subshards = <String, ShardRunner>{};
|
|
||||||
|
|
||||||
for (int subshard = 0; subshard < numberOfShards; subshard += 1) {
|
|
||||||
String last = '';
|
|
||||||
List<ShardRunner> sublist;
|
|
||||||
if (subshard < numberOfShards - 1) {
|
|
||||||
sublist = tests.sublist(subshard * testsPerShard, (subshard + 1) * testsPerShard);
|
|
||||||
} else {
|
|
||||||
sublist = tests.sublist(subshard * testsPerShard, tests.length);
|
|
||||||
// We make sure the last shard ends in _last.
|
|
||||||
last = '_last';
|
|
||||||
}
|
|
||||||
subshards['$subshard$last'] = () async {
|
|
||||||
for (final ShardRunner test in sublist)
|
|
||||||
await test();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
await selectSubshard(subshards);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parse (one-)index/total-named subshards from environment variable SUBSHARD
|
/// Parse (one-)index/total-named subshards from environment variable SUBSHARD
|
||||||
/// and equally distribute [tests] between them.
|
/// and equally distribute [tests] between them.
|
||||||
/// Subshard format is "{index}_{total number of shards}".
|
/// Subshard format is "{index}_{total number of shards}".
|
||||||
@ -1529,8 +1477,7 @@ List<T> _selectIndexOfTotalSubshard<T>(List<T> tests, {String subshardKey = kSub
|
|||||||
final Match match = pattern.firstMatch(subshardName);
|
final Match match = pattern.firstMatch(subshardName);
|
||||||
if (match == null || match.groupCount != 2) {
|
if (match == null || match.groupCount != 2) {
|
||||||
print('${red}Invalid subshard name "$subshardName". Expected format "[int]_[int]" ex. "1_3"');
|
print('${red}Invalid subshard name "$subshardName". Expected format "[int]_[int]" ex. "1_3"');
|
||||||
// TODO(jmagman): exit(1) here instead once LUCI configs are migrated to d+_d+ subshard format.
|
exit(1);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
// One-indexed.
|
// One-indexed.
|
||||||
final int index = int.parse(match.group(1));
|
final int index = int.parse(match.group(1));
|
||||||
@ -1548,25 +1495,25 @@ List<T> _selectIndexOfTotalSubshard<T>(List<T> tests, {String subshardKey = kSub
|
|||||||
return tests.sublist(start, end);
|
return tests.sublist(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> _runShardRunnerIndexOfTotalSubshard(List<ShardRunner> tests) async {
|
Future<void> _runShardRunnerIndexOfTotalSubshard(List<ShardRunner> tests) async {
|
||||||
final List<ShardRunner> sublist = _selectIndexOfTotalSubshard<ShardRunner>(tests);
|
final List<ShardRunner> sublist = _selectIndexOfTotalSubshard<ShardRunner>(tests);
|
||||||
// TODO(jmagman): Remove the boolean return to indicate fallback to unsharded variant once LUCI configs are migrated to d+_d+ subshard format.
|
|
||||||
if (sublist == null) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (final ShardRunner test in sublist) {
|
for (final ShardRunner test in sublist) {
|
||||||
await test();
|
await test();
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// If the CIRRUS_TASK_NAME environment variable exists, we use that to determine
|
/// If the CIRRUS_TASK_NAME environment variable exists, we use that to determine
|
||||||
/// the shard and sub-shard (parsing it in the form shard-subshard-platform, ignoring
|
/// the shard and sub-shard (parsing it in the form shard-subshard-platform, ignoring
|
||||||
/// the platform).
|
/// the platform).
|
||||||
///
|
///
|
||||||
/// However, for local testing you can just set the SHARD and SUBSHARD
|
/// For local testing you can just set the SHARD and SUBSHARD
|
||||||
/// environment variables. For example, to run all the framework tests you can
|
/// environment variables. For example, to run all the framework tests you can
|
||||||
/// just set SHARD=framework_tests. To run specifically the third subshard of
|
/// just set SHARD=framework_tests. Some shards support named subshards, like
|
||||||
|
/// SHARD=framework_tests SUBSHARD=widgets. Others support arbitrary numbered
|
||||||
|
/// subsharding, like SHARD=build_tests SUBSHARD=1_2 (where 1_2 means "one of two"
|
||||||
|
/// as in run the first half of the tests).
|
||||||
|
///
|
||||||
|
/// To run specifically the third subshard of
|
||||||
/// the Web tests you can set SHARD=web_tests SUBSHARD=2 (it's zero-based).
|
/// the Web tests you can set SHARD=web_tests SUBSHARD=2 (it's zero-based).
|
||||||
Future<void> selectShard(Map<String, ShardRunner> shards) => _runFromList(shards, kShardKey, 'shard', 0);
|
Future<void> selectShard(Map<String, ShardRunner> shards) => _runFromList(shards, kShardKey, 'shard', 0);
|
||||||
Future<void> selectSubshard(Map<String, ShardRunner> subshards) => _runFromList(subshards, kSubshardKey, 'subshard', 1);
|
Future<void> selectSubshard(Map<String, ShardRunner> subshards) => _runFromList(subshards, kSubshardKey, 'subshard', 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user