[flutter_plugin_tools] Remove global state from tests (#4018)

Eliminates the global test filesystem and global test packages directory, in favor of local versions. This guarantees that each test runs with a clean filesystem state, rather than relying on cleanup. It also simplifies understanding the tests, since everything is done via params and return values instead of needing to know about the magic global variables and which methods mutate them.
This commit is contained in:
stuartmorgan
2021-06-07 10:04:43 -07:00
committed by GitHub
parent bb0a1ea161
commit 74d03857f8
16 changed files with 456 additions and 537 deletions

View File

@ -4,6 +4,7 @@
import 'package:args/command_runner.dart';
import 'package:file/file.dart';
import 'package:file/memory.dart';
import 'package:flutter_plugin_tools/src/build_examples_command.dart';
import 'package:path/path.dart' as p;
import 'package:platform/platform.dart';
@ -13,40 +14,42 @@ import 'util.dart';
void main() {
group('test build_example_command', () {
late FileSystem fileSystem;
late Directory packagesDir;
late CommandRunner<void> runner;
late RecordingProcessRunner processRunner;
final String flutterCommand =
const LocalPlatform().isWindows ? 'flutter.bat' : 'flutter';
setUp(() {
initializeFakePackages();
fileSystem = MemoryFileSystem();
packagesDir = createPackagesDirectory(fileSystem: fileSystem);
processRunner = RecordingProcessRunner();
final BuildExamplesCommand command =
BuildExamplesCommand(mockPackagesDir, processRunner: processRunner);
BuildExamplesCommand(packagesDir, processRunner: processRunner);
runner = CommandRunner<void>(
'build_examples_command', 'Test for build_example_command');
runner.addCommand(command);
cleanupPackages();
});
test('building for iOS when plugin is not set up for iOS results in no-op',
() async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isLinuxPlugin: false);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--ipa', '--no-macos']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -61,18 +64,17 @@ void main() {
// Output should be empty since running build-examples --macos with no macos
// implementation is a no-op.
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
cleanupPackages();
});
test('building for ios', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isIosPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
@ -83,7 +85,7 @@ void main() {
'--enable-experiment=exp1'
]);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -107,27 +109,26 @@ void main() {
],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test(
'building for Linux when plugin is not set up for Linux results in no-op',
() async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isLinuxPlugin: false);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--linux']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -142,25 +143,24 @@ void main() {
// Output should be empty since running build-examples --linux with no
// Linux implementation is a no-op.
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
cleanupPackages();
});
test('building for Linux', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isLinuxPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--linux']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -177,24 +177,24 @@ void main() {
ProcessCall(flutterCommand, const <String>['build', 'linux'],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test('building for macos with no implementation results in no-op',
() async {
createFakePlugin('plugin', withExtraFiles: <List<String>>[
<String>['example', 'test'],
]);
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
]);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--macos']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -209,11 +209,10 @@ void main() {
// Output should be empty since running build-examples --macos with no macos
// implementation is a no-op.
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
cleanupPackages();
});
test('building for macos', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
<String>['example', 'macos', 'macos.swift'],
@ -221,14 +220,14 @@ void main() {
isMacOsPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--macos']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -245,23 +244,23 @@ void main() {
ProcessCall(flutterCommand, const <String>['build', 'macos'],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test('building for web with no implementation results in no-op', () async {
createFakePlugin('plugin', withExtraFiles: <List<String>>[
<String>['example', 'test'],
]);
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
]);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--web']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -276,11 +275,10 @@ void main() {
// Output should be empty since running build-examples --macos with no macos
// implementation is a no-op.
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
cleanupPackages();
});
test('building for web', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
<String>['example', 'web', 'index.html'],
@ -288,14 +286,14 @@ void main() {
isWebPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--web']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -312,27 +310,26 @@ void main() {
ProcessCall(flutterCommand, const <String>['build', 'web'],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test(
'building for Windows when plugin is not set up for Windows results in no-op',
() async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isWindowsPlugin: false);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--windows']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -347,25 +344,24 @@ void main() {
// Output should be empty since running build-examples --macos with no macos
// implementation is a no-op.
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
cleanupPackages();
});
test('building for windows', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isWindowsPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--no-ipa', '--windows']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -382,27 +378,26 @@ void main() {
ProcessCall(flutterCommand, const <String>['build', 'windows'],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test(
'building for Android when plugin is not set up for Android results in no-op',
() async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isLinuxPlugin: false);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
final List<String> output = await runCapturingPrint(
runner, <String>['build-examples', '--apk', '--no-ipa']);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -417,18 +412,17 @@ void main() {
// Output should be empty since running build-examples --macos with no macos
// implementation is a no-op.
expect(processRunner.recordedCalls, orderedEquals(<ProcessCall>[]));
cleanupPackages();
});
test('building for android', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isAndroidPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
@ -439,7 +433,7 @@ void main() {
'--no-macos',
]);
final String packageName =
p.relative(pluginExampleDirectory.path, from: mockPackagesDir.path);
p.relative(pluginExampleDirectory.path, from: packagesDir.path);
expect(
output,
@ -456,18 +450,17 @@ void main() {
ProcessCall(flutterCommand, const <String>['build', 'apk'],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test('enable-experiment flag for Android', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isAndroidPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
@ -487,18 +480,17 @@ void main() {
const <String>['build', 'apk', '--enable-experiment=exp1'],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
test('enable-experiment flag for ios', () async {
createFakePlugin('plugin',
final Directory pluginDirectory = createFakePlugin('plugin', packagesDir,
withExtraFiles: <List<String>>[
<String>['example', 'test'],
],
isIosPlugin: true);
final Directory pluginExampleDirectory =
mockPackagesDir.childDirectory('plugin').childDirectory('example');
pluginDirectory.childDirectory('example');
createFakePubspec(pluginExampleDirectory, isFlutter: true);
@ -521,7 +513,6 @@ void main() {
],
pluginExampleDirectory.path),
]));
cleanupPackages();
});
});
}