From c627dbfbc6400a0ac53d175fe368b178b7acb506 Mon Sep 17 00:00:00 2001 From: Derek Xu Date: Thu, 21 Sep 2023 14:32:35 -0400 Subject: [PATCH] Add `--frontend-server-starter-path` option to `flutter run` and `flutter test` (#135038) --- packages/flutter_tools/bin/macos_assemble.sh | 1 + packages/flutter_tools/bin/tool_backend.dart | 3 ++ packages/flutter_tools/bin/xcode_backend.dart | 1 + .../gradle/src/main/groovy/flutter.groovy | 10 ++++ .../flutter_tools/lib/src/build_info.dart | 14 ++++++ .../lib/src/build_system/targets/common.dart | 2 + .../flutter_tools/lib/src/commands/run.dart | 1 + .../flutter_tools/lib/src/commands/test.dart | 1 + packages/flutter_tools/lib/src/compile.dart | 24 ++++++---- .../lib/src/resident_runner.dart | 3 ++ .../lib/src/runner/flutter_command.dart | 17 +++++++ .../lib/src/test/test_compiler.dart | 1 + .../test/general.shard/build_info_test.dart | 6 +++ .../build_system/targets/common_test.dart | 47 +++++++++++++++++++ .../build_system/targets/web_test.dart | 32 +++++++++++++ .../general.shard/bundle_builder_test.dart | 2 + .../general.shard/resident_runner_test.dart | 22 +++++++++ .../general.shard/xcode_backend_test.dart | 5 ++ 18 files changed, 184 insertions(+), 8 deletions(-) diff --git a/packages/flutter_tools/bin/macos_assemble.sh b/packages/flutter_tools/bin/macos_assemble.sh index 3f21624e7c..3963a80839 100755 --- a/packages/flutter_tools/bin/macos_assemble.sh +++ b/packages/flutter_tools/bin/macos_assemble.sh @@ -123,6 +123,7 @@ BuildApp() { "-dSplitDebugInfo=${SPLIT_DEBUG_INFO}" "-dTrackWidgetCreation=${TRACK_WIDGET_CREATION}" "-dAction=${ACTION}" + "-dFrontendServerStarterPath=${FRONTEND_SERVER_STARTER_PATH}" "--DartDefines=${DART_DEFINES}" "--ExtraGenSnapshotOptions=${EXTRA_GEN_SNAPSHOT_OPTIONS}" "--ExtraFrontEndOptions=${EXTRA_FRONT_END_OPTIONS}" diff --git a/packages/flutter_tools/bin/tool_backend.dart b/packages/flutter_tools/bin/tool_backend.dart index 7b67f56757..d98c705547 100644 --- a/packages/flutter_tools/bin/tool_backend.dart +++ b/packages/flutter_tools/bin/tool_backend.dart @@ -13,6 +13,7 @@ Future main(List arguments) async { final String? dartDefines = Platform.environment['DART_DEFINES']; final bool dartObfuscation = Platform.environment['DART_OBFUSCATION'] == 'true'; + final String? frontendServerStarterPath = Platform.environment['FRONTEND_SERVER_STARTER_PATH']; final String? extraFrontEndOptions = Platform.environment['EXTRA_FRONT_END_OPTIONS']; final String? extraGenSnapshotOptions = Platform.environment['EXTRA_GEN_SNAPSHOT_OPTIONS']; final String? flutterEngine = Platform.environment['FLUTTER_ENGINE']; @@ -106,6 +107,8 @@ or '--DartDefines=$dartDefines', if (extraGenSnapshotOptions != null) '--ExtraGenSnapshotOptions=$extraGenSnapshotOptions', + if (frontendServerStarterPath != null) + '-dFrontendServerStarterPath=$frontendServerStarterPath', if (extraFrontEndOptions != null) '--ExtraFrontEndOptions=$extraFrontEndOptions', target, diff --git a/packages/flutter_tools/bin/xcode_backend.dart b/packages/flutter_tools/bin/xcode_backend.dart index 87d1c22313..6e3fb7174a 100644 --- a/packages/flutter_tools/bin/xcode_backend.dart +++ b/packages/flutter_tools/bin/xcode_backend.dart @@ -402,6 +402,7 @@ class Context { '-dTrackWidgetCreation=${environment['TRACK_WIDGET_CREATION'] ?? ''}', '-dDartObfuscation=${environment['DART_OBFUSCATION'] ?? ''}', '-dAction=${environment['ACTION'] ?? ''}', + '-dFrontendServerStarterPath=${environment['FRONTEND_SERVER_STARTER_PATH'] ?? ''}', '--ExtraGenSnapshotOptions=${environment['EXTRA_GEN_SNAPSHOT_OPTIONS'] ?? ''}', '--DartDefines=${environment['DART_DEFINES'] ?? ''}', '--ExtraFrontEndOptions=${environment['EXTRA_FRONT_END_OPTIONS'] ?? ''}', diff --git a/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy b/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy index f3c1a4145c..53808cfe48 100644 --- a/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy +++ b/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy @@ -964,6 +964,10 @@ class FlutterPlugin implements Plugin { if (project.hasProperty('track-widget-creation')) { trackWidgetCreationValue = project.property('track-widget-creation').toBoolean() } + String frontendServerStarterPathValue = null + if (project.hasProperty('frontend-server-starter-path')) { + frontendServerStarterPathValue = project.property('frontend-server-starter-path') + } String extraFrontEndOptionsValue = null if (project.hasProperty('extra-front-end-options')) { extraFrontEndOptionsValue = project.property('extra-front-end-options') @@ -1052,6 +1056,7 @@ class FlutterPlugin implements Plugin { targetPlatformValues = targetPlatforms sourceDir getFlutterSourceDirectory() intermediateDir project.file("${project.buildDir}/$INTERMEDIATES_DIR/flutter/${variant.name}/") + frontendServerStarterPath frontendServerStarterPathValue extraFrontEndOptions extraFrontEndOptionsValue extraGenSnapshotOptions extraGenSnapshotOptionsValue splitDebugInfo splitDebugInfoValue @@ -1290,6 +1295,8 @@ abstract class BaseFlutterTask extends DefaultTask { @Internal File intermediateDir @Optional @Input + String frontendServerStarterPath + @Optional @Input String extraFrontEndOptions @Optional @Input String extraGenSnapshotOptions @@ -1394,6 +1401,9 @@ abstract class BaseFlutterTask extends DefaultTask { if (extraGenSnapshotOptions != null) { args "--ExtraGenSnapshotOptions=${extraGenSnapshotOptions}" } + if (frontendServerStarterPath != null) { + args "-dFrontendServerStarterPath=${frontendServerStarterPath}" + } if (extraFrontEndOptions != null) { args "--ExtraFrontEndOptions=${extraFrontEndOptions}" } diff --git a/packages/flutter_tools/lib/src/build_info.dart b/packages/flutter_tools/lib/src/build_info.dart index fea9da5c41..b084efeddf 100644 --- a/packages/flutter_tools/lib/src/build_info.dart +++ b/packages/flutter_tools/lib/src/build_info.dart @@ -23,6 +23,7 @@ class BuildInfo { this.mode, this.flavor, { this.trackWidgetCreation = false, + this.frontendServerStarterPath, List? extraFrontEndOptions, List? extraGenSnapshotOptions, List? fileSystemRoots, @@ -82,6 +83,10 @@ class BuildInfo { /// Whether the build should track widget creation locations. final bool trackWidgetCreation; + /// If provided, the frontend server will be started in JIT mode from this + /// file. + final String? frontendServerStarterPath; + /// Extra command-line options for front-end. final List extraFrontEndOptions; @@ -237,6 +242,8 @@ class BuildInfo { if (dartDefines.isNotEmpty) kDartDefines: encodeDartDefines(dartDefines), kDartObfuscation: dartObfuscation.toString(), + if (frontendServerStarterPath != null) + kFrontendServerStarterPath: frontendServerStarterPath!, if (extraFrontEndOptions.isNotEmpty) kExtraFrontEndOptions: extraFrontEndOptions.join(','), if (extraGenSnapshotOptions.isNotEmpty) @@ -274,6 +281,8 @@ class BuildInfo { if (dartDefines.isNotEmpty) 'DART_DEFINES': encodeDartDefines(dartDefines), 'DART_OBFUSCATION': dartObfuscation.toString(), + if (frontendServerStarterPath != null) + 'FRONTEND_SERVER_STARTER_PATH': frontendServerStarterPath!, if (extraFrontEndOptions.isNotEmpty) 'EXTRA_FRONT_END_OPTIONS': extraFrontEndOptions.join(','), if (extraGenSnapshotOptions.isNotEmpty) @@ -310,6 +319,8 @@ class BuildInfo { if (dartDefines.isNotEmpty) '-Pdart-defines=${encodeDartDefines(dartDefines)}', '-Pdart-obfuscation=$dartObfuscation', + if (frontendServerStarterPath != null) + '-Pfrontend-server-starter-path=$frontendServerStarterPath', if (extraFrontEndOptions.isNotEmpty) '-Pextra-front-end-options=${extraFrontEndOptions.join(',')}', if (extraGenSnapshotOptions.isNotEmpty) @@ -901,6 +912,9 @@ const String kTargetFile = 'TargetFile'; /// Whether to enable or disable track widget creation. const String kTrackWidgetCreation = 'TrackWidgetCreation'; +/// If provided, the frontend server will be started in JIT mode from this file. +const String kFrontendServerStarterPath = 'FrontendServerStarterPath'; + /// Additional configuration passed to the dart front end. /// /// This is expected to be a comma separated list of strings. diff --git a/packages/flutter_tools/lib/src/build_system/targets/common.dart b/packages/flutter_tools/lib/src/build_system/targets/common.dart index 951febd5b4..d5febecf42 100644 --- a/packages/flutter_tools/lib/src/build_system/targets/common.dart +++ b/packages/flutter_tools/lib/src/build_system/targets/common.dart @@ -178,6 +178,7 @@ class KernelSnapshot extends Target { final TargetPlatform targetPlatform = getTargetPlatformForName(targetPlatformEnvironment); // This configuration is all optional. + final String? frontendServerStarterPath = environment.defines[kFrontendServerStarterPath]; final List extraFrontEndOptions = decodeCommaSeparated(environment.defines, kExtraFrontEndOptions); final List? fileSystemRoots = environment.defines[kFileSystemRoots]?.split(','); final String? fileSystemScheme = environment.defines[kFileSystemScheme]; @@ -254,6 +255,7 @@ class KernelSnapshot extends Target { linkPlatformKernelIn: forceLinkPlatform || buildMode.isPrecompiled, mainPath: targetFileAbsolute, depFilePath: environment.buildDir.childFile('kernel_snapshot.d').path, + frontendServerStarterPath: frontendServerStarterPath, extraFrontEndOptions: extraFrontEndOptions, fileSystemRoots: fileSystemRoots, fileSystemScheme: fileSystemScheme, diff --git a/packages/flutter_tools/lib/src/commands/run.dart b/packages/flutter_tools/lib/src/commands/run.dart index 67b5c0aece..bb6538fcf3 100644 --- a/packages/flutter_tools/lib/src/commands/run.dart +++ b/packages/flutter_tools/lib/src/commands/run.dart @@ -315,6 +315,7 @@ class RunCommand extends RunCommandBase { requiresPubspecYaml(); usesFilesystemOptions(hide: !verboseHelp); usesExtraDartFlagOptions(verboseHelp: verboseHelp); + usesFrontendServerStarterPathOption(verboseHelp: verboseHelp); addEnableExperimentation(hide: !verboseHelp); usesInitializeFromDillOption(hide: !verboseHelp); diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 16864daee6..a7279c5916 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -67,6 +67,7 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { requiresPubspecYaml(); usesPubOption(); addNullSafetyModeOptions(hide: !verboseHelp); + usesFrontendServerStarterPathOption(verboseHelp: verboseHelp); usesTrackWidgetCreation(verboseHelp: verboseHelp); addEnableExperimentation(hide: !verboseHelp); usesDartDefineOption(); diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart index 8ba7d1e89f..e7571a69ea 100644 --- a/packages/flutter_tools/lib/src/compile.dart +++ b/packages/flutter_tools/lib/src/compile.dart @@ -227,6 +227,7 @@ class KernelCompiler { TargetModel targetModel = TargetModel.flutter, bool linkPlatformKernelIn = false, bool aot = false, + String? frontendServerStarterPath, List? extraFrontEndOptions, List? fileSystemRoots, String? fileSystemScheme, @@ -243,10 +244,12 @@ class KernelCompiler { String? nativeAssets, }) async { final TargetPlatform? platform = targetModel == TargetModel.dartdevc ? TargetPlatform.web_javascript : null; - final String frontendServer = _artifacts.getArtifactPath( - Artifact.frontendServerSnapshotForEngineDartSdk, - platform: platform, - ); + final String frontendServer = (frontendServerStarterPath == null || frontendServerStarterPath.isEmpty) + ? _artifacts.getArtifactPath( + Artifact.frontendServerSnapshotForEngineDartSdk, + platform: platform, + ) + : frontendServerStarterPath; // This is a URI, not a file path, so the forward slash is correct even on Windows. if (!sdkRoot.endsWith('/')) { sdkRoot = '$sdkRoot/'; @@ -490,6 +493,7 @@ abstract class ResidentCompiler { bool assumeInitializeFromDillUpToDate, TargetModel targetModel, bool unsafePackageSerialization, + String? frontendServerStarterPath, List extraFrontEndOptions, String platformDill, List? dartDefines, @@ -605,6 +609,7 @@ class DefaultResidentCompiler implements ResidentCompiler { this.assumeInitializeFromDillUpToDate = false, this.targetModel = TargetModel.flutter, this.unsafePackageSerialization = false, + this.frontendServerStarterPath, this.extraFrontEndOptions, this.platformDill, List? dartDefines, @@ -635,6 +640,7 @@ class DefaultResidentCompiler implements ResidentCompiler { final String? initializeFromDill; final bool assumeInitializeFromDillUpToDate; final bool unsafePackageSerialization; + final String? frontendServerStarterPath; final List? extraFrontEndOptions; final List dartDefines; final String? librariesSpec; @@ -771,10 +777,12 @@ class DefaultResidentCompiler implements ResidentCompiler { String? nativeAssetsUri, }) async { final TargetPlatform? platform = (targetModel == TargetModel.dartdevc) ? TargetPlatform.web_javascript : null; - final String frontendServer = artifacts.getArtifactPath( - Artifact.frontendServerSnapshotForEngineDartSdk, - platform: platform, - ); + final String frontendServer = (frontendServerStarterPath == null || frontendServerStarterPath!.isEmpty) + ? artifacts.getArtifactPath( + Artifact.frontendServerSnapshotForEngineDartSdk, + platform: platform, + ) + : frontendServerStarterPath!; final List command = [ artifacts.getArtifactPath(Artifact.engineDartBinary, platform: platform), '--disable-dart-dev', diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart index 00ae359d63..742132b908 100644 --- a/packages/flutter_tools/lib/src/resident_runner.dart +++ b/packages/flutter_tools/lib/src/resident_runner.dart @@ -67,6 +67,7 @@ class FlutterDevice { targetModel: targetModel, dartDefines: buildInfo.dartDefines, packagesPath: buildInfo.packagesPath, + frontendServerStarterPath: buildInfo.frontendServerStarterPath, extraFrontEndOptions: buildInfo.extraFrontEndOptions, artifacts: globals.artifacts!, processManager: globals.processManager, @@ -155,6 +156,7 @@ class FlutterDevice { ), assumeInitializeFromDillUpToDate: buildInfo.assumeInitializeFromDillUpToDate, targetModel: TargetModel.dartdevc, + frontendServerStarterPath: buildInfo.frontendServerStarterPath, extraFrontEndOptions: extraFrontEndOptions, platformDill: globals.fs.file(platformDillPath).absolute.uri.toString(), dartDefines: buildInfo.dartDefines, @@ -185,6 +187,7 @@ class FlutterDevice { fileSystemScheme: buildInfo.fileSystemScheme, targetModel: targetModel, dartDefines: buildInfo.dartDefines, + frontendServerStarterPath: buildInfo.frontendServerStarterPath, extraFrontEndOptions: extraFrontEndOptions, initializeFromDill: buildInfo.initializeFromDill ?? getDefaultCachedKernelPath( trackWidgetCreation: buildInfo.trackWidgetCreation, diff --git a/packages/flutter_tools/lib/src/runner/flutter_command.dart b/packages/flutter_tools/lib/src/runner/flutter_command.dart index d062cc6064..36cf0c575f 100644 --- a/packages/flutter_tools/lib/src/runner/flutter_command.dart +++ b/packages/flutter_tools/lib/src/runner/flutter_command.dart @@ -112,6 +112,7 @@ class FlutterCommandResult { /// Common flutter command line options. abstract final class FlutterOptions { + static const String kFrontendServerStarterPath = 'frontend-server-starter-path'; static const String kExtraFrontEndOptions = 'extra-front-end-options'; static const String kExtraGenSnapshotOptions = 'extra-gen-snapshot-options'; static const String kEnableExperiment = 'enable-experiment'; @@ -849,6 +850,18 @@ abstract class FlutterCommand extends Command { ); } + void usesFrontendServerStarterPathOption({required bool verboseHelp}) { + argParser.addOption( + FlutterOptions.kFrontendServerStarterPath, + help: 'When this value is provided, the frontend server will be started ' + 'in JIT mode from the specified file, instead of from the AOT ' + 'snapshot shipped with the Dart SDK. The specified file can either ' + 'be a Dart source file, or an AppJIT snapshot. This option does ' + 'not affect web builds.', + hide: !verboseHelp, + ); + } + /// Enables support for the hidden options --extra-front-end-options and /// --extra-gen-snapshot-options. void usesExtraDartFlagOptions({ required bool verboseHelp }) { @@ -1239,6 +1252,10 @@ abstract class FlutterCommand extends Command { ? stringArg('flavor') : null, trackWidgetCreation: trackWidgetCreation, + frontendServerStarterPath: argParser.options + .containsKey(FlutterOptions.kFrontendServerStarterPath) + ? stringArg(FlutterOptions.kFrontendServerStarterPath) + : null, extraFrontEndOptions: extraFrontEndOptions.isNotEmpty ? extraFrontEndOptions : null, diff --git a/packages/flutter_tools/lib/src/test/test_compiler.dart b/packages/flutter_tools/lib/src/test/test_compiler.dart index 8f50eb9268..387795e521 100644 --- a/packages/flutter_tools/lib/src/test/test_compiler.dart +++ b/packages/flutter_tools/lib/src/test/test_compiler.dart @@ -121,6 +121,7 @@ class TestCompiler { initializeFromDill: testFilePath, dartDefines: buildInfo.dartDefines, packagesPath: buildInfo.packagesPath, + frontendServerStarterPath: buildInfo.frontendServerStarterPath, extraFrontEndOptions: buildInfo.extraFrontEndOptions, platform: globals.platform, testCompilation: true, diff --git a/packages/flutter_tools/test/general.shard/build_info_test.dart b/packages/flutter_tools/test/general.shard/build_info_test.dart index 929ce64cd4..131a8530a8 100644 --- a/packages/flutter_tools/test/general.shard/build_info_test.dart +++ b/packages/flutter_tools/test/general.shard/build_info_test.dart @@ -175,6 +175,7 @@ void main() { dartDefines: ['foo=2', 'bar=2'], dartObfuscation: true, splitDebugInfoPath: 'foo/', + frontendServerStarterPath: 'foo/bar/frontend_server_starter.dart', extraFrontEndOptions: ['--enable-experiment=non-nullable', 'bar'], extraGenSnapshotOptions: ['--enable-experiment=non-nullable', 'fizz'], bundleSkSLPath: 'foo/bar/baz.sksl.json', @@ -190,6 +191,7 @@ void main() { 'BuildMode': 'debug', 'DartDefines': 'Zm9vPTI=,YmFyPTI=', 'DartObfuscation': 'true', + 'FrontendServerStarterPath': 'foo/bar/frontend_server_starter.dart', 'ExtraFrontEndOptions': '--enable-experiment=non-nullable,bar', 'ExtraGenSnapshotOptions': '--enable-experiment=non-nullable,fizz', 'SplitDebugInfo': 'foo/', @@ -211,6 +213,7 @@ void main() { dartDefines: ['foo=2', 'bar=2'], dartObfuscation: true, splitDebugInfoPath: 'foo/', + frontendServerStarterPath: 'foo/bar/frontend_server_starter.dart', extraFrontEndOptions: ['--enable-experiment=non-nullable', 'bar'], extraGenSnapshotOptions: ['--enable-experiment=non-nullable', 'fizz'], bundleSkSLPath: 'foo/bar/baz.sksl.json', @@ -226,6 +229,7 @@ void main() { 'DART_DEFINES': 'Zm9vPTI=,YmFyPTI=', 'DART_OBFUSCATION': 'true', 'SPLIT_DEBUG_INFO': 'foo/', + 'FRONTEND_SERVER_STARTER_PATH': 'foo/bar/frontend_server_starter.dart', 'EXTRA_FRONT_END_OPTIONS': '--enable-experiment=non-nullable,bar', 'EXTRA_GEN_SNAPSHOT_OPTIONS': '--enable-experiment=non-nullable,fizz', 'BUNDLE_SKSL_PATH': 'foo/bar/baz.sksl.json', @@ -242,6 +246,7 @@ void main() { dartDefineConfigJsonMap: {'baz': '2'}, dartObfuscation: true, splitDebugInfoPath: 'foo/', + frontendServerStarterPath: 'foo/bar/frontend_server_starter.dart', extraFrontEndOptions: ['--enable-experiment=non-nullable', 'bar'], extraGenSnapshotOptions: ['--enable-experiment=non-nullable', 'fizz'], bundleSkSLPath: 'foo/bar/baz.sksl.json', @@ -253,6 +258,7 @@ void main() { expect(buildInfo.toGradleConfig(), [ '-Pdart-defines=Zm9vPTI=,YmFyPTI=', '-Pdart-obfuscation=true', + '-Pfrontend-server-starter-path=foo/bar/frontend_server_starter.dart', '-Pextra-front-end-options=--enable-experiment=non-nullable,bar', '-Pextra-gen-snapshot-options=--enable-experiment=non-nullable,fizz', '-Psplit-debug-info=foo/', diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart index 31d9d86ac2..a287f1b0d0 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/common_test.dart @@ -217,6 +217,53 @@ native-assets: {} expect(processManager, hasNoRemainingExpectations); }); + testWithoutContext('KernelSnapshot correctly forwards FrontendServerStarterPath', () async { + fileSystem.file('.dart_tool/package_config.json') + ..createSync(recursive: true) + ..writeAsStringSync('{"configVersion": 2, "packages":[]}'); + androidEnvironment.buildDir.childFile('native_assets.yaml') + ..createSync(recursive: true) + ..writeAsStringSync(emptyNativeAssets); + final String build = androidEnvironment.buildDir.path; + final String flutterPatchedSdkPath = artifacts.getArtifactPath( + Artifact.flutterPatchedSdkPath, + platform: TargetPlatform.android_arm, + mode: BuildMode.profile, + ); + processManager.addCommands([ + FakeCommand(command: [ + artifacts.getArtifactPath(Artifact.engineDartBinary), + '--disable-dart-dev', + 'path/to/frontend_server_starter.dart', + '--sdk-root', + '$flutterPatchedSdkPath/', + '--target=flutter', + '--no-print-incremental-dependencies', + ...buildModeOptions(BuildMode.profile, []), + '--track-widget-creation', + '--aot', + '--tfa', + '--target-os', + 'android', + '--packages', + '/.dart_tool/package_config.json', + '--output-dill', + '$build/app.dill', + '--depfile', + '$build/kernel_snapshot.d', + '--native-assets', + '$build/native_assets.yaml', + '--verbosity=error', + 'file:///lib/main.dart', + ], stdout: 'result $kBoundaryKey\n$kBoundaryKey\n$kBoundaryKey $build/app.dill 0\n'), + ]); + + await const KernelSnapshot() + .build(androidEnvironment..defines[kFrontendServerStarterPath] = 'path/to/frontend_server_starter.dart'); + + expect(processManager, hasNoRemainingExpectations); + }); + testWithoutContext('KernelSnapshot correctly forwards ExtraFrontEndOptions', () async { fileSystem.file('.dart_tool/package_config.json') ..createSync(recursive: true) diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart index 8e47324eda..a736b2b3b9 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/web_test.dart @@ -391,6 +391,38 @@ void main() { ProcessManager: () => processManager, })); + test('Dart2JSTarget ignores frontend server starter path option when calling dart2js', () => testbed.run(() async { + environment.defines[kBuildMode] = 'profile'; + environment.defines[kFrontendServerStarterPath] = 'path/to/frontend_server_starter.dart'; + processManager.addCommand(FakeCommand( + command: [ + ..._kDart2jsLinuxArgs, + '-Ddart.vm.profile=true', + '--no-source-maps', + '-o', + environment.buildDir.childFile('app.dill').absolute.path, + '--packages=.dart_tool/package_config.json', + '--cfe-only', + environment.buildDir.childFile('main.dart').absolute.path, + ] + )); + processManager.addCommand(FakeCommand( + command: [ + ..._kDart2jsLinuxArgs, + '-Ddart.vm.profile=true', + '--no-minify', + '--no-source-maps', + '-O4', + '-o', + environment.buildDir.childFile('main.dart.js').absolute.path, + environment.buildDir.childFile('app.dill').absolute.path, + ] + )); + + await Dart2JSTarget(WebRendererMode.auto).build(environment); + }, overrides: { + ProcessManager: () => processManager, + })); test('Dart2JSTarget calls dart2js with expected args with enabled experiment', () => testbed.run(() async { environment.defines[kBuildMode] = 'profile'; diff --git a/packages/flutter_tools/test/general.shard/bundle_builder_test.dart b/packages/flutter_tools/test/general.shard/bundle_builder_test.dart index 335354026f..fb854f24c7 100644 --- a/packages/flutter_tools/test/general.shard/bundle_builder_test.dart +++ b/packages/flutter_tools/test/general.shard/bundle_builder_test.dart @@ -87,6 +87,7 @@ void main() { BuildMode.debug, null, trackWidgetCreation: true, + frontendServerStarterPath: 'path/to/frontend_server_starter.dart', extraFrontEndOptions: ['test1', 'test2'], extraGenSnapshotOptions: ['test3', 'test4'], fileSystemRoots: ['test5', 'test6'], @@ -106,6 +107,7 @@ void main() { expect(env!.defines[kTargetPlatform], 'ios'); expect(env!.defines[kTargetFile], mainPath); expect(env!.defines[kTrackWidgetCreation], 'true'); + expect(env!.defines[kFrontendServerStarterPath], 'path/to/frontend_server_starter.dart'); expect(env!.defines[kExtraFrontEndOptions], 'test1,test2'); expect(env!.defines[kExtraGenSnapshotOptions], 'test3,test4'); expect(env!.defines[kFileSystemRoots], 'test5,test6'); 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 42b8dafb90..e24262fff8 100644 --- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart @@ -1963,6 +1963,28 @@ flutter: ProcessManager: () => FakeProcessManager.any(), }); + testUsingContext('FlutterDevice passes frontendServerStarterPath parameter if specified', () async { + fakeVmServiceHost = FakeVmServiceHost(requests: []); + final FakeDevice device = FakeDevice(); + + final DefaultResidentCompiler? residentCompiler = (await FlutterDevice.create( + device, + buildInfo: const BuildInfo( + BuildMode.debug, + '', + treeShakeIcons: false, + frontendServerStarterPath: '/foo/bar/frontend_server_starter.dart', + ), + target: null, platform: FakePlatform(), + )).generator as DefaultResidentCompiler?; + + expect(residentCompiler!.frontendServerStarterPath, '/foo/bar/frontend_server_starter.dart'); + }, overrides: { + Artifacts: () => Artifacts.test(), + FileSystem: () => MemoryFileSystem.test(), + ProcessManager: () => FakeProcessManager.any(), + }); + testUsingContext('Handle existing VM service clients DDS error', () => testbed.run(() async { fakeVmServiceHost = FakeVmServiceHost(requests: []); final FakeDevice device = FakeDevice() diff --git a/packages/flutter_tools/test/general.shard/xcode_backend_test.dart b/packages/flutter_tools/test/general.shard/xcode_backend_test.dart index dd36810f89..5215644437 100644 --- a/packages/flutter_tools/test/general.shard/xcode_backend_test.dart +++ b/packages/flutter_tools/test/general.shard/xcode_backend_test.dart @@ -51,6 +51,7 @@ void main() { '-dTrackWidgetCreation=', '-dDartObfuscation=', '-dAction=build', + '-dFrontendServerStarterPath=', '--ExtraGenSnapshotOptions=', '--DartDefines=', '--ExtraFrontEndOptions=', @@ -103,6 +104,7 @@ void main() { '-dTrackWidgetCreation=', '-dDartObfuscation=', '-dAction=', + '-dFrontendServerStarterPath=', '--ExtraGenSnapshotOptions=', '--DartDefines=', '--ExtraFrontEndOptions=', @@ -136,6 +138,7 @@ void main() { const String expandedCodeSignIdentity = 'F1326572E0B71C3C8442805230CB4B33B708A2E2'; const String extraFrontEndOptions = '--some-option'; const String extraGenSnapshotOptions = '--obfuscate'; + const String frontendServerStarterPath = '/path/to/frontend_server_starter.dart'; const String sdkRoot = '/path/to/sdk'; const String splitDebugInfo = '/path/to/split/debug/info'; const String trackWidgetCreation = 'true'; @@ -154,6 +157,7 @@ void main() { 'EXTRA_FRONT_END_OPTIONS': extraFrontEndOptions, 'EXTRA_GEN_SNAPSHOT_OPTIONS': extraGenSnapshotOptions, 'FLUTTER_ROOT': flutterRoot.path, + 'FRONTEND_SERVER_STARTER_PATH': frontendServerStarterPath, 'INFOPLIST_PATH': 'Info.plist', 'SDKROOT': sdkRoot, 'SPLIT_DEBUG_INFO': splitDebugInfo, @@ -177,6 +181,7 @@ void main() { '-dTrackWidgetCreation=$trackWidgetCreation', '-dDartObfuscation=$dartObfuscation', '-dAction=install', + '-dFrontendServerStarterPath=$frontendServerStarterPath', '--ExtraGenSnapshotOptions=$extraGenSnapshotOptions', '--DartDefines=$dartDefines', '--ExtraFrontEndOptions=$extraFrontEndOptions',