diff --git a/packages/flutter_tools/lib/executable.dart b/packages/flutter_tools/lib/executable.dart index a2807a22fa..bdd4a306ed 100644 --- a/packages/flutter_tools/lib/executable.dart +++ b/packages/flutter_tools/lib/executable.dart @@ -165,7 +165,14 @@ List generateCommands({ processInfo: globals.processInfo, fileSystem: globals.fs, ), - BuildCommand(verboseHelp: verboseHelp), + BuildCommand( + fileSystem: globals.fs, + buildSystem: globals.buildSystem, + osUtils: globals.os, + verboseHelp: verboseHelp, + androidSdk: globals.androidSdk, + logger: globals.logger, + ), ChannelCommand(verboseHelp: verboseHelp), CleanCommand(verbose: verbose), ConfigCommand(verboseHelp: verboseHelp), diff --git a/packages/flutter_tools/lib/src/commands/build.dart b/packages/flutter_tools/lib/src/commands/build.dart index e0fe313a1d..8ecd83bb21 100644 --- a/packages/flutter_tools/lib/src/commands/build.dart +++ b/packages/flutter_tools/lib/src/commands/build.dart @@ -4,11 +4,15 @@ import 'package:meta/meta.dart'; +import '../android/android_sdk.dart'; +import '../base/file_system.dart'; +import '../base/logger.dart'; +import '../base/os.dart'; import '../build_info.dart'; +import '../build_system/build_system.dart'; import '../commands/build_linux.dart'; import '../commands/build_macos.dart'; import '../commands/build_windows.dart'; -import '../globals.dart' as globals; import '../runner/flutter_command.dart'; import 'build_aar.dart'; import 'build_apk.dart'; @@ -20,28 +24,49 @@ import 'build_macos_framework.dart'; import 'build_web.dart'; class BuildCommand extends FlutterCommand { - BuildCommand({ bool verboseHelp = false }) { - _addSubcommand(BuildAarCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildApkCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildAppBundleCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildIOSCommand(verboseHelp: verboseHelp)); + BuildCommand({ + required FileSystem fileSystem, + required BuildSystem buildSystem, + required OperatingSystemUtils osUtils, + required Logger logger, + required AndroidSdk? androidSdk, + bool verboseHelp = false, + }){ + _addSubcommand( + BuildAarCommand( + fileSystem: fileSystem, + androidSdk: androidSdk, + logger: logger, + verboseHelp: verboseHelp, + ) + ); + _addSubcommand(BuildApkCommand(logger: logger, verboseHelp: verboseHelp)); + _addSubcommand(BuildAppBundleCommand(logger: logger, verboseHelp: verboseHelp)); + _addSubcommand(BuildIOSCommand(logger: logger, verboseHelp: verboseHelp)); _addSubcommand(BuildIOSFrameworkCommand( - buildSystem: globals.buildSystem, + logger: logger, + buildSystem: buildSystem, verboseHelp: verboseHelp, )); _addSubcommand(BuildMacOSFrameworkCommand( - buildSystem: globals.buildSystem, + logger: logger, + buildSystem: buildSystem, verboseHelp: verboseHelp, )); - _addSubcommand(BuildIOSArchiveCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildBundleCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildWebCommand(verboseHelp: verboseHelp)); - _addSubcommand(BuildMacosCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildIOSArchiveCommand(logger: logger, verboseHelp: verboseHelp)); + _addSubcommand(BuildBundleCommand(logger: logger, verboseHelp: verboseHelp)); + _addSubcommand(BuildWebCommand( + fileSystem: fileSystem, + logger: logger, + verboseHelp: verboseHelp, + )); + _addSubcommand(BuildMacosCommand(logger: logger, verboseHelp: verboseHelp)); _addSubcommand(BuildLinuxCommand( - operatingSystemUtils: globals.os, + logger: logger, + operatingSystemUtils: osUtils, verboseHelp: verboseHelp )); - _addSubcommand(BuildWindowsCommand(verboseHelp: verboseHelp)); + _addSubcommand(BuildWindowsCommand(logger: logger, verboseHelp: verboseHelp)); } void _addSubcommand(BuildSubCommand command) { @@ -64,11 +89,16 @@ class BuildCommand extends FlutterCommand { } abstract class BuildSubCommand extends FlutterCommand { - BuildSubCommand({required bool verboseHelp}) { + BuildSubCommand({ + required Logger logger, + required bool verboseHelp + }): _logger = logger { requiresPubspecYaml(); usesFatalWarningsOption(verboseHelp: verboseHelp); } + final Logger _logger; + @override bool get reportNullSafety => true; @@ -80,21 +110,21 @@ abstract class BuildSubCommand extends FlutterCommand { /// This is similar to the run message in run_hot.dart @protected void displayNullSafetyMode(BuildInfo buildInfo) { - globals.printStatus(''); + _logger.printStatus(''); if (buildInfo.nullSafetyMode == NullSafetyMode.sound) { - globals.printStatus( + _logger.printStatus( '💪 Building with sound null safety 💪', emphasis: true, ); } else { - globals.printStatus( + _logger.printStatus( 'Building without sound null safety ⚠️', emphasis: true, ); - globals.printStatus( + _logger.printStatus( 'Dart 3 will only support sound null safety, see https://dart.dev/null-safety', ); } - globals.printStatus(''); + _logger.printStatus(''); } } diff --git a/packages/flutter_tools/lib/src/commands/build_aar.dart b/packages/flutter_tools/lib/src/commands/build_aar.dart index a5b978ad02..70024e6956 100644 --- a/packages/flutter_tools/lib/src/commands/build_aar.dart +++ b/packages/flutter_tools/lib/src/commands/build_aar.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import '../android/android_builder.dart'; +import '../android/android_sdk.dart'; import '../android/gradle_utils.dart'; import '../base/common.dart'; @@ -10,14 +11,20 @@ import '../base/file_system.dart'; import '../base/os.dart'; import '../build_info.dart'; import '../cache.dart'; -import '../globals.dart' as globals; import '../project.dart'; import '../reporting/reporting.dart'; import '../runner/flutter_command.dart' show FlutterCommandResult; import 'build.dart'; class BuildAarCommand extends BuildSubCommand { - BuildAarCommand({ required bool verboseHelp }) : super(verboseHelp: verboseHelp) { + BuildAarCommand({ + required super.logger, + required AndroidSdk? androidSdk, + required FileSystem fileSystem, + required bool verboseHelp, + }): _androidSdk = androidSdk, + _fileSystem = fileSystem, + super(verboseHelp: verboseHelp) { argParser ..addFlag( 'debug', @@ -55,6 +62,8 @@ class BuildAarCommand extends BuildSubCommand { help: 'The target platform for which the project is compiled.', ); } + final AndroidSdk? _androidSdk; + final FileSystem _fileSystem; @override final String name = 'aar'; @@ -100,7 +109,7 @@ class BuildAarCommand extends BuildSubCommand { @override Future runCommand() async { - if (globals.androidSdk == null) { + if (_androidSdk == null) { exitWithNoSdkMessage(); } final Set androidBuildInfo = {}; @@ -115,7 +124,7 @@ class BuildAarCommand extends BuildSubCommand { ? buildNumberArg : '1.0'; - final File targetFile = globals.fs.file(globals.fs.path.join('lib', 'main.dart')); + final File targetFile = _fileSystem.file(_fileSystem.path.join('lib', 'main.dart')); for (final String buildMode in const ['debug', 'profile', 'release']) { if (boolArgDeprecated(buildMode)) { androidBuildInfo.add( @@ -151,10 +160,10 @@ class BuildAarCommand extends BuildSubCommand { if (remainingArguments.isEmpty) { return FlutterProject.current(); } - final File mainFile = globals.fs.file(remainingArguments.first); + final File mainFile = _fileSystem.file(remainingArguments.first); final String path; if (!mainFile.existsSync()) { - final Directory pathProject = globals.fs.directory(remainingArguments.first); + final Directory pathProject = _fileSystem.directory(remainingArguments.first); if (!pathProject.existsSync()) { throwToolExit('${remainingArguments.first} does not exist'); } @@ -162,10 +171,10 @@ class BuildAarCommand extends BuildSubCommand { } else { path = mainFile.parent.path; } - final String? projectRoot = findProjectRoot(globals.fs, path); + final String? projectRoot = findProjectRoot(_fileSystem, path); if (projectRoot == null) { throwToolExit('${mainFile.parent.path} is not a valid flutter project'); } - return FlutterProject.fromDirectory(globals.fs.directory(projectRoot)); + return FlutterProject.fromDirectory(_fileSystem.directory(projectRoot)); } } diff --git a/packages/flutter_tools/lib/src/commands/build_apk.dart b/packages/flutter_tools/lib/src/commands/build_apk.dart index 8e56d2151a..946d790485 100644 --- a/packages/flutter_tools/lib/src/commands/build_apk.dart +++ b/packages/flutter_tools/lib/src/commands/build_apk.dart @@ -14,7 +14,9 @@ import '../runner/flutter_command.dart' show FlutterCommandResult; import 'build.dart'; class BuildApkCommand extends BuildSubCommand { - BuildApkCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp) { + BuildApkCommand({ + required super.logger, bool verboseHelp = false + }) : super(verboseHelp: verboseHelp) { addTreeShakeIconsFlag(); usesTargetOption(); addBuildModeFlags(verboseHelp: verboseHelp); diff --git a/packages/flutter_tools/lib/src/commands/build_appbundle.dart b/packages/flutter_tools/lib/src/commands/build_appbundle.dart index 3eedb86788..d40d3da9ba 100644 --- a/packages/flutter_tools/lib/src/commands/build_appbundle.dart +++ b/packages/flutter_tools/lib/src/commands/build_appbundle.dart @@ -18,6 +18,7 @@ import 'build.dart'; class BuildAppBundleCommand extends BuildSubCommand { BuildAppBundleCommand({ + required super.logger, bool verboseHelp = false, }) : super(verboseHelp: verboseHelp) { addTreeShakeIconsFlag(); diff --git a/packages/flutter_tools/lib/src/commands/build_bundle.dart b/packages/flutter_tools/lib/src/commands/build_bundle.dart index 1e1f66b309..9cd3413c0b 100644 --- a/packages/flutter_tools/lib/src/commands/build_bundle.dart +++ b/packages/flutter_tools/lib/src/commands/build_bundle.dart @@ -15,6 +15,7 @@ import 'build.dart'; class BuildBundleCommand extends BuildSubCommand { BuildBundleCommand({ + required super.logger, bool verboseHelp = false, BundleBuilder? bundleBuilder, }) : _bundleBuilder = bundleBuilder ?? BundleBuilder(), super(verboseHelp: verboseHelp) { diff --git a/packages/flutter_tools/lib/src/commands/build_ios.dart b/packages/flutter_tools/lib/src/commands/build_ios.dart index c506fc69b3..9c224d9066 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios.dart @@ -22,7 +22,7 @@ import 'build.dart'; /// Builds an .app for an iOS app to be used for local testing on an iOS device /// or simulator. Can only be run on a macOS host. class BuildIOSCommand extends _BuildIOSSubCommand { - BuildIOSCommand({ required super.verboseHelp }) { + BuildIOSCommand({ required super.logger, required super.verboseHelp }) { argParser ..addFlag('config-only', help: 'Update the project configuration without performing a build. ' @@ -59,7 +59,7 @@ class BuildIOSCommand extends _BuildIOSSubCommand { /// /// Can only be run on a macOS host. class BuildIOSArchiveCommand extends _BuildIOSSubCommand { - BuildIOSArchiveCommand({required super.verboseHelp}) { + BuildIOSArchiveCommand({required super.logger, required super.verboseHelp}) { argParser.addOption( 'export-method', defaultsTo: 'app-store', @@ -293,6 +293,7 @@ class BuildIOSArchiveCommand extends _BuildIOSSubCommand { abstract class _BuildIOSSubCommand extends BuildSubCommand { _BuildIOSSubCommand({ + required super.logger, required bool verboseHelp }) : super(verboseHelp: verboseHelp) { addTreeShakeIconsFlag(); diff --git a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart index 321ef186e6..64fa210590 100644 --- a/packages/flutter_tools/lib/src/commands/build_ios_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_ios_framework.dart @@ -33,6 +33,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand { required bool verboseHelp, Cache? cache, Platform? platform, + required super.logger, }) : _injectedFlutterVersion = flutterVersion, _buildSystem = buildSystem, _injectedCache = cache, @@ -176,6 +177,7 @@ abstract class BuildFrameworkCommand extends BuildSubCommand { /// managers. class BuildIOSFrameworkCommand extends BuildFrameworkCommand { BuildIOSFrameworkCommand({ + required super.logger, super.flutterVersion, required super.buildSystem, required bool verboseHelp, diff --git a/packages/flutter_tools/lib/src/commands/build_linux.dart b/packages/flutter_tools/lib/src/commands/build_linux.dart index 9955a81f6b..8f13601eb4 100644 --- a/packages/flutter_tools/lib/src/commands/build_linux.dart +++ b/packages/flutter_tools/lib/src/commands/build_linux.dart @@ -17,6 +17,7 @@ import 'build.dart'; /// A command to build a linux desktop target through a build shell script. class BuildLinuxCommand extends BuildSubCommand { BuildLinuxCommand({ + required super.logger, required OperatingSystemUtils operatingSystemUtils, bool verboseHelp = false, }) : _operatingSystemUtils = operatingSystemUtils, diff --git a/packages/flutter_tools/lib/src/commands/build_macos.dart b/packages/flutter_tools/lib/src/commands/build_macos.dart index 7150d6605f..ec004840ca 100644 --- a/packages/flutter_tools/lib/src/commands/build_macos.dart +++ b/packages/flutter_tools/lib/src/commands/build_macos.dart @@ -16,6 +16,7 @@ import 'build.dart'; /// A command to build a macOS desktop target through a build shell script. class BuildMacosCommand extends BuildSubCommand { BuildMacosCommand({ + required super.logger, required bool verboseHelp, }) : super(verboseHelp: verboseHelp) { addCommonDesktopBuildOptions(verboseHelp: verboseHelp); diff --git a/packages/flutter_tools/lib/src/commands/build_macos_framework.dart b/packages/flutter_tools/lib/src/commands/build_macos_framework.dart index 036af97259..fce9021e68 100644 --- a/packages/flutter_tools/lib/src/commands/build_macos_framework.dart +++ b/packages/flutter_tools/lib/src/commands/build_macos_framework.dart @@ -29,6 +29,7 @@ class BuildMacOSFrameworkCommand extends BuildFrameworkCommand { super.flutterVersion, required super.buildSystem, required super.verboseHelp, + required super.logger, super.cache, super.platform, }); diff --git a/packages/flutter_tools/lib/src/commands/build_web.dart b/packages/flutter_tools/lib/src/commands/build_web.dart index 1f0893cdfe..1c5ad38da7 100644 --- a/packages/flutter_tools/lib/src/commands/build_web.dart +++ b/packages/flutter_tools/lib/src/commands/build_web.dart @@ -3,10 +3,10 @@ // found in the LICENSE file. import '../base/common.dart'; +import '../base/file_system.dart'; import '../build_info.dart'; import '../build_system/targets/web.dart'; import '../features.dart'; -import '../globals.dart' as globals; import '../project.dart'; import '../runner/flutter_command.dart' show DevelopmentArtifact, FlutterCommandResult; @@ -15,8 +15,10 @@ import 'build.dart'; class BuildWebCommand extends BuildSubCommand { BuildWebCommand({ + required super.logger, + required FileSystem fileSystem, required bool verboseHelp, - }) : super(verboseHelp: verboseHelp) { + }) : _fileSystem = fileSystem, super(verboseHelp: verboseHelp) { addTreeShakeIconsFlag(enabledByDefault: false); usesTargetOption(); usesOutputDir(); @@ -70,6 +72,8 @@ class BuildWebCommand extends BuildSubCommand { ); } + final FileSystem _fileSystem; + @override Future> get requiredArtifacts async => const { @@ -103,7 +107,7 @@ class BuildWebCommand extends BuildSubCommand { if (!flutterProject.web.existsSync()) { throwToolExit('Missing index.html.'); } - if (!globals.fs.currentDirectory + if (!_fileSystem.currentDirectory .childDirectory('web') .childFile('index.html') .readAsStringSync() diff --git a/packages/flutter_tools/lib/src/commands/build_windows.dart b/packages/flutter_tools/lib/src/commands/build_windows.dart index b42c97676a..0c94f53afd 100644 --- a/packages/flutter_tools/lib/src/commands/build_windows.dart +++ b/packages/flutter_tools/lib/src/commands/build_windows.dart @@ -19,6 +19,7 @@ import 'build.dart'; /// A command to build a windows desktop target through a build shell script. class BuildWindowsCommand extends BuildSubCommand { BuildWindowsCommand({ + required super.logger, bool verboseHelp = false, }) : super(verboseHelp: verboseHelp) { addCommonDesktopBuildOptions(verboseHelp: verboseHelp); diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart index 9710fb968e..fc68cf7831 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_darwin_framework_test.dart @@ -4,6 +4,7 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; @@ -66,6 +67,7 @@ void main() { final FakeFlutterVersion fakeFlutterVersion = FakeFlutterVersion(frameworkVersion: frameworkVersion); final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -95,6 +97,7 @@ void main() { ); final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -121,6 +124,7 @@ void main() { ); final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -162,6 +166,7 @@ void main() { ); final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -196,6 +201,7 @@ void main() { testUsingContext('contains license and version', () async { final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -216,6 +222,7 @@ void main() { testUsingContext('debug URL', () async { final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -234,6 +241,7 @@ void main() { testUsingContext('profile URL', () async { final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -252,6 +260,7 @@ void main() { testUsingContext('release URL', () async { final BuildIOSFrameworkCommand command = BuildIOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -295,6 +304,7 @@ void main() { final FakeFlutterVersion fakeFlutterVersion = FakeFlutterVersion(frameworkVersion: frameworkVersion); final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -324,6 +334,7 @@ void main() { ); final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -350,6 +361,7 @@ void main() { ); final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -391,6 +403,7 @@ void main() { ); final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -425,6 +438,7 @@ void main() { testUsingContext('contains license and version', () async { final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -445,6 +459,7 @@ void main() { testUsingContext('debug URL', () async { final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -463,6 +478,7 @@ void main() { testUsingContext('profile URL', () async { final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, @@ -481,6 +497,7 @@ void main() { testUsingContext('release URL', () async { final BuildMacOSFrameworkCommand command = BuildMacOSFrameworkCommand( + logger: BufferLogger.test(), buildSystem: TestBuildSystem.all(BuildResult(success: true)), platform: fakePlatform, flutterVersion: fakeFlutterVersion, diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart index 57957c8ca2..2c86997596 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ios_test.dart @@ -4,19 +4,25 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; +import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build_ios.dart'; import 'package:flutter_tools/src/ios/code_signing.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/reporting/reporting.dart'; +import 'package:test/fake.dart'; import '../../general.shard/ios/xcresult_test_data.dart'; import '../../src/common.dart'; import '../../src/context.dart'; +import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; class FakeXcodeProjectInterpreterWithBuildSettings extends FakeXcodeProjectInterpreter { @@ -176,7 +182,13 @@ void main() { } testUsingContext('ios build fails when there is no ios project', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createCoreMockProjectFiles(); expect(createTestCommandRunner(command).run( @@ -190,7 +202,13 @@ void main() { }); testUsingContext('ios build fails in debug with code analysis', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createCoreMockProjectFiles(); expect(createTestCommandRunner(command).run( @@ -204,13 +222,19 @@ void main() { }); testUsingContext('ios build fails on non-macOS platform', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fileSystem.file('pubspec.yaml').createSync(); fileSystem.file('.packages').createSync(); fileSystem.file(fileSystem.path.join('lib', 'main.dart')) .createSync(recursive: true); - final bool supported = BuildIOSCommand(verboseHelp: false).supported; + final bool supported = BuildIOSCommand(logger: BufferLogger.test(), verboseHelp: false).supported; expect(createTestCommandRunner(command).run( const ['build', 'ios', '--no-pub'] ), supported ? throwsToolExit() : throwsA(isA())); @@ -222,7 +246,13 @@ void main() { }); testUsingContext('ios build invokes xcode build', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -243,7 +273,13 @@ void main() { }); testUsingContext('ios build invokes xcode build with device ID', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -264,7 +300,13 @@ void main() { }); testUsingContext('ios simulator build invokes xcode build', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -284,7 +326,13 @@ void main() { }); testUsingContext('ios build invokes xcode build with verbosity', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -304,7 +352,13 @@ void main() { }); testUsingContext('Performs code size analysis and sends analytics', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -348,7 +402,13 @@ void main() { }); group('xcresults device', () { testUsingContext('Trace error if xcresult is empty.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -373,7 +433,13 @@ void main() { }); testUsingContext('Display xcresult issues on console if parsed, suppress Xcode output', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -402,7 +468,13 @@ void main() { }); testUsingContext('Do not display xcresult issues that needs to be discarded.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -430,7 +502,13 @@ void main() { }); testUsingContext('Trace if xcresult bundle does not exist.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -453,7 +531,13 @@ void main() { }); testUsingContext('Extra error message for provision profile issue in xcresult bundle.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -482,7 +566,13 @@ void main() { }); testUsingContext('Default bundle identifier error should be hidden if there is another xcresult issue.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -510,7 +600,13 @@ void main() { }); testUsingContext('Show default bundle identifier error if there are no other errors.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -537,7 +633,13 @@ void main() { testUsingContext('Display xcresult issues with no provisioning profile.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -566,7 +668,13 @@ void main() { }); testUsingContext('Failed to parse xcresult but display missing provisioning profile issue from stdout.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -597,7 +705,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('Failed to parse xcresult but detected no development team issue.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -625,7 +739,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('xcresult did not detect issue but detected by stdout.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -657,7 +777,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('xcresult did not detect issue, no development team is detected from build setting.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -685,7 +811,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('No development team issue error message is not displayed if no provisioning profile issue is detected from xcresult first.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -714,7 +846,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('General provisioning profile issue error message is not displayed if no development team issue is detected first.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -745,7 +883,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig group('xcresults simulator', () { testUsingContext('Trace error if xcresult is empty.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -774,7 +918,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('Display xcresult issues on console if parsed.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -804,7 +954,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('Do not display xcresult issues that needs to be discarded.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -836,7 +992,13 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }); testUsingContext('Trace if xcresult bundle does not exist.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); @@ -864,3 +1026,21 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig } const String _xcBundleFilePath = '/.tmp_rand0/flutter_ios_build_temp_dirrand0/temporary_xcresult_bundle'; + +class FakeAndroidSdk extends Fake implements AndroidSdk { + @override + late bool platformToolsAvailable; + + @override + late bool licensesAvailable; + + @override + AndroidSdkVersion? latestVersion; +} + +class FakeOperatingSystemUtils extends Fake implements OperatingSystemUtils { + FakeOperatingSystemUtils({this.hostPlatform = HostPlatform.linux_x64}); + + @override + HostPlatform hostPlatform = HostPlatform.linux_x64; +} diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart index 32d022fc1f..766bfbf788 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_ipa_test.dart @@ -5,7 +5,9 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build_ios.dart'; @@ -18,6 +20,8 @@ import '../../general.shard/ios/xcresult_test_data.dart'; import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fake_process_manager.dart'; +import '../../src/fakes.dart'; +import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; class FakeXcodeProjectInterpreterWithBuildSettings extends FakeXcodeProjectInterpreter { @@ -172,7 +176,13 @@ void main() { } testUsingContext('ipa build fails when there is no ios project', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createCoreMockProjectFiles(); expect(createTestCommandRunner(command).run( @@ -186,7 +196,13 @@ void main() { }); testUsingContext('ipa build fails in debug with code analysis', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createCoreMockProjectFiles(); expect(createTestCommandRunner(command).run( @@ -200,13 +216,19 @@ void main() { }); testUsingContext('ipa build fails on non-macOS platform', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fileSystem.file('pubspec.yaml').createSync(); fileSystem.file('.packages').createSync(); fileSystem.file(fileSystem.path.join('lib', 'main.dart')) .createSync(recursive: true); - final bool supported = BuildIOSArchiveCommand(verboseHelp: false).supported; + final bool supported = BuildIOSArchiveCommand(logger: BufferLogger.test(), verboseHelp: false).supported; expect(createTestCommandRunner(command).run( const ['build', 'ipa', '--no-pub'] ), supported ? throwsToolExit() : throwsA(isA())); @@ -219,7 +241,13 @@ void main() { testUsingContext('ipa build fails when export plist does not exist', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await expectToolExitLater( @@ -242,7 +270,13 @@ void main() { testUsingContext('ipa build fails when export plist is not a file', () async { final Directory bogus = fileSystem.directory('bogus')..createSync(); - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await expectToolExitLater( @@ -263,7 +297,13 @@ void main() { }); testUsingContext('ipa build fails when --export-options-plist and --export-method are used together', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await expectToolExitLater( @@ -286,7 +326,13 @@ void main() { }); testUsingContext('ipa build reports when IPA fails', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(), @@ -328,7 +374,13 @@ void main() { testUsingContext('ipa build invokes xcodebuild and archives for app store', () async { final File cachedExportOptionsPlist = fileSystem.file('/CachedExportOptions.plist'); - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(), @@ -371,7 +423,13 @@ void main() { testUsingContext('ipa build invokes xcodebuild and archives for ad-hoc distribution', () async { final File cachedExportOptionsPlist = fileSystem.file('/CachedExportOptions.plist'); - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(), @@ -414,7 +472,13 @@ void main() { testUsingContext('ipa build invokes xcodebuild and archives for enterprise distribution', () async { final File cachedExportOptionsPlist = fileSystem.file('/CachedExportOptions.plist'); - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(), @@ -456,7 +520,13 @@ void main() { }); testUsingContext('ipa build invokes xcode build with verbosity', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(verbose: true), @@ -476,7 +546,13 @@ void main() { }); testUsingContext('ipa build --no-codesign skips codesigning and IPA creation', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, const FakeCommand( @@ -519,7 +595,13 @@ void main() { }); testUsingContext('code size analysis fails when app not found', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await expectToolExitLater( @@ -536,7 +618,13 @@ void main() { }); testUsingContext('Performs code size analysis and sends analytics', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); fileSystem.file('build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Frameworks/App.framework/App') @@ -587,7 +675,13 @@ void main() { fileSystem.path.absolute(fileSystem.path.join('build', 'ios', 'ipa')); final File exportOptions = fileSystem.file('ExportOptions.plist') ..createSync(); - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(), @@ -615,7 +709,13 @@ void main() { }); testUsingContext('Trace error if xcresult is empty.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: () { @@ -640,7 +740,13 @@ void main() { }); testUsingContext('Display xcresult issues on console if parsed.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: () { @@ -666,7 +772,13 @@ void main() { }); testUsingContext('Do not display xcresult issues that needs to be discarded.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: () { @@ -694,7 +806,13 @@ void main() { }); testUsingContext('Trace if xcresult bundle does not exist.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(exitCode: 1), @@ -717,7 +835,13 @@ void main() { testUsingContext('Extra error message for provision profile issue in xcresulb bundle.', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fakeProcessManager.addCommands([ xattrCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: () { @@ -763,7 +887,13 @@ void main() { 'CFBundleIdentifier': 'io.flutter.someProject', }; - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); await createTestCommandRunner(command).run( ['build', 'ipa', '--no-pub']); @@ -811,7 +941,13 @@ void main() { 'CFBundleShortVersionString': '12.34.56', }; - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); await createTestCommandRunner(command).run( ['build', 'ipa', '--no-pub']); 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 363dfcdf36..5c3eaee732 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 @@ -6,9 +6,11 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/utils.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/cmake.dart'; import 'package:flutter_tools/src/commands/build.dart'; @@ -21,6 +23,7 @@ import 'package:test/fake.dart'; import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fakes.dart'; +import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; const String _kTestFlutterRoot = '/flutter'; @@ -106,7 +109,13 @@ void main() { } testUsingContext('Linux build fails when there is no linux project', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockCoreProjectFiles(); expect(createTestCommandRunner(command).run( @@ -122,7 +131,13 @@ void main() { }); testUsingContext('Linux build fails on non-linux platform', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); expect(createTestCommandRunner(command).run( @@ -136,7 +151,13 @@ void main() { }); testUsingContext('Linux build fails when feature is disabled', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); expect(createTestCommandRunner(command).run( @@ -150,7 +171,13 @@ void main() { }); testUsingContext('Linux build invokes CMake and ninja, and writes temporary files', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); processManager = FakeProcessManager.list([ cmakeCommand('release'), ninjaCommand('release'), @@ -171,7 +198,13 @@ void main() { }); testUsingContext('Handles missing cmake', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.empty() ..excludedExecutables.add('cmake'); @@ -188,7 +221,13 @@ void main() { }); testUsingContext('Handles argument error from missing ninja', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('release'), @@ -209,7 +248,13 @@ void main() { }); testUsingContext('Linux build does not spew stdout to status logger', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('debug'), @@ -234,7 +279,13 @@ void main() { }); testUsingContext('Linux build extracts errors from stdout', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); // This contains a mix of routine build output and various types of errors @@ -288,7 +339,13 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg }); testUsingContext('Linux verbose build sets VERBOSE_SCRIPT_LOGGING', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('debug'), @@ -316,7 +373,13 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg }); testUsingContext('Linux on x64 build --debug passes debug mode to cmake and ninja', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('debug'), @@ -335,7 +398,13 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg }); testUsingContext('Linux on ARM64 build --debug passes debug mode to cmake and ninja', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('debug', target: 'arm64'), @@ -350,11 +419,16 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg ProcessManager: () => processManager, Platform: () => linuxPlatform, FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), - OperatingSystemUtils: () => CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), }); testUsingContext('Linux on x64 build --profile passes profile mode to make', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('profile'), @@ -373,7 +447,13 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg }); testUsingContext('Linux on ARM64 build --profile passes profile mode to make', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('profile', target: 'arm64'), @@ -388,11 +468,16 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg ProcessManager: () => processManager, Platform: () => linuxPlatform, FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), - OperatingSystemUtils: () => CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), }); testUsingContext('Not support Linux cross-build for x64 on arm64', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), + ); expect(createTestCommandRunner(command).run( const ['build', 'linux', '--no-pub', '--target-platform=linux-x64'] @@ -400,11 +485,16 @@ ERROR: No file or variants found for asset: images/a_dot_burr.jpeg }, overrides: { Platform: () => linuxPlatform, FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), - OperatingSystemUtils: () => CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), }); testUsingContext('Linux build configures CMake exports', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('release'), @@ -491,7 +581,13 @@ set(BINARY_NAME "fizz_bar") }); testUsingContext('Refuses to build for Linux when feature is disabled', () { - final CommandRunner runner = createTestCommandRunner(BuildCommand()); + final CommandRunner runner = createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )); expect(() => runner.run(['build', 'linux', '--no-pub']), throwsToolExit()); @@ -500,21 +596,27 @@ set(BINARY_NAME "fizz_bar") }); testUsingContext('hidden when not enabled on Linux host', () { - expect(BuildLinuxCommand(operatingSystemUtils: FakeOperatingSystemUtils()).hidden, true); + expect(BuildLinuxCommand(logger: BufferLogger.test(), operatingSystemUtils: FakeOperatingSystemUtils()).hidden, true); }, overrides: { FeatureFlags: () => TestFeatureFlags(), Platform: () => notLinuxPlatform, }); testUsingContext('Not hidden when enabled and on Linux host', () { - expect(BuildLinuxCommand(operatingSystemUtils: FakeOperatingSystemUtils()).hidden, false); + expect(BuildLinuxCommand(logger: BufferLogger.test(), operatingSystemUtils: FakeOperatingSystemUtils()).hidden, false); }, overrides: { FeatureFlags: () => TestFeatureFlags(isLinuxEnabled: true), Platform: () => linuxPlatform, }); testUsingContext('Performs code size analysis and sends analytics', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('release'), @@ -559,7 +661,13 @@ set(BINARY_NAME "fizz_bar") }); testUsingContext('Linux on ARM64 build --release passes, and check if the LinuxBuildDirectory for arm64 can be referenced correctly by using analytics', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: CustomFakeOperatingSystemUtils(hostPlatform: HostPlatform.linux_arm64), + ); setUpMockProjectFilesForBuild(); processManager = FakeProcessManager.list([ cmakeCommand('release', target: 'arm64'), 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 291f820d46..4db438acd2 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 @@ -11,6 +11,7 @@ import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/build_macos.dart'; @@ -23,6 +24,7 @@ import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fake_process_manager.dart'; import '../../src/fakes.dart'; +import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; class FakeXcodeProjectInterpreterWithProfile extends FakeXcodeProjectInterpreter { @@ -136,7 +138,13 @@ STDERR STUFF } testUsingContext('macOS build fails when there is no macos project', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createCoreMockProjectFiles(); expect(createTestCommandRunner(command).run( @@ -152,7 +160,13 @@ STDERR STUFF }); testUsingContext('macOS build fails on non-macOS platform', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fileSystem.file('pubspec.yaml').createSync(); fileSystem.file(fileSystem.path.join('lib', 'main.dart')) .createSync(recursive: true); @@ -168,7 +182,13 @@ STDERR STUFF }); testUsingContext('macOS build fails when feature is disabled', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); fileSystem.file('pubspec.yaml').createSync(); fileSystem.file(fileSystem.path.join('lib', 'main.dart')) .createSync(recursive: true); @@ -184,7 +204,13 @@ STDERR STUFF }); testUsingContext('macOS build forwards error stdout to status logger error', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -208,7 +234,13 @@ STDERR STUFF }); testUsingContext('macOS build invokes xcode build (debug)', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -224,7 +256,13 @@ STDERR STUFF }); testUsingContext('macOS build invokes xcode build (debug) with verbosity', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -241,7 +279,13 @@ STDERR STUFF testUsingContext('macOS build invokes xcode build (profile)', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -258,7 +302,13 @@ STDERR STUFF }); testUsingContext('macOS build invokes xcode build (release)', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -274,7 +324,13 @@ STDERR STUFF }); testUsingContext('macOS build supports standard desktop build options', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); fileSystem.file('lib/other.dart') .createSync(recursive: true); @@ -359,7 +415,13 @@ STDERR STUFF ), ]); - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); await createTestCommandRunner(command).run( const ['build', 'macos', '--debug', '--no-pub'] @@ -375,7 +437,13 @@ STDERR STUFF }); testUsingContext('macOS build supports build-name and build-number', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); await createTestCommandRunner(command).run( @@ -404,9 +472,15 @@ STDERR STUFF }); testUsingContext('Refuses to build for macOS when feature is disabled', () { - final CommandRunner runner = createTestCommandRunner(BuildCommand()); + final CommandRunner runner = createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )); - final bool supported = BuildMacosCommand(verboseHelp: false).supported; + final bool supported = BuildMacosCommand(logger: BufferLogger.test(), verboseHelp: false).supported; expect(() => runner.run(['build', 'macos', '--no-pub']), supported ? throwsToolExit() : throwsA(isA())); }, overrides: { @@ -414,21 +488,27 @@ STDERR STUFF }); testUsingContext('hidden when not enabled on macOS host', () { - expect(BuildMacosCommand(verboseHelp: false).hidden, true); + expect(BuildMacosCommand(logger: BufferLogger.test(), verboseHelp: false).hidden, true); }, overrides: { FeatureFlags: () => TestFeatureFlags(), Platform: () => macosPlatform, }); testUsingContext('Not hidden when enabled and on macOS host', () { - expect(BuildMacosCommand(verboseHelp: false).hidden, false); + expect(BuildMacosCommand(logger: BufferLogger.test(), verboseHelp: false).hidden, false); }, overrides: { FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), Platform: () => macosPlatform, }); testUsingContext('Performs code size analysis and sends analytics', () async { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); createMinimalMockProjectFiles(); fileSystem.file('build/macos/Build/Products/Release/Runner.app/App') diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_test.dart index 144ed0e109..435c5d5834 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_test.dart @@ -5,12 +5,16 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/runner/flutter_command.dart'; import '../../src/common.dart'; import '../../src/context.dart'; +import '../../src/fakes.dart'; +import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; void main() { @@ -36,7 +40,13 @@ void main() { }); testUsingContext("doesn't fail if --fatal-warnings specified and no warnings occur", () async { - command = FakeBuildCommand(); + command = FakeBuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); try { await createTestCommandRunner(command).run([ 'build', @@ -52,7 +62,13 @@ void main() { }); testUsingContext("doesn't fail if --fatal-warnings not specified", () async { - command = FakeBuildCommand(); + command = FakeBuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); testLogger.printWarning('Warning: Mild annoyance Will Robinson!'); try { await createTestCommandRunner(command).run([ @@ -68,7 +84,13 @@ void main() { }); testUsingContext('fails if --fatal-warnings specified and warnings emitted', () async { - command = FakeBuildCommand(); + command = FakeBuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); testLogger.printWarning('Warning: Mild annoyance Will Robinson!'); await expectLater(createTestCommandRunner(command).run([ 'build', @@ -81,7 +103,13 @@ void main() { }); testUsingContext('fails if --fatal-warnings specified and errors emitted', () async { - command = FakeBuildCommand(); + command = FakeBuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); testLogger.printError('Error: Danger Will Robinson!'); await expectLater(createTestCommandRunner(command).run([ 'build', @@ -115,8 +143,15 @@ class FakeBuildInfoCommand extends FlutterCommand { } class FakeBuildCommand extends BuildCommand { - FakeBuildCommand({bool verboseHelp = false}) : super(verboseHelp: verboseHelp) { - addSubcommand(FakeBuildSubcommand(verboseHelp: verboseHelp)); + FakeBuildCommand({ + required super.fileSystem, + required super.buildSystem, + required super.osUtils, + required Logger logger, + required super.androidSdk, + bool verboseHelp = false, + }) : super(logger: logger, verboseHelp: verboseHelp,) { + addSubcommand(FakeBuildSubcommand(logger: logger, verboseHelp: verboseHelp)); } @override @@ -132,7 +167,7 @@ class FakeBuildCommand extends BuildCommand { } class FakeBuildSubcommand extends BuildSubCommand { - FakeBuildSubcommand({required super.verboseHelp}); + FakeBuildSubcommand({required super.logger, required super.verboseHelp}); @override String get description => ''; diff --git a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart index 7b3149b5e3..23d17e0d7c 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/build_web_test.dart @@ -5,6 +5,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; @@ -45,7 +46,13 @@ void main() { testUsingContext('Refuses to build for web when missing index.html', () async { fileSystem.file(fileSystem.path.join('web', 'index.html')).deleteSync(); - final CommandRunner runner = createTestCommandRunner(BuildCommand()); + final CommandRunner runner = createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )); expect( () => runner.run(['build', 'web', '--no-pub']), @@ -59,19 +66,30 @@ void main() { }); testUsingContext('Refuses to build a debug build for web', () async { - final CommandRunner runner = createTestCommandRunner(BuildCommand()); + final CommandRunner runner = createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )); expect(() => runner.run(['build', 'web', '--debug', '--no-pub']), throwsA(isA())); }, overrides: { Platform: () => fakePlatform, - FileSystem: () => fileSystem, FeatureFlags: () => TestFeatureFlags(isWebEnabled: true), ProcessManager: () => FakeProcessManager.any(), }); testUsingContext('Refuses to build for web when feature is disabled', () async { - final CommandRunner runner = createTestCommandRunner(BuildCommand()); + final CommandRunner runner = createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )); expect( () => runner.run(['build', 'web', '--no-pub']), @@ -85,7 +103,13 @@ void main() { }); testUsingContext('Setup for a web build with default output directory', () async { - final BuildCommand buildCommand = BuildCommand(); + final BuildCommand buildCommand = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); final CommandRunner runner = createTestCommandRunner(buildCommand); setupFileSystemForEndToEndTest(fileSystem); await runner.run(['build', 'web', '--no-pub', '--dart-define=foo=a', '--dart2js-optimization=O3']); @@ -118,7 +142,13 @@ void main() { testUsingContext('Setup for a web build with a user specified output directory', () async { - final BuildCommand buildCommand = BuildCommand(); + final BuildCommand buildCommand = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); final CommandRunner runner = createTestCommandRunner(buildCommand); setupFileSystemForEndToEndTest(fileSystem); @@ -159,7 +189,7 @@ void main() { }); testUsingContext('hidden if feature flag is not enabled', () async { - expect(BuildWebCommand(verboseHelp: false).hidden, true); + expect(BuildWebCommand(fileSystem: fileSystem, logger: BufferLogger.test(), verboseHelp: false).hidden, true); }, overrides: { Platform: () => fakePlatform, FileSystem: () => fileSystem, @@ -168,7 +198,7 @@ void main() { }); testUsingContext('not hidden if feature flag is enabled', () async { - expect(BuildWebCommand(verboseHelp: false).hidden, false); + expect(BuildWebCommand(fileSystem: fileSystem, logger: BufferLogger.test(), verboseHelp: false).hidden, false); }, overrides: { Platform: () => fakePlatform, FileSystem: () => fileSystem, @@ -177,7 +207,7 @@ void main() { }); testUsingContext('Defaults to web renderer auto mode when no option is specified', () async { - final TestWebBuildCommand buildCommand = TestWebBuildCommand(); + final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem); final CommandRunner runner = createTestCommandRunner(buildCommand); setupFileSystemForEndToEndTest(fileSystem); await runner.run(['build', 'web', '--no-pub']); @@ -193,7 +223,7 @@ void main() { }); testUsingContext('Web build supports build-name and build-number', () async { - final TestWebBuildCommand buildCommand = TestWebBuildCommand(); + final TestWebBuildCommand buildCommand = TestWebBuildCommand(fileSystem: fileSystem); final CommandRunner runner = createTestCommandRunner(buildCommand); setupFileSystemForEndToEndTest(fileSystem); @@ -269,8 +299,11 @@ class UrlLauncherPlugin {} } class TestWebBuildCommand extends FlutterCommand { - TestWebBuildCommand({ bool verboseHelp = false }) : - webCommand = BuildWebCommand(verboseHelp: verboseHelp) { + TestWebBuildCommand({ required FileSystem fileSystem, bool verboseHelp = false }) : + webCommand = BuildWebCommand( + fileSystem: fileSystem, + logger: BufferLogger.test(), + verboseHelp: verboseHelp) { addSubcommand(webCommand); } 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 469555a301..1fff401bdd 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 @@ -5,6 +5,7 @@ import 'package:file/memory.dart'; import 'package:file_testing/file_testing.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_windows.dart'; @@ -116,7 +117,7 @@ void main() { } testUsingContext('Windows build fails when there is no cmake path', () async { - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = FakeVisualStudio(cmakePath: null); setUpMockProjectFilesForBuild(); @@ -132,7 +133,7 @@ void main() { testUsingContext('Windows build fails when there is no windows project', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockCoreProjectFiles(); @@ -150,7 +151,7 @@ void main() { testUsingContext('Windows build fails on non windows platform', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -166,7 +167,7 @@ void main() { testUsingContext('Windows build fails when feature is disabled', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -182,7 +183,7 @@ void main() { testUsingContext('Windows build does not spew stdout to status logger', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -207,7 +208,7 @@ void main() { testUsingContext('Windows build extracts errors from stdout', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -265,7 +266,7 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier testUsingContext('Windows verbose build sets VERBOSE_SCRIPT_LOGGING', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -291,7 +292,7 @@ C:\foo\windows\runner\main.cpp(17,1): error C2065: 'Baz': undeclared identifier testUsingContext('Windows build works around CMake generation bug', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(displayVersion: '17.1.0'); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -427,7 +428,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build invokes build and writes generated files', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -497,7 +498,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows profile build passes Profile configuration', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -520,7 +521,7 @@ if %errorlevel% neq 0 goto :VCEnd const String generator = 'A different generator'; final FakeVisualStudio fakeVisualStudio = FakeVisualStudio( cmakeGenerator: generator); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -541,7 +542,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext("Windows build uses pubspec's version", () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -587,7 +588,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build uses build-name and build-number', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -631,7 +632,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build build-name overrides pubspec', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -678,7 +679,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build build-number overrides pubspec', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -725,7 +726,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build build-name and build-number override pubspec', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -773,7 +774,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build warns on non-numeric build-number', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -823,7 +824,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Windows build warns on complex build-number', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -872,14 +873,14 @@ if %errorlevel% neq 0 goto :VCEnd }); testUsingContext('hidden when not enabled on Windows host', () { - expect(BuildWindowsCommand().hidden, true); + expect(BuildWindowsCommand(logger: BufferLogger.test()).hidden, true); }, overrides: { FeatureFlags: () => TestFeatureFlags(), Platform: () => windowsPlatform, }); testUsingContext('Not hidden when enabled and on Windows host', () { - expect(BuildWindowsCommand().hidden, false); + expect(BuildWindowsCommand(logger: BufferLogger.test()).hidden, false); }, overrides: { FeatureFlags: () => TestFeatureFlags(isWindowsEnabled: true), Platform: () => windowsPlatform, @@ -887,7 +888,7 @@ if %errorlevel% neq 0 goto :VCEnd testUsingContext('Performs code size analysis and sends analytics', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; setUpMockProjectFilesForBuild(); @@ -939,7 +940,7 @@ if %errorlevel% neq 0 goto :VCEnd // is resolved on the VS side, we can allow these paths again testUsingContext('Test bad path characters', () async { final FakeVisualStudio fakeVisualStudio = FakeVisualStudio(); - final BuildWindowsCommand command = BuildWindowsCommand() + final BuildWindowsCommand command = BuildWindowsCommand(logger: BufferLogger.test()) ..visualStudioOverride = fakeVisualStudio; fileSystem.currentDirectory = fileSystem.directory("test_'path") ..createSync(); diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart index 087e65604c..a88a3ad534 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_aar_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_tools/src/android/android_builder.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/android/android_studio.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_aar.dart'; @@ -27,7 +28,12 @@ void main() { Cache.disableLocking(); Future runCommandIn(String target, { List? arguments }) async { - final BuildAarCommand command = BuildAarCommand(verboseHelp: false); + final BuildAarCommand command = BuildAarCommand( + androidSdk: FakeAndroidSdk(), + fileSystem: globals.fs, + logger: BufferLogger.test(), + verboseHelp: false, + ); final CommandRunner runner = createTestCommandRunner(command); await runner.run([ 'aar', @@ -217,6 +223,7 @@ void main() { await expectLater(() async { await runBuildAarCommand( projectPath, + null, arguments: ['--no-pub'], ); }, throwsToolExit( @@ -224,7 +231,6 @@ void main() { )); }, overrides: { - AndroidSdk: () => null, FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir), ProcessManager: () => FakeProcessManager.any(), }); @@ -235,6 +241,7 @@ void main() { await expectLater(() async { await runBuildAarCommand( 'missing_project', + mockAndroidSdk, arguments: ['--no-pub'], ); }, throwsToolExit( @@ -278,7 +285,7 @@ void main() { exitCode: 1, )); - await expectLater(() => runBuildAarCommand(projectPath, arguments: [ + await expectLater(() => runBuildAarCommand(projectPath, mockAndroidSdk, arguments: [ '--no-debug', '--no-profile', '--extra-front-end-options=foo', @@ -287,7 +294,6 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { - AndroidSdk: () => mockAndroidSdk, FlutterProjectFactory: () => FakeFlutterProjectFactory(tempDir), ProcessManager: () => processManager, FeatureFlags: () => TestFeatureFlags(isIOSEnabled: false), @@ -297,10 +303,15 @@ void main() { } Future runBuildAarCommand( - String target, { + String target, AndroidSdk? androidSdk, { List? arguments, }) async { - final BuildAarCommand command = BuildAarCommand(verboseHelp: false); + final BuildAarCommand command = BuildAarCommand( + androidSdk: androidSdk, + fileSystem: globals.fs, + logger: BufferLogger.test(), + verboseHelp: false, + ); final CommandRunner runner = createTestCommandRunner(command); await runner.run([ 'aar', diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart index 19540e56de..daac72e655 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_apk_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_tools/src/android/android_builder.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/android/android_studio.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_apk.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -429,7 +430,7 @@ Future runBuildApkCommand( String target, { List? arguments, }) async { - final BuildApkCommand command = BuildApkCommand(); + final BuildApkCommand command = BuildApkCommand(logger: BufferLogger.test()); final CommandRunner runner = createTestCommandRunner(command); await runner.run([ 'apk', diff --git a/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart b/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart index 9f21267168..0bd3eaa08a 100644 --- a/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart +++ b/packages/flutter_tools/test/commands.shard/permeable/build_appbundle_test.dart @@ -6,6 +6,7 @@ import 'package:args/command_runner.dart'; import 'package:flutter_tools/src/android/android_builder.dart'; import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build_appbundle.dart'; import 'package:flutter_tools/src/globals.dart' as globals; @@ -213,7 +214,7 @@ Future runBuildAppBundleCommand( String target, { List? arguments, }) async { - final BuildAppBundleCommand command = BuildAppBundleCommand(); + final BuildAppBundleCommand command = BuildAppBundleCommand(logger: BufferLogger.test()); final CommandRunner runner = createTestCommandRunner(command); await runner.run([ 'appbundle', 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 ce01bf1233..f5f906239a 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 @@ -6,6 +6,7 @@ import 'package:args/command_runner.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/bundle.dart'; @@ -46,7 +47,10 @@ void main() { } Future runCommandIn(String projectPath, { List? arguments }) async { - final BuildBundleCommand command = BuildBundleCommand(bundleBuilder: fakeBundleBuilder); + final BuildBundleCommand command = BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + ); final CommandRunner runner = createTestCommandRunner(command); await runner.run([ 'bundle', @@ -88,7 +92,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(recursive: true); globals.fs.file('.packages').createSync(recursive: true); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); expect(() => runner.run([ 'bundle', @@ -105,7 +112,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); expect(() => runner.run([ 'bundle', @@ -122,7 +132,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); expect(() => runner.run([ 'bundle', @@ -139,7 +152,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); expect(() => runner.run([ 'bundle', @@ -156,7 +172,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -173,7 +192,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -190,7 +212,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand(bundleBuilder: FakeBundleBuilder())); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -207,7 +232,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -237,7 +265,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -268,7 +299,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -298,7 +332,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -329,7 +366,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -360,7 +400,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -391,7 +434,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -430,7 +476,10 @@ void main() { globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file('pubspec.yaml').createSync(); globals.fs.file('.packages').createSync(); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -479,7 +528,10 @@ void main() { } ''' ); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); await runner.run([ 'bundle', @@ -509,7 +561,10 @@ void main() { } ''' ); - final CommandRunner runner = createTestCommandRunner(BuildBundleCommand()); + final CommandRunner runner = createTestCommandRunner(BuildBundleCommand( + logger: BufferLogger.test(), + bundleBuilder: fakeBundleBuilder, + )); expect(() => runner.run([ 'bundle', diff --git a/packages/flutter_tools/test/general.shard/analytics_test.dart b/packages/flutter_tools/test/general.shard/analytics_test.dart index 32f5996567..e44ef7debb 100644 --- a/packages/flutter_tools/test/general.shard/analytics_test.dart +++ b/packages/flutter_tools/test/general.shard/analytics_test.dart @@ -9,8 +9,10 @@ import 'package:flutter_tools/src/android/android_workflow.dart'; import 'package:flutter_tools/src/base/config.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/time.dart'; +import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import 'package:flutter_tools/src/commands/config.dart'; @@ -28,6 +30,7 @@ import 'package:usage/usage_io.dart'; import '../src/common.dart'; import '../src/context.dart'; import '../src/fakes.dart'; +import '../src/test_build_system.dart'; import '../src/test_flutter_command_runner.dart'; void main() { @@ -213,7 +216,13 @@ void main() { }); testUsingContext('compound command usage path', () async { - final BuildCommand buildCommand = BuildCommand(); + final BuildCommand buildCommand = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); final FlutterCommand buildApkCommand = buildCommand.subcommands['apk']! as FlutterCommand; expect(await buildApkCommand.usagePath, 'build/apk'); diff --git a/packages/flutter_tools/test/general.shard/commands/build_test.dart b/packages/flutter_tools/test/general.shard/commands/build_test.dart index 7097ecf615..1ccb5b2ffa 100644 --- a/packages/flutter_tools/test/general.shard/commands/build_test.dart +++ b/packages/flutter_tools/test/general.shard/commands/build_test.dart @@ -31,6 +31,7 @@ import 'package:test/fake.dart'; import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fakes.dart'; +import '../../src/test_build_system.dart'; class FakeTerminal extends Fake implements AnsiTerminal { FakeTerminal({this.stdinHasTerminal = true}); @@ -50,16 +51,22 @@ void main() { final Platform platform = FakePlatform(); final BufferLogger logger = BufferLogger.test(); final List commands = [ - BuildWindowsCommand(), - BuildLinuxCommand(operatingSystemUtils: FakeOperatingSystemUtils()), - BuildMacosCommand(verboseHelp: false), - BuildWebCommand(verboseHelp: false), - BuildApkCommand(), - BuildIOSCommand(verboseHelp: false), - BuildIOSArchiveCommand(verboseHelp: false), - BuildAppBundleCommand(), - BuildAarCommand(verboseHelp: false), + BuildWindowsCommand(logger: BufferLogger.test()), + BuildLinuxCommand(logger: BufferLogger.test(), operatingSystemUtils: FakeOperatingSystemUtils()), + BuildMacosCommand(logger: BufferLogger.test(), verboseHelp: false), + BuildWebCommand(fileSystem: fileSystem, logger: BufferLogger.test(), verboseHelp: false), + BuildApkCommand(logger: BufferLogger.test()), + BuildIOSCommand(logger: BufferLogger.test(), verboseHelp: false), + BuildIOSArchiveCommand(logger: BufferLogger.test(), verboseHelp: false), + BuildAppBundleCommand(logger: BufferLogger.test()), + BuildAarCommand( + logger: BufferLogger.test(), + androidSdk: FakeAndroidSdk(), + fileSystem: fileSystem, + verboseHelp: false, + ), BuildIOSFrameworkCommand( + logger: BufferLogger.test(), verboseHelp: false, buildSystem: FlutterBuildSystem( fileSystem: fileSystem, @@ -104,18 +111,25 @@ void main() { treeShakeIcons: false, ); - FakeBuildSubCommand().test(unsound); - expect(testLogger.statusText, + final BufferLogger logger = BufferLogger.test(); + FakeBuildSubCommand(logger).test(unsound); + expect(logger.statusText, contains('Building without sound null safety ⚠️')); - testLogger.clear(); - FakeBuildSubCommand().test(sound); - expect(testLogger.statusText, + logger.clear(); + FakeBuildSubCommand(logger).test(sound); + expect(logger.statusText, contains('💪 Building with sound null safety 💪')); }); testUsingContext('Include only supported sub commands', () { - final BuildCommand command = BuildCommand(); + final BuildCommand command = BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: TestBuildSystem.all(BuildResult(success: true)), + fileSystem: MemoryFileSystem.test(), + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + ); for (final Command x in command.subcommands.values) { expect((x as BuildSubCommand).supported, isTrue); } @@ -123,7 +137,7 @@ void main() { } class FakeBuildSubCommand extends BuildSubCommand { - FakeBuildSubCommand() : super(verboseHelp: false); + FakeBuildSubCommand(Logger logger) : super(logger: logger, verboseHelp: false); @override String get description => throw UnimplementedError(); diff --git a/packages/flutter_tools/test/general.shard/web/migrations/scrub_generated_plugin_registrant_test.dart b/packages/flutter_tools/test/general.shard/web/migrations/scrub_generated_plugin_registrant_test.dart index 0bc1066f5f..4261dd88a7 100644 --- a/packages/flutter_tools/test/general.shard/web/migrations/scrub_generated_plugin_registrant_test.dart +++ b/packages/flutter_tools/test/general.shard/web/migrations/scrub_generated_plugin_registrant_test.dart @@ -4,11 +4,13 @@ import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/file_system.dart'; +import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_system/build_system.dart'; import 'package:flutter_tools/src/cache.dart'; import 'package:flutter_tools/src/commands/build.dart'; import '../../../src/context.dart'; // legacy +import '../../../src/fakes.dart'; import '../../../src/test_build_system.dart'; import '../../../src/test_flutter_command_runner.dart'; // legacy @@ -44,7 +46,13 @@ void main() { expect(gitignore.existsSync(), isFalse); expect(registrant.existsSync(), isFalse); - await createTestCommandRunner(BuildCommand()) + await createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: buildSystem, + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )) .run(['build', 'web', '--no-pub']); final Directory buildDir = fileSystem.directory(fileSystem.path.join('build', 'web')); @@ -61,7 +69,13 @@ void main() { final String contentsBeforeBuild = gitignore.readAsStringSync(); expect(contentsBeforeBuild, isNot(contains('lib/generated_plugin_registrant.dart'))); - await createTestCommandRunner(BuildCommand()) + await createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: buildSystem, + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )) .run(['build', 'web', '--no-pub']); expect(gitignore.readAsStringSync(), contentsBeforeBuild); @@ -77,7 +91,13 @@ void main() { expect(gitignore.existsSync(), isTrue); expect(gitignore.readAsStringSync(), contains('lib/generated_plugin_registrant.dart')); - await createTestCommandRunner(BuildCommand()) + await createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: buildSystem, + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )) .run(['build', 'web', '--no-pub']); expect(gitignore.readAsStringSync(), isNot(contains('lib/generated_plugin_registrant.dart'))); @@ -92,7 +112,13 @@ void main() { expect(registrant.existsSync(), isTrue); - await createTestCommandRunner(BuildCommand()) + await createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: buildSystem, + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )) .run(['build', 'web', '--no-pub']); expect(registrant.existsSync(), isFalse); @@ -109,7 +135,13 @@ void main() { expect(registrant.existsSync(), isTrue); expect(gitignore.readAsStringSync(), contains('lib/generated_plugin_registrant.dart')); - await createTestCommandRunner(BuildCommand()) + await createTestCommandRunner(BuildCommand( + androidSdk: FakeAndroidSdk(), + buildSystem: buildSystem, + fileSystem: fileSystem, + logger: BufferLogger.test(), + osUtils: FakeOperatingSystemUtils(), + )) .run(['build', 'web', '--no-pub']); expect(registrant.existsSync(), isFalse); diff --git a/packages/flutter_tools/test/src/fakes.dart b/packages/flutter_tools/test/src/fakes.dart index 6be91d9302..386f56babe 100644 --- a/packages/flutter_tools/test/src/fakes.dart +++ b/packages/flutter_tools/test/src/fakes.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'dart:io' as io show IOSink, ProcessSignal, Stdout, StdoutException; +import 'package:flutter_tools/src/android/android_sdk.dart'; import 'package:flutter_tools/src/base/bot_detector.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; @@ -572,3 +573,14 @@ class FakeFlutterProjectFactory implements FlutterProjectFactory { @override Map get projects => throw UnimplementedError(); } + +class FakeAndroidSdk extends Fake implements AndroidSdk { + @override + late bool platformToolsAvailable; + + @override + late bool licensesAvailable; + + @override + AndroidSdkVersion? latestVersion; +}