diff --git a/.ci.yaml b/.ci.yaml index e94fccce2af..f31b075cbc6 100755 --- a/.ci.yaml +++ b/.ci.yaml @@ -2913,6 +2913,28 @@ targets: - bin/** - .ci.yaml + - name: Mac tool_host_cross_arch_tests + recipe: flutter/flutter_drone + bringup: true + timeout: 60 + properties: + add_recipes_cq: "true" + dependencies: >- + [ + {"dependency": "xcode"}, + {"dependency": "gems"} + ] + shard: tool_host_cross_arch_tests + tags: > + ["framework","hostonly","shard"] + test_timeout_secs: "2700" + scheduler: luci + runIf: + - dev/** + - packages/flutter_tools/** + - bin/** + - .ci.yaml + - name: Mac tool_integration_tests_1_4 recipe: flutter/flutter_drone timeout: 60 diff --git a/TESTOWNERS b/TESTOWNERS index 769b384f277..d48ef1a5494 100644 --- a/TESTOWNERS +++ b/TESTOWNERS @@ -241,6 +241,7 @@ # flutter_plugins @stuartmorgan @flutter/plugin # framework_tests @HansMuller @flutter/framework # tool_integration_tests @zanderso @flutter/tool +# tool_host_cross_arch_tests @zanderso @flutter/tool # tool_tests @zanderso @flutter/tool # web_integration_tests @yjbanov @flutter/web # web_long_running_tests @yjbanov @flutter/web diff --git a/dev/bots/test.dart b/dev/bots/test.dart index ec93efa0b86..a8532ae097f 100644 --- a/dev/bots/test.dart +++ b/dev/bots/test.dart @@ -200,6 +200,7 @@ Future main(List args) async { // web_tool_tests is also used by HHH: https://dart.googlesource.com/recipes/+/refs/heads/master/recipes/dart/flutter_engine.py 'web_tool_tests': _runWebToolTests, 'tool_integration_tests': _runIntegrationToolTests, + 'tool_host_cross_arch_tests': _runToolHostCrossArchTests, // All the unit/widget tests run using `flutter test --platform=chrome --web-renderer=html` 'web_tests': _runWebHtmlUnitTests, // All the unit/widget tests run using `flutter test --platform=chrome --web-renderer=canvaskit` @@ -331,9 +332,11 @@ Future _runTestHarnessTests() async { exitWithError([versionError]); } +final String _toolsPath = path.join(flutterRoot, 'packages', 'flutter_tools'); + Future _runGeneralToolTests() async { await _dartRunTest( - path.join(flutterRoot, 'packages', 'flutter_tools'), + _toolsPath, testPaths: [path.join('test', 'general.shard')], enableFlutterToolAsserts: false, // Detect unit test time regressions (poor time delay handling, etc). @@ -345,7 +348,7 @@ Future _runGeneralToolTests() async { Future _runCommandsToolTests() async { await _dartRunTest( - path.join(flutterRoot, 'packages', 'flutter_tools'), + _toolsPath, forceSingleCore: true, testPaths: [path.join('test', 'commands.shard')], ); @@ -353,22 +356,30 @@ Future _runCommandsToolTests() async { Future _runWebToolTests() async { await _dartRunTest( - path.join(flutterRoot, 'packages', 'flutter_tools'), + _toolsPath, forceSingleCore: true, testPaths: [path.join('test', 'web.shard')], includeLocalEngineEnv: true, ); } +Future _runToolHostCrossArchTests() { + return _dartRunTest( + _toolsPath, + // These are integration tests + forceSingleCore: true, + testPaths: [path.join('test', 'host_cross_arch.shard')], + ); +} + Future _runIntegrationToolTests() async { - final String toolsPath = path.join(flutterRoot, 'packages', 'flutter_tools'); - final List allTests = Directory(path.join(toolsPath, 'test', 'integration.shard')) + final List allTests = Directory(path.join(_toolsPath, 'test', 'integration.shard')) .listSync(recursive: true).whereType() - .map((FileSystemEntity entry) => path.relative(entry.path, from: toolsPath)) + .map((FileSystemEntity entry) => path.relative(entry.path, from: _toolsPath)) .where((String testPath) => path.basename(testPath).endsWith('_test.dart')).toList(); await _dartRunTest( - toolsPath, + _toolsPath, forceSingleCore: true, testPaths: _selectIndexOfTotalSubshard(allTests), ); diff --git a/packages/flutter_tools/test/host_cross_arch.shard/cache_test.dart b/packages/flutter_tools/test/host_cross_arch.shard/cache_test.dart new file mode 100644 index 00000000000..48068114289 --- /dev/null +++ b/packages/flutter_tools/test/host_cross_arch.shard/cache_test.dart @@ -0,0 +1,56 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:file/file.dart'; +import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/os.dart'; + +import '../integration.shard/test_utils.dart'; +import '../src/common.dart'; + +Future main() async { + test('verify the dart binary arch matches the host arch', () async { + final HostPlatform dartArch = _identifyMacBinaryArch(_dartBinary.path); + final OperatingSystemUtils os = OperatingSystemUtils( + processManager: processManager, + fileSystem: fileSystem, + platform: platform, + logger: BufferLogger.test(), + ); + expect(dartArch, os.hostPlatform); + }, skip: !platform.isMacOS); // [intended] Calls macOS-specific commands +} + +// Call `file` on the path and parse the output. +HostPlatform _identifyMacBinaryArch(String path) { + // Expect STDOUT like: + // bin/cache/dart-sdk/bin/dart: Mach-O 64-bit executable x86_64 + final RegExp pattern = RegExp(r'Mach-O 64-bit executable (\w+)'); + final ProcessResult result = processManager.runSync( + ['file', _dartBinary.path], + ); + final RegExpMatch? match = pattern.firstMatch(result.stdout as String); + if (match == null) { + fail('Unrecognized STDOUT from `file`: "${result.stdout}"'); + } + switch (match.group(1)) { + case 'x86_64': + return HostPlatform.darwin_x64; + case 'arm64': + return HostPlatform.darwin_arm; + default: + fail('Unexpected architecture ${match.group(1)}'); + } +} + +final String _flutterRootPath = getFlutterRoot(); +final Directory _flutterRoot = fileSystem.directory(_flutterRootPath); +final File _dartBinary = _flutterRoot + .childDirectory('bin') + .childDirectory('cache') + .childDirectory('dart-sdk') + .childDirectory('bin') + .childFile('dart') + .absolute; diff --git a/packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart b/packages/flutter_tools/test/host_cross_arch.shard/ios_content_validation_test.dart similarity index 99% rename from packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart rename to packages/flutter_tools/test/host_cross_arch.shard/ios_content_validation_test.dart index e8cb730f82e..3055592b4b1 100644 --- a/packages/flutter_tools/test/integration.shard/ios_content_validation_test.dart +++ b/packages/flutter_tools/test/host_cross_arch.shard/ios_content_validation_test.dart @@ -9,9 +9,9 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/build_info.dart'; +import '../integration.shard/test_utils.dart'; import '../src/common.dart'; import '../src/darwin_common.dart'; -import 'test_utils.dart'; void main() { group('iOS app validation', () { diff --git a/packages/flutter_tools/test/integration.shard/macos_content_validation_test.dart b/packages/flutter_tools/test/host_cross_arch.shard/macos_content_validation_test.dart similarity index 99% rename from packages/flutter_tools/test/integration.shard/macos_content_validation_test.dart rename to packages/flutter_tools/test/host_cross_arch.shard/macos_content_validation_test.dart index f2f17ff1592..4529af59654 100644 --- a/packages/flutter_tools/test/integration.shard/macos_content_validation_test.dart +++ b/packages/flutter_tools/test/host_cross_arch.shard/macos_content_validation_test.dart @@ -8,9 +8,9 @@ import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; +import '../integration.shard/test_utils.dart'; import '../src/common.dart'; import '../src/darwin_common.dart'; -import 'test_utils.dart'; void main() { for (final String buildMode in ['Debug', 'Release']) { diff --git a/packages/flutter_tools/test/integration.shard/bash_entrypoint_test.dart b/packages/flutter_tools/test/integration.shard/bash_entrypoint_test.dart index 2b69951c00a..7377889c24e 100644 --- a/packages/flutter_tools/test/integration.shard/bash_entrypoint_test.dart +++ b/packages/flutter_tools/test/integration.shard/bash_entrypoint_test.dart @@ -7,8 +7,6 @@ import 'dart:convert'; import 'package:file/file.dart'; import 'package:flutter_tools/src/base/io.dart'; -import 'package:flutter_tools/src/base/logger.dart'; -import 'package:flutter_tools/src/base/os.dart'; import '../src/common.dart'; import 'test_utils.dart'; @@ -50,40 +48,6 @@ Future main() async { expect(stdout, contains('Successfully received SIGTERM!')); }, skip: platform.isWindows); // [intended] Windows does not use the bash entrypoint - - test('verify the dart binary arch matches the host arch', () async { - final HostPlatform dartArch = _identifyBinaryArch(dartBinary.path); - final OperatingSystemUtils os = OperatingSystemUtils( - processManager: processManager, - fileSystem: fileSystem, - platform: platform, - logger: BufferLogger.test(), - ); - expect(dartArch, os.hostPlatform); - }, skip: !platform.isMacOS); // [intended] Calls macOS-specific commands -} - -// Call `file` on the path and parse the output. -// This is macOS-specific. -HostPlatform _identifyBinaryArch(String path) { - // Expect STDOUT like: - // bin/cache/dart-sdk/bin/dart: Mach-O 64-bit executable x86_64 - final RegExp pattern = RegExp(r'Mach-O 64-bit executable (\w+)'); - final ProcessResult result = processManager.runSync( - ['file', dartBinary.path], - ); - final RegExpMatch? match = pattern.firstMatch(result.stdout as String); - if (match == null) { - fail('Unrecognized STDOUT from `file`: "${result.stdout}"'); - } - switch (match.group(1)) { - case 'x86_64': - return HostPlatform.darwin_x64; - case 'arm64': - return HostPlatform.darwin_arm; - default: - fail('Unexpected architecture ${match.group(1)}'); - } } // A test Dart app that will run until it receives SIGTERM @@ -105,14 +69,3 @@ File get dartBash { .childFile('dart') .absolute; } - -// The executable bash entrypoint for the Dart binary. -File get dartBinary { - return flutterRoot - .childDirectory('bin') - .childDirectory('cache') - .childDirectory('dart-sdk') - .childDirectory('bin') - .childFile('dart') - .absolute; -}