Fix Dart plugin registrant interaction with 'flutter test' (#90288)
Building an application for a desktop platform that transitively included any Dart-based plugins (such as path_provider) broke `flutter test`, because its compilation was overriding the provided main (in this case, the test main) with `generated_main.dart` if it was present. This PR:
- Changes the `flutter test` compilation path to update `generated_main.dart`, so that the tests will work, and will include any registered Dart plugins.
- Makes using `generated_main.dart` during recompile opt-in, to try to reduce the chance of a similar bug happening with other codepaths in the future.
Fixes https://github.com/flutter/flutter/issues/88794
diff --git a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart
index f2c38b7..cafabc5 100644
--- a/packages/flutter_tools/test/general.shard/dart_plugin_test.dart
+++ b/packages/flutter_tools/test/general.shard/dart_plugin_test.dart
@@ -33,7 +33,8 @@
..manifest = flutterManifest
..directory = directory
..flutterPluginsFile = directory.childFile('.flutter-plugins')
- ..flutterPluginsDependenciesFile = directory.childFile('.flutter-plugins-dependencies');
+ ..flutterPluginsDependenciesFile = directory.childFile('.flutter-plugins-dependencies')
+ ..dartPluginRegistrant = directory.childFile('generated_main.dart');
flutterProject.directory.childFile('.packages').createSync(recursive: true);
});
@@ -610,7 +611,6 @@
void main() {
}
''');
- final File generatedMainFile = flutterProject.directory.childFile('generated_main.dart');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
flutterProject.directory.childDirectory('.dart_tool').childFile('package_config.json'),
logger: globals.logger,
@@ -620,11 +620,10 @@
flutterProject,
packageConfig,
'package:app/main.dart',
- generatedMainFile,
mainFile,
throwOnPluginPubspecError: true,
);
- expect(generatedMainFile.readAsStringSync(),
+ expect(flutterProject.dartPluginRegistrant.readAsStringSync(),
'//\n'
'// Generated file. Do not edit.\n'
'// This file is generated from template in file `flutter_tools/lib/src/flutter_plugins.dart`.\n'
@@ -730,7 +729,6 @@
libDir.createSync(recursive: true);
final File mainFile = libDir.childFile('main.dart')..writeAsStringSync('');
- final File generatedMainFile = flutterProject.directory.childFile('generated_main.dart');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
flutterProject.directory.childDirectory('.dart_tool').childFile('package_config.json'),
logger: globals.logger,
@@ -741,7 +739,6 @@
flutterProject,
packageConfig,
'package:app/main.dart',
- generatedMainFile,
mainFile,
throwOnPluginPubspecError: true,
), throwsToolExit(message:
@@ -773,7 +770,6 @@
libDir.createSync(recursive: true);
final File mainFile = libDir.childFile('main.dart')..writeAsStringSync('');
- final File generatedMainFile = flutterProject.directory.childFile('generated_main.dart');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
flutterProject.directory.childDirectory('.dart_tool').childFile('package_config.json'),
logger: globals.logger,
@@ -784,7 +780,6 @@
flutterProject,
packageConfig,
'package:app/main.dart',
- generatedMainFile,
mainFile,
throwOnPluginPubspecError: true,
), throwsToolExit(message:
@@ -834,7 +829,6 @@
libDir.createSync(recursive: true);
final File mainFile = libDir.childFile('main.dart')..writeAsStringSync('');
- final File generatedMainFile = flutterProject.directory.childFile('generated_main.dart');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
flutterProject.directory.childDirectory('.dart_tool').childFile('package_config.json'),
logger: globals.logger,
@@ -844,11 +838,10 @@
flutterProject,
packageConfig,
'package:app/main.dart',
- generatedMainFile,
mainFile,
throwOnPluginPubspecError: true,
);
- expect(generatedMainFile.existsSync(), isFalse);
+ expect(flutterProject.dartPluginRegistrant.existsSync(), isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
@@ -876,7 +869,6 @@
libDir.createSync(recursive: true);
final File mainFile = libDir.childFile('main.dart')..writeAsStringSync('');
- final File generatedMainFile = flutterProject.directory.childFile('generated_main.dart');
final PackageConfig packageConfig = await loadPackageConfigWithLogging(
flutterProject.directory.childDirectory('.dart_tool').childFile('package_config.json'),
logger: globals.logger,
@@ -886,11 +878,10 @@
flutterProject,
packageConfig,
'package:app/main.dart',
- generatedMainFile,
mainFile,
throwOnPluginPubspecError: true,
);
- expect(generatedMainFile.existsSync(), isTrue);
+ expect(flutterProject.dartPluginRegistrant.existsSync(), isTrue);
// No plugins.
createFakeDartPlugins(
@@ -903,11 +894,10 @@
flutterProject,
packageConfig,
'package:app/main.dart',
- generatedMainFile,
mainFile,
throwOnPluginPubspecError: true,
);
- expect(generatedMainFile.existsSync(), isFalse);
+ expect(flutterProject.dartPluginRegistrant.existsSync(), isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
@@ -963,6 +953,9 @@
File flutterPluginsDependenciesFile;
@override
+ File dartPluginRegistrant;
+
+ @override
IosProject ios;
@override
diff --git a/packages/flutter_tools/test/general.shard/devfs_test.dart b/packages/flutter_tools/test/general.shard/devfs_test.dart
index 22024a2..ddc38be 100644
--- a/packages/flutter_tools/test/general.shard/devfs_test.dart
+++ b/packages/flutter_tools/test/general.shard/devfs_test.dart
@@ -476,7 +476,7 @@
Future<CompilerOutput> Function(Uri mainUri, List<Uri> invalidatedFiles) onRecompile;
@override
- Future<CompilerOutput> recompile(Uri mainUri, List<Uri> invalidatedFiles, {String outputPath, PackageConfig packageConfig, String projectRootPath, FileSystem fs, bool suppressErrors = false}) {
+ Future<CompilerOutput> recompile(Uri mainUri, List<Uri> invalidatedFiles, {String outputPath, PackageConfig packageConfig, String projectRootPath, FileSystem fs, bool suppressErrors = false, bool checkDartPluginRegistry = false}) {
return onRecompile?.call(mainUri, invalidatedFiles)
?? Future<CompilerOutput>.value(const CompilerOutput('', 1, <Uri>[]));
}
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 aec0aab..dda9562 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -2191,6 +2191,7 @@
@required String projectRootPath,
@required FileSystem fs,
bool suppressErrors = false,
+ bool checkDartPluginRegistry = false,
}) async {
didSuppressErrors = suppressErrors;
return nextOutput ?? const CompilerOutput('foo.dill', 0, <Uri>[]);
diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart
index 21cf19d..b732d60 100644
--- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart
@@ -1115,6 +1115,7 @@
@required String projectRootPath,
@required FileSystem fs,
bool suppressErrors = false,
+ bool checkDartPluginRegistry = false,
}) async {
return const CompilerOutput('foo.dill', 0, <Uri>[]);
}
diff --git a/packages/flutter_tools/test/general.shard/test/test_compiler_test.dart b/packages/flutter_tools/test/general.shard/test/test_compiler_test.dart
index 715b367..5eebf96 100644
--- a/packages/flutter_tools/test/general.shard/test/test_compiler_test.dart
+++ b/packages/flutter_tools/test/general.shard/test/test_compiler_test.dart
@@ -5,6 +5,7 @@
// @dart = 2.8
import 'package:file/memory.dart';
+import 'package:file_testing/file_testing.dart';
import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/base/platform.dart';
@@ -40,6 +41,7 @@
fileSystem = MemoryFileSystem.test();
fileSystem.file('pubspec.yaml').createSync();
fileSystem.file('test/foo.dart').createSync(recursive: true);
+ fileSystem.file('.packages').createSync();
residentCompiler = FakeResidentCompiler(fileSystem);
});
@@ -113,6 +115,57 @@
ProcessManager: () => FakeProcessManager.any(),
Logger: () => BufferLogger.test(),
});
+
+ testUsingContext('TestCompiler updates generated_main.dart', () async {
+ final Directory fakeDartPlugin = fileSystem.directory('a_plugin');
+ fileSystem.file('pubspec.yaml').writeAsStringSync('''
+name: foo
+dependencies:
+ flutter:
+ sdk: flutter
+ a_plugin: 1.0.0
+''');
+ fileSystem.file('.packages').writeAsStringSync('a_plugin:/a_plugin/lib/');
+ fakeDartPlugin.childFile('pubspec.yaml')
+ ..createSync(recursive: true)
+ ..writeAsStringSync('''
+name: a_plugin
+flutter:
+ plugin:
+ implements: a
+ platforms:
+ linux:
+ dartPluginClass: APlugin
+environment:
+ sdk: ">=2.14.0 <3.0.0"
+ flutter: ">=2.5.0"
+''');
+
+ residentCompiler.compilerOutput = const CompilerOutput('abc.dill', 0, <Uri>[]);
+ final FakeTestCompiler testCompiler = FakeTestCompiler(
+ debugBuild,
+ FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
+ residentCompiler,
+ );
+
+ await testCompiler.compile(Uri.parse('test/foo.dart'));
+
+ final File generatedMain = fileSystem
+ .directory('.dart_tool')
+ .childDirectory('flutter_build')
+ .childFile('generated_main.dart');
+
+ expect(generatedMain, exists);
+ expect(
+ generatedMain.readAsLinesSync(),
+ contains("import 'test/foo.dart' as entrypoint;")
+ );
+ }, overrides: <Type, Generator>{
+ FileSystem: () => fileSystem,
+ Platform: () => linuxPlatform,
+ ProcessManager: () => FakeProcessManager.any(),
+ Logger: () => BufferLogger.test(),
+ });
}
/// Override the creation of the Resident Compiler to simplify testing.
@@ -150,6 +203,7 @@
String projectRootPath,
FileSystem fs,
bool suppressErrors = false,
+ bool checkDartPluginRegistry = false,
}) async {
if (compilerOutput != null) {
fileSystem.file(compilerOutput.outputFilename).createSync(recursive: true);
diff --git a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart
index 52d5802..6e5475e 100644
--- a/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart
+++ b/packages/flutter_tools/test/general.shard/web/devfs_web_test.dart
@@ -1077,6 +1077,7 @@
String projectRootPath,
FileSystem fs,
bool suppressErrors = false,
+ bool checkDartPluginRegistry = false,
}) async {
return output;
}