diff --git a/dev/devicelab/bin/run.dart b/dev/devicelab/bin/run.dart index 25da577dde..1a13762b27 100644 --- a/dev/devicelab/bin/run.dart +++ b/dev/devicelab/bin/run.dart @@ -38,6 +38,11 @@ Future main(List rawArgs) async { /// Required for A/B test mode. final String? localEngine = args['local-engine'] as String?; + /// The build of the local Web SDK to use. + /// + /// Required for A/B test mode. + final String? localWebSdk = args['local-web-sdk'] as String?; + /// The path to the engine "src/" directory. final String? localEngineSrcPath = args['local-engine-src-path'] as String?; @@ -85,8 +90,8 @@ Future main(List rawArgs) async { stderr.writeln(argParser.usage); exit(1); } - if (localEngine == null) { - stderr.writeln('When running in A/B test mode --local-engine is required.\n'); + if (localEngine == null && localWebSdk == null) { + stderr.writeln('When running in A/B test mode --local-engine or --local-web-sdk is required.\n'); stderr.writeln(argParser.usage); exit(1); } @@ -94,6 +99,7 @@ Future main(List rawArgs) async { runsPerTest: runsPerTest, silent: silent, localEngine: localEngine, + localWebSdk: localWebSdk, localEngineSrcPath: localEngineSrcPath, deviceId: deviceId, resultsFile: resultsFile, @@ -118,7 +124,8 @@ Future main(List rawArgs) async { Future _runABTest({ required int runsPerTest, required bool silent, - required String localEngine, + required String? localEngine, + required String? localWebSdk, required String? localEngineSrcPath, required String? deviceId, required String resultsFile, @@ -126,7 +133,9 @@ Future _runABTest({ }) async { print('$taskName A/B test. Will run $runsPerTest times.'); - final ABTest abTest = ABTest(localEngine, taskName); + assert(localEngine != null || localWebSdk != null); + + final ABTest abTest = ABTest((localEngine ?? localWebSdk)!, taskName); for (int i = 1; i <= runsPerTest; i++) { section('Run #$i'); @@ -152,6 +161,7 @@ Future _runABTest({ taskName, silent: silent, localEngine: localEngine, + localWebSdk: localWebSdk, localEngineSrcPath: localEngineSrcPath, deviceId: deviceId, ); @@ -282,6 +292,14 @@ ArgParser createArgParser(List taskNames) { 'This path is relative to --local-engine-src-path/out. This option\n' 'is required when running an A/B test (see the --ab option).', ) + ..addOption( + 'local-web-sdk', + help: 'Name of a build output within the engine out directory, if you\n' + 'are building Flutter locally. Use this to select a specific\n' + 'version of the engine if you have built multiple engine targets.\n' + 'This path is relative to --local-engine-src-path/out. This option\n' + 'is required when running an A/B test (see the --ab option).', + ) ..addFlag( 'list', abbr: 'l', diff --git a/dev/devicelab/lib/framework/runner.dart b/dev/devicelab/lib/framework/runner.dart index 0a8368f0cc..88a81d81ba 100644 --- a/dev/devicelab/lib/framework/runner.dart +++ b/dev/devicelab/lib/framework/runner.dart @@ -153,6 +153,7 @@ Future runTask( bool terminateStrayDartProcesses = false, bool silent = false, String? localEngine, + String? localWebSdk, String? localEngineSrcPath, String? deviceId, List? taskArgs, @@ -181,6 +182,7 @@ Future runTask( '--enable-vm-service=0', // zero causes the system to choose a free port '--no-pause-isolates-on-exit', if (localEngine != null) '-DlocalEngine=$localEngine', + if (localWebSdk != null) '-DlocalWebSdk=$localWebSdk', if (localEngineSrcPath != null) '-DlocalEngineSrcPath=$localEngineSrcPath', taskExecutable, ...?taskArgs, diff --git a/dev/devicelab/lib/framework/utils.dart b/dev/devicelab/lib/framework/utils.dart index 493d1f3d44..ad057e3fd0 100644 --- a/dev/devicelab/lib/framework/utils.dart +++ b/dev/devicelab/lib/framework/utils.dart @@ -35,6 +35,14 @@ String? get localEngineSrcPathFromEnv { return isDefined ? const String.fromEnvironment('localEngineSrcPath') : null; } +/// The local Web SDK to use for [flutter] and [evalFlutter], if any. +/// +/// This is set as an environment variable when running the task, see runTask in runner.dart. +String? get localWebSdkFromEnv { + const bool isDefined = bool.hasEnvironment('localWebSdk'); + return isDefined ? const String.fromEnvironment('localWebSdk') : null; +} + List _runningProcesses = []; ProcessManager _processManager = const LocalProcessManager(); @@ -446,6 +454,7 @@ List _flutterCommandArgs(String command, List options) { }; final String? localEngine = localEngineFromEnv; final String? localEngineSrcPath = localEngineSrcPathFromEnv; + final String? localWebSdk = localWebSdkFromEnv; return [ command, if (deviceOperatingSystem == DeviceOperatingSystem.ios && supportedDeviceTimeoutCommands.contains(command)) @@ -460,6 +469,7 @@ List _flutterCommandArgs(String command, List options) { ], if (localEngine != null) ...['--local-engine', localEngine], if (localEngineSrcPath != null) ...['--local-engine-src-path', localEngineSrcPath], + if (localWebSdk != null) ...['--local-web-sdk', localWebSdk], ...options, ]; } diff --git a/dev/devicelab/lib/tasks/perf_tests.dart b/dev/devicelab/lib/tasks/perf_tests.dart index f0fd4bd499..b3bdfb15d5 100644 --- a/dev/devicelab/lib/tasks/perf_tests.dart +++ b/dev/devicelab/lib/tasks/perf_tests.dart @@ -1192,6 +1192,7 @@ class WebCompileTest { return inDirectory>(directory, () async { final Map metrics = {}; + await flutter('clean'); await flutter('packages', options: ['get']); final Stopwatch? watch = measureBuildTime ? Stopwatch() : null; watch?.start(); @@ -1200,6 +1201,7 @@ class WebCompileTest { '-v', '--release', '--no-pub', + '--no-web-resources-cdn', ]); watch?.stop(); final String buildDir = path.join(directory, 'build', 'web'); diff --git a/dev/devicelab/lib/tasks/web_benchmarks.dart b/dev/devicelab/lib/tasks/web_benchmarks.dart index 3a1938f950..d3defb42fd 100644 --- a/dev/devicelab/lib/tasks/web_benchmarks.dart +++ b/dev/devicelab/lib/tasks/web_benchmarks.dart @@ -25,11 +25,13 @@ Future runWebBenchmark({ required bool useCanvasKit }) async { Logger.root.level = Level.INFO; final String macrobenchmarksDirectory = path.join(flutterDirectory.path, 'dev', 'benchmarks', 'macrobenchmarks'); return inDirectory(macrobenchmarksDirectory, () async { + await flutter('clean'); await evalFlutter('build', options: [ 'web', '--dart-define=FLUTTER_WEB_ENABLE_PROFILING=true', '--web-renderer=${useCanvasKit ? 'canvaskit' : 'html'}', '--profile', + '--no-web-resources-cdn', '-t', 'lib/web_benchmarks.dart', ]);