// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:flutter_plugin_tools/src/common/plugin_utils.dart'; 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() { group('$JavaTestCommand', () { late FileSystem fileSystem; late Directory packagesDir; late CommandRunner runner; late RecordingProcessRunner processRunner; setUp(() { fileSystem = MemoryFileSystem(); packagesDir = createPackagesDirectory(fileSystem: fileSystem); processRunner = RecordingProcessRunner(); final JavaTestCommand command = JavaTestCommand(packagesDir, processRunner: processRunner); runner = CommandRunner('java_test_test', 'Test for $JavaTestCommand'); runner.addCommand(command); }); test('Should run Java tests in Android implementation folder', () async { final Directory plugin = createFakePlugin( 'plugin1', packagesDir, platformSupport: { kPlatformAndroid: PlatformSupport.inline }, extraFiles: [ 'example/android/gradlew', 'android/src/test/example_test.java', ], ); await runCapturingPrint(runner, ['java-test']); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( p.join(plugin.path, 'example/android/gradlew'), const ['testDebugUnitTest', '--info'], p.join(plugin.path, 'example/android'), ), ]), ); }); test('Should run Java tests in example folder', () async { final Directory plugin = createFakePlugin( 'plugin1', packagesDir, platformSupport: { kPlatformAndroid: PlatformSupport.inline }, extraFiles: [ 'example/android/gradlew', 'example/android/app/src/test/example_test.java', ], ); await runCapturingPrint(runner, ['java-test']); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( p.join(plugin.path, 'example/android/gradlew'), const ['testDebugUnitTest', '--info'], p.join(plugin.path, 'example/android'), ), ]), ); }); test('fails when the app needs to be built', () async { 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 { 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.') ]), ); }); }); }