From 08643c41d76d0f8b1e53102addedcd88c169f61d Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Fri, 11 Oct 2019 11:23:12 -0700 Subject: [PATCH] Always fake ProcessManager when you fake Filesystem in tests (#42369) ...because otherwise, processes that think they're manipulating your filesystem will be doing crazy things the test is ignoring, leading to (at best) failures and (at worst) flakes or disk corruption. --- packages/flutter_tools/README.md | 3 + packages/flutter_tools/lib/src/run_hot.dart | 3 +- .../commands.shard/hermetic/analyze_test.dart | 1 + .../commands.shard/hermetic/attach_test.dart | 13 + .../hermetic/build_fuchsia_test.dart | 18 +- .../hermetic/build_linux_test.dart | 3 + .../hermetic/build_macos_test.dart | 11 +- .../hermetic/build_windows_test.dart | 15 +- .../commands.shard/hermetic/clean_test.dart | 38 ++- .../commands.shard/hermetic/drive_test.dart | 14 + .../hermetic/shell_completion_test.dart | 4 + .../permeable/build_bundle_test.dart | 7 + .../test/general.shard/analytics_test.dart | 4 + .../android/android_device_test.dart | 3 + .../android/android_sdk_test.dart | 6 + .../android/android_studio_test.dart | 3 + .../android/android_workflow_test.dart | 26 +- .../general.shard/android/gradle_test.dart | 33 ++- .../application_package_test.dart | 2 + .../test/general.shard/artifacts_test.dart | 6 + .../asset_bundle_package_fonts_test.dart | 7 + .../asset_bundle_package_test.dart | 18 ++ .../test/general.shard/asset_bundle_test.dart | 12 +- .../asset_bundle_variant_test.dart | 1 + .../test/general.shard/base/build_test.dart | 1 + .../general.shard/base/file_system_test.dart | 11 +- .../general.shard/base/fingerprint_test.dart | 16 +- .../build_system/targets/windows_test.dart | 2 + .../test/general.shard/cache_test.dart | 6 + .../test/general.shard/channel_test.dart | 4 +- .../commands/build_aot_test.dart | 1 + .../commands/build_apk_test.dart | 2 +- .../test/general.shard/dart/pub_get_test.dart | 12 +- .../test/general.shard/devfs_test.dart | 7 + .../general.shard/flutter_manifest_test.dart | 1 + .../fuchsia/fuchsia_device_test.dart | 12 + .../general.shard/intellij/intellij_test.dart | 2 + .../test/general.shard/ios/devices_test.dart | 3 + .../general.shard/ios/simulators_test.dart | 3 + .../general.shard/ios/xcodeproj_test.dart | 6 +- .../linux/linux_device_test.dart | 43 +-- .../general.shard/macos/cocoapods_test.dart | 9 +- .../macos/macos_device_test.dart | 3 + .../package_uri_mapper_test.dart | 4 + .../test/general.shard/plugins_test.dart | 11 + .../project_file_invalidator_test.dart | 39 ++- .../test/general.shard/project_test.dart | 7 + .../runner/flutter_command_runner_test.dart | 23 +- .../general.shard/runner/runner_test.dart | 1 + .../tester/flutter_tester_test.dart | 3 +- .../windows/visual_studio_test.dart | 38 +-- .../windows/windows_device_test.dart | 3 + packages/flutter_tools/test/src/common.dart | 2 +- packages/flutter_tools/test/src/context.dart | 12 +- .../test/src/fake_process_manager.dart | 250 ++++++++++++++++++ packages/flutter_tools/test/src/testbed.dart | 36 +-- .../flutter_tools/test/src/throwing_pub.dart | 39 +++ 57 files changed, 692 insertions(+), 171 deletions(-) create mode 100644 packages/flutter_tools/test/src/fake_process_manager.dart create mode 100644 packages/flutter_tools/test/src/throwing_pub.dart diff --git a/packages/flutter_tools/README.md b/packages/flutter_tools/README.md index db6ad73410..aa690befe5 100644 --- a/packages/flutter_tools/README.md +++ b/packages/flutter_tools/README.md @@ -23,6 +23,7 @@ $ ../../bin/cache/dart-sdk/bin/dart bin/flutter_tools.dart ``` followed by command line arguments, as usual. + ### Analyzing To run the analyzer on Flutter Tools, in this directory run: @@ -56,6 +57,8 @@ run: ```shell $ ../../bin/cache/dart-sdk/bin/pub run build_runner test ``` +This is what we do in the continuous integration bots. + ### Forcing snapshot regeneration diff --git a/packages/flutter_tools/lib/src/run_hot.dart b/packages/flutter_tools/lib/src/run_hot.dart index 5422dbc333..ca5626b4c8 100644 --- a/packages/flutter_tools/lib/src/run_hot.dart +++ b/packages/flutter_tools/lib/src/run_hot.dart @@ -1069,7 +1069,8 @@ class ProjectFileInvalidator { final List invalidatedFiles = []; for (final Uri uri in urisToScan) { final DateTime updatedAt = fs.statSync( - uri.toFilePath(windows: platform.isWindows)).modified; + uri.toFilePath(windows: platform.isWindows), + ).modified; if (updatedAt != null && updatedAt.isAfter(lastCompiled)) { invalidatedFiles.add(uri); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart index ee246159f7..63e442cb74 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/analyze_test.dart @@ -48,6 +48,7 @@ void main() { inRepo([]); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart index c6d99983ca..8d991228e6 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/attach_test.dart @@ -19,6 +19,7 @@ import 'package:flutter_tools/src/resident_runner.dart'; import 'package:flutter_tools/src/run_hot.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -99,6 +100,7 @@ void main() { await loggerSubscription.cancel(); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Logger: () => logger, }); @@ -116,6 +118,7 @@ void main() { throwsA(isA())); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Logger: () => logger, }); @@ -195,6 +198,7 @@ void main() { expect(flutterDevice.fileSystemRoots, const [filesystemRoot]); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('exits when ipv6 is specified and debug-port is not', () async { @@ -218,6 +222,7 @@ void main() { ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), },); testUsingContext('exits when observatory-port is specified and debug-port is not', () async { @@ -241,6 +246,7 @@ void main() { ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), },); }); @@ -302,6 +308,7 @@ void main() { )).called(1); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); group('forwarding to given port', () { @@ -344,6 +351,7 @@ void main() { await loggerSubscription.cancel(); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Logger: () => logger, }); @@ -367,6 +375,7 @@ void main() { await loggerSubscription.cancel(); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Logger: () => logger, }); @@ -397,6 +406,7 @@ void main() { await loggerSubscription.cancel(); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Logger: () => logger, }); @@ -428,6 +438,7 @@ void main() { await loggerSubscription.cancel(); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Logger: () => logger, }); }); @@ -441,6 +452,7 @@ void main() { expect(testLogger.statusText, contains('No supported devices connected')); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('exits when multiple devices connected', () async { @@ -465,6 +477,7 @@ void main() { expect(testLogger.statusText, contains('yy2')); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart index 96ebedfeb5..63f26ad407 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_fuchsia_test.dart @@ -15,6 +15,7 @@ import 'package:flutter_tools/src/fuchsia/fuchsia_sdk.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -23,7 +24,6 @@ import '../../src/mocks.dart'; void main() { Cache.disableLocking(); - MemoryFileSystem memoryFileSystem; MockPlatform linuxPlatform; MockPlatform windowsPlatform; MockFuchsiaSdk fuchsiaSdk; @@ -31,7 +31,6 @@ void main() { MockFuchsiaArtifacts fuchsiaArtifactsNoCompiler; setUp(() { - memoryFileSystem = MemoryFileSystem(); linuxPlatform = MockPlatform(); windowsPlatform = MockPlatform(); fuchsiaSdk = MockFuchsiaSdk(); @@ -57,7 +56,8 @@ void main() { throwsA(isInstanceOf())); }, overrides: { Platform: () => linuxPlatform, - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FuchsiaArtifacts: () => fuchsiaArtifacts, }); @@ -74,7 +74,8 @@ void main() { throwsA(isInstanceOf())); }, overrides: { Platform: () => linuxPlatform, - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FuchsiaArtifacts: () => fuchsiaArtifacts, }); @@ -96,7 +97,8 @@ void main() { throwsA(isInstanceOf())); }, overrides: { Platform: () => windowsPlatform, - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FuchsiaArtifacts: () => fuchsiaArtifacts, }); @@ -118,7 +120,8 @@ void main() { throwsA(isInstanceOf())); }, overrides: { Platform: () => linuxPlatform, - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FuchsiaArtifacts: () => fuchsiaArtifactsNoCompiler, }); }); @@ -143,7 +146,8 @@ void main() { expect(fs.file(farPath).existsSync(), isTrue); }, overrides: { Platform: () => linuxPlatform, - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FuchsiaSdk: () => fuchsiaSdk, }); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart index 1c6dafbcda..96b53405eb 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_linux_test.dart @@ -83,6 +83,7 @@ void main() { }, overrides: { Platform: () => linuxPlatform, FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), }); @@ -97,6 +98,7 @@ void main() { }, overrides: { Platform: () => notLinuxPlatform, FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), }); @@ -185,6 +187,7 @@ BINARY_NAME=fizz_bar expect(makefileExecutableName(flutterProject.linux), 'fizz_bar'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), }); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart index 51cdee2105..1df3eecfa9 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_macos_test.dart @@ -36,7 +36,6 @@ class FakeXcodeProjectInterpreterWithProfile extends FakeXcodeProjectInterpreter void main() { MockProcessManager mockProcessManager; - MemoryFileSystem memoryFilesystem; MockProcess mockProcess; MockPlatform macosPlatform; MockPlatform notMacosPlatform; @@ -47,7 +46,6 @@ void main() { setUp(() { mockProcessManager = MockProcessManager(); - memoryFilesystem = MemoryFileSystem(); mockProcess = MockProcess(); macosPlatform = MockPlatform(); notMacosPlatform = MockPlatform(); @@ -121,7 +119,8 @@ void main() { ), throwsA(isInstanceOf())); }, overrides: { Platform: () => notMacosPlatform, - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -135,7 +134,7 @@ void main() { const ['build', 'macos', '--debug'] ); }, overrides: { - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(), ProcessManager: () => mockProcessManager, Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), @@ -151,7 +150,7 @@ void main() { const ['build', 'macos', '--profile'] ); }, overrides: { - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(), ProcessManager: () => mockProcessManager, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithProfile(), @@ -168,7 +167,7 @@ void main() { const ['build', 'macos', '--release'] ); }, overrides: { - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(), ProcessManager: () => mockProcessManager, Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart index 6605d7bdcc..3b6fc29a96 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_windows_test.dart @@ -25,7 +25,6 @@ import '../../src/testbed.dart'; void main() { MockProcessManager mockProcessManager; - MemoryFileSystem memoryFilesystem; MockProcess mockProcess; MockPlatform windowsPlatform; MockPlatform notWindowsPlatform; @@ -40,7 +39,6 @@ void main() { setUp(() { mockProcessManager = MockProcessManager(); - memoryFilesystem = MemoryFileSystem(style: FileSystemStyle.windows); mockProcess = MockProcess(); windowsPlatform = MockPlatform() ..environment['PROGRAMFILES(X86)'] = r'C:\Program Files (x86)\'; @@ -68,7 +66,8 @@ void main() { ), throwsA(isInstanceOf())); }, overrides: { Platform: () => windowsPlatform, - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), + ProcessManager: () => FakeProcessManager([]), VisualStudio: () => mockVisualStudio, FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), }); @@ -82,7 +81,8 @@ void main() { ), throwsA(isInstanceOf())); }, overrides: { Platform: () => windowsPlatform, - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), + ProcessManager: () => FakeProcessManager([]), VisualStudio: () => mockVisualStudio, FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), }); @@ -101,7 +101,8 @@ void main() { ), throwsA(isInstanceOf())); }, overrides: { Platform: () => notWindowsPlatform, - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), + ProcessManager: () => FakeProcessManager([]), VisualStudio: () => mockVisualStudio, FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), }); @@ -136,7 +137,7 @@ void main() { expect(props.findAllElements('ItemGroup').length, 1); expect(props.findAllElements('FLUTTER_ROOT').first.text, r'C:\'); }, overrides: { - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), ProcessManager: () => mockProcessManager, Platform: () => windowsPlatform, VisualStudio: () => mockVisualStudio, @@ -168,7 +169,7 @@ void main() { final BufferLogger bufferLogger = logger; expect(bufferLogger.statusText, contains('🚧')); }, overrides: { - FileSystem: () => memoryFilesystem, + FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), ProcessManager: () => mockProcessManager, Platform: () => windowsPlatform, VisualStudio: () => mockVisualStudio, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart index 271cfabf67..5c736a69cd 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/clean_test.dart @@ -12,29 +12,22 @@ import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/macos/xcode.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; void main() { - MemoryFileSystem fs; - MockPlatform windowsPlatform; - MockXcode mockXcode; - FlutterProject projectUnderTest; - MockXcodeProjectInterpreter mockXcodeProjectInterpreter; - Directory buildDirectory; - - setUp(() { - fs = MemoryFileSystem(); - mockXcodeProjectInterpreter = MockXcodeProjectInterpreter(); - windowsPlatform = MockPlatform(); - mockXcode = MockXcode(); + void test1() { + final MemoryFileSystem fs = MemoryFileSystem(); + final MockXcodeProjectInterpreter mockXcodeProjectInterpreter = MockXcodeProjectInterpreter(); + final MockXcode mockXcode = MockXcode(); final Directory currentDirectory = fs.currentDirectory; - buildDirectory = currentDirectory.childDirectory('build'); + final Directory buildDirectory = currentDirectory.childDirectory('build'); buildDirectory.createSync(recursive: true); - projectUnderTest = FlutterProject.fromDirectory(currentDirectory); + final FlutterProject projectUnderTest = FlutterProject.fromDirectory(currentDirectory); projectUnderTest.ios.xcodeWorkspace.createSync(recursive: true); projectUnderTest.macos.xcodeWorkspace.createSync(recursive: true); @@ -44,10 +37,8 @@ void main() { projectUnderTest.linux.ephemeralDirectory.createSync(recursive: true); projectUnderTest.macos.ephemeralDirectory.createSync(recursive: true); projectUnderTest.windows.ephemeralDirectory.createSync(recursive: true); - }); - group(CleanCommand, () { - testUsingContext('removes build and .dart_tool and ephemeral directories, cleans Xcode', () async { + testUsingContext('$CleanCommand removes build and .dart_tool and ephemeral directories, cleans Xcode', () async { when(mockXcode.isInstalledAndMeetsVersionCheck).thenReturn(true); await CleanCommand().runCommand(); @@ -62,12 +53,16 @@ void main() { verify(xcodeProjectInterpreter.cleanWorkspace(any, 'Runner')).called(2); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Xcode: () => mockXcode, - FileSystem: () => fs, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, }); + } - testUsingContext('prints a helpful error message on Windows', () async { + void test2() { + final MockXcode mockXcode = MockXcode(); + final MockPlatform windowsPlatform = MockPlatform(); + testUsingContext('$CleanCommand prints a helpful error message on Windows', () async { when(mockXcode.isInstalledAndMeetsVersionCheck).thenReturn(false); when(windowsPlatform.isWindows).thenReturn(true); @@ -85,7 +80,10 @@ void main() { Logger: () => BufferLogger(), Xcode: () => mockXcode, }); - }); + } + + test1(); + test2(); } class MockFile extends Mock implements File {} diff --git a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart index fe15e43ed9..99174a71fa 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/drive_test.dart @@ -84,6 +84,7 @@ void main() { } }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns 1 when app fails to run', () async { @@ -111,6 +112,7 @@ void main() { } }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns 1 when app file is outside package', () async { @@ -133,6 +135,7 @@ void main() { } }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns 1 when app file is in the root dir', () async { @@ -156,6 +159,7 @@ void main() { } }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns 0 when test ends successfully', () async { @@ -188,6 +192,7 @@ void main() { expect(testLogger.errorText, isEmpty); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns exitCode set by test runner', () async { @@ -224,6 +229,7 @@ void main() { } }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); group('findTargetDevice', () { @@ -238,6 +244,7 @@ void main() { expect(device.name, 'specified-device'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -248,6 +255,7 @@ void main() { expect(await findTargetDevice(), isNull); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: platform, }); @@ -260,6 +268,7 @@ void main() { expect(device.name, 'mock-android-device'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: platform, }); @@ -291,6 +300,7 @@ void main() { expect(device.name, 'mock-android-device'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: platform, }); } @@ -318,6 +328,7 @@ void main() { expect(device.name, 'mock-simulator'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: macOsPlatform, }); }); @@ -389,6 +400,7 @@ void main() { )); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('does not use pre-built app if --build arg provided', () async { @@ -416,6 +428,7 @@ void main() { )); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('uses prebuilt app if --no-build arg provided', () async { @@ -443,6 +456,7 @@ void main() { )); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); }); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart index 00b4aacfc1..b5bcc8e9f5 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/shell_completion_test.dart @@ -9,6 +9,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/shell_completion.dart'; +import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -51,6 +52,7 @@ void main() { expect(fs.file(outputFile).readAsStringSync(), contains('__flutter_completion')); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Stdio: () => mockStdio, }); @@ -71,6 +73,7 @@ void main() { expect(fs.file(outputFile).readAsStringSync(), isEmpty); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Stdio: () => mockStdio, }); @@ -85,6 +88,7 @@ void main() { expect(fs.file(outputFile).readAsStringSync(), contains('__flutter_completion')); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Stdio: () => mockStdio, }); }); diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart index 4dfc63d196..224d406407 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_bundle_test.dart @@ -12,6 +12,7 @@ import 'package:flutter_tools/src/commands/build_bundle.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:mockito/mockito.dart'; +import 'package:process/process.dart'; import '../../src/common.dart'; import '../../src/context.dart'; @@ -108,6 +109,7 @@ void main() { ]), throwsA(isInstanceOf())); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: false), }); @@ -125,6 +127,7 @@ void main() { ]), throwsA(isInstanceOf())); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: false), }); @@ -142,6 +145,7 @@ void main() { ]), throwsA(isInstanceOf())); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: false), }); @@ -159,6 +163,7 @@ void main() { ]); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), }); @@ -176,6 +181,7 @@ void main() { ]); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), }); @@ -193,6 +199,7 @@ void main() { ]); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); } diff --git a/packages/flutter_tools/test/general.shard/analytics_test.dart b/packages/flutter_tools/test/general.shard/analytics_test.dart index 82e4d07c41..8a661129cc 100644 --- a/packages/flutter_tools/test/general.shard/analytics_test.dart +++ b/packages/flutter_tools/test/general.shard/analytics_test.dart @@ -108,6 +108,7 @@ void main() { 'FLUTTER_ANALYTICS_LOG_FILE': 'test', }), FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Usage records multiple features in experiment setting', () async { @@ -129,6 +130,7 @@ void main() { 'FLUTTER_ANALYTICS_LOG_FILE': 'test', }), FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); }); @@ -221,6 +223,7 @@ void main() { expect(log.contains(formatDateTime(dateTime)), isTrue); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), SystemClock: () => mockClock, Platform: () => FakePlatform( environment: { @@ -246,6 +249,7 @@ void main() { expect(log.contains(formatDateTime(dateTime)), isTrue); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), SystemClock: () => mockClock, Platform: () => FakePlatform( environment: { diff --git a/packages/flutter_tools/test/general.shard/android/android_device_test.dart b/packages/flutter_tools/test/general.shard/android/android_device_test.dart index 73e64bbd50..366f2b2c09 100644 --- a/packages/flutter_tools/test/general.shard/android/android_device_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_device_test.dart @@ -280,6 +280,7 @@ flutter: expect(AndroidDevice('test').isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('isSupportedForProject is true with editable host app', () async { @@ -291,6 +292,7 @@ flutter: expect(AndroidDevice('test').isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('isSupportedForProject is false with no host app and no module', () async { @@ -301,6 +303,7 @@ flutter: expect(AndroidDevice('test').isSupportedForProject(flutterProject), false); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); group('emulatorId', () { diff --git a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart index e08151bfce..e93f7f7134 100644 --- a/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_sdk_test.dart @@ -45,6 +45,7 @@ void main() { expect(sdk.latestVersion.sdkLevel, 23); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('parse sdk N', () { @@ -56,6 +57,7 @@ void main() { expect(sdk.latestVersion.sdkLevel, 24); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns sdkmanager path', () { @@ -66,6 +68,7 @@ void main() { expect(sdk.sdkManagerPath, fs.path.join(sdk.directory, 'tools', 'bin', 'sdkmanager')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns sdkmanager version', () { @@ -158,6 +161,7 @@ void main() { expect(sdk.ndk.compilerArgs, ['--sysroot', realNdkSysroot]); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: os), }); @@ -192,6 +196,7 @@ void main() { expect(sdk.ndk.compilerArgs, ['--sysroot', realNdkSysroot, '-fuse-ld=$realNdkLinker']); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: os), }); }); @@ -209,6 +214,7 @@ void main() { expect(explanation, contains('Can not locate ndk-bundle')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: os), }); } diff --git a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart index cd7216d14d..5fe9a223e6 100644 --- a/packages/flutter_tools/test/general.shard/android/android_studio_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_studio_test.dart @@ -66,6 +66,7 @@ void main() { equals('/home/me/.AndroidStudioWithCheese5.0/config/plugins')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), // Custom home paths are not supported on macOS nor Windows yet, // so we force the platform to fake Linux here. Platform: () => linuxPlatform(), @@ -85,6 +86,7 @@ void main() { equals(fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3'))); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), // Custom home paths are not supported on macOS nor Windows yet, // so we force the platform to fake Linux here. Platform: () => macPlatform(), @@ -114,6 +116,7 @@ void main() { equals(fs.path.join(homeMac, 'Library', 'Application Support', 'AndroidStudio3.3'))); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), // Custom home paths are not supported on macOS nor Windows yet, // so we force the platform to fake Linux here. Platform: () => macPlatform(), diff --git a/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart b/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart index 3269e4fd8a..b4a08cdd90 100644 --- a/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart +++ b/packages/flutter_tools/test/general.shard/android/android_workflow_test.dart @@ -51,8 +51,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -65,8 +65,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -80,8 +80,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -98,8 +98,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -117,8 +117,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -136,8 +136,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -149,8 +149,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -162,8 +162,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -175,8 +175,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -188,8 +188,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -201,8 +201,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -218,8 +218,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); @@ -272,8 +272,8 @@ void main() { }, overrides: { AndroidSdk: () => sdk, FileSystem: () => fs, - Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, ProcessManager: () => processManager, + Platform: () => FakePlatform()..environment = {'HOME': '/home/me'}, Stdio: () => stdio, }); diff --git a/packages/flutter_tools/test/general.shard/android/gradle_test.dart b/packages/flutter_tools/test/general.shard/android/gradle_test.dart index ccc9a21fb1..8b1f1e580c 100644 --- a/packages/flutter_tools/test/general.shard/android/gradle_test.dart +++ b/packages/flutter_tools/test/general.shard/android/gradle_test.dart @@ -58,6 +58,7 @@ void main() { expect(findApkFiles(gradleProject, buildInfo), []); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); test('androidXFailureRegex should match lines with likely AndroidX errors', () { @@ -130,6 +131,7 @@ void main() { expect(bundle.path, '/foo_barRelease/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor doesn\'t contain underscores in release mode', () { @@ -139,6 +141,7 @@ void main() { expect(bundle.path, '/fooRelease/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when no flavor is used in release mode', () { @@ -148,6 +151,7 @@ void main() { expect(bundle.path, '/release/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor contains underscores in debug mode', () { @@ -157,6 +161,7 @@ void main() { expect(bundle.path, '/foo_barDebug/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor doesn\'t contain underscores in debug mode', () { @@ -166,6 +171,7 @@ void main() { expect(bundle.path, '/fooDebug/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when no flavor is used in debug mode', () { @@ -175,6 +181,7 @@ void main() { expect(bundle.path, '/debug/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor contains underscores in profile mode', () { @@ -184,6 +191,7 @@ void main() { expect(bundle.path, '/foo_barProfile/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor doesn\'t contain underscores in profile mode', () { @@ -193,6 +201,7 @@ void main() { expect(bundle.path, '/fooProfile/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when no flavor is used in profile mode', () { @@ -202,6 +211,7 @@ void main() { expect(bundle.path, '/profile/app.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle in release mode - Gradle 3.5', () { @@ -211,6 +221,7 @@ void main() { expect(bundle.path, '/release/app-release.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle in profile mode - Gradle 3.5', () { @@ -220,6 +231,7 @@ void main() { expect(bundle.path, '/profile/app-profile.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle in debug mode - Gradle 3.5', () { @@ -229,6 +241,7 @@ void main() { expect(bundle.path, '/debug/app-debug.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor contains underscores in release mode - Gradle 3.5', () { @@ -238,6 +251,7 @@ void main() { expect(bundle.path, '/foo_barRelease/app-foo_bar-release.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor contains underscores in profile mode - Gradle 3.5', () { @@ -247,6 +261,7 @@ void main() { expect(bundle.path, '/foo_barProfile/app-foo_bar-profile.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Finds app bundle when flavor contains underscores in debug mode - Gradle 3.5', () { @@ -256,6 +271,7 @@ void main() { expect(bundle.path, '/foo_barDebug/app-foo_bar-debug.aab'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); }); @@ -492,6 +508,7 @@ include ':app' }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Logger: () => mockLogger, }); @@ -525,6 +542,7 @@ include ':app' }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Logger: () => mockLogger, }); }); @@ -587,9 +605,9 @@ include ':app' void testUsingAndroidContext(String description, dynamic testMethod()) { testUsingContext(description, testMethod, overrides: { Artifacts: () => mockArtifacts, - ProcessManager: () => mockProcessManager, Platform: () => android, FileSystem: () => fs, + ProcessManager: () => mockProcessManager, }); } @@ -1011,6 +1029,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Inject the wrapper when some files are missing', () { @@ -1051,6 +1070,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Gives executable permission to gradle', () { @@ -1068,6 +1088,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), OperatingSystemUtils: () => OperatingSystemUtils(), }); }); @@ -1089,6 +1110,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('throws ToolExit if it cannot write gradle.properties', () { @@ -1126,6 +1148,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; equals('android.enableR8=true')); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('sets android.enableR8=true', () { @@ -1146,6 +1169,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; ); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -1167,6 +1191,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns false when the project is not using AndroidX', () async { @@ -1180,6 +1205,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('returns false when gradle.properties does not exist', () async { @@ -1189,6 +1215,7 @@ at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)'''; }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -1291,8 +1318,8 @@ plugin2=${plugin2.path} }, overrides: { AndroidSdk: () => mockAndroidSdk, FileSystem: () => fs, - GradleUtils: () => FakeGradleUtils(), ProcessManager: () => mockProcessManager, + GradleUtils: () => FakeGradleUtils(), }); }); @@ -1405,9 +1432,9 @@ plugin2=${plugin2.path} AndroidStudio: () => mockAndroidStudio, Artifacts: () => mockArtifacts, Cache: () => cache, - ProcessManager: () => mockProcessManager, Platform: () => android, FileSystem: () => fs, + ProcessManager: () => mockProcessManager, }); }); } diff --git a/packages/flutter_tools/test/general.shard/application_package_test.dart b/packages/flutter_tools/test/general.shard/application_package_test.dart index 6917370aff..06c3b000fa 100644 --- a/packages/flutter_tools/test/general.shard/application_package_test.dart +++ b/packages/flutter_tools/test/general.shard/application_package_test.dart @@ -211,6 +211,7 @@ void main() { group('PrebuiltIOSApp', () { final Map overrides = { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), PlistParser: () => MockPlistUtils(), Platform: _kNoColorTerminalPlatform, OperatingSystemUtils: () => MockOperatingSystemUtils(), @@ -362,6 +363,7 @@ void main() { group('FuchsiaApp', () { final Map overrides = { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Platform: _kNoColorTerminalPlatform, OperatingSystemUtils: () => MockOperatingSystemUtils(), }; diff --git a/packages/flutter_tools/test/general.shard/artifacts_test.dart b/packages/flutter_tools/test/general.shard/artifacts_test.dart index 2086547def..a5539d5b89 100644 --- a/packages/flutter_tools/test/general.shard/artifacts_test.dart +++ b/packages/flutter_tools/test/general.shard/artifacts_test.dart @@ -45,6 +45,7 @@ void main() { }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: 'linux'), }); @@ -64,6 +65,7 @@ void main() { }, overrides: { Cache: () => Cache(rootOverride: tempDir), FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: 'linux'), }); }); @@ -93,6 +95,7 @@ void main() { ); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: 'linux'), }); @@ -111,6 +114,7 @@ void main() { ); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: 'linux'), }); @@ -118,6 +122,7 @@ void main() { expect(artifacts.getArtifactPath(Artifact.engineDartBinary), contains('.exe')); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: 'windows'), }); @@ -125,6 +130,7 @@ void main() { expect(artifacts.getArtifactPath(Artifact.engineDartBinary), isNot(contains('.exe'))); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), Platform: () => FakePlatform(operatingSystem: 'linux'), }); }); diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart index 9e505861ee..db44a3b7df 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_package_fonts_test.dart @@ -126,6 +126,7 @@ $fontsSection expect(bundle.entries.containsKey('FontManifest.json'), isTrue); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('App font uses font file from package', () async { @@ -154,6 +155,7 @@ $fontsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('App font uses local font file and package font file', () async { @@ -186,6 +188,7 @@ $fontsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('App uses package font with own font file', () async { @@ -219,6 +222,7 @@ $fontsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('App uses package font with font file from another package', () async { @@ -253,6 +257,7 @@ $fontsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('App uses package font with properties and own font file', () async { @@ -288,6 +293,7 @@ $fontsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('App uses local font and package font with own font file.', () async { @@ -327,6 +333,7 @@ $fontsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart index f6adfe7b2f..6ab2369f4d 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_package_test.dart @@ -135,6 +135,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('No assets are bundled when the package has an asset that is not listed', () async { @@ -162,6 +163,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('One asset is bundled when the package has and lists one asset its pubspec', () async { @@ -189,6 +191,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext("One asset is bundled when the package has one asset, listed in the app's pubspec", () async { @@ -216,6 +219,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('One asset and its variant are bundled when the package has an asset and a variant, and lists the asset in its pubspec', () async { @@ -243,6 +247,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('One asset and its variant are bundled when the package has an asset and a variant, and the app lists the asset in its pubspec', () async { @@ -273,6 +278,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Two assets are bundled when the package has and lists two assets in its pubspec', () async { @@ -301,6 +307,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext("Two assets are bundled when the package has two assets, listed in the app's pubspec", () async { @@ -336,6 +343,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Two assets are bundled when two packages each have and list an asset their pubspec', () async { @@ -375,6 +383,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext("Two assets are bundled when two packages each have an asset, listed in the app's pubspec", () async { @@ -417,6 +426,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('One asset is bundled when the app depends on a package, listing in its pubspec an asset from another package', () async { @@ -451,6 +461,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -480,6 +491,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); group('AssetBundle assets from scanned paths', () { @@ -511,6 +523,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Two assets are bundled when listing one and scanning second directory', () async { @@ -541,6 +554,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('One asset is bundled with variant, scanning wrong directory', () async { @@ -566,6 +580,7 @@ $assetsSection assert(bundle.entries['AssetManifest.json'] == null,'Invalid pubspec.yaml should not generate AssetManifest.json' ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -597,6 +612,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('No asset is bundled with variant, no assets or directories are listed', () async { @@ -625,6 +641,7 @@ $assetsSection ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Expect error generating manifest, wrong non-existing directory is listed', () async { @@ -658,6 +675,7 @@ $assetsSection } }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart index 3ffd01f9ef..8f97826954 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_test.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. import 'dart:convert'; -import 'dart:io' as io; import 'package:file/file.dart'; import 'package:file/memory.dart'; @@ -39,6 +38,7 @@ void main() { expect(ab.entries.length, greaterThan(0)); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('empty pubspec', () async { @@ -56,6 +56,7 @@ void main() { ); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('wildcard directories are updated when filesystem changes', () async { @@ -96,10 +97,10 @@ flutter: expect(bundle.entries.length, 5); }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('handle removal of wildcard directories', () async { - fs.file('.packages').createSync(); fs.file(fs.path.join('assets', 'foo', 'bar.txt')).createSync(recursive: true); fs.file('pubspec.yaml') ..createSync() @@ -109,6 +110,7 @@ flutter: assets: - assets/foo/ '''); + fs.file('.packages').createSync(); final AssetBundle bundle = AssetBundleFactory.instance.createBundle(); await bundle.build(manifestPath: 'pubspec.yaml'); // Expected assets: @@ -126,6 +128,9 @@ flutter: ..writeAsStringSync(r''' name: example'''); + // touch .packages to make sure its change time is after pubspec.yaml's + fs.file('.packages').createSync(); + // Even though the previous file was removed, it is left in the // asset manifest and not updated. This is due to the devfs not // supporting file deletion. @@ -139,7 +144,8 @@ name: example'''); expect(bundle.entries.length, 4); }, overrides: { FileSystem: () => testFileSystem, - }, skip: io.Platform.isWindows /* https://github.com/flutter/flutter/issues/34446 */); + ProcessManager: () => FakeProcessManager([]), + }); }); } diff --git a/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart b/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart index a2b37f126c..2b6a383256 100644 --- a/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart +++ b/packages/flutter_tools/test/general.shard/asset_bundle_variant_test.dart @@ -92,6 +92,7 @@ flutter: } }, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/general.shard/base/build_test.dart b/packages/flutter_tools/test/general.shard/base/build_test.dart index 99dd36f71c..65d5e066bf 100644 --- a/packages/flutter_tools/test/general.shard/base/build_test.dart +++ b/packages/flutter_tools/test/general.shard/base/build_test.dart @@ -254,6 +254,7 @@ void main() { AndroidSdk: () => mockAndroidSdk, Artifacts: () => mockArtifacts, FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), GenSnapshot: () => genSnapshot, Xcode: () => mockXcode, Logger: () => bufferLogger, diff --git a/packages/flutter_tools/test/general.shard/base/file_system_test.dart b/packages/flutter_tools/test/general.shard/base/file_system_test.dart index e0a4155a87..b647b60f18 100644 --- a/packages/flutter_tools/test/general.shard/base/file_system_test.dart +++ b/packages/flutter_tools/test/general.shard/base/file_system_test.dart @@ -20,12 +20,18 @@ void main() { testUsingContext('recursively creates a directory if it does not exist', () async { ensureDirectoryExists('foo/bar/baz.flx'); expect(fs.isDirectorySync('foo/bar'), true); - }, overrides: {FileSystem: () => fs}); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), + }); testUsingContext('throws tool exit on failure to create', () async { fs.file('foo').createSync(); expect(() => ensureDirectoryExists('foo/bar.flx'), throwsToolExit()); - }, overrides: {FileSystem: () => fs}); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), + }); }); group('copyDirectorySync', () { @@ -80,6 +86,7 @@ void main() { expect(destination.childDirectory('nested').childFile('a.txt').existsSync(), isFalse); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); }); diff --git a/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart b/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart index 5068a49b5d..0a40128c1b 100644 --- a/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart +++ b/packages/flutter_tools/test/general.shard/base/fingerprint_test.dart @@ -30,6 +30,7 @@ void main() { final Map contextOverrides = { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }; testUsingContext('throws when depfile is malformed', () { @@ -290,7 +291,10 @@ void main() { () => Fingerprint.fromBuildInputs({}, ['a.dart', 'b.dart']), throwsArgumentError, ); - }, overrides: {FileSystem: () => fs}); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), + }); testUsingContext('populates checksums for valid files', () { fs.file('a.dart').writeAsStringSync('This is a'); @@ -301,7 +305,10 @@ void main() { expect(jsonObject['files'], hasLength(2)); expect(jsonObject['files']['a.dart'], '8a21a15fad560b799f6731d436c1b698'); expect(jsonObject['files']['b.dart'], '6f144e08b58cd0925328610fad7ac07c'); - }, overrides: {FileSystem: () => fs}); + }, overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), + }); testUsingContext('includes framework version', () { final Fingerprint fingerprint = Fingerprint.fromBuildInputs({}, []); @@ -480,7 +487,10 @@ void main() { fs = MemoryFileSystem(); }); - final Map contextOverrides = {FileSystem: () => fs}; + final Map contextOverrides = { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), + }; testUsingContext('returns one file if only one is listed', () { fs.file('a.d').writeAsStringSync('snapshot.d: /foo/a.dart'); diff --git a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart index ec49906b4e..ba3763fdbd 100644 --- a/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart +++ b/packages/flutter_tools/test/general.shard/build_system/targets/windows_test.dart @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/cache.dart'; import 'package:mockito/mockito.dart'; import '../../../src/common.dart'; +import '../../../src/fake_process_manager.dart'; import '../../../src/testbed.dart'; void main() { @@ -51,6 +52,7 @@ void main() { fs.directory('windows').createSync(); }, overrides: { FileSystem: () => MemoryFileSystem(style: FileSystemStyle.windows), + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }); }); diff --git a/packages/flutter_tools/test/general.shard/cache_test.dart b/packages/flutter_tools/test/general.shard/cache_test.dart index 1c86af75fb..d3f9d58a27 100644 --- a/packages/flutter_tools/test/general.shard/cache_test.dart +++ b/packages/flutter_tools/test/general.shard/cache_test.dart @@ -64,6 +64,7 @@ void main() { Cache.releaseLockEarly(); }, overrides: { FileSystem: () => mockFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('throws tool exit when lockfile open fails', () async { @@ -72,6 +73,7 @@ void main() { expect(() async => await Cache.lock(), throwsA(isA())); }, overrides: { FileSystem: () => mockFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('should not throw when FLUTTER_ALREADY_LOCKED is set', () async { @@ -100,6 +102,7 @@ void main() { }, overrides: { Cache: ()=> mockCache, FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Gradle wrapper should be up to date, only if all cached artifact are available', () { @@ -115,6 +118,7 @@ void main() { }, overrides: { Cache: ()=> mockCache, FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); test('should not be up to date, if some cached artifact is not', () { @@ -206,6 +210,7 @@ void main() { expect(flattenNameSubdirs(Uri.parse('https://www.flutter.dev')), 'www.flutter.dev'); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); test('Unstable artifacts', () { @@ -256,6 +261,7 @@ void main() { }, overrides: { Cache: ()=> mockCache, FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), HttpClientFactory: () => () => fakeHttpClient, OperatingSystemUtils: () => mockOperatingSystemUtils, Platform: () => fakePlatform, diff --git a/packages/flutter_tools/test/general.shard/channel_test.dart b/packages/flutter_tools/test/general.shard/channel_test.dart index 3e42ece363..593347b63f 100644 --- a/packages/flutter_tools/test/general.shard/channel_test.dart +++ b/packages/flutter_tools/test/general.shard/channel_test.dart @@ -157,8 +157,8 @@ void main() { environment: anyNamed('environment'), )).called(1); }, overrides: { - ProcessManager: () => mockProcessManager, FileSystem: () => MemoryFileSystem(), + ProcessManager: () => mockProcessManager, }); // This verifies that bug https://github.com/flutter/flutter/issues/21134 @@ -218,8 +218,8 @@ void main() { expect(testLogger.errorText, hasLength(0)); expect(versionCheckFile.existsSync(), isFalse); }, overrides: { - ProcessManager: () => mockProcessManager, FileSystem: () => MemoryFileSystem(), + ProcessManager: () => mockProcessManager, }); }); } diff --git a/packages/flutter_tools/test/general.shard/commands/build_aot_test.dart b/packages/flutter_tools/test/general.shard/commands/build_aot_test.dart index 7381ee823a..3804f4f272 100644 --- a/packages/flutter_tools/test/general.shard/commands/build_aot_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/build_aot_test.dart @@ -41,6 +41,7 @@ void main() { }, overrides: { Artifacts: () => LocalEngineArtifacts('/engine', 'ios_profile', 'host_profile'), FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('build aot prints error if Clang version invalid', () async { diff --git a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart index 28bbe6cec8..c3316c6656 100644 --- a/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/build_apk_test.dart @@ -189,8 +189,8 @@ flutter: overrides: { AndroidSdk: () => mockAndroidSdk, GradleUtils: () => GradleUtils(), - ProcessManager: () => mockProcessManager, FileSystem: () => memoryFileSystem, + ProcessManager: () => mockProcessManager, }); }); diff --git a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart index 41970b4da5..9130bbe89f 100644 --- a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart +++ b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart @@ -89,8 +89,8 @@ void main() { expect(testLogger.errorText, isEmpty); expect(error, isNull); }, overrides: { - ProcessManager: () => MockProcessManager(69), FileSystem: () => MockFileSystem(), + ProcessManager: () => MockProcessManager(69), Platform: () => FakePlatform( environment: UnmodifiableMapView({}), ), @@ -144,8 +144,8 @@ void main() { expect(error, isNull); }); }, overrides: { - ProcessManager: () => MockProcessManager(69), FileSystem: () => MockFileSystem(), + ProcessManager: () => MockProcessManager(69), Platform: () => FakePlatform( environment: UnmodifiableMapView({}), ), @@ -171,8 +171,8 @@ void main() { expect(error, isNull); }); }, overrides: { - ProcessManager: () => MockProcessManager(69), FileSystem: () => MockFileSystem(), + ProcessManager: () => MockProcessManager(69), Platform: () => FakePlatform( environment: UnmodifiableMapView({ 'PUB_CACHE': 'custom/pub-cache/path', @@ -186,8 +186,8 @@ void main() { await pub.get(context: PubContext.flutterTests, checkLastModified: false); verify(flutterUsage.sendEvent('pub-result', 'flutter-tests', label: 'success')).called(1); }, overrides: { - ProcessManager: () => MockProcessManager(0), FileSystem: () => MockFileSystem(), + ProcessManager: () => MockProcessManager(0), Platform: () => FakePlatform( environment: UnmodifiableMapView({ 'PUB_CACHE': 'custom/pub-cache/path', @@ -206,8 +206,8 @@ void main() { } verify(flutterUsage.sendEvent('pub-result', 'flutter-tests', label: 'failure')).called(1); }, overrides: { - ProcessManager: () => MockProcessManager(1), FileSystem: () => MockFileSystem(), + ProcessManager: () => MockProcessManager(1), Platform: () => FakePlatform( environment: UnmodifiableMapView({ 'PUB_CACHE': 'custom/pub-cache/path', @@ -226,11 +226,11 @@ void main() { } verify(flutterUsage.sendEvent('pub-result', 'flutter-tests', label: 'version-solving-failed')).called(1); }, overrides: { + FileSystem: () => MockFileSystem(), ProcessManager: () => MockProcessManager( 1, stderr: 'version solving failed', ), - FileSystem: () => MockFileSystem(), Platform: () => FakePlatform( environment: UnmodifiableMapView({ 'PUB_CACHE': 'custom/pub-cache/path', diff --git a/packages/flutter_tools/test/general.shard/devfs_test.dart b/packages/flutter_tools/test/general.shard/devfs_test.dart index 0a49b42763..9c63f521e0 100644 --- a/packages/flutter_tools/test/general.shard/devfs_test.dart +++ b/packages/flutter_tools/test/general.shard/devfs_test.dart @@ -89,6 +89,7 @@ void main() { expect(content.isModified, isFalse); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }, skip: Platform.isWindows); // TODO(jonahwilliams): fix or disable this functionality. }); @@ -158,6 +159,7 @@ void main() { verify(httpRequest.close()).called(kFailedAttempts + 1); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -206,6 +208,7 @@ void main() { expect(report.success, true); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('delete dev file system', () async { @@ -215,6 +218,7 @@ void main() { expect(devFS.assetPathsToEvict, isEmpty); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('cleanup preexisting file system', () async { @@ -242,6 +246,7 @@ void main() { expect(devFS.assetPathsToEvict, isEmpty); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('reports unsuccessful compile when errors are returned', () async { @@ -271,6 +276,7 @@ void main() { expect(devFS.lastCompiled, previousCompile); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('correctly updates last compiled time when compilation does not fail', () async { @@ -304,6 +310,7 @@ void main() { expect(devFS.lastCompiled, isNot(previousCompile)); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart index 84324879c0..7f0d34731b 100644 --- a/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart +++ b/packages/flutter_tools/test/general.shard/flutter_manifest_test.dart @@ -621,6 +621,7 @@ flutter: }, overrides: { FileSystem: () => filesystem, + ProcessManager: () => FakeProcessManager([]), }, ); } diff --git a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart index 1db28a268c..a93073ab92 100644 --- a/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/general.shard/fuchsia/fuchsia_device_test.dart @@ -75,6 +75,7 @@ void main() { expect(device.isSupportedForProject(FlutterProject.current()), true); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('supported for project', () async { @@ -84,6 +85,7 @@ void main() { expect(device.isSupportedForProject(FlutterProject.current()), true); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('not supported for project', () async { @@ -92,6 +94,7 @@ void main() { expect(device.isSupportedForProject(FlutterProject.current()), false); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -445,6 +448,7 @@ void main() { expect(launchResult.hasObservatory, isFalse); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, @@ -469,6 +473,7 @@ void main() { expect(await device.stopApp(app), isTrue); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, @@ -481,6 +486,7 @@ void main() { expect(launchResult.hasObservatory, isTrue); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, @@ -493,6 +499,7 @@ void main() { expect(launchResult.hasObservatory, isFalse); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, @@ -505,6 +512,7 @@ void main() { expect(launchResult.hasObservatory, isTrue); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, @@ -517,6 +525,7 @@ void main() { expect(launchResult.hasObservatory, isFalse); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => MockFuchsiaSdk(devFinder: FailingDevFinder()), OperatingSystemUtils: () => osUtils, @@ -529,6 +538,7 @@ void main() { expect(launchResult.hasObservatory, isFalse); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => fuchsiaDeviceTools, FuchsiaSdk: () => MockFuchsiaSdk(pm: FailingPM()), OperatingSystemUtils: () => osUtils, @@ -541,6 +551,7 @@ void main() { expect(launchResult.hasObservatory, isFalse); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => FakeFuchsiaDeviceTools(amber: FailingAmberCtl()), FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, @@ -553,6 +564,7 @@ void main() { expect(launchResult.hasObservatory, isFalse); }, overrides: { FileSystem: () => memoryFileSystem, + ProcessManager: () => FakeProcessManager([]), FuchsiaDeviceTools: () => FakeFuchsiaDeviceTools(tiles: FailingTilesCtl()), FuchsiaSdk: () => fuchsiaSdk, OperatingSystemUtils: () => osUtils, diff --git a/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart b/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart index 181141c336..2130ed2336 100644 --- a/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart +++ b/packages/flutter_tools/test/general.shard/intellij/intellij_test.dart @@ -69,6 +69,7 @@ void main() { expect(message.message, contains('recommended minimum version')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('not found', () async { @@ -89,6 +90,7 @@ void main() { expect(message.message, contains('Flutter plugin not installed')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); }); diff --git a/packages/flutter_tools/test/general.shard/ios/devices_test.dart b/packages/flutter_tools/test/general.shard/ios/devices_test.dart index 64ba0e37e8..47061e56b7 100644 --- a/packages/flutter_tools/test/general.shard/ios/devices_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/devices_test.dart @@ -763,6 +763,7 @@ flutter: expect(IOSDevice('test').isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Platform: () => macPlatform, }); testUsingContext('IOSDevice.isSupportedForProject is true with editable host app', () async { @@ -774,6 +775,7 @@ flutter: expect(IOSDevice('test').isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Platform: () => macPlatform, }); @@ -785,6 +787,7 @@ flutter: expect(IOSDevice('test').isSupportedForProject(flutterProject), false); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Platform: () => macPlatform, }); } diff --git a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart index 289c3afead..cdac3b8bf4 100644 --- a/packages/flutter_tools/test/general.shard/ios/simulators_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/simulators_test.dart @@ -486,6 +486,7 @@ flutter: expect(IOSSimulator('test').isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('IOSDevice.isSupportedForProject is true with editable host app', () async { @@ -497,6 +498,7 @@ flutter: expect(IOSSimulator('test').isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('IOSDevice.isSupportedForProject is false with no host app and no module', () async { @@ -507,5 +509,6 @@ flutter: expect(IOSSimulator('test').isSupportedForProject(flutterProject), false); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); } diff --git a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart index c238ab04ed..48f3cb9209 100644 --- a/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/xcodeproj_test.dart @@ -39,9 +39,9 @@ void main() { void testUsingOsxContext(String description, dynamic testMethod()) { testUsingContext(description, testMethod, overrides: { - ProcessManager: () => mockProcessManager, Platform: () => macOS, FileSystem: () => fs, + ProcessManager: () => mockProcessManager, }); } @@ -188,9 +188,9 @@ void main() { void testUsingOsxContext(String description, dynamic testMethod()) { testUsingContext(description, testMethod, overrides: { - ProcessManager: () => mockProcessManager, Platform: () => macOS, FileSystem: () => fs, + ProcessManager: () => mockProcessManager, }); } @@ -355,9 +355,9 @@ Information about project "Runner": void testUsingOsxContext(String description, dynamic testMethod()) { testUsingContext(description, testMethod, overrides: { Artifacts: () => mockArtifacts, - ProcessManager: () => mockProcessManager, Platform: () => macOS, FileSystem: () => fs, + ProcessManager: () => mockProcessManager, }); } diff --git a/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart b/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart index aafffb923b..421549879c 100644 --- a/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart +++ b/packages/flutter_tools/test/general.shard/linux/linux_device_test.dart @@ -16,29 +16,27 @@ import '../../src/common.dart'; import '../../src/context.dart'; void main() { - group(LinuxDevice, () { - final LinuxDevice device = LinuxDevice(); - final MockPlatform notLinux = MockPlatform(); + final LinuxDevice device = LinuxDevice(); + final MockPlatform notLinux = MockPlatform(); - when(notLinux.isLinux).thenReturn(false); + when(notLinux.isLinux).thenReturn(false); - testUsingContext('defaults', () async { - final PrebuiltLinuxApp linuxApp = PrebuiltLinuxApp(executable: 'foo'); - expect(await device.targetPlatform, TargetPlatform.linux_x64); - expect(device.name, 'Linux'); - expect(await device.installApp(linuxApp), true); - expect(await device.uninstallApp(linuxApp), true); - expect(await device.isLatestBuildInstalled(linuxApp), true); - expect(await device.isAppInstalled(linuxApp), true); - expect(await device.stopApp(linuxApp), true); - expect(device.category, Category.desktop); - }); + testUsingContext('LinuxDevice defaults', () async { + final PrebuiltLinuxApp linuxApp = PrebuiltLinuxApp(executable: 'foo'); + expect(await device.targetPlatform, TargetPlatform.linux_x64); + expect(device.name, 'Linux'); + expect(await device.installApp(linuxApp), true); + expect(await device.uninstallApp(linuxApp), true); + expect(await device.isLatestBuildInstalled(linuxApp), true); + expect(await device.isAppInstalled(linuxApp), true); + expect(await device.stopApp(linuxApp), true); + expect(device.category, Category.desktop); + }); - testUsingContext('No devices listed if platform unsupported', () async { - expect(await LinuxDevices().devices, []); - }, overrides: { - Platform: () => notLinux, - }); + testUsingContext('LinuxDevice: no devices listed if platform unsupported', () async { + expect(await LinuxDevices().devices, []); + }, overrides: { + Platform: () => notLinux, }); testUsingContext('LinuxDevice.isSupportedForProject is true with editable host app', () async { @@ -50,6 +48,7 @@ void main() { expect(LinuxDevice().isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('LinuxDevice.isSupportedForProject is false with no host app', () async { @@ -60,9 +59,10 @@ void main() { expect(LinuxDevice().isSupportedForProject(flutterProject), false); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); - testUsingContext('executablePathForDevice uses the correct package executable', () async { + testUsingContext('LinuxDevice.executablePathForDevice uses the correct package executable', () async { final MockLinuxApp mockApp = MockLinuxApp(); const String debugPath = 'debug/executable'; const String profilePath = 'profile/executable'; @@ -76,6 +76,7 @@ void main() { expect(LinuxDevice().executablePathForDevice(mockApp, BuildMode.release), releasePath); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); } diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart index 57ca5589e2..f4079cdc61 100644 --- a/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/cocoapods_test.dart @@ -166,9 +166,9 @@ void main() { pretendPodVersionIs('1.8.0'); expect(await cocoaPodsUnderTest.isCocoaPodsInitialized, isTrue); }, overrides: { - ProcessManager: () => mockProcessManager, Platform: () => FakePlatform(), FileSystem: () => fs, + ProcessManager: () => mockProcessManager, }); }); @@ -179,6 +179,7 @@ void main() { expect(projectUnderTest.ios.podfile.readAsStringSync(), 'Objective-C iOS podfile template'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('creates swift Podfile if swift', () async { @@ -194,6 +195,7 @@ void main() { expect(projectUnderTest.ios.podfile.readAsStringSync(), 'Swift iOS podfile template'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, }); @@ -204,6 +206,7 @@ void main() { expect(projectUnderTest.macos.podfile.readAsStringSync(), 'macOS podfile template'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('does not recreate Podfile when already present', () async { @@ -215,6 +218,7 @@ void main() { expect(projectUnderTest.ios.podfile.readAsStringSync(), 'Existing Podfile'); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('does not create Podfile when we cannot interpret Xcode projects', () async { @@ -226,6 +230,7 @@ void main() { expect(projectUnderTest.ios.podfile.existsSync(), false); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, }); @@ -251,6 +256,7 @@ void main() { expect(releaseContents, contains('Existing release config')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -279,6 +285,7 @@ void main() { expect(releaseContents, contains('Existing release config')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); diff --git a/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart b/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart index 56f307db52..36f43baf0f 100644 --- a/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/macos_device_test.dart @@ -56,6 +56,7 @@ void main() { expect(MacOSDevice().isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('isSupportedForProject is false with no host app', () async { @@ -66,6 +67,7 @@ void main() { expect(MacOSDevice().isSupportedForProject(flutterProject), false); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('executablePathForDevice uses the correct package executable', () async { @@ -82,6 +84,7 @@ void main() { expect(MacOSDevice().executablePathForDevice(mockApp, BuildMode.release), releasePath); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart b/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart index 7300b1b476..18516c0afb 100644 --- a/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart +++ b/packages/flutter_tools/test/general.shard/package_uri_mapper_test.dart @@ -40,6 +40,7 @@ void main() { 'package:example/main.dart'); }, overrides: { FileSystem: () => mockFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('single-root maps file from other package to null', () async { @@ -47,6 +48,7 @@ void main() { expect(packageUriMapper.map('/xml/lib/xml.dart'), null); }, overrides: { FileSystem: () => mockFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('single-root maps non-main file from same package', () async { @@ -55,6 +57,7 @@ void main() { 'package:example/src/foo.dart'); }, overrides: { FileSystem: () => mockFileSystem, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('multi-root maps main file from same package on multiroot scheme', () async { @@ -73,6 +76,7 @@ void main() { 'package:example/main.dart'); }, overrides: { FileSystem: () => mockFileSystem, + ProcessManager: () => FakeProcessManager([]), }); } diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart index 073fee4565..270b316a42 100644 --- a/packages/flutter_tools/test/general.shard/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/plugins_test.dart @@ -75,6 +75,7 @@ flutter: expect(flutterProject.flutterPluginsFile.existsSync(), false); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Refreshing the plugin list deletes the plugin file when there were plugins but no longer are', () { @@ -85,6 +86,7 @@ flutter: expect(flutterProject.flutterPluginsFile.existsSync(), false); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Refreshing the plugin list creates a plugin directory when there are plugins', () { @@ -95,6 +97,7 @@ flutter: expect(flutterProject.flutterPluginsFile.existsSync(), true); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Changes to the plugin list invalidates the Cocoapod lockfiles', () { @@ -108,6 +111,7 @@ flutter: expect(macosProject.podManifestLock.existsSync(), false); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -157,6 +161,7 @@ flutter: expect(registrant.readAsStringSync(), contains('class GeneratedPluginRegistrant')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, }); @@ -182,6 +187,7 @@ flutter: expect(registrant.readAsStringSync(), contains('class GeneratedPluginRegistrant')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, }); @@ -278,6 +284,7 @@ plugin3:${pluginUsingOldEmbeddingDir.childDirectory('lib').uri.toString()} }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, XcodeProjectInterpreter: () => xcodeProjectInterpreter, }); @@ -304,6 +311,7 @@ plugin3:${pluginUsingOldEmbeddingDir.childDirectory('lib').uri.toString()} expect(registrant.readAsStringSync(), contains('class GeneratedPluginRegistrant')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, }); @@ -322,6 +330,7 @@ plugin3:${pluginUsingOldEmbeddingDir.childDirectory('lib').uri.toString()} expect(registrant.readAsStringSync(), contains('class GeneratedPluginRegistrant')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, }); @@ -347,6 +356,7 @@ plugin3:${pluginUsingOldEmbeddingDir.childDirectory('lib').uri.toString()} expect(registrant.readAsStringSync(), contains('class GeneratedPluginRegistrant')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, }); @@ -372,6 +382,7 @@ plugin3:${pluginUsingOldEmbeddingDir.childDirectory('lib').uri.toString()} expect(registrant.readAsStringSync(), contains('class GeneratedPluginRegistrant')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => featureFlags, }); }); diff --git a/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart b/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart index b5c8c02bfd..27e69b87ff 100644 --- a/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart +++ b/packages/flutter_tools/test/general.shard/project_file_invalidator_test.dart @@ -9,33 +9,48 @@ import 'package:flutter_tools/src/run_hot.dart'; import '../src/common.dart'; import '../src/context.dart'; +// assumption: tests have a timeout less than 100 days +final DateTime inFuture = DateTime.now().add(const Duration(days: 100)); + void main() { group('ProjectFileInvalidator', () { - final MemoryFileSystem memoryFileSystem = MemoryFileSystem(); testUsingContext('No last compile', () async { expect( - ProjectFileInvalidator.findInvalidated(lastCompiled: null, urisToMonitor: [], packagesPath: ''), - isEmpty); + ProjectFileInvalidator.findInvalidated( + lastCompiled: null, + urisToMonitor: [], + packagesPath: '', + ), + isEmpty, + ); }); testUsingContext('Empty project', () async { expect( - ProjectFileInvalidator.findInvalidated(lastCompiled: DateTime.now(), urisToMonitor: [], packagesPath: ''), - isEmpty); + ProjectFileInvalidator.findInvalidated( + lastCompiled: inFuture, + urisToMonitor: [], + packagesPath: '', + ), + isEmpty, + ); }, overrides: { - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('Non-existent files are ignored', () async { expect( ProjectFileInvalidator.findInvalidated( - lastCompiled: DateTime.now(), - urisToMonitor: [Uri.parse('/not-there-anymore'),], - packagesPath: '', - ), - isEmpty); + lastCompiled: inFuture, + urisToMonitor: [Uri.parse('/not-there-anymore'),], + packagesPath: '', + ), + isEmpty, + ); }, overrides: { - FileSystem: () => memoryFileSystem, + FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/general.shard/project_test.dart b/packages/flutter_tools/test/general.shard/project_test.dart index a34f35cee7..676b78dff7 100644 --- a/packages/flutter_tools/test/general.shard/project_test.dart +++ b/packages/flutter_tools/test/general.shard/project_test.dart @@ -196,6 +196,7 @@ void main() { expectExists(project.macos.managedDirectory.childFile('GeneratedPluginRegistrant.swift')); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), FlutterProjectFactory: () => FlutterProjectFactory(), }); @@ -206,6 +207,7 @@ void main() { expectExists(project.macos.generatedXcodePropertiesFile); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), FlutterProjectFactory: () => FlutterProjectFactory(), }); @@ -217,6 +219,7 @@ void main() { expectExists(project.linux.managedDirectory.childFile('generated_plugin_registrant.cc')); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), FlutterProjectFactory: () => FlutterProjectFactory(), }); @@ -228,6 +231,7 @@ void main() { expectExists(project.windows.managedDirectory.childFile('generated_plugin_registrant.cc')); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), FlutterProjectFactory: () => FlutterProjectFactory(), }); @@ -324,6 +328,7 @@ apply plugin: 'kotlin-android' expect(project.android.isKotlin, isTrue); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, FlutterProjectFactory: () => flutterProjectFactory, }); @@ -344,6 +349,7 @@ apply plugin: 'kotlin-android' void testWithMocks(String description, Future testMethod()) { testUsingContext(description, testMethod, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), PlistParser: () => mockPlistUtils, XcodeProjectInterpreter: () => mockXcodeProjectInterpreter, FlutterProjectFactory: () => flutterProjectFactory, @@ -606,6 +612,7 @@ void testInMemory(String description, Future testMethod()) { testMethod, overrides: { FileSystem: () => testFileSystem, + ProcessManager: () => FakeProcessManager([]), Cache: () => Cache(), FlutterProjectFactory: () => flutterProjectFactory, }, diff --git a/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart b/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart index 50df26010f..3d821eb07e 100644 --- a/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/flutter_command_runner_test.dart @@ -67,6 +67,7 @@ void main() { expect(versionChecked, isTrue); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); @@ -78,6 +79,7 @@ void main() { }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); @@ -93,6 +95,7 @@ void main() { await runner.run(['dummy', '--local-engine=ios_debug']); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); @@ -102,6 +105,7 @@ void main() { await runner.run(['dummy', '--local-engine-src-path=$_kArbitraryEngineRoot/src', '--local-engine=ios_debug']); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); @@ -111,6 +115,7 @@ void main() { await runner.run(['dummy', '--local-engine=ios_debug']); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); }); @@ -125,6 +130,7 @@ void main() { }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); @@ -153,8 +159,8 @@ void main() { expect(version.toJson()['frameworkVersion'], '0.10.3'); }, overrides: { FileSystem: () => fs, - Platform: () => platform, ProcessManager: () => processManager, + Platform: () => platform, }, initializeFlutterRoot: false); }); @@ -182,48 +188,53 @@ void main() { ]); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Platform: () => platform, }, initializeFlutterRoot: false); }); group('wrapping', () { testUsingContext('checks that output wrapping is turned on when writing to a terminal', () async { - final FakeCommand fakeCommand = FakeCommand(); + final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['fake']); expect(fakeCommand.preferences.wrapText, isTrue); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Stdio: () => FakeStdio(hasFakeTerminal: true), }, initializeFlutterRoot: false); testUsingContext('checks that output wrapping is turned off when not writing to a terminal', () async { - final FakeCommand fakeCommand = FakeCommand(); + final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['fake']); expect(fakeCommand.preferences.wrapText, isFalse); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Stdio: () => FakeStdio(hasFakeTerminal: false), }, initializeFlutterRoot: false); testUsingContext('checks that output wrapping is turned off when set on the command line and writing to a terminal', () async { - final FakeCommand fakeCommand = FakeCommand(); + final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['--no-wrap', 'fake']); expect(fakeCommand.preferences.wrapText, isFalse); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Stdio: () => FakeStdio(hasFakeTerminal: true), }, initializeFlutterRoot: false); testUsingContext('checks that output wrapping is turned on when set on the command line, but not writing to a terminal', () async { - final FakeCommand fakeCommand = FakeCommand(); + final FakeFlutterCommand fakeCommand = FakeFlutterCommand(); runner.addCommand(fakeCommand); await runner.run(['--wrap', 'fake']); expect(fakeCommand.preferences.wrapText, isTrue); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), Stdio: () => FakeStdio(hasFakeTerminal: false), }, initializeFlutterRoot: false); }); @@ -236,7 +247,7 @@ class FakeFlutterVersion extends FlutterVersion { String get frameworkVersion => '0.10.3'; } -class FakeCommand extends FlutterCommand { +class FakeFlutterCommand extends FlutterCommand { OutputPreferences preferences; @override diff --git a/packages/flutter_tools/test/general.shard/runner/runner_test.dart b/packages/flutter_tools/test/general.shard/runner/runner_test.dart index c0a4c51d80..b9a0b87f53 100644 --- a/packages/flutter_tools/test/general.shard/runner/runner_test.dart +++ b/packages/flutter_tools/test/general.shard/runner/runner_test.dart @@ -71,6 +71,7 @@ void main() { 'FLUTTER_ROOT': '/', }), FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), Usage: () => CrashingUsage(), }); }); diff --git a/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart b/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart index a2329df36c..d5fd68f88e 100644 --- a/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart +++ b/packages/flutter_tools/test/general.shard/tester/flutter_tester_test.dart @@ -39,6 +39,7 @@ void main() { expect(app.packagesFile.path, fs.path.join(projectPath, '.packages')); }, overrides: { FileSystem: () => fs, + ProcessManager: () => FakeProcessManager([]), }); }); @@ -108,8 +109,8 @@ void main() { final Map startOverrides = { Platform: () => FakePlatform(operatingSystem: 'linux'), FileSystem: () => fs, - Cache: () => Cache(rootOverride: fs.directory(flutterRoot)), ProcessManager: () => mockProcessManager, + Cache: () => Cache(rootOverride: fs.directory(flutterRoot)), KernelCompilerFactory: () => FakeKernelCompilerFactory(mockKernelCompiler), Artifacts: () => mockArtifacts, }; diff --git a/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart b/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart index fa8870088e..5a9b7e4d4e 100644 --- a/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart +++ b/packages/flutter_tools/test/general.shard/windows/visual_studio_test.dart @@ -138,8 +138,8 @@ void main() { expect(visualStudio.isInstalled, false); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('vcvarsPath returns null when vswhere is missing', () { @@ -153,8 +153,8 @@ void main() { expect(visualStudio.vcvarsPath, isNull); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isInstalled returns false when vswhere returns non-zero', () { @@ -181,8 +181,8 @@ void main() { expect(visualStudio.isInstalled, false); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('VisualStudio getters return the right values if no installation is found', () { @@ -202,8 +202,8 @@ void main() { expect(visualStudio.fullVersion, null); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('necessaryComponentDescriptions suggest the right VS tools on major version 15', () { @@ -213,8 +213,8 @@ void main() { expect(toolsString.contains('v141'), true); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('necessaryComponentDescriptions suggest the right VS tools on major version != 15', () { @@ -224,8 +224,8 @@ void main() { expect(toolsString.contains('v142'), true); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isInstalled returns true even with missing status information', () { @@ -237,8 +237,8 @@ void main() { expect(visualStudio.isInstalled, true); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isInstalled returns true when VS is present but missing components', () { @@ -250,8 +250,8 @@ void main() { expect(visualStudio.isInstalled, true); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isInstalled returns true when a prerelease version of VS is present', () { @@ -267,8 +267,8 @@ void main() { expect(visualStudio.isPrerelease, true); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isComplete returns false when an incomplete installation is found', () { @@ -284,8 +284,8 @@ void main() { expect(visualStudio.isComplete, false); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isLaunchable returns false if the installation can\'t be launched', () { @@ -301,8 +301,8 @@ void main() { expect(visualStudio.isLaunchable, false); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('isRebootRequired returns true if the installation needs a reboot', () { @@ -318,8 +318,8 @@ void main() { expect(visualStudio.isRebootRequired, true); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); @@ -332,8 +332,8 @@ void main() { expect(visualStudio.hasNecessaryComponents, false); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('vcvarsPath returns null when VS is present but missing components', () { @@ -345,8 +345,8 @@ void main() { expect(visualStudio.vcvarsPath, isNull); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('vcvarsPath returns null when VS is present but with require components but installation is faulty', () { @@ -359,8 +359,8 @@ void main() { expect(visualStudio.vcvarsPath, isNull); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('hasNecessaryComponents returns false when VS is present with required components but installation is faulty', () { @@ -373,8 +373,8 @@ void main() { expect(visualStudio.hasNecessaryComponents, false); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('VS metadata is available when VS is present, even if missing components', () { @@ -389,8 +389,8 @@ void main() { expect(visualStudio.fullVersion, equals('16.2.29306.81')); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('Everything returns good values when VS is present with all components', () { @@ -404,8 +404,8 @@ void main() { expect(visualStudio.vcvarsPath, equals(vcvarsPath)); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); testUsingContext('Metadata is for compatible version when latest is missing components', () { @@ -437,8 +437,8 @@ void main() { expect(visualStudio.displayVersion, equals('15.9.12')); }, overrides: { FileSystem: () => memoryFilesystem, - Platform: () => windowsPlatform, ProcessManager: () => mockProcessManager, + Platform: () => windowsPlatform, }); }); } diff --git a/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart b/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart index 0a3023cf24..236b723fbc 100644 --- a/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart +++ b/packages/flutter_tools/test/general.shard/windows/windows_device_test.dart @@ -49,6 +49,7 @@ void main() { expect(WindowsDevice().isSupportedForProject(flutterProject), true); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('isSupportedForProject is false with no host app', () async { @@ -59,6 +60,7 @@ void main() { expect(WindowsDevice().isSupportedForProject(flutterProject), false); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); testUsingContext('executablePathForDevice uses the correct package executable', () async { @@ -75,6 +77,7 @@ void main() { expect(WindowsDevice().executablePathForDevice(mockApp, BuildMode.release), releasePath); }, overrides: { FileSystem: () => MemoryFileSystem(), + ProcessManager: () => FakeProcessManager([]), }); }); } diff --git a/packages/flutter_tools/test/src/common.dart b/packages/flutter_tools/test/src/common.dart index 64e0575af7..7741daf52d 100644 --- a/packages/flutter_tools/test/src/common.dart +++ b/packages/flutter_tools/test/src/common.dart @@ -42,7 +42,7 @@ String getFlutterRoot() { return platform.environment['FLUTTER_ROOT']; } - Error invalidScript() => StateError('Invalid script: ${platform.script}'); + Error invalidScript() => StateError('Could not determine flutter_tools/ path from script URL (${platform.script}); consider setting FLUTTER_ROOT explicitly.'); Uri scriptUri; switch (platform.script.scheme) { diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart index dda9eaa29e..fb2e21c566 100644 --- a/packages/flutter_tools/test/src/context.dart +++ b/packages/flutter_tools/test/src/context.dart @@ -30,9 +30,11 @@ import 'package:meta/meta.dart'; import 'package:mockito/mockito.dart'; import 'common.dart'; -import 'testbed.dart'; +import 'fake_process_manager.dart'; +import 'throwing_pub.dart'; export 'package:flutter_tools/src/base/context.dart' show Generator; +export 'fake_process_manager.dart' show ProcessManager, FakeProcessManager, FakeCommand; /// Return the test logger. This assumes that the current Logger is a BufferLogger. BufferLogger get testLogger => context.get(); @@ -52,6 +54,14 @@ void testUsingContext( String testOn, bool skip, // should default to `false`, but https://github.com/dart-lang/test/issues/545 doesn't allow this }) { + if (overrides[FileSystem] != null && overrides[ProcessManager] == null) { + throw StateError( + 'If you override the FileSystem context you must also provide a ProcessManager, ' + 'otherwise the processes you launch will not be dealing with the same file system ' + 'that you are dealing with in your test.' + ); + } + // Ensure we don't rely on the default [Config] constructor which will // leak a sticky $HOME/.flutter_settings behind! Directory configDir; diff --git a/packages/flutter_tools/test/src/fake_process_manager.dart b/packages/flutter_tools/test/src/fake_process_manager.dart new file mode 100644 index 0000000000..a0a2203ac7 --- /dev/null +++ b/packages/flutter_tools/test/src/fake_process_manager.dart @@ -0,0 +1,250 @@ +// Copyright 2016 The Chromium 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 'dart:convert'; +import 'dart:io' as io show ProcessSignal; + +import 'package:flutter_tools/src/base/io.dart'; +import 'package:meta/meta.dart'; +import 'package:process/process.dart'; + +export 'package:process/process.dart' show ProcessManager; + +/// A command for [FakeProcessManager]. +@immutable +class FakeCommand { + const FakeCommand({ + @required this.command, + this.workingDirectory, + this.environment, + this.duration = const Duration(), + @required this.exitCode, + @required this.stdout, + @required this.stderr, + }) : assert(command != null), + assert(duration != null), + assert(stdout != null), + assert(stderr != null); + + /// The exact commands that must be matched for this [FakeCommand] to be + /// selected from those given to the [FakeProcessManager]. + final List command; + + /// The exact working directory that must be matched for this [FakeCommand] to + /// be selected from those given to the [FakeProcessManager]. + /// + /// If this is null, then it matches any working directory. + final String workingDirectory; + + /// The environment that must be matched for this [FakeCommand] to be selected + /// from those given to the [FakeProcessManager]. + /// + /// If this is null, then it matches any environment. + /// + /// Otherwise, each key in this environment must be present and must have a + /// value that matches the one given here for the [FakeCommand] to match. + final Map environment; + + /// The time to allow to elapse before returning the [exitCode], if this command + /// is "executed". + /// + /// If you set this to a non-zero time, you should use a [FakeAsync] zone, + /// otherwise the test will be artificially slow. + final Duration duration; + + /// The process' exit code. + /// + /// To simulate a never-ending process, set [duration] to a value greated than + /// 15 minutes (the timeout for our tests). + /// + /// To simulate a crash, subtract the crash signal number from 256. For example, + /// SIGPIPE (-13) is 243. + final int exitCode; + + /// The output to simulate on stdout. This will be encoded as UTF-8 and + /// returned in one go. + final String stdout; + + /// The output to simulate on stderr. This will be encoded as UTF-8 and + /// returned in one go. + final String stderr; + + static bool _listEquals(List a, List b) { + if (a == null) { + return b == null; + } + if (b == null || a.length != b.length) { + return false; + } + for (int index = 0; index < a.length; index += 1) { + if (a[index] != b[index]) { + return false; + } + } + return true; + } + + bool _matches(List command, String workingDirectory, Map environment) { + if (!_listEquals(command, this.command)) { + return false; + } + if (this.workingDirectory != null && workingDirectory != this.workingDirectory) { + return false; + } + if (this.environment != null) { + if (environment == null) { + return false; + } + for (String key in environment.keys) { + if (environment[key] != this.environment[key]) { + return false; + } + } + } + return true; + } +} + +class _FakeProcess implements Process { + _FakeProcess( + this._exitCode, + Duration duration, + this.pid, + this._stderr, + this.stdin, + this._stdout, + ) : exitCode = Future.delayed(duration).then((void value) => _exitCode), + stderr = Stream>.value(utf8.encode(_stderr)), + stdout = Stream>.value(utf8.encode(_stdout)); + final int _exitCode; + + @override + final Future exitCode; + + @override + final int pid; + + final String _stderr; + + @override + final Stream> stderr; + + @override + final IOSink stdin; + + @override + final Stream> stdout; + + final String _stdout; + + @override + bool kill([io.ProcessSignal signal = io.ProcessSignal.sigterm]) { + assert(false, 'Process.kill() should not be used directly in flutter_tools.'); + return false; + } +} + +/// A fake [ProcessManager] which responds to particular commands with particular results. +/// +/// On creation, pass in a list of [FakeCommand] objects. When the [ProcessManager] methods +/// such as [start] are invoked, the first matching [FakeCommand] is found and its settings +/// are used to simulate the result of running that command. +/// +/// If no command is found, then one is implied which immediately returns exit +/// code 0 with no output. +class FakeProcessManager implements ProcessManager { + FakeProcessManager(this._commands); + + final List _commands; + + FakeCommand _findCommand(List command, String workingDirectory, Map environment) { + for (FakeCommand candidate in _commands) { + if (candidate._matches(command, workingDirectory, environment)) { + return candidate; + } + } + return FakeCommand( + command: command, + workingDirectory: workingDirectory, + environment: environment, + duration: const Duration(), + exitCode: 0, + stdout: '', + stderr: '', + ); + } + + int _pid = 9999; + + _FakeProcess _runCommand(List command, String workingDirectory, Map environment) { + _pid += 1; + final FakeCommand fakeCommand = _findCommand(command, workingDirectory, environment); + return _FakeProcess( + fakeCommand.exitCode, + fakeCommand.duration, + _pid, + fakeCommand.stdout, + null, // stdin + fakeCommand.stderr, + ); + } + + @override + Future start( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, // ignored + bool runInShell = false, // ignored + ProcessStartMode mode = ProcessStartMode.normal, // ignored + }) async => _runCommand(command, workingDirectory, environment); + + @override + Future run( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, // ignored + bool runInShell = false, // ignored + Encoding stdoutEncoding = systemEncoding, + Encoding stderrEncoding = systemEncoding, + }) async { + final _FakeProcess process = _runCommand(command, workingDirectory, environment); + await process.exitCode; + return ProcessResult( + process.pid, + process._exitCode, + stdoutEncoding == null ? process.stdout : await stdoutEncoding.decodeStream(process.stdout), + stderrEncoding == null ? process.stderr : await stderrEncoding.decodeStream(process.stderr), + ); + } + + @override + ProcessResult runSync( + List command, { + String workingDirectory, + Map environment, + bool includeParentEnvironment = true, // ignored + bool runInShell = false, // ignored + Encoding stdoutEncoding = systemEncoding, // actual encoder is ignored + Encoding stderrEncoding = systemEncoding, // actual encoder is ignored + }) { + final _FakeProcess process = _runCommand(command, workingDirectory, environment); + return ProcessResult( + process.pid, + process._exitCode, + stdoutEncoding == null ? utf8.encode(process._stdout) : process._stdout, + stderrEncoding == null ? utf8.encode(process._stderr) : process._stderr, + ); + } + + @override + bool canRun(dynamic executable, {String workingDirectory}) => true; + + @override + bool killPid(int pid, [io.ProcessSignal signal = io.ProcessSignal.sigterm]) { + assert(false, 'ProcessManager.killPid() should not be used directly in flutter_tools.'); + return false; + } +} diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart index 37acf093a6..e091318363 100644 --- a/packages/flutter_tools/test/src/testbed.dart +++ b/packages/flutter_tools/test/src/testbed.dart @@ -22,8 +22,11 @@ import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; import 'package:flutter_tools/src/version.dart'; +import 'package:process/process.dart'; import 'context.dart'; +import 'fake_process_manager.dart'; +import 'throwing_pub.dart'; export 'package:flutter_tools/src/base/context.dart' show Generator; @@ -32,6 +35,7 @@ export 'package:flutter_tools/src/base/context.dart' show Generator; final Map _testbedDefaults = { // Keeps tests fast by avoiding the actual file system. FileSystem: () => MemoryFileSystem(style: platform.isWindows ? FileSystemStyle.windows : FileSystemStyle.posix), + ProcessManager: () => FakeProcessManager([]), Logger: () => BufferLogger(), // Allows reading logs and prevents stdout. OperatingSystemUtils: () => FakeOperatingSystemUtils(), OutputPreferences: () => OutputPreferences.test(), // configures BufferLogger to avoid color codes. @@ -730,35 +734,3 @@ class TestFeatureFlags implements FeatureFlags { return false; } } - -class ThrowingPub implements Pub { - @override - Future batch(List arguments, { - PubContext context, - String directory, - MessageFilter filter, - String failureMessage = 'pub failed', - bool retry, - bool showTraceForErrors, - }) { - throw UnsupportedError('Attempted to inovke pub during test.'); - } - - @override - Future get({ - PubContext context, - String directory, - bool skipIfAbsent = false, - bool upgrade = false, - bool offline = false, - bool checkLastModified = true, - bool skipPubspecYamlCheck = false, - }) { - throw UnsupportedError('Attempted to inovke pub during test.'); - } - - @override - Future interactively(List arguments, {String directory}) { - throw UnsupportedError('Attempted to inovke pub during test.'); - } -} diff --git a/packages/flutter_tools/test/src/throwing_pub.dart b/packages/flutter_tools/test/src/throwing_pub.dart new file mode 100644 index 0000000000..abe300ed3c --- /dev/null +++ b/packages/flutter_tools/test/src/throwing_pub.dart @@ -0,0 +1,39 @@ +// Copyright 2019 The Chromium 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 'dart:async'; + +import 'package:flutter_tools/src/dart/pub.dart'; + +class ThrowingPub implements Pub { + @override + Future batch(List arguments, { + PubContext context, + String directory, + MessageFilter filter, + String failureMessage = 'pub failed', + bool retry, + bool showTraceForErrors, + }) { + throw UnsupportedError('Attempted to inovke pub during test.'); + } + + @override + Future get({ + PubContext context, + String directory, + bool skipIfAbsent = false, + bool upgrade = false, + bool offline = false, + bool checkLastModified = true, + bool skipPubspecYamlCheck = false, + }) { + throw UnsupportedError('Attempted to inovke pub during test.'); + } + + @override + Future interactively(List arguments, {String directory}) { + throw UnsupportedError('Attempted to inovke pub during test.'); + } +}