From ceca606662d8b7a6b3889f77ca2bb83ca0919dbb Mon Sep 17 00:00:00 2001 From: "auto-submit[bot]" <98614782+auto-submit[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 00:01:18 +0000 Subject: [PATCH] Reverts "Move native assets to `isolated/` directory" (#143027) Reverts flutter/flutter#142709 Initiated by: vashworth Reason for reverting: `Mac tool_tests_general` started failing on this commit: https://ci.chromium.org/ui/p/flutter/builders/prod/Mac%20tool_tests_general/15552/overview Original PR Author: dcharkes Reviewed By: {christopherfujino, chingjun, reidbaker} This change reverts the following previous change: Original Description: Native assets in other build systems are not built with `package:native_assets_builder` invoking `build.dart` scripts. Instead all packages have their own blaze rules. Therefore we'd like to not depend on `package:native_assets_builder` from flutter tools in g3 at all. This PR aims to move the imports of `native_assets_builder` and `native_assets_cli` into the `isolated/` directory and into the files with a `main` function that are not used in with other build systems. In order to be able to remove all imports in files used by other build systems, two new interfaces are added `HotRunnerNativeAssetsBuilder` and `TestCompilerNativeAssetsBuilder`. New parameters are then piped all the way through from the entry points: * bin/fuchsia_tester.dart * lib/executable.dart The build_system/targets dir is already excluded in other build systems. So, after this PR only the two above files and build_system/targets import from `isolated/native_assets/` and only `isolated/native_assets/` import `package:native_assets_cli` and `package:native_assets_builder`. Context: * https://github.com/flutter/flutter/issues/142041 --- .../flutter_tools/bin/fuchsia_tester.dart | 2 - packages/flutter_tools/lib/executable.dart | 14 +- .../android/native_assets.dart | 14 +- .../build_system/targets/native_assets.dart | 12 +- .../lib/src/commands/attach.dart | 11 +- .../lib/src/commands/daemon.dart | 2 - .../flutter_tools/lib/src/commands/run.dart | 10 +- .../flutter_tools/lib/src/commands/test.dart | 5 - .../native_assets => }/ios/native_assets.dart | 6 +- .../lib/src/isolated/native_assets/README.md | 4 - .../native_assets/test/native_assets.dart | 80 --- .../linux/native_assets.dart | 10 +- .../macos/native_assets.dart | 6 +- .../macos/native_assets_host.dart | 12 +- .../native_assets => }/native_assets.dart | 51 +- packages/flutter_tools/lib/src/run_hot.dart | 30 +- .../lib/src/test/flutter_platform.dart | 19 +- .../flutter_tools/lib/src/test/runner.dart | 4 - .../lib/src/test/test_compiler.dart | 76 ++- .../windows/native_assets.dart | 9 +- .../commands.shard/hermetic/attach_test.dart | 1 - .../commands.shard/hermetic/run_test.dart | 2 - .../commands.shard/hermetic/test_test.dart | 2 - .../android/native_assets_test.dart | 8 +- .../targets/native_assets_test.dart | 8 +- .../fake_native_assets_build_runner.dart | 28 +- .../test/general.shard/hot_shared.dart | 231 ------- .../test/general.shard/hot_test.dart | 362 ++++++++++- .../ios/native_assets_test.dart | 8 +- .../test/general.shard/isolated/hot_test.dart | 164 ----- .../isolated/resident_runner_test.dart | 121 ---- .../linux/native_assets_test.dart | 10 +- .../macos/native_assets_host_test.dart | 4 +- .../macos/native_assets_test.dart | 10 +- .../resident_runner_helpers.dart | 529 --------------- .../general.shard/resident_runner_test.dart | 606 +++++++++++++++++- .../windows/native_assets_test.dart | 10 +- .../{isolated => }/native_assets_test.dart | 6 +- 38 files changed, 1119 insertions(+), 1368 deletions(-) rename packages/flutter_tools/lib/src/{isolated/native_assets => }/android/native_assets.dart (97%) rename packages/flutter_tools/lib/src/{isolated/native_assets => }/ios/native_assets.dart (98%) delete mode 100644 packages/flutter_tools/lib/src/isolated/native_assets/README.md delete mode 100644 packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart rename packages/flutter_tools/lib/src/{isolated/native_assets => }/linux/native_assets.dart (94%) rename packages/flutter_tools/lib/src/{isolated/native_assets => }/macos/native_assets.dart (99%) rename packages/flutter_tools/lib/src/{isolated/native_assets => }/macos/native_assets_host.dart (96%) rename packages/flutter_tools/lib/src/{isolated/native_assets => }/native_assets.dart (95%) rename packages/flutter_tools/lib/src/{isolated/native_assets => }/windows/native_assets.dart (93%) rename packages/flutter_tools/test/general.shard/{isolated => }/android/native_assets_test.dart (98%) rename packages/flutter_tools/test/general.shard/{isolated => }/build_system/targets/native_assets_test.dart (97%) rename packages/flutter_tools/test/general.shard/{isolated => }/fake_native_assets_build_runner.dart (78%) delete mode 100644 packages/flutter_tools/test/general.shard/hot_shared.dart rename packages/flutter_tools/test/general.shard/{isolated => }/ios/native_assets_test.dart (98%) delete mode 100644 packages/flutter_tools/test/general.shard/isolated/hot_test.dart delete mode 100644 packages/flutter_tools/test/general.shard/isolated/resident_runner_test.dart rename packages/flutter_tools/test/general.shard/{isolated => }/linux/native_assets_test.dart (98%) rename packages/flutter_tools/test/general.shard/{isolated => }/macos/native_assets_host_test.dart (94%) rename packages/flutter_tools/test/general.shard/{isolated => }/macos/native_assets_test.dart (98%) delete mode 100644 packages/flutter_tools/test/general.shard/resident_runner_helpers.dart rename packages/flutter_tools/test/general.shard/{isolated => }/windows/native_assets_test.dart (98%) rename packages/flutter_tools/test/integration.shard/{isolated => }/native_assets_test.dart (99%) diff --git a/packages/flutter_tools/bin/fuchsia_tester.dart b/packages/flutter_tools/bin/fuchsia_tester.dart index 49392494a8e..c0017d25a5f 100644 --- a/packages/flutter_tools/bin/fuchsia_tester.dart +++ b/packages/flutter_tools/bin/fuchsia_tester.dart @@ -16,7 +16,6 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/context_runner.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/isolated/native_assets/test/native_assets.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/test/coverage_collector.dart'; @@ -154,7 +153,6 @@ Future run(List args) async { concurrency: math.max(1, globals.platform.numberOfProcessors - 2), icudtlPath: globals.fs.path.absolute(argResults[_kOptionIcudtl] as String), coverageDirectory: coverageDirectory, - nativeAssetsBuilder: const TestCompilerNativeAssetsBuilderImpl(), ); if (collector != null) { diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index 8e7aef05857..a1894b0f7cd 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -50,8 +50,6 @@ import 'src/globals.dart' as globals; // Files in `isolated` are intentionally excluded from google3 tooling. import 'src/isolated/build_targets.dart'; import 'src/isolated/mustache_template.dart'; -import 'src/isolated/native_assets/native_assets.dart'; -import 'src/isolated/native_assets/test/native_assets.dart'; import 'src/isolated/resident_web_runner.dart'; import 'src/pre_run_validator.dart'; import 'src/project_validator.dart'; @@ -179,7 +177,6 @@ List generateCommands({ platform: globals.platform, processInfo: globals.processInfo, fileSystem: globals.fs, - nativeAssetsBuilder: const HotRunnerNativeAssetsBuilderImpl(), ), BuildCommand( artifacts: globals.artifacts!, @@ -240,17 +237,10 @@ List generateCommands({ platform: globals.platform, featureFlags: featureFlags, ), - RunCommand( - verboseHelp: verboseHelp, - nativeAssetsBuilder: const HotRunnerNativeAssetsBuilderImpl(), - ), + RunCommand(verboseHelp: verboseHelp), ScreenshotCommand(fs: globals.fs), ShellCompletionCommand(), - TestCommand( - verboseHelp: verboseHelp, - verbose: verbose, - nativeAssetsBuilder: const TestCompilerNativeAssetsBuilderImpl(), - ), + TestCommand(verboseHelp: verboseHelp, verbose: verbose), UpgradeCommand(verboseHelp: verboseHelp), SymbolizeCommand( stdio: globals.stdio, diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart b/packages/flutter_tools/lib/src/android/native_assets.dart similarity index 97% rename from packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart rename to packages/flutter_tools/lib/src/android/native_assets.dart index c2b40011c74..91fbc6f89b4 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/android/native_assets.dart +++ b/packages/flutter_tools/lib/src/android/native_assets.dart @@ -4,17 +4,17 @@ import 'package:native_assets_builder/native_assets_builder.dart' show BuildResult, DryRunResult; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - as native_assets_cli; import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode; +import 'package:native_assets_cli/native_assets_cli_internal.dart' + as native_assets_cli; -import '../../../android/android_sdk.dart'; -import '../../../base/common.dart'; -import '../../../base/file_system.dart'; -import '../../../build_info.dart'; -import '../../../globals.dart' as globals; +import '../base/common.dart'; +import '../base/file_system.dart'; +import '../build_info.dart'; +import '../globals.dart' as globals; import '../native_assets.dart'; +import 'android_sdk.dart'; /// Dry run the native builds. /// diff --git a/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart b/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart index 967546e14a9..45e999fd5cd 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart @@ -7,18 +7,18 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart' show Asset; import 'package:package_config/package_config_types.dart'; import '../../android/gradle_utils.dart'; +import '../../android/native_assets.dart'; import '../../base/common.dart'; import '../../base/file_system.dart'; import '../../base/platform.dart'; import '../../build_info.dart'; import '../../dart/package_map.dart'; -import '../../isolated/native_assets/android/native_assets.dart'; -import '../../isolated/native_assets/ios/native_assets.dart'; -import '../../isolated/native_assets/linux/native_assets.dart'; -import '../../isolated/native_assets/macos/native_assets.dart'; -import '../../isolated/native_assets/native_assets.dart'; -import '../../isolated/native_assets/windows/native_assets.dart'; +import '../../ios/native_assets.dart'; +import '../../linux/native_assets.dart'; +import '../../macos/native_assets.dart'; import '../../macos/xcode.dart'; +import '../../native_assets.dart'; +import '../../windows/native_assets.dart'; import '../build_system.dart'; import '../depfile.dart'; import '../exceptions.dart'; diff --git a/packages/flutter_tools/lib/src/commands/attach.dart b/packages/flutter_tools/lib/src/commands/attach.dart index 9ff56ebde29..c5a875db796 100644 --- a/packages/flutter_tools/lib/src/commands/attach.dart +++ b/packages/flutter_tools/lib/src/commands/attach.dart @@ -71,7 +71,6 @@ class AttachCommand extends FlutterCommand { required Platform platform, required ProcessInfo processInfo, required FileSystem fileSystem, - HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, }) : _hotRunnerFactory = hotRunnerFactory ?? HotRunnerFactory(), _stdio = stdio, _logger = logger, @@ -79,8 +78,7 @@ class AttachCommand extends FlutterCommand { _signals = signals, _platform = platform, _processInfo = processInfo, - _fileSystem = fileSystem, - _nativeAssetsBuilder = nativeAssetsBuilder { + _fileSystem = fileSystem { addBuildModeFlags(verboseHelp: verboseHelp, defaultToRelease: false, excludeRelease: true); usesTargetOption(); usesPortOptions(verboseHelp: verboseHelp); @@ -152,7 +150,6 @@ class AttachCommand extends FlutterCommand { final Platform _platform; final ProcessInfo _processInfo; final FileSystem _fileSystem; - final HotRunnerNativeAssetsBuilder? _nativeAssetsBuilder; @override final String name = 'attach'; @@ -419,7 +416,6 @@ known, it can be explicitly provided to attach via the command-line, e.g. device: device, flutterProject: flutterProject, usesIpv6: usesIpv6, - nativeAssetsBuilder: _nativeAssetsBuilder, ); late AppInstance app; try { @@ -453,7 +449,6 @@ known, it can be explicitly provided to attach via the command-line, e.g. device: device, flutterProject: flutterProject, usesIpv6: usesIpv6, - nativeAssetsBuilder: _nativeAssetsBuilder, ); final Completer onAppStart = Completer.sync(); TerminalHandler? terminalHandler; @@ -510,7 +505,6 @@ known, it can be explicitly provided to attach via the command-line, e.g. required Device device, required FlutterProject flutterProject, required bool usesIpv6, - required HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, }) async { final BuildInfo buildInfo = await getBuildInfo(); @@ -545,7 +539,6 @@ known, it can be explicitly provided to attach via the command-line, e.g. ipv6: usesIpv6, flutterProject: flutterProject, nativeAssetsYamlFile: stringArg(FlutterOptions.kNativeAssetsYamlFile), - nativeAssetsBuilder: _nativeAssetsBuilder, analytics: analytics, ) : ColdRunner( @@ -580,7 +573,6 @@ class HotRunnerFactory { bool ipv6 = false, FlutterProject? flutterProject, String? nativeAssetsYamlFile, - required HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, required Analytics analytics, }) => HotRunner( devices, @@ -594,7 +586,6 @@ class HotRunnerFactory { stayResident: stayResident, ipv6: ipv6, nativeAssetsYamlFile: nativeAssetsYamlFile, - nativeAssetsBuilder: nativeAssetsBuilder, analytics: analytics, ); } diff --git a/packages/flutter_tools/lib/src/commands/daemon.dart b/packages/flutter_tools/lib/src/commands/daemon.dart index 05bac1d14ec..435cf7eeac9 100644 --- a/packages/flutter_tools/lib/src/commands/daemon.dart +++ b/packages/flutter_tools/lib/src/commands/daemon.dart @@ -654,7 +654,6 @@ class AppDomain extends Domain { bool machine = true, String? userIdentifier, bool enableDevTools = true, - required HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, }) async { if (!await device.supportsRuntimeMode(options.buildInfo.mode)) { throw Exception( @@ -706,7 +705,6 @@ class AppDomain extends Domain { hostIsIde: true, machine: machine, analytics: globals.analytics, - nativeAssetsBuilder: nativeAssetsBuilder, ); } else { runner = ColdRunner( diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index ceccfbd939d..16fbf806066 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -334,11 +334,7 @@ abstract class RunCommandBase extends FlutterCommand with DeviceBasedDevelopment } class RunCommand extends RunCommandBase { - RunCommand({ - bool verboseHelp = false, - HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, - }) : _nativeAssetsBuilder = nativeAssetsBuilder, - super(verboseHelp: verboseHelp) { + RunCommand({ bool verboseHelp = false }) : super(verboseHelp: verboseHelp) { requiresPubspecYaml(); usesFilesystemOptions(hide: !verboseHelp); usesExtraDartFlagOptions(verboseHelp: verboseHelp); @@ -422,8 +418,6 @@ class RunCommand extends RunCommandBase { ); } - final HotRunnerNativeAssetsBuilder? _nativeAssetsBuilder; - @override final String name = 'run'; @@ -666,7 +660,6 @@ class RunCommand extends RunCommandBase { ipv6: ipv6 ?? false, analytics: globals.analytics, nativeAssetsYamlFile: stringArg(FlutterOptions.kNativeAssetsYamlFile), - nativeAssetsBuilder: _nativeAssetsBuilder, ); } else if (webMode) { return webRunnerFactory!.createWebRunner( @@ -740,7 +733,6 @@ class RunCommand extends RunCommandBase { ipv6: ipv6 ?? false, userIdentifier: userIdentifier, enableDevTools: boolArg(FlutterCommand.kEnableDevTools), - nativeAssetsBuilder: _nativeAssetsBuilder, ); } on Exception catch (error) { throwToolExit(error.toString()); diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 63e3fddf1bb..2bed07aa131 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -18,7 +18,6 @@ import '../runner/flutter_command.dart'; import '../test/coverage_collector.dart'; import '../test/event_printer.dart'; import '../test/runner.dart'; -import '../test/test_compiler.dart'; import '../test/test_time_recorder.dart'; import '../test/test_wrapper.dart'; import '../test/watcher.dart'; @@ -64,7 +63,6 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { this.testWrapper = const TestWrapper(), this.testRunner = const FlutterTestRunner(), this.verbose = false, - this.nativeAssetsBuilder, }) { requiresPubspecYaml(); usesPubOption(); @@ -239,8 +237,6 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { /// Interface for running the tester process. final FlutterTestRunner testRunner; - final TestCompilerNativeAssetsBuilder? nativeAssetsBuilder; - final bool verbose; @visibleForTesting @@ -508,7 +504,6 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { integrationTestDevice: integrationTestDevice, integrationTestUserIdentifier: stringArg(FlutterOptions.kDeviceUser), testTimeRecorder: testTimeRecorder, - nativeAssetsBuilder: nativeAssetsBuilder, ); testTimeRecorder?.stop(TestTimePhases.TestRunner, testRunnerTimeRecorderStopwatch!); diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart b/packages/flutter_tools/lib/src/ios/native_assets.dart similarity index 98% rename from packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart rename to packages/flutter_tools/lib/src/ios/native_assets.dart index 24e1beb78d9..5327ca7280e 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/ios/native_assets.dart +++ b/packages/flutter_tools/lib/src/ios/native_assets.dart @@ -9,9 +9,9 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart' import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; -import '../../../base/file_system.dart'; -import '../../../build_info.dart'; -import '../../../globals.dart' as globals; +import '../base/file_system.dart'; +import '../build_info.dart'; +import '../globals.dart' as globals; import '../macos/native_assets_host.dart'; import '../native_assets.dart'; diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/README.md b/packages/flutter_tools/lib/src/isolated/native_assets/README.md deleted file mode 100644 index d775029fdc3..00000000000 --- a/packages/flutter_tools/lib/src/isolated/native_assets/README.md +++ /dev/null @@ -1,4 +0,0 @@ -The directory structure in here mirrors the directory structure in lib/src/. - -The native assets feature lives in lib/src/isolated/ because this code is not -used in other build systems. diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart b/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart deleted file mode 100644 index 206f1afa42e..00000000000 --- a/packages/flutter_tools/lib/src/isolated/native_assets/test/native_assets.dart +++ /dev/null @@ -1,80 +0,0 @@ -// 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. - -// Logic for native assets shared between all host OSes. - -import '../../../base/os.dart'; -import '../../../base/platform.dart'; -import '../../../build_info.dart'; -import '../../../globals.dart' as globals; -import '../../../project.dart'; -import '../../../test/test_compiler.dart'; -import '../linux/native_assets.dart'; -import '../macos/native_assets.dart'; -import '../native_assets.dart'; -import '../windows/native_assets.dart'; - -class TestCompilerNativeAssetsBuilderImpl - implements TestCompilerNativeAssetsBuilder { - const TestCompilerNativeAssetsBuilderImpl(); - - @override - Future build(BuildInfo buildInfo) => - testCompilerBuildNativeAssets(buildInfo); -} - -Future testCompilerBuildNativeAssets(BuildInfo buildInfo) async { - Uri? nativeAssetsYaml; - if (!buildInfo.buildNativeAssets) { - nativeAssetsYaml = null; - } else { - final Uri projectUri = FlutterProject.current().directory.uri; - final NativeAssetsBuildRunner buildRunner = NativeAssetsBuildRunnerImpl( - projectUri, - buildInfo.packageConfig, - globals.fs, - globals.logger, - ); - if (globals.platform.isMacOS) { - (nativeAssetsYaml, _) = await buildNativeAssetsMacOS( - buildMode: buildInfo.mode, - projectUri: projectUri, - flutterTester: true, - fileSystem: globals.fs, - buildRunner: buildRunner, - ); - } else if (globals.platform.isLinux) { - (nativeAssetsYaml, _) = await buildNativeAssetsLinux( - buildMode: buildInfo.mode, - projectUri: projectUri, - flutterTester: true, - fileSystem: globals.fs, - buildRunner: buildRunner, - ); - } else if (globals.platform.isWindows) { - final TargetPlatform targetPlatform; - if (globals.os.hostPlatform == HostPlatform.windows_x64) { - targetPlatform = TargetPlatform.windows_x64; - } else { - targetPlatform = TargetPlatform.windows_arm64; - } - (nativeAssetsYaml, _) = await buildNativeAssetsWindows( - buildMode: buildInfo.mode, - targetPlatform: targetPlatform, - projectUri: projectUri, - flutterTester: true, - fileSystem: globals.fs, - buildRunner: buildRunner, - ); - } else { - await ensureNoNativeAssetsOrOsIsSupported( - projectUri, - const LocalPlatform().operatingSystem, - globals.fs, - buildRunner, - ); - } - } - return nativeAssetsYaml; -} diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart b/packages/flutter_tools/lib/src/linux/native_assets.dart similarity index 94% rename from packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart rename to packages/flutter_tools/lib/src/linux/native_assets.dart index 47c6d57216f..7b8bb0fc480 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/linux/native_assets.dart +++ b/packages/flutter_tools/lib/src/linux/native_assets.dart @@ -5,11 +5,11 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode; -import '../../../base/common.dart'; -import '../../../base/file_system.dart'; -import '../../../base/io.dart'; -import '../../../build_info.dart'; -import '../../../globals.dart' as globals; +import '../base/common.dart'; +import '../base/file_system.dart'; +import '../base/io.dart'; +import '../build_info.dart'; +import '../globals.dart' as globals; import '../native_assets.dart'; /// Dry run the native builds. diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart b/packages/flutter_tools/lib/src/macos/native_assets.dart similarity index 99% rename from packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart rename to packages/flutter_tools/lib/src/macos/native_assets.dart index c68a8f8d2ab..eb609c04ee4 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets.dart +++ b/packages/flutter_tools/lib/src/macos/native_assets.dart @@ -9,9 +9,9 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart' import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; -import '../../../base/file_system.dart'; -import '../../../build_info.dart'; -import '../../../globals.dart' as globals; +import '../base/file_system.dart'; +import '../build_info.dart'; +import '../globals.dart' as globals; import '../native_assets.dart'; import 'native_assets_host.dart'; diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart b/packages/flutter_tools/lib/src/macos/native_assets_host.dart similarity index 96% rename from packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart rename to packages/flutter_tools/lib/src/macos/native_assets_host.dart index b0bfb0e7e7c..e86ea7e4748 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/macos/native_assets_host.dart +++ b/packages/flutter_tools/lib/src/macos/native_assets_host.dart @@ -7,12 +7,12 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode; -import '../../../base/common.dart'; -import '../../../base/file_system.dart'; -import '../../../base/io.dart'; -import '../../../build_info.dart'; -import '../../../convert.dart'; -import '../../../globals.dart' as globals; +import '../base/common.dart'; +import '../base/file_system.dart'; +import '../base/io.dart'; +import '../build_info.dart'; +import '../convert.dart'; +import '../globals.dart' as globals; /// Create an `Info.plist` in [target] for a framework with a single dylib. /// diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart b/packages/flutter_tools/lib/src/native_assets.dart similarity index 95% rename from packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart rename to packages/flutter_tools/lib/src/native_assets.dart index 99dc6f6780c..4c132224b74 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/native_assets.dart +++ b/packages/flutter_tools/lib/src/native_assets.dart @@ -5,28 +5,25 @@ // Logic for native assets shared between all host OSes. import 'package:logging/logging.dart' as logging; -import 'package:native_assets_builder/native_assets_builder.dart' - as native_assets_builder show NativeAssetsBuildRunner; -import 'package:native_assets_builder/native_assets_builder.dart' - hide NativeAssetsBuildRunner; +import 'package:native_assets_builder/native_assets_builder.dart' hide NativeAssetsBuildRunner; +import 'package:native_assets_builder/native_assets_builder.dart' as native_assets_builder show NativeAssetsBuildRunner; import 'package:native_assets_cli/native_assets_cli_internal.dart'; import 'package:package_config/package_config_types.dart'; -import '../../base/common.dart'; -import '../../base/file_system.dart'; -import '../../base/logger.dart'; -import '../../base/platform.dart'; -import '../../build_info.dart' as build_info; -import '../../cache.dart'; -import '../../features.dart'; -import '../../globals.dart' as globals; -import '../../resident_runner.dart'; -import '../../run_hot.dart'; import 'android/native_assets.dart'; +import 'base/common.dart'; +import 'base/file_system.dart'; +import 'base/logger.dart'; +import 'base/platform.dart'; +import 'build_info.dart' as build_info; +import 'cache.dart'; +import 'features.dart'; +import 'globals.dart' as globals; import 'ios/native_assets.dart'; import 'linux/native_assets.dart'; import 'macos/native_assets.dart'; import 'macos/native_assets_host.dart'; +import 'resident_runner.dart'; import 'windows/native_assets.dart'; /// Programmatic API to be used by Dart launchers to invoke native builds. @@ -313,32 +310,6 @@ Uri nativeAssetsBuildUri(Uri projectUri, OS os) { return projectUri.resolve('$buildDir/native_assets/$os/'); } -class HotRunnerNativeAssetsBuilderImpl implements HotRunnerNativeAssetsBuilder { - const HotRunnerNativeAssetsBuilderImpl(); - - @override - Future dryRun({ - required Uri projectUri, - required FileSystem fileSystem, - required List flutterDevices, - required PackageConfig packageConfig, - required Logger logger, - }) async { - final NativeAssetsBuildRunner buildRunner = NativeAssetsBuildRunnerImpl( - projectUri, - packageConfig, - fileSystem, - globals.logger, - ); - return dryRunNativeAssets( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: buildRunner, - flutterDevices: flutterDevices, - ); - } -} - /// Gets the native asset id to dylib mapping to embed in the kernel file. /// /// Run hot compiles a kernel file that is pushed to the device after hot diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 17a212d6a26..5f7cc6aa713 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart @@ -22,6 +22,7 @@ import 'dart/package_map.dart'; import 'devfs.dart'; import 'device.dart'; import 'globals.dart' as globals; +import 'native_assets.dart'; import 'project.dart'; import 'reporting/reporting.dart'; import 'resident_runner.dart'; @@ -92,13 +93,13 @@ class HotRunner extends ResidentRunner { StopwatchFactory stopwatchFactory = const StopwatchFactory(), ReloadSourcesHelper reloadSourcesHelper = defaultReloadSourcesHelper, ReassembleHelper reassembleHelper = _defaultReassembleHelper, - HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, + NativeAssetsBuildRunner? buildRunner, String? nativeAssetsYamlFile, required Analytics analytics, }) : _stopwatchFactory = stopwatchFactory, _reloadSourcesHelper = reloadSourcesHelper, _reassembleHelper = reassembleHelper, - _nativeAssetsBuilder = nativeAssetsBuilder, + _buildRunner = buildRunner, _nativeAssetsYamlFile = nativeAssetsYamlFile, _analytics = analytics, super( @@ -138,7 +139,7 @@ class HotRunner extends ResidentRunner { String? _sdkName; bool? _emulator; - final HotRunnerNativeAssetsBuilder? _nativeAssetsBuilder; + NativeAssetsBuildRunner? _buildRunner; final String? _nativeAssetsYamlFile; String? flavor; @@ -373,12 +374,17 @@ class HotRunner extends ResidentRunner { nativeAssetsYaml = globals.fs.path.toUri(_nativeAssetsYamlFile); } else { final Uri projectUri = Uri.directory(projectRootPath); - nativeAssetsYaml = await _nativeAssetsBuilder?.dryRun( + _buildRunner ??= NativeAssetsBuildRunnerImpl( + projectUri, + debuggingOptions.buildInfo.packageConfig, + fileSystem, + globals.logger, + ); + nativeAssetsYaml = await dryRunNativeAssets( projectUri: projectUri, fileSystem: fileSystem, + buildRunner: _buildRunner!, flutterDevices: flutterDevices, - logger: logger, - packageConfig: debuggingOptions.buildInfo.packageConfig, ); } @@ -1722,15 +1728,3 @@ class ReasonForCancelling { return '$message.\nTry performing a hot restart instead.'; } } - -/// An interface to enable overriding native assets build logic in other -/// build systems. -abstract class HotRunnerNativeAssetsBuilder { - Future dryRun({ - required Uri projectUri, - required FileSystem fileSystem, - required List flutterDevices, - required PackageConfig packageConfig, - required Logger logger, - }); -} diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart index 6db74370719..25f26516366 100644 --- a/packages/flutter_tools/lib/src/test/flutter_platform.dart +++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart @@ -69,7 +69,6 @@ FlutterPlatform installHook({ String? integrationTestUserIdentifier, TestTimeRecorder? testTimeRecorder, UriConverter? uriConverter, - TestCompilerNativeAssetsBuilder? nativeAssetsBuilder, }) { assert(enableVmService || enableObservatory || (!debuggingOptions.startPaused && debuggingOptions.hostVmServicePort == null)); @@ -100,7 +99,6 @@ FlutterPlatform installHook({ integrationTestUserIdentifier: integrationTestUserIdentifier, testTimeRecorder: testTimeRecorder, uriConverter: uriConverter, - nativeAssetsBuilder: nativeAssetsBuilder, ); platformPluginRegistration(platform); return platform; @@ -293,7 +291,6 @@ class FlutterPlatform extends PlatformPlugin { this.integrationTestUserIdentifier, this.testTimeRecorder, this.uriConverter, - this.nativeAssetsBuilder, }); final String shellPath; @@ -310,7 +307,6 @@ class FlutterPlatform extends PlatformPlugin { final FlutterProject? flutterProject; final String? icudtlPath; final TestTimeRecorder? testTimeRecorder; - final TestCompilerNativeAssetsBuilder? nativeAssetsBuilder; // This can be used by internal projects that require custom logic for converting package: URIs to local paths. final UriConverter? uriConverter; @@ -469,13 +465,7 @@ class FlutterPlatform extends PlatformPlugin { // running this with a debugger attached. Initialize the resident // compiler in this case. if (debuggingOptions.startPaused) { - compiler ??= TestCompiler( - debuggingOptions.buildInfo, - flutterProject, - precompiledDillPath: precompiledDillPath, - testTimeRecorder: testTimeRecorder, - nativeAssetsBuilder: nativeAssetsBuilder, - ); + compiler ??= TestCompiler(debuggingOptions.buildInfo, flutterProject, precompiledDillPath: precompiledDillPath, testTimeRecorder: testTimeRecorder); final Uri uri = globals.fs.file(path).uri; // Trigger a compilation to initialize the resident compiler. unawaited(compiler!.compile(uri)); @@ -497,12 +487,7 @@ class FlutterPlatform extends PlatformPlugin { // Integration test device takes care of the compilation. if (integrationTestDevice == null) { // Lazily instantiate compiler so it is built only if it is actually used. - compiler ??= TestCompiler( - debuggingOptions.buildInfo, - flutterProject, - testTimeRecorder: testTimeRecorder, - nativeAssetsBuilder: nativeAssetsBuilder, - ); + compiler ??= TestCompiler(debuggingOptions.buildInfo, flutterProject, testTimeRecorder: testTimeRecorder); mainDart = await compiler!.compile(globals.fs.file(mainDart).uri); if (mainDart == null) { diff --git a/packages/flutter_tools/lib/src/test/runner.dart b/packages/flutter_tools/lib/src/test/runner.dart index c652e53804d..ab3082269ff 100644 --- a/packages/flutter_tools/lib/src/test/runner.dart +++ b/packages/flutter_tools/lib/src/test/runner.dart @@ -12,7 +12,6 @@ import '../web/chrome.dart'; import '../web/memory_fs.dart'; import 'flutter_platform.dart' as loader; import 'flutter_web_platform.dart'; -import 'test_compiler.dart'; import 'test_time_recorder.dart'; import 'test_wrapper.dart'; import 'watcher.dart'; @@ -54,7 +53,6 @@ abstract class FlutterTestRunner { Device? integrationTestDevice, String? integrationTestUserIdentifier, TestTimeRecorder? testTimeRecorder, - TestCompilerNativeAssetsBuilder? nativeAssetsBuilder, }); } @@ -93,7 +91,6 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner { Device? integrationTestDevice, String? integrationTestUserIdentifier, TestTimeRecorder? testTimeRecorder, - TestCompilerNativeAssetsBuilder? nativeAssetsBuilder, }) async { // Configure package:test to use the Flutter engine for child processes. final String shellPath = globals.artifacts!.getArtifactPath(Artifact.flutterTester); @@ -213,7 +210,6 @@ class _FlutterTestRunnerImpl implements FlutterTestRunner { integrationTestDevice: integrationTestDevice, integrationTestUserIdentifier: integrationTestUserIdentifier, testTimeRecorder: testTimeRecorder, - nativeAssetsBuilder: nativeAssetsBuilder, ); try { diff --git a/packages/flutter_tools/lib/src/test/test_compiler.dart b/packages/flutter_tools/lib/src/test/test_compiler.dart index bed5675b588..5d1cd9732a9 100644 --- a/packages/flutter_tools/lib/src/test/test_compiler.dart +++ b/packages/flutter_tools/lib/src/test/test_compiler.dart @@ -10,12 +10,18 @@ import 'package:meta/meta.dart'; import '../artifacts.dart'; import '../base/file_system.dart'; +import '../base/os.dart' show HostPlatform; +import '../base/platform.dart'; import '../build_info.dart'; import '../bundle.dart'; import '../compile.dart'; import '../flutter_plugins.dart'; import '../globals.dart' as globals; +import '../linux/native_assets.dart'; +import '../macos/native_assets.dart'; +import '../native_assets.dart'; import '../project.dart'; +import '../windows/native_assets.dart'; import 'test_time_recorder.dart'; /// A request to the [TestCompiler] for recompilation. @@ -45,11 +51,9 @@ class TestCompiler { /// If [testTimeRecorder] is passed, times will be recorded in it. TestCompiler( this.buildInfo, - this.flutterProject, { - String? precompiledDillPath, - this.testTimeRecorder, - TestCompilerNativeAssetsBuilder? nativeAssetsBuilder, - }) : testFilePath = precompiledDillPath ?? globals.fs.path.join( + this.flutterProject, + { String? precompiledDillPath, this.testTimeRecorder } + ) : testFilePath = precompiledDillPath ?? globals.fs.path.join( flutterProject!.directory.path, getBuildDirectory(), 'test_cache', @@ -58,8 +62,7 @@ class TestCompiler { dartDefines: buildInfo.dartDefines, extraFrontEndOptions: buildInfo.extraFrontEndOptions, )), - shouldCopyDillFile = precompiledDillPath == null, - _nativeAssetsBuilder = nativeAssetsBuilder { + shouldCopyDillFile = precompiledDillPath == null { // Compiler maintains and updates single incremental dill file. // Incremental compilation requests done for each test copy that file away // for independent execution. @@ -80,7 +83,6 @@ class TestCompiler { final String testFilePath; final bool shouldCopyDillFile; final TestTimeRecorder? testTimeRecorder; - final TestCompilerNativeAssetsBuilder? _nativeAssetsBuilder; ResidentCompiler? compiler; @@ -168,7 +170,57 @@ class TestCompiler { invalidatedRegistrantFiles.add(flutterProject!.dartPluginRegistrant.absolute.uri); } - final Uri? nativeAssetsYaml = await _nativeAssetsBuilder?.build(buildInfo); + Uri? nativeAssetsYaml; + if (!buildInfo.buildNativeAssets) { + nativeAssetsYaml = null; + } else { + final Uri projectUri = FlutterProject.current().directory.uri; + final NativeAssetsBuildRunner buildRunner = NativeAssetsBuildRunnerImpl( + projectUri, + buildInfo.packageConfig, + globals.fs, + globals.logger, + ); + if (globals.platform.isMacOS) { + (nativeAssetsYaml, _) = await buildNativeAssetsMacOS( + buildMode: buildInfo.mode, + projectUri: projectUri, + flutterTester: true, + fileSystem: globals.fs, + buildRunner: buildRunner, + ); + } else if (globals.platform.isLinux) { + (nativeAssetsYaml, _) = await buildNativeAssetsLinux( + buildMode: buildInfo.mode, + projectUri: projectUri, + flutterTester: true, + fileSystem: globals.fs, + buildRunner: buildRunner, + ); + } else if (globals.platform.isWindows) { + final TargetPlatform targetPlatform; + if (globals.os.hostPlatform == HostPlatform.windows_x64) { + targetPlatform = TargetPlatform.windows_x64; + } else { + targetPlatform = TargetPlatform.windows_arm64; + } + (nativeAssetsYaml, _) = await buildNativeAssetsWindows( + buildMode: buildInfo.mode, + targetPlatform: targetPlatform, + projectUri: projectUri, + flutterTester: true, + fileSystem: globals.fs, + buildRunner: buildRunner, + ); + } else { + await ensureNoNativeAssetsOrOsIsSupported( + projectUri, + const LocalPlatform().operatingSystem, + globals.fs, + buildRunner, + ); + } + } final CompilerOutput? compilerOutput = await compiler!.recompile( request.mainUri, @@ -218,9 +270,3 @@ class TestCompiler { } } } - -/// An interface to enable overriding native assets build logic in other -/// build systems. -abstract class TestCompilerNativeAssetsBuilder { - Future build(BuildInfo buildInfo); -} diff --git a/packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart b/packages/flutter_tools/lib/src/windows/native_assets.dart similarity index 93% rename from packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart rename to packages/flutter_tools/lib/src/windows/native_assets.dart index 77e8b5350b5..1c8579918ab 100644 --- a/packages/flutter_tools/lib/src/isolated/native_assets/windows/native_assets.dart +++ b/packages/flutter_tools/lib/src/windows/native_assets.dart @@ -5,11 +5,11 @@ import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode; -import '../../../base/file_system.dart'; -import '../../../build_info.dart'; -import '../../../globals.dart' as globals; -import '../../../windows/visual_studio.dart'; +import '../base/file_system.dart'; +import '../build_info.dart'; +import '../globals.dart' as globals; import '../native_assets.dart'; +import 'visual_studio.dart'; /// Dry run the native builds. /// @@ -66,6 +66,7 @@ Future<(Uri? nativeAssetsYaml, List dependencies)> ); } + Future cCompilerConfigWindows() async { final VisualStudio visualStudio = VisualStudio( fileSystem: globals.fs, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart index 33629ec6687..f9e40d61d54 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart @@ -1203,7 +1203,6 @@ class FakeHotRunnerFactory extends Fake implements HotRunnerFactory { FlutterProject? flutterProject, Analytics? analytics, String? nativeAssetsYamlFile, - HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, }) { if (_artifactTester != null) { for (final FlutterDevice device in devices) { diff --git a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart index 47951c7b906..96d944944bd 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/run_test.dart @@ -29,7 +29,6 @@ import 'package:flutter_tools/src/macos/macos_ipad_device.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/resident_runner.dart'; -import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/vmservice.dart'; import 'package:test/fake.dart'; @@ -1579,7 +1578,6 @@ class CapturingAppDomain extends AppDomain { String? userIdentifier, bool enableDevTools = true, String? flavor, - HotRunnerNativeAssetsBuilder? nativeAssetsBuilder, }) async { this.userIdentifier = userIdentifier; this.enableDevTools = enableDevTools; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index b92e30bac71..378c9815ab4 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -18,7 +18,6 @@ import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; import 'package:flutter_tools/src/test/coverage_collector.dart'; import 'package:flutter_tools/src/test/runner.dart'; -import 'package:flutter_tools/src/test/test_compiler.dart'; import 'package:flutter_tools/src/test/test_device.dart'; import 'package:flutter_tools/src/test/test_time_recorder.dart'; import 'package:flutter_tools/src/test/test_wrapper.dart'; @@ -1106,7 +1105,6 @@ class FakeFlutterTestRunner implements FlutterTestRunner { Device? integrationTestDevice, String? integrationTestUserIdentifier, TestTimeRecorder? testTimeRecorder, - TestCompilerNativeAssetsBuilder? nativeAssetsBuilder, }) async { lastEnableVmServiceValue = enableVmService; lastDebuggingOptionsValue = debuggingOptions; diff --git a/packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart b/packages/flutter_tools/test/general.shard/android/native_assets_test.dart similarity index 98% rename from packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart rename to packages/flutter_tools/test/general.shard/android/native_assets_test.dart index 6391d4c59b1..43c2955946b 100644 --- a/packages/flutter_tools/test/general.shard/isolated/android/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/android/native_assets_test.dart @@ -5,6 +5,7 @@ import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; +import 'package:flutter_tools/src/android/native_assets.dart'; import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; @@ -14,16 +15,15 @@ import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/isolated/native_assets/android/native_assets.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode, Target; import 'package:package_config/package_config_types.dart'; -import '../../../src/common.dart'; -import '../../../src/context.dart'; -import '../../../src/fakes.dart'; +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/fakes.dart'; import '../fake_native_assets_build_runner.dart'; void main() { diff --git a/packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/native_assets_test.dart similarity index 97% rename from packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart rename to packages/flutter_tools/test/general.shard/build_system/targets/native_assets_test.dart index 077a624abf3..baa6d7df37b 100644 --- a/packages/flutter_tools/test/general.shard/isolated/build_system/targets/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/native_assets_test.dart @@ -12,14 +12,14 @@ import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/build_system/exceptions.dart'; import 'package:flutter_tools/src/build_system/targets/native_assets.dart'; import 'package:flutter_tools/src/features.dart'; -import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; +import 'package:flutter_tools/src/native_assets.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:package_config/package_config.dart' show Package; -import '../../../../src/common.dart'; -import '../../../../src/context.dart'; -import '../../../../src/fakes.dart'; +import '../../../src/common.dart'; +import '../../../src/context.dart'; +import '../../../src/fakes.dart'; import '../../fake_native_assets_build_runner.dart'; void main() { diff --git a/packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart b/packages/flutter_tools/test/general.shard/fake_native_assets_build_runner.dart similarity index 78% rename from packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart rename to packages/flutter_tools/test/general.shard/fake_native_assets_build_runner.dart index afc7c236388..fa1e8cf0e38 100644 --- a/packages/flutter_tools/test/general.shard/isolated/fake_native_assets_build_runner.dart +++ b/packages/flutter_tools/test/general.shard/fake_native_assets_build_runner.dart @@ -2,11 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:file/src/interface/file_system.dart'; -import 'package:flutter_tools/src/base/logger.dart'; -import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; -import 'package:flutter_tools/src/resident_runner.dart'; -import 'package:flutter_tools/src/run_hot.dart'; +import 'package:flutter_tools/src/native_assets.dart'; import 'package:native_assets_builder/native_assets_builder.dart' as native_assets_builder; import 'package:native_assets_cli/native_assets_cli_internal.dart'; @@ -99,25 +95,3 @@ final class FakeNativeAssetsBuilderResult @override final bool success; } - -class FakeHotRunnerNativeAssetsBuilder implements HotRunnerNativeAssetsBuilder { - FakeHotRunnerNativeAssetsBuilder(this.buildRunner); - - final NativeAssetsBuildRunner buildRunner; - - @override - Future dryRun({ - required Uri projectUri, - required FileSystem fileSystem, - required List flutterDevices, - required PackageConfig packageConfig, - required Logger logger, - }) { - return dryRunNativeAssets( - projectUri: projectUri, - fileSystem: fileSystem, - buildRunner: buildRunner, - flutterDevices: flutterDevices, - ); - } -} diff --git a/packages/flutter_tools/test/general.shard/hot_shared.dart b/packages/flutter_tools/test/general.shard/hot_shared.dart deleted file mode 100644 index e97ec6b9f14..00000000000 --- a/packages/flutter_tools/test/general.shard/hot_shared.dart +++ /dev/null @@ -1,231 +0,0 @@ -// 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:flutter_tools/src/application_package.dart'; -import 'package:flutter_tools/src/asset.dart'; -import 'package:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/build_system/tools/shader_compiler.dart'; -import 'package:flutter_tools/src/compile.dart'; -import 'package:flutter_tools/src/devfs.dart'; -import 'package:flutter_tools/src/device.dart'; -import 'package:flutter_tools/src/project.dart'; -import 'package:flutter_tools/src/resident_runner.dart'; -import 'package:flutter_tools/src/run_hot.dart'; -import 'package:flutter_tools/src/vmservice.dart'; -import 'package:package_config/package_config.dart'; -import 'package:test/fake.dart'; -import 'package:vm_service/vm_service.dart' as vm_service; - -class FakeDevFs extends Fake implements DevFS { - @override - Future destroy() async { } - - @override - List sources = []; - - @override - DateTime? lastCompiled; - - @override - PackageConfig? lastPackageConfig; - - @override - Set assetPathsToEvict = {}; - - @override - Set shaderPathsToEvict= {}; - - @override - Set scenePathsToEvict= {}; - - @override - Uri? baseUri; -} - -class FakeDevice extends Fake implements Device { - FakeDevice({ - TargetPlatform targetPlatform = TargetPlatform.tester, - }) : _targetPlatform = targetPlatform; - - final TargetPlatform _targetPlatform; - - bool disposed = false; - - @override - bool isSupported() => true; - - @override - bool supportsHotReload = true; - - @override - bool supportsHotRestart = true; - - @override - bool supportsFlutterExit = true; - - @override - Future get targetPlatform async => _targetPlatform; - - @override - Future get sdkNameAndVersion async => 'Tester'; - - @override - Future get isLocalEmulator async => false; - - @override - String get name => 'Fake Device'; - - @override - Future stopApp( - ApplicationPackage? app, { - String? userIdentifier, - }) async { - return true; - } - - @override - Future dispose() async { - disposed = true; - } -} - -class FakeFlutterDevice extends Fake implements FlutterDevice { - FakeFlutterDevice(this.device); - - bool stoppedEchoingDeviceLog = false; - late Future Function() updateDevFSReportCallback; - - @override - final FakeDevice device; - - @override - Future stopEchoingDeviceLog() async { - stoppedEchoingDeviceLog = true; - } - - @override - DevFS? devFS = FakeDevFs(); - - @override - FlutterVmService get vmService => FakeFlutterVmService(); - - @override - ResidentCompiler? generator; - - @override - Future updateDevFS({ - Uri? mainUri, - String? target, - AssetBundle? bundle, - DateTime? firstBuildTime, - bool bundleFirstUpload = false, - bool bundleDirty = false, - bool fullRestart = false, - String? projectRootPath, - String? pathToReload, - required String dillOutputPath, - required List invalidatedFiles, - required PackageConfig packageConfig, - }) => updateDevFSReportCallback(); - - @override - TargetPlatform? get targetPlatform => device._targetPlatform; -} - -class TestFlutterDevice extends FlutterDevice { - TestFlutterDevice({ - required Device device, - required this.exception, - required ResidentCompiler generator, - }) : super(device, buildInfo: BuildInfo.debug, generator: generator, developmentShaderCompiler: const FakeShaderCompiler()); - - /// The exception to throw when the connect method is called. - final Exception exception; - - @override - Future connect({ - ReloadSources? reloadSources, - Restart? restart, - CompileExpression? compileExpression, - GetSkSLMethod? getSkSLMethod, - FlutterProject? flutterProject, - PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, - bool disableServiceAuthCodes = false, - bool enableDds = true, - bool cacheStartupProfile = false, - bool? ipv6 = false, - int? hostVmServicePort, - int? ddsPort, - bool allowExistingDdsInstance = false, - }) async { - throw exception; - } -} - -class TestHotRunnerConfig extends HotRunnerConfig { - TestHotRunnerConfig({this.successfulHotRestartSetup, this.successfulHotReloadSetup}); - bool? successfulHotRestartSetup; - bool? successfulHotReloadSetup; - bool shutdownHookCalled = false; - bool updateDevFSCompleteCalled = false; - - @override - Future setupHotRestart() async { - assert(successfulHotRestartSetup != null, 'setupHotRestart is not expected to be called in this test.'); - return successfulHotRestartSetup; - } - - @override - Future setupHotReload() async { - assert(successfulHotReloadSetup != null, 'setupHotReload is not expected to be called in this test.'); - return successfulHotReloadSetup; - } - - @override - void updateDevFSComplete() { - updateDevFSCompleteCalled = true; - } - - @override - Future runPreShutdownOperations() async { - shutdownHookCalled = true; - } -} - -class FakeResidentCompiler extends Fake implements ResidentCompiler { - @override - void accept() {} -} - -class FakeFlutterVmService extends Fake implements FlutterVmService { - @override - vm_service.VmService get service => FakeVmService(); - - @override - Future> getFlutterViews({bool returnEarly = false, Duration delay = const Duration(milliseconds: 50)}) async { - return []; - } -} - -class FakeVmService extends Fake implements vm_service.VmService { - @override - Future getVM() async => FakeVm(); -} - -class FakeVm extends Fake implements vm_service.VM { - @override - List get isolates => []; -} - -class FakeShaderCompiler implements DevelopmentShaderCompiler { - const FakeShaderCompiler(); - - @override - void configureCompiler(TargetPlatform? platform) { } - - @override - Future recompileShader(DevFSContent inputShader) { - throw UnimplementedError(); - } -} diff --git a/packages/flutter_tools/test/general.shard/hot_test.dart b/packages/flutter_tools/test/general.shard/hot_test.dart index b6510e0836f..4668402c68a 100644 --- a/packages/flutter_tools/test/general.shard/hot_test.dart +++ b/packages/flutter_tools/test/general.shard/hot_test.dart @@ -3,25 +3,37 @@ // found in the LICENSE file. import 'package:file/memory.dart'; +import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/asset.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/tools/shader_compiler.dart'; +import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/features.dart'; +import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/resident_devtools_handler.dart'; import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/vmservice.dart'; +import 'package:native_assets_cli/native_assets_cli_internal.dart' + hide BuildMode, Target; +import 'package:native_assets_cli/native_assets_cli_internal.dart' + as native_assets_cli; +import 'package:package_config/package_config.dart'; +import 'package:test/fake.dart'; import 'package:unified_analytics/unified_analytics.dart'; import 'package:vm_service/vm_service.dart' as vm_service; import '../src/common.dart'; import '../src/context.dart'; import '../src/fakes.dart'; -import 'hot_shared.dart'; +import 'fake_native_assets_build_runner.dart'; void main() { group('validateReloadReport', () { @@ -613,4 +625,352 @@ void main() { expect(flutterDevice2.stoppedEchoingDeviceLog, true); }); }); + + group('native assets', () { + late TestHotRunnerConfig testingConfig; + late FileSystem fileSystem; + late FakeAnalytics fakeAnalytics; + + setUp(() { + fileSystem = MemoryFileSystem.test(); + testingConfig = TestHotRunnerConfig( + successfulHotRestartSetup: true, + ); + fakeAnalytics = getInitializedFakeAnalyticsInstance( + fs: fileSystem, + fakeFlutterVersion: FakeFlutterVersion(), + ); + }); + testUsingContext('native assets restart', () async { + final FakeDevice device = FakeDevice(); + final FakeFlutterDevice fakeFlutterDevice = FakeFlutterDevice(device); + final List devices = [ + fakeFlutterDevice, + ]; + + fakeFlutterDevice.updateDevFSReportCallback = () async => UpdateFSReport( + success: true, + invalidatedSourcesCount: 6, + syncedBytes: 8, + scannedSourcesCount: 16, + compileDuration: const Duration(seconds: 16), + transferDuration: const Duration(seconds: 32), + ); + + (fakeFlutterDevice.devFS! as FakeDevFs).baseUri = Uri.parse('file:///base_uri'); + + final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner( + packagesWithNativeAssetsResult: [ + Package('bar', fileSystem.currentDirectory.uri), + ], + dryRunResult: FakeNativeAssetsBuilderResult( + assets: [ + Asset( + id: 'package:bar/bar.dart', + linkMode: LinkMode.dynamic, + target: native_assets_cli.Target.macOSArm64, + path: AssetAbsolutePath(Uri.file('bar.dylib')), + ), + ], + ), + ); + + final HotRunner hotRunner = HotRunner( + devices, + debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), + target: 'main.dart', + devtoolsHandler: createNoOpHandler, + buildRunner: buildRunner, + analytics: fakeAnalytics, + ); + final OperationResult result = await hotRunner.restart(fullRestart: true); + expect(result.isOk, true); + // Hot restart does not require rerunning anything for native assets. + // The previous native assets mapping should be used. + expect(buildRunner.buildInvocations, 0); + expect(buildRunner.dryRunInvocations, 0); + expect(buildRunner.hasPackageConfigInvocations, 0); + expect(buildRunner.packagesWithNativeAssetsInvocations, 0); + }, overrides: { + HotRunnerConfig: () => testingConfig, + Artifacts: () => Artifacts.test(), + FileSystem: () => fileSystem, + Platform: () => FakePlatform(), + ProcessManager: () => FakeProcessManager.empty(), + FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), + }); + + testUsingContext('native assets run unsupported', () async { + final FakeDevice device = FakeDevice(targetPlatform: TargetPlatform.fuchsia_arm64); + final FakeFlutterDevice fakeFlutterDevice = FakeFlutterDevice(device); + final List devices = [ + fakeFlutterDevice, + ]; + + fakeFlutterDevice.updateDevFSReportCallback = () async => UpdateFSReport( + success: true, + invalidatedSourcesCount: 6, + syncedBytes: 8, + scannedSourcesCount: 16, + compileDuration: const Duration(seconds: 16), + transferDuration: const Duration(seconds: 32), + ); + + (fakeFlutterDevice.devFS! as FakeDevFs).baseUri = Uri.parse('file:///base_uri'); + + final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner( + packagesWithNativeAssetsResult: [ + Package('bar', fileSystem.currentDirectory.uri), + ], + dryRunResult: FakeNativeAssetsBuilderResult( + assets: [ + Asset( + id: 'package:bar/bar.dart', + linkMode: LinkMode.dynamic, + target: native_assets_cli.Target.macOSArm64, + path: AssetAbsolutePath(Uri.file('bar.dylib')), + ), + ], + ), + ); + + final HotRunner hotRunner = HotRunner( + devices, + debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), + target: 'main.dart', + devtoolsHandler: createNoOpHandler, + buildRunner: buildRunner, + analytics: fakeAnalytics, + ); + expect( + () => hotRunner.run(), + throwsToolExit( message: + 'Package(s) bar require the native assets feature. ' + 'This feature has not yet been implemented for `TargetPlatform.fuchsia_arm64`. ' + 'For more info see https://github.com/flutter/flutter/issues/129757.', + ) + ); + + }, overrides: { + HotRunnerConfig: () => testingConfig, + Artifacts: () => Artifacts.test(), + FileSystem: () => fileSystem, + Platform: () => FakePlatform(), + ProcessManager: () => FakeProcessManager.empty(), + FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), + }); + }); +} + +class FakeDevFs extends Fake implements DevFS { + @override + Future destroy() async { } + + @override + List sources = []; + + @override + DateTime? lastCompiled; + + @override + PackageConfig? lastPackageConfig; + + @override + Set assetPathsToEvict = {}; + + @override + Set shaderPathsToEvict= {}; + + @override + Set scenePathsToEvict= {}; + + @override + Uri? baseUri; +} + +class FakeDevice extends Fake implements Device { + FakeDevice({ + TargetPlatform targetPlatform = TargetPlatform.tester, + }) : _targetPlatform = targetPlatform; + + final TargetPlatform _targetPlatform; + + bool disposed = false; + + @override + bool isSupported() => true; + + @override + bool supportsHotReload = true; + + @override + bool supportsHotRestart = true; + + @override + bool supportsFlutterExit = true; + + @override + Future get targetPlatform async => _targetPlatform; + + @override + Future get sdkNameAndVersion async => 'Tester'; + + @override + Future get isLocalEmulator async => false; + + @override + String get name => 'Fake Device'; + + @override + Future stopApp( + ApplicationPackage? app, { + String? userIdentifier, + }) async { + return true; + } + + @override + Future dispose() async { + disposed = true; + } +} + +class FakeFlutterDevice extends Fake implements FlutterDevice { + FakeFlutterDevice(this.device); + + bool stoppedEchoingDeviceLog = false; + late Future Function() updateDevFSReportCallback; + + @override + final FakeDevice device; + + @override + Future stopEchoingDeviceLog() async { + stoppedEchoingDeviceLog = true; + } + + @override + DevFS? devFS = FakeDevFs(); + + @override + FlutterVmService get vmService => FakeFlutterVmService(); + + @override + ResidentCompiler? generator; + + @override + Future updateDevFS({ + Uri? mainUri, + String? target, + AssetBundle? bundle, + DateTime? firstBuildTime, + bool bundleFirstUpload = false, + bool bundleDirty = false, + bool fullRestart = false, + String? projectRootPath, + String? pathToReload, + required String dillOutputPath, + required List invalidatedFiles, + required PackageConfig packageConfig, + }) => updateDevFSReportCallback(); + + @override + TargetPlatform? get targetPlatform => device._targetPlatform; +} + +class TestFlutterDevice extends FlutterDevice { + TestFlutterDevice({ + required Device device, + required this.exception, + required ResidentCompiler generator, + }) : super(device, buildInfo: BuildInfo.debug, generator: generator, developmentShaderCompiler: const FakeShaderCompiler()); + + /// The exception to throw when the connect method is called. + final Exception exception; + + @override + Future connect({ + ReloadSources? reloadSources, + Restart? restart, + CompileExpression? compileExpression, + GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, + PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, + bool disableServiceAuthCodes = false, + bool enableDds = true, + bool cacheStartupProfile = false, + bool? ipv6 = false, + int? hostVmServicePort, + int? ddsPort, + bool allowExistingDdsInstance = false, + }) async { + throw exception; + } +} + +class TestHotRunnerConfig extends HotRunnerConfig { + TestHotRunnerConfig({this.successfulHotRestartSetup, this.successfulHotReloadSetup}); + bool? successfulHotRestartSetup; + bool? successfulHotReloadSetup; + bool shutdownHookCalled = false; + bool updateDevFSCompleteCalled = false; + + @override + Future setupHotRestart() async { + assert(successfulHotRestartSetup != null, 'setupHotRestart is not expected to be called in this test.'); + return successfulHotRestartSetup; + } + + @override + Future setupHotReload() async { + assert(successfulHotReloadSetup != null, 'setupHotReload is not expected to be called in this test.'); + return successfulHotReloadSetup; + } + + @override + void updateDevFSComplete() { + updateDevFSCompleteCalled = true; + } + + @override + Future runPreShutdownOperations() async { + shutdownHookCalled = true; + } +} + +class FakeResidentCompiler extends Fake implements ResidentCompiler { + @override + void accept() {} +} + +class FakeFlutterVmService extends Fake implements FlutterVmService { + @override + vm_service.VmService get service => FakeVmService(); + + @override + Future> getFlutterViews({bool returnEarly = false, Duration delay = const Duration(milliseconds: 50)}) async { + return []; + } +} + +class FakeVmService extends Fake implements vm_service.VmService { + @override + Future getVM() async => FakeVm(); +} + +class FakeVm extends Fake implements vm_service.VM { + @override + List get isolates => []; +} + +class FakeShaderCompiler implements DevelopmentShaderCompiler { + const FakeShaderCompiler(); + + @override + void configureCompiler(TargetPlatform? platform) { } + + @override + Future recompileShader(DevFSContent inputShader) { + throw UnimplementedError(); + } } diff --git a/packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart b/packages/flutter_tools/test/general.shard/ios/native_assets_test.dart similarity index 98% rename from packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart rename to packages/flutter_tools/test/general.shard/ios/native_assets_test.dart index b365dcb77af..95d0bfc2658 100644 --- a/packages/flutter_tools/test/general.shard/isolated/ios/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/native_assets_test.dart @@ -13,16 +13,16 @@ import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/isolated/native_assets/ios/native_assets.dart'; +import 'package:flutter_tools/src/ios/native_assets.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode, Target; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:package_config/package_config_types.dart'; -import '../../../src/common.dart'; -import '../../../src/context.dart'; -import '../../../src/fakes.dart'; +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/fakes.dart'; import '../fake_native_assets_build_runner.dart'; void main() { diff --git a/packages/flutter_tools/test/general.shard/isolated/hot_test.dart b/packages/flutter_tools/test/general.shard/isolated/hot_test.dart deleted file mode 100644 index 03957db464e..00000000000 --- a/packages/flutter_tools/test/general.shard/isolated/hot_test.dart +++ /dev/null @@ -1,164 +0,0 @@ -// 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/memory.dart'; -import 'package:flutter_tools/src/artifacts.dart'; -import 'package:flutter_tools/src/base/file_system.dart'; -import 'package:flutter_tools/src/base/platform.dart'; -import 'package:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/devfs.dart'; -import 'package:flutter_tools/src/device.dart'; -import 'package:flutter_tools/src/features.dart'; -import 'package:flutter_tools/src/resident_devtools_handler.dart'; -import 'package:flutter_tools/src/resident_runner.dart'; -import 'package:flutter_tools/src/run_hot.dart'; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - hide BuildMode, Target; -import 'package:native_assets_cli/native_assets_cli_internal.dart' - as native_assets_cli; -import 'package:package_config/package_config.dart'; -import 'package:unified_analytics/unified_analytics.dart'; - -import '../../src/common.dart'; -import '../../src/context.dart'; -import '../../src/fakes.dart'; -import '../hot_shared.dart'; -import 'fake_native_assets_build_runner.dart'; - -void main() { - group('native assets', () { - late TestHotRunnerConfig testingConfig; - late FileSystem fileSystem; - late FakeAnalytics fakeAnalytics; - - setUp(() { - fileSystem = MemoryFileSystem.test(); - testingConfig = TestHotRunnerConfig( - successfulHotRestartSetup: true, - ); - fakeAnalytics = getInitializedFakeAnalyticsInstance( - fs: fileSystem, - fakeFlutterVersion: FakeFlutterVersion(), - ); - }); - testUsingContext('native assets restart', () async { - final FakeDevice device = FakeDevice(); - final FakeFlutterDevice fakeFlutterDevice = FakeFlutterDevice(device); - final List devices = [ - fakeFlutterDevice, - ]; - - fakeFlutterDevice.updateDevFSReportCallback = () async => UpdateFSReport( - success: true, - invalidatedSourcesCount: 6, - syncedBytes: 8, - scannedSourcesCount: 16, - compileDuration: const Duration(seconds: 16), - transferDuration: const Duration(seconds: 32), - ); - - (fakeFlutterDevice.devFS! as FakeDevFs).baseUri = Uri.parse('file:///base_uri'); - - final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', fileSystem.currentDirectory.uri), - ], - dryRunResult: FakeNativeAssetsBuilderResult( - assets: [ - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.dynamic, - target: native_assets_cli.Target.macOSArm64, - path: AssetAbsolutePath(Uri.file('bar.dylib')), - ), - ], - ), - ); - - final HotRunner hotRunner = HotRunner( - devices, - debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), - target: 'main.dart', - devtoolsHandler: createNoOpHandler, - nativeAssetsBuilder: FakeHotRunnerNativeAssetsBuilder(buildRunner), - analytics: fakeAnalytics, - ); - final OperationResult result = await hotRunner.restart(fullRestart: true); - expect(result.isOk, true); - // Hot restart does not require rerunning anything for native assets. - // The previous native assets mapping should be used. - expect(buildRunner.buildInvocations, 0); - expect(buildRunner.dryRunInvocations, 0); - expect(buildRunner.hasPackageConfigInvocations, 0); - expect(buildRunner.packagesWithNativeAssetsInvocations, 0); - }, overrides: { - HotRunnerConfig: () => testingConfig, - Artifacts: () => Artifacts.test(), - FileSystem: () => fileSystem, - Platform: () => FakePlatform(), - ProcessManager: () => FakeProcessManager.empty(), - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), - }); - - testUsingContext('native assets run unsupported', () async { - final FakeDevice device = FakeDevice(targetPlatform: TargetPlatform.fuchsia_arm64); - final FakeFlutterDevice fakeFlutterDevice = FakeFlutterDevice(device); - final List devices = [ - fakeFlutterDevice, - ]; - - fakeFlutterDevice.updateDevFSReportCallback = () async => UpdateFSReport( - success: true, - invalidatedSourcesCount: 6, - syncedBytes: 8, - scannedSourcesCount: 16, - compileDuration: const Duration(seconds: 16), - transferDuration: const Duration(seconds: 32), - ); - - (fakeFlutterDevice.devFS! as FakeDevFs).baseUri = Uri.parse('file:///base_uri'); - - final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner( - packagesWithNativeAssetsResult: [ - Package('bar', fileSystem.currentDirectory.uri), - ], - dryRunResult: FakeNativeAssetsBuilderResult( - assets: [ - Asset( - id: 'package:bar/bar.dart', - linkMode: LinkMode.dynamic, - target: native_assets_cli.Target.macOSArm64, - path: AssetAbsolutePath(Uri.file('bar.dylib')), - ), - ], - ), - ); - - final HotRunner hotRunner = HotRunner( - devices, - debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), - target: 'main.dart', - devtoolsHandler: createNoOpHandler, - nativeAssetsBuilder: FakeHotRunnerNativeAssetsBuilder(buildRunner), - analytics: fakeAnalytics, - ); - expect( - () => hotRunner.run(), - throwsToolExit( message: - 'Package(s) bar require the native assets feature. ' - 'This feature has not yet been implemented for `TargetPlatform.fuchsia_arm64`. ' - 'For more info see https://github.com/flutter/flutter/issues/129757.', - ) - ); - - }, overrides: { - HotRunnerConfig: () => testingConfig, - Artifacts: () => Artifacts.test(), - FileSystem: () => fileSystem, - Platform: () => FakePlatform(), - ProcessManager: () => FakeProcessManager.empty(), - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), - }); - }); -} diff --git a/packages/flutter_tools/test/general.shard/isolated/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/isolated/resident_runner_test.dart deleted file mode 100644 index b67c0e5ff44..00000000000 --- a/packages/flutter_tools/test/general.shard/isolated/resident_runner_test.dart +++ /dev/null @@ -1,121 +0,0 @@ -// 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:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/device.dart'; -import 'package:flutter_tools/src/features.dart'; -import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/resident_devtools_handler.dart'; -import 'package:flutter_tools/src/resident_runner.dart'; -import 'package:flutter_tools/src/run_hot.dart'; -import 'package:unified_analytics/unified_analytics.dart'; - -import '../../src/common.dart'; -import '../../src/context.dart'; -import '../../src/fake_vm_services.dart'; -import '../../src/fakes.dart'; -import '../../src/testbed.dart'; -import '../resident_runner_helpers.dart'; -import 'fake_native_assets_build_runner.dart'; - -void main() { - late Testbed testbed; - late FakeFlutterDevice flutterDevice; - late FakeDevFS devFS; - late ResidentRunner residentRunner; - late FakeDevice device; - late FakeAnalytics fakeAnalytics; - FakeVmServiceHost? fakeVmServiceHost; - - setUp(() { - testbed = Testbed(setup: () { - fakeAnalytics = getInitializedFakeAnalyticsInstance( - fs: globals.fs, - fakeFlutterVersion: FakeFlutterVersion(), - ); - - globals.fs.file('.packages') - .writeAsStringSync('\n'); - globals.fs.file(globals.fs.path.join('build', 'app.dill')) - ..createSync(recursive: true) - ..writeAsStringSync('ABC'); - residentRunner = HotRunner( - [ - flutterDevice, - ], - stayResident: false, - debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), - target: 'main.dart', - devtoolsHandler: createNoOpHandler, - analytics: fakeAnalytics, - ); - }); - device = FakeDevice(); - devFS = FakeDevFS(); - flutterDevice = FakeFlutterDevice() - ..testUri = testUri - ..vmServiceHost = (() => fakeVmServiceHost) - ..device = device - ..devFS = devFS; - }); - - testUsingContext( - 'use the nativeAssetsYamlFile when provided', - () => testbed.run(() async { - final FakeDevice device = FakeDevice( - targetPlatform: TargetPlatform.darwin, - sdkNameAndVersion: 'Macos', - ); - final FakeResidentCompiler residentCompiler = FakeResidentCompiler(); - final FakeFlutterDevice flutterDevice = FakeFlutterDevice() - ..testUri = testUri - ..vmServiceHost = (() => fakeVmServiceHost) - ..device = device - ..devFS = devFS - ..targetPlatform = TargetPlatform.darwin - ..generator = residentCompiler; - - fakeVmServiceHost = FakeVmServiceHost(requests: [ - listViews, - listViews, - ]); - globals.fs - .file(globals.fs.path.join('lib', 'main.dart')) - .createSync(recursive: true); - final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner(); - residentRunner = HotRunner( - [ - flutterDevice, - ], - stayResident: false, - debuggingOptions: DebuggingOptions.enabled(const BuildInfo( - BuildMode.debug, - '', - treeShakeIcons: false, - trackWidgetCreation: true, - )), - target: 'main.dart', - devtoolsHandler: createNoOpHandler, - nativeAssetsBuilder: FakeHotRunnerNativeAssetsBuilder(buildRunner), - analytics: fakeAnalytics, - nativeAssetsYamlFile: 'foo.yaml', - ); - - final int? result = await residentRunner.run(); - expect(result, 0); - - expect(buildRunner.buildInvocations, 0); - expect(buildRunner.dryRunInvocations, 0); - expect(buildRunner.hasPackageConfigInvocations, 0); - expect(buildRunner.packagesWithNativeAssetsInvocations, 0); - - expect(residentCompiler.recompileCalled, true); - expect(residentCompiler.receivedNativeAssetsYaml, globals.fs.path.toUri('foo.yaml')); - }), - overrides: { - ProcessManager: () => FakeProcessManager.any(), - FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), - }); -} diff --git a/packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart b/packages/flutter_tools/test/general.shard/linux/native_assets_test.dart similarity index 98% rename from packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart rename to packages/flutter_tools/test/general.shard/linux/native_assets_test.dart index 6806919da07..bf7296ea8f6 100644 --- a/packages/flutter_tools/test/general.shard/isolated/linux/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/linux/native_assets_test.dart @@ -15,17 +15,17 @@ import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/isolated/native_assets/linux/native_assets.dart'; -import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; +import 'package:flutter_tools/src/linux/native_assets.dart'; +import 'package:flutter_tools/src/native_assets.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode, Target; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:package_config/package_config_types.dart'; -import '../../../src/common.dart'; -import '../../../src/context.dart'; -import '../../../src/fakes.dart'; +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/fakes.dart'; import '../fake_native_assets_build_runner.dart'; void main() { diff --git a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart b/packages/flutter_tools/test/general.shard/macos/native_assets_host_test.dart similarity index 94% rename from packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart rename to packages/flutter_tools/test/general.shard/macos/native_assets_host_test.dart index ad8898ce1bb..4df6c6362d5 100644 --- a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_host_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/native_assets_host_test.dart @@ -2,9 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_tools/src/isolated/native_assets/macos/native_assets_host.dart'; +import 'package:flutter_tools/src/macos/native_assets_host.dart'; -import '../../../src/common.dart'; +import '../../src/common.dart'; void main() { test('framework name', () { diff --git a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart b/packages/flutter_tools/test/general.shard/macos/native_assets_test.dart similarity index 98% rename from packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart rename to packages/flutter_tools/test/general.shard/macos/native_assets_test.dart index 8006ac03c58..c934d42af2f 100644 --- a/packages/flutter_tools/test/general.shard/isolated/macos/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/native_assets_test.dart @@ -13,17 +13,17 @@ import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/isolated/native_assets/macos/native_assets.dart'; -import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; +import 'package:flutter_tools/src/macos/native_assets.dart'; +import 'package:flutter_tools/src/native_assets.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode, Target; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:package_config/package_config_types.dart'; -import '../../../src/common.dart'; -import '../../../src/context.dart'; -import '../../../src/fakes.dart'; +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/fakes.dart'; import '../fake_native_assets_build_runner.dart'; void main() { diff --git a/packages/flutter_tools/test/general.shard/resident_runner_helpers.dart b/packages/flutter_tools/test/general.shard/resident_runner_helpers.dart deleted file mode 100644 index 918685bf1f6..00000000000 --- a/packages/flutter_tools/test/general.shard/resident_runner_helpers.dart +++ /dev/null @@ -1,529 +0,0 @@ -// 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 'dart:async'; - -import 'package:dds/dds.dart' as dds; -import 'package:flutter_tools/src/application_package.dart'; -import 'package:flutter_tools/src/asset.dart'; -import 'package:flutter_tools/src/base/dds.dart'; -import 'package:flutter_tools/src/base/file_system.dart'; -import 'package:flutter_tools/src/build_info.dart'; -import 'package:flutter_tools/src/build_system/tools/scene_importer.dart'; -import 'package:flutter_tools/src/build_system/tools/shader_compiler.dart'; -import 'package:flutter_tools/src/compile.dart'; -import 'package:flutter_tools/src/devfs.dart'; -import 'package:flutter_tools/src/device.dart'; -import 'package:flutter_tools/src/device_port_forwarder.dart'; -import 'package:flutter_tools/src/project.dart'; -import 'package:flutter_tools/src/resident_runner.dart'; -import 'package:flutter_tools/src/run_cold.dart'; -import 'package:flutter_tools/src/run_hot.dart'; -import 'package:flutter_tools/src/vmservice.dart'; -import 'package:package_config/package_config.dart'; -import 'package:test/fake.dart'; -import 'package:vm_service/vm_service.dart' as vm_service; - -import '../src/fake_vm_services.dart'; - -final vm_service.Event fakeUnpausedEvent = vm_service.Event( - kind: vm_service.EventKind.kResume, - timestamp: 0 -); - -final vm_service.Event fakePausedEvent = vm_service.Event( - kind: vm_service.EventKind.kPauseException, - timestamp: 0 -); - -final vm_service.Isolate fakeUnpausedIsolate = vm_service.Isolate( - id: '1', - pauseEvent: fakeUnpausedEvent, - breakpoints: [], - extensionRPCs: [], - libraries: [ - vm_service.LibraryRef( - id: '1', - uri: 'file:///hello_world/main.dart', - name: '', - ), - ], - livePorts: 0, - name: 'test', - number: '1', - pauseOnExit: false, - runnable: true, - startTime: 0, - isSystemIsolate: false, - isolateFlags: [], -); - -final vm_service.Isolate fakePausedIsolate = vm_service.Isolate( - id: '1', - pauseEvent: fakePausedEvent, - breakpoints: [ - vm_service.Breakpoint( - breakpointNumber: 123, - id: 'test-breakpoint', - location: vm_service.SourceLocation( - tokenPos: 0, - script: vm_service.ScriptRef(id: 'test-script', uri: 'foo.dart'), - ), - enabled: true, - resolved: true, - ), - ], - libraries: [], - livePorts: 0, - name: 'test', - number: '1', - pauseOnExit: false, - runnable: true, - startTime: 0, - isSystemIsolate: false, - isolateFlags: [], -); - -final vm_service.VM fakeVM = vm_service.VM( - isolates: [fakeUnpausedIsolate], - pid: 1, - hostCPU: '', - isolateGroups: [], - targetCPU: '', - startTime: 0, - name: 'dart', - architectureBits: 64, - operatingSystem: '', - version: '', - systemIsolateGroups: [], - systemIsolates: [], -); - -final FlutterView fakeFlutterView = FlutterView( - id: 'a', - uiIsolate: fakeUnpausedIsolate, -); - -final FakeVmServiceRequest listViews = FakeVmServiceRequest( - method: kListViewsMethod, - jsonResponse: { - 'views': [ - fakeFlutterView.toJson(), - ], - }, -); - -const FakeVmServiceRequest setAssetBundlePath = FakeVmServiceRequest( - method: '_flutter.setAssetBundlePath', - args: { - 'viewId': 'a', - 'assetDirectory': 'build/flutter_assets', - 'isolateId': '1', - } -); - -const FakeVmServiceRequest evict = FakeVmServiceRequest( - method: 'ext.flutter.evict', - args: { - 'value': 'asset', - 'isolateId': '1', - } -); - -const FakeVmServiceRequest evictShader = FakeVmServiceRequest( - method: 'ext.ui.window.reinitializeShader', - args: { - 'assetKey': 'foo.frag', - 'isolateId': '1', - } -); - -final Uri testUri = Uri.parse('foo://bar'); - -// This implements [dds.DartDevelopmentService], not the [DartDevelopmentService] -// interface from package:flutter_tools. -class FakeDartDevelopmentService extends Fake implements dds.DartDevelopmentService { - @override - Future get done => Future.value(); - - @override - Uri? get uri => null; -} - -class FakeDartDevelopmentServiceException implements dds.DartDevelopmentServiceException { - FakeDartDevelopmentServiceException({this.message = defaultMessage}); - - @override - final int errorCode = dds.DartDevelopmentServiceException.existingDdsInstanceError; - - @override - final String message; - static const String defaultMessage = 'A DDS instance is already connected at http://localhost:8181'; -} - -class TestFlutterDevice extends FlutterDevice { - TestFlutterDevice(super.device, { Stream? vmServiceUris }) - : _vmServiceUris = vmServiceUris, super(buildInfo: BuildInfo.debug, developmentShaderCompiler: const FakeShaderCompiler()); - - final Stream? _vmServiceUris; - - @override - Stream get vmServiceUris => _vmServiceUris!; -} - -class ThrowingForwardingFileSystem extends ForwardingFileSystem { - ThrowingForwardingFileSystem(super.delegate); - - @override - File file(dynamic path) { - if (path == 'foo') { - throw const FileSystemException(); - } - return delegate.file(path); - } -} - -class FakeFlutterDevice extends Fake implements FlutterDevice { - FakeVmServiceHost? Function()? vmServiceHost; - Uri? testUri; - UpdateFSReport report = UpdateFSReport( - success: true, - invalidatedSourcesCount: 1, - ); - Exception? reportError; - Exception? runColdError; - int runHotCode = 0; - int runColdCode = 0; - - @override - ResidentCompiler? generator; - - @override - DevelopmentShaderCompiler get developmentShaderCompiler => const FakeShaderCompiler(); - - @override - TargetPlatform targetPlatform = TargetPlatform.android; - - @override - Stream get vmServiceUris => Stream.value(testUri); - - @override - FlutterVmService? get vmService => vmServiceHost?.call()?.vmService; - - DevFS? _devFS; - - @override - DevFS? get devFS => _devFS; - - @override - set devFS(DevFS? value) { } - - @override - Device? device; - - @override - Future stopEchoingDeviceLog() async { } - - @override - Future initLogReader() async { } - - @override - Future setupDevFS(String fsName, Directory rootDirectory) async { - return testUri!; - } - - @override - Future runHot({required HotRunner hotRunner, String? route}) async { - return runHotCode; - } - - @override - Future runCold({required ColdRunner coldRunner, String? route}) async { - if (runColdError != null) { - throw runColdError!; - } - return runColdCode; - } - - @override - Future connect({ - ReloadSources? reloadSources, - Restart? restart, - CompileExpression? compileExpression, - GetSkSLMethod? getSkSLMethod, - FlutterProject? flutterProject, - PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, - int? hostVmServicePort, - int? ddsPort, - bool disableServiceAuthCodes = false, - bool enableDds = true, - bool cacheStartupProfile = false, - required bool allowExistingDdsInstance, - bool ipv6 = false, - }) async { } - - @override - Future updateDevFS({ - required Uri mainUri, - String? target, - AssetBundle? bundle, - DateTime? firstBuildTime, - bool bundleFirstUpload = false, - bool bundleDirty = false, - bool fullRestart = false, - String? projectRootPath, - required String pathToReload, - required String dillOutputPath, - required List invalidatedFiles, - required PackageConfig packageConfig, - }) async { - if (reportError != null) { - throw reportError!; - } - return report; - } - - @override - Future updateReloadStatus(bool wasReloadSuccessful) async { } -} - -class FakeDelegateFlutterDevice extends FlutterDevice { - FakeDelegateFlutterDevice( - super.device, - BuildInfo buildInfo, - ResidentCompiler residentCompiler, - this.fakeDevFS, - ) : super(buildInfo: buildInfo, generator: residentCompiler, developmentShaderCompiler: const FakeShaderCompiler()); - - @override - Future connect({ - ReloadSources? reloadSources, - Restart? restart, - bool enableDds = true, - bool cacheStartupProfile = false, - bool disableServiceAuthCodes = false, - bool ipv6 = false, - CompileExpression? compileExpression, - GetSkSLMethod? getSkSLMethod, - FlutterProject? flutterProject, - int? hostVmServicePort, - int? ddsPort, - PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, - bool allowExistingDdsInstance = false, - }) async { } - - - final DevFS fakeDevFS; - - @override - DevFS? get devFS => fakeDevFS; - - @override - set devFS(DevFS? value) {} -} - -class FakeResidentCompiler extends Fake implements ResidentCompiler { - CompilerOutput? nextOutput; - bool didSuppressErrors = false; - Uri? receivedNativeAssetsYaml; - bool recompileCalled = false; - - @override - Future recompile( - Uri mainUri, - List? invalidatedFiles, { - required String outputPath, - required PackageConfig packageConfig, - String? projectRootPath, - required FileSystem fs, - bool suppressErrors = false, - bool checkDartPluginRegistry = false, - File? dartPluginRegistrant, - Uri? nativeAssetsYaml, - }) async { - recompileCalled = true; - receivedNativeAssetsYaml = nativeAssetsYaml; - didSuppressErrors = suppressErrors; - return nextOutput ?? const CompilerOutput('foo.dill', 0, []); - } - - @override - void accept() { } - - @override - void reset() { } -} - -class FakeProjectFileInvalidator extends Fake implements ProjectFileInvalidator { - @override - Future findInvalidated({ - required DateTime? lastCompiled, - required List urisToMonitor, - required String packagesPath, - required PackageConfig packageConfig, - bool asyncScanning = false, - }) async { - return InvalidationResult( - packageConfig: packageConfig, - uris: [Uri.parse('file:///hello_world/main.dart'), - ]); - } -} - -class FakeDevice extends Fake implements Device { - FakeDevice({ - String sdkNameAndVersion = 'Android', - TargetPlatform targetPlatform = TargetPlatform.android_arm, - bool isLocalEmulator = false, - this.supportsHotRestart = true, - this.supportsScreenshot = true, - this.supportsFlutterExit = true, - }) : _isLocalEmulator = isLocalEmulator, - _targetPlatform = targetPlatform, - _sdkNameAndVersion = sdkNameAndVersion; - - final bool _isLocalEmulator; - final TargetPlatform _targetPlatform; - final String _sdkNameAndVersion; - - bool disposed = false; - bool appStopped = false; - bool failScreenshot = false; - - @override - bool supportsHotRestart; - - @override - bool supportsScreenshot; - - @override - bool supportsFlutterExit; - - @override - PlatformType get platformType => _targetPlatform == TargetPlatform.web_javascript - ? PlatformType.web - : PlatformType.android; - - @override - Future get sdkNameAndVersion async => _sdkNameAndVersion; - - @override - Future get targetPlatform async => _targetPlatform; - - @override - Future get isLocalEmulator async => _isLocalEmulator; - - @override - String get name => 'FakeDevice'; - - @override - late DartDevelopmentService dds; - - @override - Future dispose() async { - disposed = true; - } - - @override - Future stopApp(ApplicationPackage? app, {String? userIdentifier}) async { - appStopped = true; - return true; - } - - @override - Future takeScreenshot(File outputFile) async { - if (failScreenshot) { - throw Exception(); - } - outputFile.writeAsBytesSync(List.generate(1024, (int i) => i)); - } - - @override - FutureOr getLogReader({ - ApplicationPackage? app, - bool includePastLogs = false, - }) => NoOpDeviceLogReader(name); - - @override - DevicePortForwarder portForwarder = const NoOpDevicePortForwarder(); -} - -class FakeDevFS extends Fake implements DevFS { - @override - DateTime? lastCompiled = DateTime(2000); - - @override - PackageConfig? lastPackageConfig = PackageConfig.empty; - - @override - List sources = []; - - @override - Uri baseUri = Uri(); - - @override - Future destroy() async { } - - @override - Set assetPathsToEvict = {}; - - @override - Set shaderPathsToEvict = {}; - - @override - Set scenePathsToEvict = {}; - - @override - bool didUpdateFontManifest = false; - - UpdateFSReport nextUpdateReport = UpdateFSReport(success: true); - - @override - bool hasSetAssetDirectory = false; - - @override - Future create() async { - return Uri(); - } - - @override - void resetLastCompiled() { - lastCompiled = null; - } - - @override - Future update({ - required Uri mainUri, - required ResidentCompiler generator, - required bool trackWidgetCreation, - required String pathToReload, - required List invalidatedFiles, - required PackageConfig packageConfig, - required String dillOutputPath, - required DevelopmentShaderCompiler shaderCompiler, - DevelopmentSceneImporter? sceneImporter, - DevFSWriter? devFSWriter, - String? target, - AssetBundle? bundle, - DateTime? firstBuildTime, - bool bundleFirstUpload = false, - bool fullRestart = false, - String? projectRootPath, - File? dartPluginRegistrant, - }) async { - return nextUpdateReport; - } -} - -class FakeShaderCompiler implements DevelopmentShaderCompiler { - const FakeShaderCompiler(); - - @override - void configureCompiler(TargetPlatform? platform) { } - - @override - Future recompileShader(DevFSContent inputShader) { - throw UnimplementedError(); - } -} diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart index 8c30e0a0a11..547c9b7e9c0 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -7,7 +7,9 @@ import 'dart:async'; import 'package:dds/dds.dart' as dds; import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; +import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/artifacts.dart'; +import 'package:flutter_tools/src/asset.dart'; import 'package:flutter_tools/src/base/command_help.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/dds.dart'; @@ -16,10 +18,14 @@ import 'package:flutter_tools/src/base/io.dart' as io; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; +import 'package:flutter_tools/src/build_system/tools/scene_importer.dart'; +import 'package:flutter_tools/src/build_system/tools/shader_compiler.dart'; import 'package:flutter_tools/src/compile.dart'; import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/devfs.dart'; import 'package:flutter_tools/src/device.dart'; +import 'package:flutter_tools/src/device_port_forwarder.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/project.dart'; @@ -30,6 +36,12 @@ import 'package:flutter_tools/src/run_cold.dart'; import 'package:flutter_tools/src/run_hot.dart'; import 'package:flutter_tools/src/version.dart'; import 'package:flutter_tools/src/vmservice.dart'; +import 'package:native_assets_cli/native_assets_cli_internal.dart' + hide BuildMode, Target; +import 'package:native_assets_cli/native_assets_cli_internal.dart' + as native_assets_cli; +import 'package:package_config/package_config.dart'; +import 'package:test/fake.dart'; import 'package:unified_analytics/src/enums.dart'; import 'package:unified_analytics/unified_analytics.dart'; import 'package:vm_service/vm_service.dart' as vm_service; @@ -39,8 +51,121 @@ import '../src/context.dart'; import '../src/fake_vm_services.dart'; import '../src/fakes.dart'; import '../src/testbed.dart'; -import 'isolated/fake_native_assets_build_runner.dart'; -import 'resident_runner_helpers.dart'; +import 'fake_native_assets_build_runner.dart'; + +final vm_service.Event fakeUnpausedEvent = vm_service.Event( + kind: vm_service.EventKind.kResume, + timestamp: 0 +); + +final vm_service.Event fakePausedEvent = vm_service.Event( + kind: vm_service.EventKind.kPauseException, + timestamp: 0 +); + +final vm_service.Isolate fakeUnpausedIsolate = vm_service.Isolate( + id: '1', + pauseEvent: fakeUnpausedEvent, + breakpoints: [], + extensionRPCs: [], + libraries: [ + vm_service.LibraryRef( + id: '1', + uri: 'file:///hello_world/main.dart', + name: '', + ), + ], + livePorts: 0, + name: 'test', + number: '1', + pauseOnExit: false, + runnable: true, + startTime: 0, + isSystemIsolate: false, + isolateFlags: [], +); + +final vm_service.Isolate fakePausedIsolate = vm_service.Isolate( + id: '1', + pauseEvent: fakePausedEvent, + breakpoints: [ + vm_service.Breakpoint( + breakpointNumber: 123, + id: 'test-breakpoint', + location: vm_service.SourceLocation( + tokenPos: 0, + script: vm_service.ScriptRef(id: 'test-script', uri: 'foo.dart'), + ), + enabled: true, + resolved: true, + ), + ], + libraries: [], + livePorts: 0, + name: 'test', + number: '1', + pauseOnExit: false, + runnable: true, + startTime: 0, + isSystemIsolate: false, + isolateFlags: [], +); + +final vm_service.VM fakeVM = vm_service.VM( + isolates: [fakeUnpausedIsolate], + pid: 1, + hostCPU: '', + isolateGroups: [], + targetCPU: '', + startTime: 0, + name: 'dart', + architectureBits: 64, + operatingSystem: '', + version: '', + systemIsolateGroups: [], + systemIsolates: [], +); + +final FlutterView fakeFlutterView = FlutterView( + id: 'a', + uiIsolate: fakeUnpausedIsolate, +); + +final FakeVmServiceRequest listViews = FakeVmServiceRequest( + method: kListViewsMethod, + jsonResponse: { + 'views': [ + fakeFlutterView.toJson(), + ], + }, +); + +const FakeVmServiceRequest setAssetBundlePath = FakeVmServiceRequest( + method: '_flutter.setAssetBundlePath', + args: { + 'viewId': 'a', + 'assetDirectory': 'build/flutter_assets', + 'isolateId': '1', + } +); + +const FakeVmServiceRequest evict = FakeVmServiceRequest( + method: 'ext.flutter.evict', + args: { + 'value': 'asset', + 'isolateId': '1', + } +); + +const FakeVmServiceRequest evictShader = FakeVmServiceRequest( + method: 'ext.ui.window.reinitializeShader', + args: { + 'assetKey': 'foo.frag', + 'isolateId': '1', + } +); + +final Uri testUri = Uri.parse('foo://bar'); void main() { late Testbed testbed; @@ -80,7 +205,7 @@ void main() { ..testUri = testUri ..vmServiceHost = (() => fakeVmServiceHost) ..device = device - ..devFS = devFS; + .._devFS = devFS; }); testUsingContext('ResidentRunner can attach to device successfully', () => testbed.run(() async { @@ -346,7 +471,7 @@ void main() { connectionInfoCompleter: futureConnectionInfo, )); await futureAppStart.future; - flutterDevice.devFS = null; + flutterDevice._devFS = null; final OperationResult result = await residentRunner.restart(); expect(result.fatal, false); @@ -2312,6 +2437,88 @@ flutter: expect(fakeVmServiceHost!.hasRemainingExpectations, false); })); + testUsingContext( + 'native assets', + () => testbed.run(() async { + final FileSystem fileSystem = globals.fs; + final Environment environment = Environment.test( + fileSystem.currentDirectory, + inputs: {}, + artifacts: Artifacts.test(), + processManager: FakeProcessManager.empty(), + fileSystem: fileSystem, + logger: BufferLogger.test(), + ); + final Uri projectUri = environment.projectDir.uri; + + final FakeDevice device = FakeDevice( + targetPlatform: TargetPlatform.darwin, + sdkNameAndVersion: 'Macos', + ); + final FakeResidentCompiler residentCompiler = FakeResidentCompiler(); + final FakeFlutterDevice flutterDevice = FakeFlutterDevice() + ..testUri = testUri + ..vmServiceHost = (() => fakeVmServiceHost) + ..device = device + .._devFS = devFS + ..targetPlatform = TargetPlatform.darwin + ..generator = residentCompiler; + + fakeVmServiceHost = FakeVmServiceHost(requests: [ + listViews, + listViews, + ]); + globals.fs + .file(globals.fs.path.join('lib', 'main.dart')) + .createSync(recursive: true); + final FakeNativeAssetsBuildRunner buildRunner = FakeNativeAssetsBuildRunner( + packagesWithNativeAssetsResult: [ + Package('bar', projectUri), + ], + dryRunResult: FakeNativeAssetsBuilderResult( + assets: [ + Asset( + id: 'package:bar/bar.dart', + linkMode: LinkMode.dynamic, + target: native_assets_cli.Target.macOSArm64, + path: AssetAbsolutePath(Uri.file('bar.dylib')), + ), + ], + ), + ); + residentRunner = HotRunner( + [ + flutterDevice, + ], + stayResident: false, + debuggingOptions: DebuggingOptions.enabled(const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + trackWidgetCreation: true, + )), + target: 'main.dart', + devtoolsHandler: createNoOpHandler, + buildRunner: buildRunner, + analytics: fakeAnalytics, + ); + + final int? result = await residentRunner.run(); + expect(result, 0); + + expect(buildRunner.buildInvocations, 0); + expect(buildRunner.dryRunInvocations, 1); + expect(buildRunner.hasPackageConfigInvocations, 1); + expect(buildRunner.packagesWithNativeAssetsInvocations, 1); + + expect(residentCompiler.recompileCalled, true); + expect(residentCompiler.receivedNativeAssetsYaml.toString(), endsWith('native_assets/macos/native_assets.yaml')); + }), + overrides: { + ProcessManager: () => FakeProcessManager.any(), + FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), + }); + testUsingContext( 'use the nativeAssetsYamlFile when provided', () => testbed.run(() async { @@ -2324,7 +2531,7 @@ flutter: ..testUri = testUri ..vmServiceHost = (() => fakeVmServiceHost) ..device = device - ..devFS = devFS + .._devFS = devFS ..targetPlatform = TargetPlatform.darwin ..generator = residentCompiler; @@ -2349,7 +2556,7 @@ flutter: )), target: 'main.dart', devtoolsHandler: createNoOpHandler, - nativeAssetsBuilder: FakeHotRunnerNativeAssetsBuilder(buildRunner), + buildRunner: buildRunner, analytics: fakeAnalytics, nativeAssetsYamlFile: 'foo.yaml', ); @@ -2370,3 +2577,390 @@ flutter: FeatureFlags: () => TestFeatureFlags(isNativeAssetsEnabled: true, isMacOSEnabled: true), }); } + +// This implements [dds.DartDevelopmentService], not the [DartDevelopmentService] +// interface from package:flutter_tools. +class FakeDartDevelopmentService extends Fake implements dds.DartDevelopmentService { + @override + Future get done => Future.value(); + + @override + Uri? get uri => null; +} + +class FakeDartDevelopmentServiceException implements dds.DartDevelopmentServiceException { + FakeDartDevelopmentServiceException({this.message = defaultMessage}); + + @override + final int errorCode = dds.DartDevelopmentServiceException.existingDdsInstanceError; + + @override + final String message; + static const String defaultMessage = 'A DDS instance is already connected at http://localhost:8181'; +} + +class TestFlutterDevice extends FlutterDevice { + TestFlutterDevice(super.device, { Stream? vmServiceUris }) + : _vmServiceUris = vmServiceUris, super(buildInfo: BuildInfo.debug, developmentShaderCompiler: const FakeShaderCompiler()); + + final Stream? _vmServiceUris; + + @override + Stream get vmServiceUris => _vmServiceUris!; +} + +class ThrowingForwardingFileSystem extends ForwardingFileSystem { + ThrowingForwardingFileSystem(super.delegate); + + @override + File file(dynamic path) { + if (path == 'foo') { + throw const FileSystemException(); + } + return delegate.file(path); + } +} + +class FakeFlutterDevice extends Fake implements FlutterDevice { + FakeVmServiceHost? Function()? vmServiceHost; + Uri? testUri; + UpdateFSReport report = UpdateFSReport( + success: true, + invalidatedSourcesCount: 1, + ); + Exception? reportError; + Exception? runColdError; + int runHotCode = 0; + int runColdCode = 0; + + @override + ResidentCompiler? generator; + + @override + DevelopmentShaderCompiler get developmentShaderCompiler => const FakeShaderCompiler(); + + @override + TargetPlatform targetPlatform = TargetPlatform.android; + + @override + Stream get vmServiceUris => Stream.value(testUri); + + @override + FlutterVmService? get vmService => vmServiceHost?.call()?.vmService; + + DevFS? _devFS; + + @override + DevFS? get devFS => _devFS; + + @override + set devFS(DevFS? value) { } + + @override + Device? device; + + @override + Future stopEchoingDeviceLog() async { } + + @override + Future initLogReader() async { } + + @override + Future setupDevFS(String fsName, Directory rootDirectory) async { + return testUri!; + } + + @override + Future runHot({required HotRunner hotRunner, String? route}) async { + return runHotCode; + } + + @override + Future runCold({required ColdRunner coldRunner, String? route}) async { + if (runColdError != null) { + throw runColdError!; + } + return runColdCode; + } + + @override + Future connect({ + ReloadSources? reloadSources, + Restart? restart, + CompileExpression? compileExpression, + GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, + PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, + int? hostVmServicePort, + int? ddsPort, + bool disableServiceAuthCodes = false, + bool enableDds = true, + bool cacheStartupProfile = false, + required bool allowExistingDdsInstance, + bool ipv6 = false, + }) async { } + + @override + Future updateDevFS({ + required Uri mainUri, + String? target, + AssetBundle? bundle, + DateTime? firstBuildTime, + bool bundleFirstUpload = false, + bool bundleDirty = false, + bool fullRestart = false, + String? projectRootPath, + required String pathToReload, + required String dillOutputPath, + required List invalidatedFiles, + required PackageConfig packageConfig, + }) async { + if (reportError != null) { + throw reportError!; + } + return report; + } + + @override + Future updateReloadStatus(bool wasReloadSuccessful) async { } +} + +class FakeDelegateFlutterDevice extends FlutterDevice { + FakeDelegateFlutterDevice( + super.device, + BuildInfo buildInfo, + ResidentCompiler residentCompiler, + this.fakeDevFS, + ) : super(buildInfo: buildInfo, generator: residentCompiler, developmentShaderCompiler: const FakeShaderCompiler()); + + @override + Future connect({ + ReloadSources? reloadSources, + Restart? restart, + bool enableDds = true, + bool cacheStartupProfile = false, + bool disableServiceAuthCodes = false, + bool ipv6 = false, + CompileExpression? compileExpression, + GetSkSLMethod? getSkSLMethod, + FlutterProject? flutterProject, + int? hostVmServicePort, + int? ddsPort, + PrintStructuredErrorLogMethod? printStructuredErrorLogMethod, + bool allowExistingDdsInstance = false, + }) async { } + + + final DevFS fakeDevFS; + + @override + DevFS? get devFS => fakeDevFS; + + @override + set devFS(DevFS? value) {} +} + +class FakeResidentCompiler extends Fake implements ResidentCompiler { + CompilerOutput? nextOutput; + bool didSuppressErrors = false; + Uri? receivedNativeAssetsYaml; + bool recompileCalled = false; + + @override + Future recompile( + Uri mainUri, + List? invalidatedFiles, { + required String outputPath, + required PackageConfig packageConfig, + String? projectRootPath, + required FileSystem fs, + bool suppressErrors = false, + bool checkDartPluginRegistry = false, + File? dartPluginRegistrant, + Uri? nativeAssetsYaml, + }) async { + recompileCalled = true; + receivedNativeAssetsYaml = nativeAssetsYaml; + didSuppressErrors = suppressErrors; + return nextOutput ?? const CompilerOutput('foo.dill', 0, []); + } + + @override + void accept() { } + + @override + void reset() { } +} + +class FakeProjectFileInvalidator extends Fake implements ProjectFileInvalidator { + @override + Future findInvalidated({ + required DateTime? lastCompiled, + required List urisToMonitor, + required String packagesPath, + required PackageConfig packageConfig, + bool asyncScanning = false, + }) async { + return InvalidationResult( + packageConfig: packageConfig, + uris: [Uri.parse('file:///hello_world/main.dart'), + ]); + } +} + +class FakeDevice extends Fake implements Device { + FakeDevice({ + String sdkNameAndVersion = 'Android', + TargetPlatform targetPlatform = TargetPlatform.android_arm, + bool isLocalEmulator = false, + this.supportsHotRestart = true, + this.supportsScreenshot = true, + this.supportsFlutterExit = true, + }) : _isLocalEmulator = isLocalEmulator, + _targetPlatform = targetPlatform, + _sdkNameAndVersion = sdkNameAndVersion; + + final bool _isLocalEmulator; + final TargetPlatform _targetPlatform; + final String _sdkNameAndVersion; + + bool disposed = false; + bool appStopped = false; + bool failScreenshot = false; + + @override + bool supportsHotRestart; + + @override + bool supportsScreenshot; + + @override + bool supportsFlutterExit; + + @override + PlatformType get platformType => _targetPlatform == TargetPlatform.web_javascript + ? PlatformType.web + : PlatformType.android; + + @override + Future get sdkNameAndVersion async => _sdkNameAndVersion; + + @override + Future get targetPlatform async => _targetPlatform; + + @override + Future get isLocalEmulator async => _isLocalEmulator; + + @override + String get name => 'FakeDevice'; + + @override + late DartDevelopmentService dds; + + @override + Future dispose() async { + disposed = true; + } + + @override + Future stopApp(ApplicationPackage? app, {String? userIdentifier}) async { + appStopped = true; + return true; + } + + @override + Future takeScreenshot(File outputFile) async { + if (failScreenshot) { + throw Exception(); + } + outputFile.writeAsBytesSync(List.generate(1024, (int i) => i)); + } + + @override + FutureOr getLogReader({ + ApplicationPackage? app, + bool includePastLogs = false, + }) => NoOpDeviceLogReader(name); + + @override + DevicePortForwarder portForwarder = const NoOpDevicePortForwarder(); +} + +class FakeDevFS extends Fake implements DevFS { + @override + DateTime? lastCompiled = DateTime(2000); + + @override + PackageConfig? lastPackageConfig = PackageConfig.empty; + + @override + List sources = []; + + @override + Uri baseUri = Uri(); + + @override + Future destroy() async { } + + @override + Set assetPathsToEvict = {}; + + @override + Set shaderPathsToEvict = {}; + + @override + Set scenePathsToEvict = {}; + + @override + bool didUpdateFontManifest = false; + + UpdateFSReport nextUpdateReport = UpdateFSReport(success: true); + + @override + bool hasSetAssetDirectory = false; + + @override + Future create() async { + return Uri(); + } + + @override + void resetLastCompiled() { + lastCompiled = null; + } + + @override + Future update({ + required Uri mainUri, + required ResidentCompiler generator, + required bool trackWidgetCreation, + required String pathToReload, + required List invalidatedFiles, + required PackageConfig packageConfig, + required String dillOutputPath, + required DevelopmentShaderCompiler shaderCompiler, + DevelopmentSceneImporter? sceneImporter, + DevFSWriter? devFSWriter, + String? target, + AssetBundle? bundle, + DateTime? firstBuildTime, + bool bundleFirstUpload = false, + bool fullRestart = false, + String? projectRootPath, + File? dartPluginRegistrant, + }) async { + return nextUpdateReport; + } +} + +class FakeShaderCompiler implements DevelopmentShaderCompiler { + const FakeShaderCompiler(); + + @override + void configureCompiler(TargetPlatform? platform) { } + + @override + Future recompileShader(DevFSContent inputShader) { + throw UnimplementedError(); + } +} diff --git a/packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart b/packages/flutter_tools/test/general.shard/windows/native_assets_test.dart similarity index 98% rename from packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart rename to packages/flutter_tools/test/general.shard/windows/native_assets_test.dart index 15c8d587f3e..7226fa2396b 100644 --- a/packages/flutter_tools/test/general.shard/isolated/windows/native_assets_test.dart +++ b/packages/flutter_tools/test/general.shard/windows/native_assets_test.dart @@ -14,17 +14,17 @@ import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/dart/package_map.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/globals.dart' as globals; -import 'package:flutter_tools/src/isolated/native_assets/native_assets.dart'; -import 'package:flutter_tools/src/isolated/native_assets/windows/native_assets.dart'; +import 'package:flutter_tools/src/native_assets.dart'; +import 'package:flutter_tools/src/windows/native_assets.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart' hide BuildMode, Target; import 'package:native_assets_cli/native_assets_cli_internal.dart' as native_assets_cli; import 'package:package_config/package_config_types.dart'; -import '../../../src/common.dart'; -import '../../../src/context.dart'; -import '../../../src/fakes.dart'; +import '../../src/common.dart'; +import '../../src/context.dart'; +import '../../src/fakes.dart'; import '../fake_native_assets_build_runner.dart'; void main() { diff --git a/packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart b/packages/flutter_tools/test/integration.shard/native_assets_test.dart similarity index 99% rename from packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart rename to packages/flutter_tools/test/integration.shard/native_assets_test.dart index 505f4fdadc9..99a7a87846c 100644 --- a/packages/flutter_tools/test/integration.shard/isolated/native_assets_test.dart +++ b/packages/flutter_tools/test/integration.shard/native_assets_test.dart @@ -21,9 +21,9 @@ import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/os.dart'; import 'package:native_assets_cli/native_assets_cli_internal.dart'; -import '../../src/common.dart'; -import '../test_utils.dart' show ProcessResultMatcher, fileSystem, platform; -import '../transition_test_utils.dart'; +import '../src/common.dart'; +import 'test_utils.dart' show ProcessResultMatcher, fileSystem, platform; +import 'transition_test_utils.dart'; final String hostOs = platform.operatingSystem;