[tools] Check integration tests for `test` (#5936)
diff --git a/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart b/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart
index 4f5a187..6b3dd65 100644
--- a/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart
+++ b/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart
@@ -70,7 +70,8 @@
];
for (final StorageDirectory? type in _allDirs) {
- test('getExternalStorageDirectories (type: $type)', () async {
+ testWidgets('getExternalStorageDirectories (type: $type)',
+ (WidgetTester tester) async {
if (Platform.isIOS) {
final Future<List<Directory>?> result =
getExternalStorageDirectories(type: null);
diff --git a/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart b/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart
index 426b07a..0538738 100644
--- a/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart
+++ b/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart
@@ -61,7 +61,8 @@
];
for (final StorageDirectory? type in _allDirs) {
- test('getExternalStorageDirectories (type: $type)', () async {
+ testWidgets('getExternalStorageDirectories (type: $type)',
+ (WidgetTester tester) async {
final PathProviderPlatform provider = PathProviderPlatform.instance;
final List<String>? directories =
diff --git a/script/tool/CHANGELOG.md b/script/tool/CHANGELOG.md
index adc7bfc..36d8d23 100644
--- a/script/tool/CHANGELOG.md
+++ b/script/tool/CHANGELOG.md
@@ -1,6 +1,8 @@
## NEXT
- Supports empty custom analysis allow list files.
+- `drive-examples` now validates files to ensure that they don't accidentally
+ use `test(...)`.
## 0.8.6
diff --git a/script/tool/lib/src/drive_examples_command.dart b/script/tool/lib/src/drive_examples_command.dart
index 15366e1..45e20c0 100644
--- a/script/tool/lib/src/drive_examples_command.dart
+++ b/script/tool/lib/src/drive_examples_command.dart
@@ -182,7 +182,16 @@
if (legacyTestFile != null) {
testTargets.add(legacyTestFile);
} else {
- (await _getIntegrationTests(example)).forEach(testTargets.add);
+ for (final File testFile in await _getIntegrationTests(example)) {
+ // Check files for known problematic patterns.
+ final bool passesValidation = _validateIntegrationTest(testFile);
+ if (!passesValidation) {
+ // Report the issue, but continue with the test as the validation
+ // errors don't prevent running.
+ errors.add('${testFile.basename} failed validation');
+ }
+ testTargets.add(testFile);
+ }
}
if (testTargets.isEmpty) {
@@ -310,6 +319,25 @@
return tests;
}
+ /// Checks [testFile] for known bad patterns in integration tests, logging
+ /// any issues.
+ ///
+ /// Returns true if the file passes validation without issues.
+ bool _validateIntegrationTest(File testFile) {
+ final List<String> lines = testFile.readAsLinesSync();
+
+ final RegExp badTestPattern = RegExp(r'\s*test\(');
+ if (lines.any((String line) => line.startsWith(badTestPattern))) {
+ final String filename = testFile.basename;
+ printError(
+ '$filename uses "test", which will not report failures correctly. '
+ 'Use testWidgets instead.');
+ return false;
+ }
+
+ return true;
+ }
+
/// For each file in [targets], uses
/// `flutter drive --driver [driver] --target <target>`
/// to drive [example], returning a list of any failing test targets.
diff --git a/script/tool/test/drive_examples_command_test.dart b/script/tool/test/drive_examples_command_test.dart
index 23318f7..0b60820 100644
--- a/script/tool/test/drive_examples_command_test.dart
+++ b/script/tool/test/drive_examples_command_test.dart
@@ -307,6 +307,47 @@
);
});
+ test('integration tests using test(...) fail validation', () async {
+ setMockFlutterDevicesOutput();
+ final RepositoryPackage package = createFakePlugin(
+ 'plugin',
+ packagesDir,
+ extraFiles: <String>[
+ 'example/test_driver/integration_test.dart',
+ 'example/integration_test/foo_test.dart',
+ 'example/android/android.java',
+ ],
+ platformSupport: <String, PlatformDetails>{
+ platformAndroid: const PlatformDetails(PlatformSupport.inline),
+ platformIOS: const PlatformDetails(PlatformSupport.inline),
+ },
+ );
+ package.directory
+ .childDirectory('example')
+ .childDirectory('integration_test')
+ .childFile('foo_test.dart')
+ .writeAsStringSync('''
+ test('this is the wrong kind of test!'), () {
+ ...
+ }
+''');
+
+ Error? commandError;
+ final List<String> output = await runCapturingPrint(
+ runner, <String>['drive-examples', '--android'],
+ errorHandler: (Error e) {
+ commandError = e;
+ });
+
+ expect(commandError, isA<ToolExit>());
+ expect(
+ output,
+ containsAllInOrder(<Matcher>[
+ contains('foo_test.dart failed validation'),
+ ]),
+ );
+ });
+
test(
'driving under folder "test_driver" when targets are under "integration_test"',
() async {