From 22239f41833afa4f26ba53dc50ce1a022fa06ca3 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 4 May 2020 11:19:02 -0700 Subject: [PATCH] Test engine version hash, but skip for Dart HHH bot (#55223) --- dev/bots/run_command.dart | 2 +- dev/bots/test.dart | 50 +++++++++++++++++++++++++++++++++++---- dev/bots/utils.dart | 2 +- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/dev/bots/run_command.dart b/dev/bots/run_command.dart index 1e260325642..3f194017e41 100644 --- a/dev/bots/run_command.dart +++ b/dev/bots/run_command.dart @@ -80,7 +80,7 @@ Future runCommand(String executable, List arguments, { ); final String commandDescription = '${path.relative(executable, from: workingDirectory)} ${arguments.join(' ')}'; - final String relativeWorkingDir = path.relative(workingDirectory); + final String relativeWorkingDir = path.relative(workingDirectory ?? Directory.current.path); if (skip) { printProgress('SKIPPING', relativeWorkingDir, commandDescription); return; diff --git a/dev/bots/test.dart b/dev/bots/test.dart index 035d07b818e..b84566a4fee 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -28,12 +28,26 @@ typedef ShardRunner = Future Function(); /// appropriate error message. typedef OutputChecker = String Function(CapturedOutput); +final String exe = Platform.isWindows ? '.exe' : ''; +final String bat = Platform.isWindows ? '.bat' : ''; final String flutterRoot = path.dirname(path.dirname(path.dirname(path.fromUri(Platform.script)))); -final String flutter = path.join(flutterRoot, 'bin', Platform.isWindows ? 'flutter.bat' : 'flutter'); -final String dart = path.join(flutterRoot, 'bin', 'cache', 'dart-sdk', 'bin', Platform.isWindows ? 'dart.exe' : 'dart'); -final String pub = path.join(flutterRoot, 'bin', 'cache', 'dart-sdk', 'bin', Platform.isWindows ? 'pub.bat' : 'pub'); +final String flutter = path.join(flutterRoot, 'bin', 'flutter$bat'); +final String dart = path.join(flutterRoot, 'bin', 'cache', 'dart-sdk', 'bin', 'dart$exe'); +final String pub = path.join(flutterRoot, 'bin', 'cache', 'dart-sdk', 'bin', 'pub$bat'); final String pubCache = path.join(flutterRoot, '.pub-cache'); final String toolRoot = path.join(flutterRoot, 'packages', 'flutter_tools'); +final String engineVersionFile = path.join(flutterRoot, 'bin', 'internal', 'engine.version'); + +String get platformFolderName { + if (Platform.isWindows) + return 'windows-x64'; + if (Platform.isMacOS) + return 'darwin-x64'; + if (Platform.isLinux) + return 'linux-x64'; + throw UnsupportedError('The platform ${Platform.operatingSystem} is not supported by this script.'); +} +final String flutterTester = path.join(flutterRoot, 'bin', 'cache', 'artifacts', 'engine', platformFolderName, 'flutter_tester$exe'); /// The arguments to pass to `flutter test` (typically the local engine /// configuration) -- prefilled with the arguments passed to test.dart. @@ -118,8 +132,37 @@ Future main(List args) async { print('$clock ${bold}Test successful.$reset'); } +/// Verify the Flutter Engine is the revision in +/// bin/cache/internal/engine.version. +Future _validateEngineHash() async { + final String luciBotId = Platform.environment['SWARMING_BOT_ID'] ?? ''; + if (luciBotId.startsWith('luci-dart-')) { + // The Dart HHH bots intentionally modify the local artifact cache + // and then use this script to run Flutter's test suites. + // Because the artifacts have been changed, this particular test will return + // a false positive and should be skipped. + print('${yellow}Skipping Flutter Engine Version Validation for swarming ' + 'bot $luciBotId.'); + return; + } + final String expectedVersion = File(engineVersionFile).readAsStringSync().trim(); + final CapturedOutput flutterTesterOutput = CapturedOutput(); + await runCommand(flutterTester, ['--help'], output: flutterTesterOutput, outputMode: OutputMode.capture); + final String actualVersion = flutterTesterOutput.stderr.split('\n').firstWhere((final String line) { + return line.startsWith('Flutter Engine Version:'); + }); + if (!actualVersion.contains(expectedVersion)) { + print('${red}Expected "Flutter Engine Version: $expectedVersion", ' + 'but found "$actualVersion".'); + exit(1); + } +} + Future _runSmokeTests() async { print('${green}Running smoketests...$reset'); + + await _validateEngineHash(); + // Verify that the tests actually return failure on failure and success on // success. final String automatedTests = path.join(flutterRoot, 'dev', 'automated_tests'); @@ -1249,7 +1292,6 @@ int get prNumber { } Future _getAuthors() async { - final String exe = Platform.isWindows ? '.exe' : ''; final String author = await runAndGetStdout( 'git$exe', ['-c', 'log.showSignature=false', 'log', gitHash, '--pretty="%an <%ae>"'], workingDirectory: flutterRoot, diff --git a/dev/bots/utils.dart b/dev/bots/utils.dart index 92b2ef62ef0..34e105e3f39 100644 --- a/dev/bots/utils.dart +++ b/dev/bots/utils.dart @@ -12,7 +12,7 @@ final bool hasColor = stdout.supportsAnsiEscapes; final String bold = hasColor ? '\x1B[1m' : ''; // used for shard titles final String red = hasColor ? '\x1B[31m' : ''; // used for errors final String green = hasColor ? '\x1B[32m' : ''; // used for section titles, commands -final String yellow = hasColor ? '\x1B[33m' : ''; // unused +final String yellow = hasColor ? '\x1B[33m' : ''; // used for skips final String cyan = hasColor ? '\x1B[36m' : ''; // used for paths final String reverse = hasColor ? '\x1B[7m' : ''; // used for clocks final String reset = hasColor ? '\x1B[0m' : '';