// 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.dart'; import 'package:flutter_plugin_tools/src/drive_examples_command.dart'; import 'package:path/path.dart' as p; import 'package:platform/platform.dart'; import 'package:test/test.dart'; import 'util.dart'; void main() { group('test drive_example_command', () { late FileSystem fileSystem; late Directory packagesDir; late CommandRunner runner; late RecordingProcessRunner processRunner; final String flutterCommand = const LocalPlatform().isWindows ? 'flutter.bat' : 'flutter'; setUp(() { fileSystem = MemoryFileSystem(); packagesDir = createPackagesDirectory(fileSystem: fileSystem); processRunner = RecordingProcessRunner(); final DriveExamplesCommand command = DriveExamplesCommand(packagesDir, processRunner: processRunner); runner = CommandRunner( 'drive_examples_command', 'Test for drive_example_command'); runner.addCommand(command); }); test('driving under folder "test"', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test', 'plugin.dart'], ], isIosPlugin: true, isAndroidPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String deviceTestPath = p.join('test', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); test('driving under folder "test_driver"', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isAndroidPlugin: true, isIosPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String deviceTestPath = p.join('test_driver', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); test('driving under folder "test_driver" when test files are missing"', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ], isAndroidPlugin: true, isIosPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); await expectLater( () => runCapturingPrint(runner, ['drive-examples']), throwsA(const TypeMatcher())); }); test('a plugin without any integration test files is reported as an error', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'lib', 'main.dart'], ], isAndroidPlugin: true, isIosPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); await expectLater( () => runCapturingPrint(runner, ['drive-examples']), throwsA(const TypeMatcher())); }); test( 'driving under folder "test_driver" when targets are under "integration_test"', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'integration_test.dart'], ['example', 'integration_test', 'bar_test.dart'], ['example', 'integration_test', 'foo_test.dart'], ['example', 'integration_test', 'ignore_me.dart'], ], isAndroidPlugin: true, isIosPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String driverTestPath = p.join('test_driver', 'integration_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '--driver', driverTestPath, '--target', p.join('integration_test', 'bar_test.dart'), ], pluginExampleDirectory.path), ProcessCall( flutterCommand, [ 'drive', '--driver', driverTestPath, '--target', p.join('integration_test', 'foo_test.dart'), ], pluginExampleDirectory.path), ])); }); test('driving when plugin does not support Linux is a no-op', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isMacOsPlugin: false); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--linux', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', 'Not supported for the target platform; skipping.', '\n\n', 'All driver tests successful!', ]), ); // Output should be empty since running drive-examples --linux on a non-Linux // plugin is a no-op. expect(processRunner.recordedCalls, []); }); test('driving on a Linux plugin', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isLinuxPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--linux', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String deviceTestPath = p.join('test_driver', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '-d', 'linux', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); test('driving when plugin does not suppport macOS is a no-op', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ]); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--macos', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', 'Not supported for the target platform; skipping.', '\n\n', 'All driver tests successful!', ]), ); // Output should be empty since running drive-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, []); }); test('driving on a macOS plugin', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ['example', 'macos', 'macos.swift'], ], isMacOsPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--macos', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String deviceTestPath = p.join('test_driver', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '-d', 'macos', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); test('driving when plugin does not suppport web is a no-op', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isWebPlugin: false); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--web', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', 'Not supported for the target platform; skipping.', '\n\n', 'All driver tests successful!', ]), ); // Output should be empty since running drive-examples --web on a non-web // plugin is a no-op. expect(processRunner.recordedCalls, []); }); test('driving a web plugin', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isWebPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--web', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String deviceTestPath = p.join('test_driver', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '-d', 'web-server', '--web-port=7357', '--browser-name=chrome', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); test('driving when plugin does not suppport Windows is a no-op', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isWindowsPlugin: false); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--windows', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', 'Not supported for the target platform; skipping.', '\n\n', 'All driver tests successful!', ]), ); // Output should be empty since running drive-examples --windows on a // non-Windows plugin is a no-op. expect(processRunner.recordedCalls, []); }); test('driving on a Windows plugin', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isWindowsPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', '--windows', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', '\n\n', 'All driver tests successful!', ]), ); final String deviceTestPath = p.join('test_driver', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '-d', 'windows', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); test('driving when plugin does not support mobile is no-op', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test_driver', 'plugin.dart'], ], isMacOsPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); final List output = await runCapturingPrint(runner, [ 'drive-examples', ]); expect( output, orderedEquals([ '\n==========\nChecking plugin...', 'Not supported for the target platform; skipping.', '\n\n', 'All driver tests successful!', ]), ); // Output should be empty since running drive-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, []); }); test('platform interface plugins are silently skipped', () async { createFakePlugin('aplugin_platform_interface', packagesDir); final List output = await runCapturingPrint(runner, [ 'drive-examples', ]); expect( output, orderedEquals([ '\n\n', 'All driver tests successful!', ]), ); // Output should be empty since running drive-examples --macos with no macos // implementation is a no-op. expect(processRunner.recordedCalls, []); }); test('enable-experiment flag', () async { final Directory pluginDirectory = createFakePlugin('plugin', packagesDir, withExtraFiles: >[ ['example', 'test_driver', 'plugin_test.dart'], ['example', 'test', 'plugin.dart'], ], isIosPlugin: true, isAndroidPlugin: true); final Directory pluginExampleDirectory = pluginDirectory.childDirectory('example'); createFakePubspec(pluginExampleDirectory, isFlutter: true); await runCapturingPrint(runner, [ 'drive-examples', '--enable-experiment=exp1', ]); final String deviceTestPath = p.join('test', 'plugin.dart'); final String driverTestPath = p.join('test_driver', 'plugin_test.dart'); expect( processRunner.recordedCalls, orderedEquals([ ProcessCall( flutterCommand, [ 'drive', '--enable-experiment=exp1', '--driver', driverTestPath, '--target', deviceTestPath ], pluginExampleDirectory.path), ])); }); }); }