From 6d75c8c3a3511b0e7cd4f017dc1e5b4d71d9ba6c Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 25 Jun 2021 12:09:08 -0400 Subject: [PATCH 1/4] Migrate to new base command --- script/tool/lib/src/java_test_command.dart | 55 +++++++--------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/script/tool/lib/src/java_test_command.dart b/script/tool/lib/src/java_test_command.dart index d7e453b6ad74..77b8aa70a6e4 100644 --- a/script/tool/lib/src/java_test_command.dart +++ b/script/tool/lib/src/java_test_command.dart @@ -6,17 +6,19 @@ import 'package:file/file.dart'; import 'package:path/path.dart' as p; import 'common/core.dart'; -import 'common/plugin_command.dart'; +import 'common/package_looping_command.dart'; import 'common/process_runner.dart'; /// A command to run the Java tests of Android plugins. -class JavaTestCommand extends PluginCommand { +class JavaTestCommand extends PackageLoopingCommand { /// Creates an instance of the test runner. JavaTestCommand( Directory packagesDir, { ProcessRunner processRunner = const ProcessRunner(), }) : super(packagesDir, processRunner: processRunner); + static const String _gradleWrapper = 'gradlew'; + @override final String name = 'java-test'; @@ -25,12 +27,10 @@ class JavaTestCommand extends PluginCommand { 'Building the apks of the example apps is required before executing this' 'command.'; - static const String _gradleWrapper = 'gradlew'; - @override - Future run() async { - final Stream examplesWithTests = getExamples().where( - (Directory d) => + Future> runForPackage(Directory package) async { + final Iterable examplesWithTests = getExamplesForPlugin(package) + .where((Directory d) => isFlutterPackage(d) && (d .childDirectory('android') @@ -44,18 +44,17 @@ class JavaTestCommand extends PluginCommand { .childDirectory('test') .existsSync())); - final List failingPackages = []; - final List missingFlutterBuild = []; - await for (final Directory example in examplesWithTests) { - final String packageName = - p.relative(example.path, from: packagesDir.path); - print('\nRUNNING JAVA TESTS for $packageName'); + final List errors = []; + for (final Directory example in examplesWithTests) { + final String exampleName = p.relative(example.path, from: package.path); + print('\nRUNNING JAVA TESTS for $exampleName'); final Directory androidDirectory = example.childDirectory('android'); if (!androidDirectory.childFile(_gradleWrapper).existsSync()) { - print('ERROR: Run "flutter build apk" on example app of $packageName' + printError('ERROR: Run "flutter build apk" on $exampleName, or run ' + 'this tool\'s "build-examples --apk" command, ' 'before executing tests.'); - missingFlutterBuild.add(packageName); + errors.add('$exampleName has not been built.'); continue; } @@ -64,31 +63,9 @@ class JavaTestCommand extends PluginCommand { ['testDebugUnitTest', '--info'], workingDir: androidDirectory); if (exitCode != 0) { - failingPackages.add(packageName); - } - } - - print('\n\n'); - if (failingPackages.isNotEmpty) { - print( - 'The Java tests for the following packages are failing (see above for' - 'details):'); - for (final String package in failingPackages) { - print(' * $package'); - } - } - if (missingFlutterBuild.isNotEmpty) { - print('Run "pub global run flutter_plugin_tools build-examples --apk" on' - 'the following packages before executing tests again:'); - for (final String package in missingFlutterBuild) { - print(' * $package'); + errors.add('$exampleName tests failed.'); } } - - if (failingPackages.isNotEmpty || missingFlutterBuild.isNotEmpty) { - throw ToolExit(1); - } - - print('All Java tests successful!'); + return errors; } } From c999973bfe5e01d705819a2ea1a42d9704d76e64 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 25 Jun 2021 12:10:09 -0400 Subject: [PATCH 2/4] Capture print in tests --- script/tool/test/java_test_command_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/tool/test/java_test_command_test.dart b/script/tool/test/java_test_command_test.dart index fc80961462c7..d2580b4c2b56 100644 --- a/script/tool/test/java_test_command_test.dart +++ b/script/tool/test/java_test_command_test.dart @@ -45,7 +45,7 @@ void main() { ], ); - await runner.run(['java-test']); + await runCapturingPrint(runner, ['java-test']); expect( processRunner.recordedCalls, @@ -72,7 +72,7 @@ void main() { ], ); - await runner.run(['java-test']); + await runCapturingPrint(runner, ['java-test']); expect( processRunner.recordedCalls, From 279cae2a417cec0536996a412bc6b5cd9ded40b7 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 25 Jun 2021 12:45:12 -0400 Subject: [PATCH 3/4] Add failure tests --- script/tool/test/java_test_command_test.dart | 66 ++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/script/tool/test/java_test_command_test.dart b/script/tool/test/java_test_command_test.dart index d2580b4c2b56..91c3848aff70 100644 --- a/script/tool/test/java_test_command_test.dart +++ b/script/tool/test/java_test_command_test.dart @@ -11,6 +11,7 @@ import 'package:flutter_plugin_tools/src/java_test_command.dart'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; +import 'mocks.dart'; import 'util.dart'; void main() { @@ -85,5 +86,70 @@ void main() { ]), ); }); + + test('fails when the app needs to be built', () async { + final Directory plugin = createFakePlugin( + 'plugin1', + packagesDir, + platformSupport: { + kPlatformAndroid: PlatformSupport.inline + }, + extraFiles: [ + 'example/android/app/src/test/example_test.java', + ], + ); + + Error? commandError; + final List output = await runCapturingPrint( + runner, ['java-test'], errorHandler: (Error e) { + commandError = e; + }); + + expect(commandError, isA()); + + expect( + output, + containsAllInOrder([ + contains('ERROR: Run "flutter build apk" on example'), + contains('plugin1:\n' + ' example has not been built.') + ]), + ); + }); + + test('fails when a test fails', () async { + final Directory plugin = createFakePlugin( + 'plugin1', + packagesDir, + platformSupport: { + kPlatformAndroid: PlatformSupport.inline + }, + extraFiles: [ + 'example/android/gradlew', + 'example/android/app/src/test/example_test.java', + ], + ); + + // Simulate failure from `gradlew`. + final MockProcess mockDriveProcess = MockProcess(); + mockDriveProcess.exitCodeCompleter.complete(1); + processRunner.processToReturn = mockDriveProcess; + + Error? commandError; + final List output = await runCapturingPrint( + runner, ['java-test'], errorHandler: (Error e) { + commandError = e; + }); + + expect(commandError, isA()); + + expect( + output, + containsAllInOrder([ + contains('plugin1:\n' + ' example tests failed.') + ]), + ); + }); }); } From cb87cd5a753b8728263e32f63f9aba11b21b80b1 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Mon, 28 Jun 2021 12:12:23 -0400 Subject: [PATCH 4/4] Analyzer cleanup --- script/tool/test/java_test_command_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/tool/test/java_test_command_test.dart b/script/tool/test/java_test_command_test.dart index 91c3848aff70..894a5c3fce70 100644 --- a/script/tool/test/java_test_command_test.dart +++ b/script/tool/test/java_test_command_test.dart @@ -88,7 +88,7 @@ void main() { }); test('fails when the app needs to be built', () async { - final Directory plugin = createFakePlugin( + createFakePlugin( 'plugin1', packagesDir, platformSupport: { @@ -118,7 +118,7 @@ void main() { }); test('fails when a test fails', () async { - final Directory plugin = createFakePlugin( + createFakePlugin( 'plugin1', packagesDir, platformSupport: {