Only run codegen at start of flutter_test (#29171)

diff --git a/dev/bots/test.dart b/dev/bots/test.dart
index 5bf7048..8a2fde4 100644
--- a/dev/bots/test.dart
+++ b/dev/bots/test.dart
@@ -317,6 +317,10 @@
   // with --track-widget-creation.
   await _runFlutterTest(path.join(flutterRoot, 'examples', 'flutter_gallery'), options: <String>['--track-widget-creation'], tableData: bigqueryApi?.tabledata);
   await _runFlutterTest(path.join(flutterRoot, 'examples', 'catalog'), tableData: bigqueryApi?.tabledata);
+  // Smoke test for code generation.
+  await _runFlutterTest(path.join(flutterRoot, 'dev', 'integration_tests', 'codegen'), tableData: bigqueryApi?.tabledata, environment: <String, String>{
+    'FLUTTER_EXPERIMENTAL_BUILD': 'true',
+  });
 
   print('${bold}DONE: All tests successful.$reset');
 }
@@ -581,6 +585,7 @@
   bool skip = false,
   Duration timeout = _kLongTimeout,
   bq.TabledataResourceApi tableData,
+  Map<String, String> environment,
 }) async {
   final List<String> args = <String>['test']..addAll(options);
   if (flutterTestArgs != null && flutterTestArgs.isNotEmpty)
@@ -612,6 +617,7 @@
       printOutput: printOutput,
       skip: skip,
       timeout: timeout,
+      environment: environment,
     );
   }
 
@@ -624,6 +630,7 @@
     expectNonZeroExit: expectFailure,
     timeout: timeout,
     beforeExit: formatter.finish,
+    environment: environment,
   );
   await _processTestOutput(formatter, testOutput, tableData);
   } else {
diff --git a/packages/flutter_tools/lib/src/codegen.dart b/packages/flutter_tools/lib/src/codegen.dart
index d53714a..128c816 100644
--- a/packages/flutter_tools/lib/src/codegen.dart
+++ b/packages/flutter_tools/lib/src/codegen.dart
@@ -161,22 +161,19 @@
 
   /// Creates a new [ResidentCompiler] and configures a [BuildDaemonClient] to
   /// run builds.
-  static Future<CodeGeneratingResidentCompiler> create({
+  ///
+  /// If `runCold` is true, then no codegen daemon will be created. Instead the
+  /// compiler will only be initialized with the correct configuration for
+  /// codegen mode.
+  static Future<ResidentCompiler> create({
     @required FlutterProject flutterProject,
     bool trackWidgetCreation = false,
     CompilerMessageConsumer compilerMessageConsumer = printError,
     bool unsafePackageSerialization = false,
     String outputPath,
     String initializeFromDill,
+    bool runCold = false,
   }) async {
-    final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
-    codegenDaemon.startBuild();
-    final CodegenStatus status = await codegenDaemon.buildResults.firstWhere((CodegenStatus status) {
-      return status == CodegenStatus.Succeeded || status == CodegenStatus.Failed;
-    });
-    if (status == CodegenStatus.Failed) {
-      printError('Code generation failed, build may have compile errors.');
-    }
     final ResidentCompiler residentCompiler = ResidentCompiler(
       artifacts.getArtifactPath(Artifact.flutterPatchedSdkPath),
       trackWidgetCreation: trackWidgetCreation,
@@ -191,6 +188,17 @@
       // Pass an invalid file name to prevent frontend_server from initializing from dill.
       initializeFromDill: 'none_file',
     );
+    if (runCold) {
+      return residentCompiler;
+    }
+    final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
+    codegenDaemon.startBuild();
+    final CodegenStatus status = await codegenDaemon.buildResults.firstWhere((CodegenStatus status) {
+      return status == CodegenStatus.Succeeded || status == CodegenStatus.Failed;
+    });
+    if (status == CodegenStatus.Failed) {
+      printError('Code generation failed, build may have compile errors.');
+    }
     return CodeGeneratingResidentCompiler._(residentCompiler, codegenDaemon);
   }
 
diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart
index 4779e42..3fa235f 100644
--- a/packages/flutter_tools/lib/src/commands/test.dart
+++ b/packages/flutter_tools/lib/src/commands/test.dart
@@ -9,6 +9,7 @@
 import '../base/file_system.dart';
 import '../base/platform.dart';
 import '../cache.dart';
+import '../codegen.dart';
 import '../project.dart';
 import '../runner/flutter_command.dart';
 import '../test/coverage_collector.dart';
@@ -159,6 +160,20 @@
 
     Cache.releaseLockEarly();
 
+    // Run builders once before all tests.
+    if (experimentalBuildEnabled && await flutterProject.hasBuilders) {
+      final CodegenDaemon codegenDaemon = await codeGenerator.daemon(flutterProject);
+      codegenDaemon.startBuild();
+      await for (CodegenStatus status in codegenDaemon.buildResults) {
+        if (status == CodegenStatus.Succeeded) {
+          break;
+        }
+        if (status == CodegenStatus.Failed) {
+          throwToolExit('Code generation failed.');
+        }
+      }
+    }
+
     final int result = await runTests(
       files,
       workDir: workDir,
diff --git a/packages/flutter_tools/lib/src/compile.dart b/packages/flutter_tools/lib/src/compile.dart
index 5f93671..12c0770 100644
--- a/packages/flutter_tools/lib/src/compile.dart
+++ b/packages/flutter_tools/lib/src/compile.dart
@@ -500,13 +500,12 @@
     }
     if (packagesFilePath != null) {
       command.addAll(<String>['--packages', packagesFilePath]);
+    } else if (_packagesPath != null) {
+      command.addAll(<String>['--packages', _packagesPath]);
     }
     if (_trackWidgetCreation) {
       command.add('--track-widget-creation');
     }
-    if (_packagesPath != null) {
-      command.addAll(<String>['--packages', _packagesPath]);
-    }
     if (_fileSystemRoots != null) {
       for (String root in _fileSystemRoots) {
         command.addAll(<String>['--filesystem-root', root]);
@@ -662,6 +661,9 @@
         }
       }
     }
+    if (platform.isWindows && _fileSystemRoots != null && _fileSystemRoots.length > 1) {
+      return Uri.file(filename, windows: platform.isWindows).toString();
+    }
     return null;
   }
 
diff --git a/packages/flutter_tools/lib/src/test/flutter_platform.dart b/packages/flutter_tools/lib/src/test/flutter_platform.dart
index 0bbe735..22aa734 100644
--- a/packages/flutter_tools/lib/src/test/flutter_platform.dart
+++ b/packages/flutter_tools/lib/src/test/flutter_platform.dart
@@ -274,9 +274,10 @@
         return CodeGeneratingResidentCompiler.create(
           flutterProject: flutterProject,
           trackWidgetCreation: trackWidgetCreation,
-          initializeFromDill: null, // TODO(jonahwilliams): investigate multi-root support in init from dill.
-          unsafePackageSerialization: false,
           compilerMessageConsumer: reportCompilerMessage,
+          // We already ran codegen once at the start, we only need to
+          // configure builders.
+          runCold: true,
         );
       }
       return ResidentCompiler(