diff --git a/packages/flutter_tools/lib/src/compute_dev_dependencies.dart b/packages/flutter_tools/lib/src/compute_dev_dependencies.dart index d55491a039..a1305c53e4 100644 --- a/packages/flutter_tools/lib/src/compute_dev_dependencies.dart +++ b/packages/flutter_tools/lib/src/compute_dev_dependencies.dart @@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:process/process.dart'; - -import 'base/io.dart'; import 'base/logger.dart'; import 'convert.dart'; +import 'dart/pub.dart'; +import 'project.dart'; /// Returns dependencies of [project] that are _only_ used as `dev_dependency`. /// @@ -15,54 +14,19 @@ import 'convert.dart'; /// `pubspec.yaml` file, and removing packages from that set that appear as /// dependencies (implicitly non-dev) in any non-dev package depended on. Future> computeExclusiveDevDependencies( - ProcessManager processes, { + Pub pub, { required Logger logger, - required String projectPath, + required FlutterProject project, }) async { - final ProcessResult processResult = await processes.run( - ['dart', 'pub', 'deps', '--json'], - workingDirectory: projectPath, - ); + final Map jsonResult = await pub.deps(project); Never fail([String? reason]) { - final Object? stdout = processResult.stdout; - if (stdout is String && stdout.isNotEmpty) { - logger.printTrace(stdout); - } - final String stderr = processResult.stderr.toString(); + logger.printTrace(const JsonEncoder.withIndent(' ').convert(jsonResult)); throw StateError( 'dart pub deps --json ${reason != null ? 'had unexpected output: $reason' : 'failed'}' - '${stderr.isNotEmpty ? '\n$stderr' : ''}', ); } - // Guard against dart pub deps crashing. - final Map jsonResult; - if (processResult.exitCode != 0 || processResult.stdout is! String) { - fail(); - } - - // Guard against dart pub deps having explicitly invalid output. - final String stdout; - try { - stdout = processResult.stdout as String; - - // This is an indication that `FakeProcessManager.any` was used, which by - // contract emits exit code 0 and no output on either stdout or stderr. To - // avoid this code, we'd have to go and make this function injectable into - // every callsite and mock-it out manually, which at the time of this - // writing was 130+ unit test cases alone. - // - // So, this is the lesser of two evils. - if (stdout.isEmpty && processResult.stderr == '') { - return {}; - } - - jsonResult = json.decode(stdout) as Map; - } on FormatException catch (e) { - fail('$e'); - } - List asListOrFail(Object? value, String name) { // Allow omitting a list as empty to default to an empty list if (value == null) { diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart index 656ab79109..5e5e539c02 100644 --- a/packages/flutter_tools/lib/src/dart/pub.dart +++ b/packages/flutter_tools/lib/src/dart/pub.dart @@ -157,6 +157,13 @@ abstract class Pub { PubOutputMode outputMode = PubOutputMode.all, }); + /// Runs, parses, and returns `pub deps --json` for [project]. + /// + /// While it is guaranteed that, if succcessful, that the result are a valid + /// JSON object, the exact contents returned are _not_ validated, and are left + /// as a responsibility of the caller. + Future> deps(FlutterProject project); + /// Runs pub in 'batch' mode. /// /// forwarding complete lines written by pub to its stdout/stderr streams to @@ -373,6 +380,48 @@ class _DefaultPub implements Pub { await _updateVersionAndPackageConfig(project); } + @override + Future> deps(FlutterProject project) async { + final List pubCommand = [ + ..._pubCommand, + 'deps', + '--json', + ]; + + final RunResult runResult = await _processUtils.run( + pubCommand, + workingDirectory: project.directory.path, + ); + + Never fail([String? reason]) { + final String stdout = runResult.stdout; + if (stdout.isNotEmpty) { + _logger.printTrace(stdout); + } + final String stderr = runResult.stderr; + throw StateError( + '${pubCommand.join(' ')} ${reason != null ? 'had unexpected output: $reason' : 'failed'}' + '${stderr.isNotEmpty ? '\n$stderr' : ''}', + ); + } + + // Guard against dart pub deps crashing. + if (runResult.exitCode != 0) { + fail(); + } + + // Guard against dart pub deps having explicitly invalid output. + try { + final Object? result = json.decode(runResult.stdout); + if (result is! Map) { + fail('Not a JSON object'); + } + return result; + } on FormatException catch (e) { + fail('$e'); + } + } + /// Runs pub with [arguments] and [ProcessStartMode.inheritStdio] mode. /// /// Uses [ProcessStartMode.normal] and [Pub._stdio] if [Pub.test] constructor diff --git a/packages/flutter_tools/lib/src/flutter_plugins.dart b/packages/flutter_tools/lib/src/flutter_plugins.dart index e815d75062..471dba42f9 100644 --- a/packages/flutter_tools/lib/src/flutter_plugins.dart +++ b/packages/flutter_tools/lib/src/flutter_plugins.dart @@ -21,6 +21,7 @@ import 'compute_dev_dependencies.dart'; import 'convert.dart'; import 'dart/language_version.dart'; import 'dart/package_map.dart'; +import 'dart/pub.dart'; import 'features.dart'; import 'globals.dart' as globals; import 'macos/darwin_dependency_management.dart'; @@ -128,9 +129,9 @@ Future> findPlugins( devDependencies = {}; } else { devDependencies = await computeExclusiveDevDependencies( - globals.processManager, + pub, logger: globals.logger, - projectPath: project.directory.path, + project: project, ); } for (final Package package in packageConfig.packages) { 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 3f08cd4e89..359dee3dbd 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 @@ -17,6 +17,7 @@ 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/dart/pub.dart'; import 'package:flutter_tools/src/ios/code_signing.dart'; import 'package:flutter_tools/src/ios/mac.dart'; import 'package:flutter_tools/src/ios/plist_parser.dart'; @@ -28,6 +29,7 @@ import 'package:unified_analytics/unified_analytics.dart'; import '../../general.shard/ios/xcresult_test_data.dart'; import '../../src/common.dart'; import '../../src/context.dart'; +import '../../src/fake_pub_deps.dart'; import '../../src/fakes.dart'; import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; @@ -114,13 +116,6 @@ void main() { 'xattr', '-r', '-d', 'com.apple.FinderInfo', '/', ]); - const FakeCommand dartPubDepsCommand = FakeCommand(command: [ - 'dart', - 'pub', - 'deps', - '--json', - ]); - FakeCommand setUpRsyncCommand({void Function(List command)? onRun}) { return FakeCommand( command: const [ @@ -305,9 +300,9 @@ void main() { expect(testLogger.statusText, contains(RegExp(r'✓ Built build/ios/iphoneos/Runner\.app \(\d+\.\d+MB\)'))); }, overrides: { FileSystem: () => fileSystem, + Pub: FakePubWithPrimedDeps.new, ProcessManager: () => FakeProcessManager.list([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); }), @@ -331,7 +326,6 @@ void main() { processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); }), @@ -345,6 +339,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -369,7 +364,6 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( disablePortPublication: true, onRun: (_) { @@ -378,6 +372,7 @@ void main() { ), setUpRsyncCommand(), ]), + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -402,7 +397,6 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); @@ -410,6 +404,7 @@ void main() { ), setUpRsyncCommand(), ]), + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -427,7 +422,6 @@ void main() { processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(customNaming: true, onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); }), @@ -446,6 +440,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -462,7 +457,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(deviceId: '1234', onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); }), @@ -477,6 +471,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -493,7 +488,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(simulator: true, onRun: (_) { fileSystem.directory('build/ios/Debug-iphonesimulator/Runner.app').createSync(recursive: true); }), @@ -507,6 +501,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -524,7 +519,6 @@ void main() { createMinimalMockProjectFiles(); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(verbose: true, onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); }), @@ -537,6 +531,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -553,7 +548,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true); fileSystem.file('build/flutter_size_01/snapshot.arm64.json') @@ -591,6 +585,7 @@ void main() { Logger: () => logger, ProcessManager: () => processManager, Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FileSystemUtils: () => FileSystemUtils(fileSystem: fileSystem, platform: macosPlatform), Analytics: () => fakeAnalytics, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), @@ -640,7 +635,6 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app') .createSync(recursive: true); @@ -656,6 +650,7 @@ void main() { platform: macosPlatform, ), XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), + Pub: FakePubWithPrimedDeps.new, Analytics: () => fakeAnalytics, }); @@ -695,7 +690,6 @@ void main() { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.directory('build/ios/Release-iphoneos/Runner.app') .createSync(recursive: true); @@ -722,6 +716,7 @@ void main() { plutilCommand, plutilCommand, plutilCommand, ]), ), + Pub: FakePubWithPrimedDeps.new, Analytics: () => fakeAnalytics, }); }); @@ -739,7 +734,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleDirectoryPath).createSync(); }), @@ -759,6 +753,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -775,7 +770,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleDirectoryPath).createSync(); }, stdout: 'Lots of spew from Xcode', @@ -799,6 +793,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -815,7 +810,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleDirectoryPath).createSync(); }), @@ -838,6 +832,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -854,7 +849,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1), setUpXCResultCommand(stdout: kSampleResultJsonWithIssues), setUpRsyncCommand(), @@ -871,6 +865,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -887,7 +882,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleDirectoryPath).createSync(); }), @@ -911,6 +905,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -927,7 +922,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, onRun: (_) { @@ -951,6 +945,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -967,7 +962,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleDirectoryPath).createSync(); }), @@ -987,6 +981,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1003,7 +998,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, // Intentionally fail the first xcodebuild command with concurrent run failure message. setUpFakeXcodeBuildHandler( exitCode: 1, @@ -1035,6 +1029,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1051,7 +1046,6 @@ void main() { ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, stdout: ''' @@ -1077,6 +1071,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1093,7 +1088,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, onRun: (_) { @@ -1116,6 +1110,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(developmentTeam: null), }); @@ -1143,7 +1138,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, stdout: ''' @@ -1156,6 +1150,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig setUpXCResultCommand(stdout: kSampleResultJsonNoIssues), setUpRsyncCommand(), ]), + Pub: FakePubWithPrimedDeps.new, EnvironmentType: () => EnvironmentType.physical, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), @@ -1173,7 +1168,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, onRun: (_) { @@ -1195,6 +1189,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(developmentTeam: null), }); @@ -1211,7 +1206,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, onRun: (_) { @@ -1235,6 +1229,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(developmentTeam: null), }); @@ -1251,7 +1246,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( exitCode: 1, onRun: (_) { @@ -1275,6 +1269,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(developmentTeam: null), }); @@ -1293,7 +1288,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( simulator: true, exitCode: 1, @@ -1317,6 +1311,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1333,7 +1328,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( simulator: true, exitCode: 1, @@ -1358,6 +1352,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1375,7 +1370,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( simulator: true, exitCode: 1, @@ -1402,6 +1396,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1418,7 +1413,6 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig ); processManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler( simulator: true, exitCode: 1, @@ -1439,6 +1433,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => processManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); 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 0d8917642c..8413124a8e 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 @@ -16,6 +16,7 @@ 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/dart/pub.dart'; import 'package:flutter_tools/src/ios/plist_parser.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:test/fake.dart'; @@ -25,6 +26,7 @@ import '../../general.shard/ios/xcresult_test_data.dart'; import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fake_process_manager.dart'; +import '../../src/fake_pub_deps.dart'; import '../../src/fakes.dart'; import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; @@ -140,13 +142,6 @@ void main() { 'xattr', '-r', '-d', 'com.apple.FinderInfo', '/', ]); - const FakeCommand dartPubDepsCommand = FakeCommand(command: [ - 'dart', - 'pub', - 'deps', - '--json', - ]); - FakeCommand setUpXCResultCommand({String stdout = '', void Function(List command)? onRun}) { return FakeCommand( command: const [ @@ -405,7 +400,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist), ]); @@ -420,6 +414,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -437,7 +432,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -467,6 +461,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(version: Version(15, 4, null)), }); @@ -484,7 +479,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -514,6 +508,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(version: Version(15, 4, null)), }); @@ -531,7 +526,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -561,6 +555,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(version: Version(15, 4, null)), }); @@ -577,7 +572,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist), ]); @@ -590,6 +584,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(version: Version(15, 3, null)), }); @@ -607,7 +602,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -637,6 +631,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(version: Version(15, 4, null)), }); @@ -653,7 +648,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist), ]); @@ -666,6 +660,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(version: Version(15, 3, null)), }); @@ -682,7 +677,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: exportOptions.path), ]); @@ -705,6 +699,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), PlistParser: () => plistUtils, @@ -722,7 +717,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), const FakeCommand( command: [ @@ -761,6 +755,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -778,7 +773,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand( exportOptionsPlist: _exportOptionsPlist, @@ -796,6 +790,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -813,7 +808,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -849,6 +843,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -866,7 +861,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -902,6 +896,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -919,7 +914,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist, cachePlist: cachedExportOptionsPlist), ]); @@ -955,6 +949,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -971,7 +966,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(verbose: true), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist), ]); @@ -985,6 +979,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1001,7 +996,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist), ]); @@ -1014,6 +1008,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1030,7 +1025,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, const FakeCommand( command: [ 'xcrun', @@ -1067,6 +1061,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1083,7 +1078,6 @@ void main() { ); createMinimalMockProjectFiles(); - fakeProcessManager.addCommand(dartPubDepsCommand); fakeProcessManager.addCommand(setUpFakeXcodeBuildHandler()); await expectToolExitLater( createTestCommandRunner(command).run( @@ -1094,6 +1088,7 @@ void main() { }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1115,7 +1110,6 @@ void main() { ..writeAsBytesSync(List.generate(10000, (int index) => 0)); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file('build/flutter_size_01/snapshot.arm64.json') ..createSync(recursive: true) @@ -1149,6 +1143,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, FileSystemUtils: () => FileSystemUtils(fileSystem: fileSystem, platform: macosPlatform), Analytics: () => fakeAnalytics, @@ -1171,7 +1166,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(), exportArchiveCommand(), ]); @@ -1193,6 +1187,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1209,7 +1204,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleFilePath).createSync(); }), @@ -1228,6 +1222,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1244,7 +1239,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleFilePath).createSync(); }), @@ -1264,6 +1258,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1280,7 +1275,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleFilePath).createSync(); }), @@ -1302,6 +1296,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1318,7 +1313,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1), ]); createMinimalMockProjectFiles(); @@ -1334,6 +1328,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1351,7 +1346,6 @@ void main() { ); fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(exitCode: 1, onRun: (_) { fileSystem.systemTempDirectory.childDirectory(_xcBundleFilePath).createSync(); }), @@ -1374,6 +1368,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1384,7 +1379,6 @@ void main() { const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist'; fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(plistPath).createSync(recursive: true); }), @@ -1428,6 +1422,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), PlistParser: () => plistUtils, @@ -1438,7 +1433,6 @@ void main() { const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist'; fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(plistPath).createSync(recursive: true); }), @@ -1488,6 +1482,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), PlistParser: () => plistUtils, @@ -1498,7 +1493,6 @@ void main() { const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist'; fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(plistPath).createSync(recursive: true); }), @@ -1547,6 +1541,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), PlistParser: () => plistUtils, @@ -1558,7 +1553,6 @@ void main() { const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist'; fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(plistPath).createSync(recursive: true); }), @@ -1592,6 +1586,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), PlistParser: () => plistUtils, @@ -1602,7 +1597,6 @@ void main() { const String plistPath = 'build/ios/archive/Runner.xcarchive/Products/Applications/Runner.app/Info.plist'; fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(plistPath).createSync(recursive: true); }), @@ -1636,6 +1630,7 @@ void main() { Logger: () => logger, ProcessManager: () => fakeProcessManager, Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), PlistParser: () => plistUtils, }); @@ -1649,7 +1644,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(templateIconContentsJsonPath) ..createSync(recursive: true) @@ -1720,6 +1714,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1732,7 +1727,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(templateIconContentsJsonPath) ..createSync(recursive: true) @@ -1803,6 +1797,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1813,7 +1808,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(projectIconContentsJsonPath) ..createSync(recursive: true) @@ -1866,6 +1860,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1876,7 +1871,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(projectIconContentsJsonPath) ..createSync(recursive: true) @@ -1930,6 +1924,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -1940,7 +1935,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(projectIconContentsJsonPath) ..createSync(recursive: true) @@ -1993,6 +1987,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -2003,7 +1998,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { // Uses unknown format version 123. fileSystem.file(projectIconContentsJsonPath) @@ -2059,6 +2053,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -2076,7 +2071,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { // The following json contains examples of: // - invalid size @@ -2170,6 +2164,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -2182,7 +2177,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(templateLaunchImageContentsJsonPath) ..createSync(recursive: true) @@ -2251,6 +2245,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); @@ -2264,7 +2259,6 @@ void main() { fakeProcessManager.addCommands([ xattrCommand, - dartPubDepsCommand, setUpFakeXcodeBuildHandler(onRun: (_) { fileSystem.file(templateLaunchImageContentsJsonPath) ..createSync(recursive: true) @@ -2333,6 +2327,7 @@ void main() { FileSystem: () => fileSystem, Logger: () => logger, ProcessManager: () => fakeProcessManager, + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(), }); 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 bf14c0c0e4..8074c58d82 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 @@ -17,6 +17,7 @@ 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'; +import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/ios/xcodeproj.dart'; import 'package:flutter_tools/src/project.dart'; @@ -25,6 +26,7 @@ import 'package:unified_analytics/unified_analytics.dart'; import '../../src/common.dart'; import '../../src/context.dart'; import '../../src/fake_process_manager.dart'; +import '../../src/fake_pub_deps.dart'; import '../../src/fakes.dart'; import '../../src/test_build_system.dart'; import '../../src/test_flutter_command_runner.dart'; @@ -105,13 +107,6 @@ void main() { createCoreMockProjectFiles(); } - const FakeCommand dartPubDepsCommand = FakeCommand(command: [ - 'dart', - 'pub', - 'deps', - '--json', - ]); - // Creates a FakeCommand for the xcodebuild call to build the app // in the given configuration. FakeCommand setUpFakeXcodeBuildHandler( @@ -225,6 +220,7 @@ STDERR STUFF Platform: () => macosPlatform, FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.any(), + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), Analytics: () => fakeAnalytics, }); @@ -307,9 +303,9 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Debug'), ]), + Pub: FakePubWithPrimedDeps.new, Platform: () => macosPlatform, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -333,10 +329,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Release'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -358,10 +354,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Debug'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -383,10 +379,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Debug', verbose: true), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -409,10 +405,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Profile'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithProfile(), FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -435,10 +431,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Release'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -499,10 +495,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Release'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), Artifacts: () => Artifacts.test(), }); @@ -518,7 +514,6 @@ STDERR STUFF createMinimalMockProjectFiles(); fakeProcessManager.addCommands([ - dartPubDepsCommand, FakeCommand( command: [ '/usr/bin/env', @@ -557,6 +552,7 @@ STDERR STUFF FileSystem: () => fileSystem, ProcessManager: () => fakeProcessManager, Platform: () => macosPlatformCustomEnv, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), XcodeProjectInterpreter: () => xcodeProjectInterpreter, }); @@ -592,10 +588,10 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler('Debug'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -664,11 +660,11 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, // we never generate code size snapshot here setUpFakeXcodeBuildHandler('Release'), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), FileSystemUtils: () => FileSystemUtils(fileSystem: fileSystem, platform: macosPlatform), Analytics: () => fakeAnalytics, @@ -699,7 +695,6 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, // These are generated by gen_snapshot because flutter assemble passes // extra flags specifying this output path setUpFakeXcodeBuildHandler('Release', onRun: (_) { @@ -720,6 +715,7 @@ STDERR STUFF }), ]), Platform: () => macosPlatform, + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), FileSystemUtils: () => FileSystemUtils(fileSystem: fileSystem, platform: macosPlatform), Analytics: () => fakeAnalytics, @@ -771,7 +767,6 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler( 'Debug', additionalCommandArguements: [ @@ -787,6 +782,7 @@ STDERR STUFF 'LUCI_CI': 'True' } ), + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); @@ -840,7 +836,6 @@ STDERR STUFF }, overrides: { FileSystem: () => fileSystem, ProcessManager: () => FakeProcessManager.list([ - dartPubDepsCommand, setUpFakeXcodeBuildHandler( 'Release', additionalCommandArguements: [ @@ -856,6 +851,7 @@ STDERR STUFF 'LUCI_CI': 'True' } ), + Pub: FakePubWithPrimedDeps.new, FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true), }); } diff --git a/packages/flutter_tools/test/general.shard/compute_dev_dependencies_test.dart b/packages/flutter_tools/test/general.shard/compute_dev_dependencies_test.dart index 1f1f7b9638..f9dec39e0b 100644 --- a/packages/flutter_tools/test/general.shard/compute_dev_dependencies_test.dart +++ b/packages/flutter_tools/test/general.shard/compute_dev_dependencies_test.dart @@ -2,11 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:file/file.dart'; +import 'package:file/memory.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/compute_dev_dependencies.dart'; +import 'package:flutter_tools/src/dart/pub.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:flutter_tools/src/reporting/reporting.dart'; import '../src/common.dart'; import '../src/fake_process_manager.dart'; +import '../src/fakes.dart'; + +const String _dartBin = 'bin/cache/dart-sdk/bin/dart'; // For all of these examples, imagine the following package structure: // @@ -20,12 +30,29 @@ import '../src/fake_process_manager.dart'; // /package_c // pubspec.yaml void main() { + late FileSystem fileSystem; + late FlutterProject project; late BufferLogger logger; setUp(() { + Cache.flutterRoot = ''; + fileSystem = MemoryFileSystem.test(); + project = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); logger = BufferLogger.test(); }); + Pub pub(ProcessManager processManager) { + return Pub.test( + fileSystem: fileSystem, + logger: logger, + processManager: processManager, + usage: TestUsage(), + platform: FakePlatform(), + botDetector: const FakeBotDetector(false), + stdio: FakeStdio(), + ); + } + test('no dev dependencies at all', () async { // Simulates the following: // @@ -38,7 +65,8 @@ void main() { // name: package_a // dependencies: // package_b: - final ProcessManager processes = _dartPubDepsReturns(''' + final ProcessManager processes = _dartPubDepsReturns( + ''' { "root": "my_app", "packages": [ @@ -71,11 +99,13 @@ void main() { "directDependencies": [] } ] - }'''); + }''', + project: project, + ); final Set dependencies = await computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, + pub(processes), + project: project, logger: logger, ); @@ -99,7 +129,8 @@ void main() { // // # /package_a/pubspec.yaml // name: package_a - final ProcessManager processes = _dartPubDepsReturns(''' + final ProcessManager processes = _dartPubDepsReturns( + ''' { "root": "my_app", "packages": [ @@ -130,11 +161,13 @@ void main() { "directDependencies": [] } ] - }'''); + }''', + project: project, + ); final Set dependencies = await computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, + pub(processes), + project: project, logger: logger, ); @@ -160,7 +193,8 @@ void main() { // name: package_a // dependencies: // package_b: - final ProcessManager processes = _dartPubDepsReturns(''' + final ProcessManager processes = _dartPubDepsReturns( + ''' { "root": "my_app", "packages": [ @@ -195,11 +229,13 @@ void main() { "directDependencies": [] } ] - }'''); + }''', + project: project, + ); final Set dependencies = await computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, + pub(processes), + project: project, logger: logger, ); @@ -232,7 +268,8 @@ void main() { // // # /package_c/pubspec.yaml // name: package_c - final ProcessManager processes = _dartPubDepsReturns(''' + final ProcessManager processes = _dartPubDepsReturns( + ''' { "root": "my_app", "packages": [ @@ -278,11 +315,13 @@ void main() { "directDependencies": [] } ] - }'''); + }''', + project: project, + ); final Set dependencies = await computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, + pub(processes), + project: project, logger: logger, ); @@ -293,7 +332,7 @@ void main() { ); }); - test('omitted devDependencies in app package', () async { + test('omitted devDependencies in app package', () async { // Simulates the following: // // # /my_app/pubspec.yaml @@ -324,11 +363,13 @@ void main() { "directDependencies": [] } ] - }'''); + }''', + project: project, + ); final Set dependencies = await computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, + pub(processes), + project: project, logger: logger, ); @@ -339,55 +380,9 @@ void main() { ); }); - test('throws and logs on non-zero exit code', () async { - final ProcessManager processes = _dartPubDepsFails( - 'Bad thing', - exitCode: 1, - ); - - await expectLater( - computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, - logger: logger, - ), - throwsA( - isA().having( - (StateError e) => e.message, - 'message', - contains('dart pub deps --json failed'), - ), - ), - ); - - expect(logger.traceText, isEmpty); - }); - - test('throws and logs on unexpected output type', () async { - final ProcessManager processes = _dartPubDepsReturns( - 'Not JSON haha!', - ); - - await expectLater( - computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, - logger: logger, - ), - throwsA( - isA().having( - (StateError e) => e.message, - 'message', - contains('dart pub deps --json had unexpected output'), - ), - ), - ); - - expect(logger.traceText, contains('Not JSON haha')); - }); - test('throws and logs on invalid JSON', () async { - final ProcessManager processes = _dartPubDepsReturns(''' + final ProcessManager processes = _dartPubDepsReturns( + ''' { "root": "my_app", "packages": [ @@ -420,12 +415,14 @@ void main() { "directDependencies": [] } ] - }'''); + }''', + project: project, + ); await expectLater( computeExclusiveDevDependencies( - processes, - projectPath: _fakeProjectPath, + pub(processes), + project: project, logger: logger, ), throwsA( @@ -445,28 +442,21 @@ void main() { }); } -const String _fakeProjectPath = '/path/to/project'; - -ProcessManager _dartPubDepsReturns(String dartPubDepsOutput) { - return FakeProcessManager.list([ - FakeCommand( - command: const ['dart', 'pub', 'deps', '--json'], - stdout: dartPubDepsOutput, - workingDirectory: _fakeProjectPath, - ), - ]); -} - -ProcessManager _dartPubDepsFails( - String dartPubDepsError, { - required int exitCode, +ProcessManager _dartPubDepsReturns( + String dartPubDepsOutput, { + required FlutterProject project, }) { return FakeProcessManager.list([ FakeCommand( - command: const ['dart', 'pub', 'deps', '--json'], - exitCode: exitCode, - stderr: dartPubDepsError, - workingDirectory: _fakeProjectPath, + command: const [ + _dartBin, + 'pub', + '--suppress-analytics', + 'deps', + '--json', + ], + stdout: dartPubDepsOutput, + workingDirectory: project.directory.path, ), ]); } diff --git a/packages/flutter_tools/test/general.shard/dart/pub_deps_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_deps_test.dart new file mode 100644 index 0000000000..28934732eb --- /dev/null +++ b/packages/flutter_tools/test/general.shard/dart/pub_deps_test.dart @@ -0,0 +1,192 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:file/memory.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/dart/pub.dart'; +import 'package:flutter_tools/src/project.dart'; +import 'package:flutter_tools/src/reporting/reporting.dart'; + +import '../../src/common.dart'; +import '../../src/fake_process_manager.dart'; +import '../../src/fakes.dart'; + +const String _dartBin = 'bin/cache/dart-sdk/bin/dart'; + +void main() { + setUpAll(() { + Cache.flutterRoot = ''; + }); + + testWithoutContext('throws a tool exit if pub cannot be run', () async { + final FakeProcessManager processManager = FakeProcessManager.empty(); + final BufferLogger logger = BufferLogger.test(); + final MemoryFileSystem fileSystem = MemoryFileSystem.test(); + + processManager.excludedExecutables.add(_dartBin); + fileSystem.file('pubspec.yaml').createSync(); + + final Pub pub = Pub.test( + fileSystem: fileSystem, + logger: logger, + processManager: processManager, + usage: TestUsage(), + platform: FakePlatform(), + botDetector: const FakeBotDetector(false), + stdio: FakeStdio(), + ); + + await expectLater( + () => pub.deps( + FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + ), + throwsToolExit( + message: 'Your Flutter SDK download may be corrupt', + ), + ); + }); + + testWithoutContext('fails on non-zero exit code', () async { + final BufferLogger logger = BufferLogger.test(); + final MemoryFileSystem fileSystem = MemoryFileSystem.test(); + final ProcessManager processManager = _dartPubDepsFails( + 'Bad thing', + project: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + exitCode: 1, + ); + + final Pub pub = Pub.test( + fileSystem: fileSystem, + logger: logger, + processManager: processManager, + usage: TestUsage(), + platform: FakePlatform(), + botDetector: const FakeBotDetector(false), + stdio: FakeStdio(), + ); + + await expectLater( + () => pub.deps( + FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + ), + throwsA( + isA().having( + (StateError e) => e.message, + 'message', + contains('dart pub --suppress-analytics deps --json failed'), + ), + ), + ); + }); + + testWithoutContext('fails on non-parseable JSON', () async { + final BufferLogger logger = BufferLogger.test(); + final MemoryFileSystem fileSystem = MemoryFileSystem.test(); + final ProcessManager processManager = _dartPubDepsReturns( + 'Not JSON haha!', + project: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + ); + + final Pub pub = Pub.test( + fileSystem: fileSystem, + logger: logger, + processManager: processManager, + usage: TestUsage(), + platform: FakePlatform(), + botDetector: const FakeBotDetector(false), + stdio: FakeStdio(), + ); + + await expectLater( + () => pub.deps( + FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + ), + throwsA( + isA().having( + (StateError e) => e.message, + 'message', + contains( + 'dart pub --suppress-analytics deps --json had unexpected output', + ), + ), + ), + ); + }); + + testWithoutContext('fails on unexpected JSON type', () async { + final BufferLogger logger = BufferLogger.test(); + final MemoryFileSystem fileSystem = MemoryFileSystem.test(); + final ProcessManager processManager = _dartPubDepsReturns( + '[]', + project: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + ); + + final Pub pub = Pub.test( + fileSystem: fileSystem, + logger: logger, + processManager: processManager, + usage: TestUsage(), + platform: FakePlatform(), + botDetector: const FakeBotDetector(false), + stdio: FakeStdio(), + ); + + await expectLater( + () => pub.deps( + FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), + ), + throwsA( + isA().having( + (StateError e) => e.message, + 'message', + contains( + 'Not a JSON object', + ), + ), + ), + ); + }); +} + +ProcessManager _dartPubDepsReturns( + String dartPubDepsOutput, { + required FlutterProject project, +}) { + return FakeProcessManager.list([ + FakeCommand( + command: const [ + _dartBin, + 'pub', + '--suppress-analytics', + 'deps', + '--json', + ], + stdout: dartPubDepsOutput, + workingDirectory: project.directory.path, + ), + ]); +} + +ProcessManager _dartPubDepsFails( + String dartPubDepsError, { + required FlutterProject project, + required int exitCode, +}) { + return FakeProcessManager.list([ + FakeCommand( + command: const [ + _dartBin, + 'pub', + '--suppress-analytics', + 'deps', + '--json' + ], + exitCode: exitCode, + stderr: dartPubDepsError, + workingDirectory: project.directory.path, + ), + ]); +} diff --git a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart index 1a9e079620..06af2a5462 100644 --- a/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart +++ b/packages/flutter_tools/test/general.shard/dart/pub_get_test.dart @@ -4,7 +4,6 @@ import 'package:file/file.dart'; import 'package:file/memory.dart'; -import 'package:flutter_tools/src/base/bot_detector.dart'; import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart' show ProcessException; @@ -39,7 +38,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -94,7 +93,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -149,7 +148,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -203,7 +202,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -236,7 +235,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -275,7 +274,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -321,7 +320,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -366,7 +365,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -414,7 +413,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -459,7 +458,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -504,7 +503,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -552,7 +551,7 @@ void main() { processManager: processManager, usage: TestUsage(), platform: FakePlatform(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -597,7 +596,7 @@ void main() { fileSystem: fileSystem, logger: logger, usage: TestUsage(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: mockStdio, processManager: processManager, ); @@ -615,8 +614,8 @@ exit code: 66 project: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), context: PubContext.flutterTests, ), - throwsA(isA() - .having((ToolExit error) => error.message, 'message', contains('Failed to update packages'))), + throwsA(isA().having((ToolExit error) => error.message, + 'message', contains('Failed to update packages'))), ); expect(logger.statusText, isEmpty); expect(logger.traceText, contains(toolExitMessage)); @@ -629,11 +628,14 @@ exit code: 66 expect(processManager, hasNoRemainingExpectations); }); - testWithoutContext('pub get with failing exit code even with OutputMode == failuresOnly', () async { + testWithoutContext( + 'pub get with failing exit code even with OutputMode == failuresOnly', + () async { final BufferLogger logger = BufferLogger.test(); final FileSystem fileSystem = MemoryFileSystem.test(); - final FakeProcessManager processManager = FakeProcessManager.list([ + final FakeProcessManager processManager = + FakeProcessManager.list([ const FakeCommand( command: [ 'bin/cache/dart-sdk/bin/dart', @@ -661,7 +663,7 @@ exit code: 66 fileSystem: fileSystem, logger: logger, usage: TestUsage(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), processManager: processManager, ); @@ -680,7 +682,8 @@ exit code: 66 expect( logger.warningText, contains('git remote set-url upstream'), - reason: 'When update-packages fails, it is often because of missing an upsteam remote.', + reason: + 'When update-packages fails, it is often because of missing an upsteam remote.', ); expect(processManager, hasNoRemainingExpectations); }); @@ -732,7 +735,7 @@ exit code: 66 fileSystem: fileSystem, logger: logger, usage: TestUsage(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), processManager: processManager, ); @@ -793,7 +796,7 @@ exit code: 66 fileSystem: fileSystem, logger: logger, processManager: processManager, - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: mockStdio, ); @@ -844,7 +847,7 @@ exit code: 66 fileSystem: fileSystem, logger: BufferLogger.test(), processManager: processManager, - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: mockStdio, ); @@ -915,7 +918,7 @@ exit code: 66 fileSystem: fileSystem, logger: logger, processManager: processManager, - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), ); @@ -957,7 +960,7 @@ exit code: 66 logger: BufferLogger.test(), processManager: processManager, usage: TestUsage(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: mockStdio, platform: FakePlatform( environment: const { @@ -988,7 +991,7 @@ exit code: 66 fileSystem: fileSystem, logger: BufferLogger.test(), processManager: FakeProcessManager.any(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), usage: usage, platform: FakePlatform(environment: const { @@ -1021,7 +1024,7 @@ exit code: 66 fileSystem: fileSystem, logger: BufferLogger.test(), processManager: FakeProcessManager.any(), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), usage: usage, platform: FakePlatform(environment: const { @@ -1084,7 +1087,7 @@ exit code: 66 fileSystem: fileSystem, logger: BufferLogger.test(), processManager: processManager, - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio(), platform: FakePlatform( environment: const { @@ -1173,7 +1176,7 @@ exit code: 66 platform: FakePlatform( environment: {}, ), - botDetector: const BotDetectorAlwaysNo(), + botDetector: const FakeBotDetector(false), stdio: FakeStdio()); fileSystem.file('version').createSync(); @@ -1211,10 +1214,3 @@ exit code: 66 logger.clear(); }); } - -class BotDetectorAlwaysNo implements BotDetector { - const BotDetectorAlwaysNo(); - - @override - Future get isRunningOnBot async => false; -} diff --git a/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart b/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart index a6e93cfb33..7c5d1d0c34 100644 --- a/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart +++ b/packages/flutter_tools/test/general.shard/ios/ios_device_start_nonprebuilt_test.dart @@ -15,6 +15,7 @@ import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/version.dart'; import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/cache.dart'; +import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device_port_forwarder.dart'; import 'package:flutter_tools/src/ios/application_package.dart'; @@ -34,6 +35,7 @@ import '../../src/common.dart'; import '../../src/context.dart' hide FakeXcodeProjectInterpreter; import '../../src/fake_devices.dart'; import '../../src/fake_process_manager.dart'; +import '../../src/fake_pub_deps.dart'; import '../../src/fakes.dart'; List _xattrArgs(FlutterProject flutterProject) { @@ -74,12 +76,7 @@ const List kRunReleaseArgs = [ // label which plugins are dependency plugins. // // Ideally processPodsIfNeeded should rely on the command (removing this call). -const List kCheckDartPubDeps = [ - 'dart', - 'pub', - 'deps', - '--json', -]; +final Pub fakePubBecauseRefreshPluginsList = FakePubWithPrimedDeps(); const String kConcurrentBuildErrorMessage = ''' "/Developer/Xcode/DerivedData/foo/XCBuildData/build.db": @@ -144,7 +141,6 @@ void main() { final BuildableIOSApp buildableIOSApp = BuildableIOSApp(flutterProject.ios, 'flutter', 'My Super Awesome App'); processManager.addCommand(FakeCommand(command: _xattrArgs(flutterProject))); - processManager.addCommand(const FakeCommand(command: kCheckDartPubDeps)); processManager.addCommand(const FakeCommand(command: kRunReleaseArgs)); final LaunchResult launchResult = await iosDevice.startApp( @@ -166,6 +162,7 @@ void main() { ); }, overrides: { ProcessManager: () => processManager, + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -219,7 +216,6 @@ void main() { fileSystem.directory('build/ios/Release-iphoneos/My Super Awesome App.app').createSync(recursive: true); processManager.addCommand(FakeCommand(command: _xattrArgs(flutterProject))); - processManager.addCommand(const FakeCommand(command: kCheckDartPubDeps)); processManager.addCommand(const FakeCommand(command: kRunReleaseArgs)); processManager.addCommand(const FakeCommand(command: [ 'rsync', @@ -258,6 +254,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => processManager, + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -280,7 +277,6 @@ void main() { fileSystem.directory('build/ios/Release-iphoneos/My Super Awesome App.app').createSync(recursive: true); processManager.addCommand(FakeCommand(command: _xattrArgs(flutterProject))); - processManager.addCommand(const FakeCommand(command: kCheckDartPubDeps)); processManager.addCommand(const FakeCommand(command: [ 'xcrun', 'xcodebuild', @@ -347,6 +343,7 @@ void main() { OperatingSystemUtils: () => FakeOperatingSystemUtils( hostPlatform: HostPlatform.darwin_x64, ), + Pub: () => fakePubBecauseRefreshPluginsList, Platform: () => macPlatform, XcodeProjectInterpreter: () => fakeXcodeProjectInterpreter, Xcode: () => xcode, @@ -364,7 +361,6 @@ void main() { final BuildableIOSApp buildableIOSApp = BuildableIOSApp(flutterProject.ios, 'flutter', 'My Super Awesome App'); processManager.addCommand(FakeCommand(command: _xattrArgs(flutterProject))); - processManager.addCommand(const FakeCommand(command: kCheckDartPubDeps)); // The first xcrun call should fail with a // concurrent build exception. processManager.addCommand( @@ -419,6 +415,7 @@ void main() { hostPlatform: HostPlatform.darwin_arm64, ), Platform: () => macPlatform, + Pub: () => fakePubBecauseRefreshPluginsList, XcodeProjectInterpreter: () => fakeXcodeProjectInterpreter, Xcode: () => xcode, }); @@ -472,6 +469,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -507,6 +505,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -542,6 +541,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -578,6 +578,7 @@ void main() { expect(coreDeviceControl.argumentsUsedForLaunch, contains('--enable-dart-profiling')); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -645,6 +646,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -721,6 +723,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -802,6 +805,7 @@ void main() { expect(contents.contains('CONFIGURATION_BUILD_DIR'), isFalse); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, @@ -842,6 +846,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, Platform: () => macPlatform, @@ -881,6 +886,7 @@ void main() { expect(processManager, hasNoRemainingExpectations); }, overrides: { ProcessManager: () => FakeProcessManager.any(), + Pub: () => fakePubBecauseRefreshPluginsList, FileSystem: () => fileSystem, Logger: () => logger, OperatingSystemUtils: () => os, diff --git a/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart b/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart index 454222d247..fde5c90e4a 100644 --- a/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart +++ b/packages/flutter_tools/test/general.shard/macos/cocoapod_utils_test.dart @@ -8,6 +8,7 @@ import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/build_info.dart'; +import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/flutter_manifest.dart'; import 'package:flutter_tools/src/macos/cocoapod_utils.dart'; import 'package:flutter_tools/src/macos/cocoapods.dart'; @@ -16,6 +17,7 @@ import 'package:test/fake.dart'; import '../../src/common.dart'; import '../../src/context.dart'; +import '../../src/fake_pub_deps.dart'; void main() { group('processPodsIfNeeded', () { @@ -107,7 +109,8 @@ void main() { expect(cocoaPods.processedPods, isTrue); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -125,7 +128,8 @@ void main() { expect(cocoaPods.processedPods, isTrue); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -142,7 +146,8 @@ void main() { expect(cocoaPods.processedPods, isFalse); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -158,7 +163,8 @@ void main() { expect(cocoaPods.processedPods, isFalse); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); }); @@ -182,7 +188,8 @@ void main() { expect(cocoaPods.processedPods, isTrue); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -203,7 +210,7 @@ void main() { expect(cocoaPods.processedPods, isFalse); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, CocoaPods: () => cocoaPods, }); @@ -235,7 +242,8 @@ void main() { ); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, Logger: () => logger, }); @@ -260,7 +268,8 @@ void main() { expect(cocoaPods.processedPods, isTrue); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -278,7 +287,8 @@ void main() { expect(cocoaPods.processedPods, isTrue); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -295,7 +305,8 @@ void main() { expect(cocoaPods.processedPods, isFalse); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -311,7 +322,8 @@ void main() { expect(cocoaPods.processedPods, isFalse); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); }); @@ -335,7 +347,8 @@ void main() { expect(cocoaPods.processedPods, isTrue); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, }); @@ -356,7 +369,7 @@ void main() { expect(cocoaPods.processedPods, isFalse); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, CocoaPods: () => cocoaPods, }); @@ -388,7 +401,8 @@ void main() { ); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, CocoaPods: () => cocoaPods, Logger: () => logger, }); diff --git a/packages/flutter_tools/test/general.shard/plugins_test.dart b/packages/flutter_tools/test/general.shard/plugins_test.dart index 6051e967bd..08c07c4fa7 100644 --- a/packages/flutter_tools/test/general.shard/plugins_test.dart +++ b/packages/flutter_tools/test/general.shard/plugins_test.dart @@ -14,6 +14,7 @@ import 'package:flutter_tools/src/base/os.dart'; import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/time.dart'; import 'package:flutter_tools/src/base/utils.dart'; +import 'package:flutter_tools/src/dart/pub.dart'; import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/flutter_manifest.dart'; import 'package:flutter_tools/src/flutter_plugins.dart'; @@ -30,6 +31,7 @@ import 'package:yaml/yaml.dart'; import '../src/common.dart'; import '../src/context.dart'; +import '../src/fake_pub_deps.dart'; import '../src/fakes.dart' hide FakeOperatingSystemUtils; import '../src/pubspec_schema.dart'; @@ -462,7 +464,8 @@ dependencies: expect(flutterProject.flutterPluginsDependenciesFile, exists); }, overrides: { FileSystem: () => fs, - ProcessManager: () => FakeProcessManager.any(), + ProcessManager: FakeProcessManager.empty, + Pub: FakePubWithPrimedDeps.new, }); testUsingContext( diff --git a/packages/flutter_tools/test/src/context.dart b/packages/flutter_tools/test/src/context.dart index 8207b601da..6adfd1facb 100644 --- a/packages/flutter_tools/test/src/context.dart +++ b/packages/flutter_tools/test/src/context.dart @@ -121,7 +121,7 @@ void testUsingContext( FileSystem: () => LocalFileSystemBlockingSetCurrentDirectory(), PlistParser: () => FakePlistParser(), Signals: () => FakeSignals(), - Pub: () => ThrowingPub(), // prevent accidentally using pub. + Pub: () => const ThrowingPub(), // prevent accidentally using pub. CrashReporter: () => const NoopCrashReporter(), TemplateRenderer: () => const MustacheTemplateRenderer(), BuildTargets: () => const BuildTargetsImpl(), diff --git a/packages/flutter_tools/test/src/fake_pub_deps.dart b/packages/flutter_tools/test/src/fake_pub_deps.dart new file mode 100644 index 0000000000..87e80cd35b --- /dev/null +++ b/packages/flutter_tools/test/src/fake_pub_deps.dart @@ -0,0 +1,84 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_tools/src/dart/pub.dart'; +import 'package:flutter_tools/src/project.dart'; + +/// A fake implementation of [Pub] with a pre-primed [deps] response. +final class FakePubWithPrimedDeps implements Pub { + /// Creates an implementation of [Pub] with a pre-primed [Pub.deps] response. + /// + /// It is expected that every [FlutterProject] that is provided to the + /// [Pub.deps] call is represented by [rootPackageName]. + /// + /// Optionally, provide [devDependencies] (of [rootPackageName]), and non + /// dev-dependencies ([dependencies]) of any package to a set of any other + /// packages. A resulting valid `dart pub deps --json` response is implicitly + /// created. + factory FakePubWithPrimedDeps({ + String rootPackageName = 'app_name', + Set devDependencies = const {}, + Map> dependencies = const >{}, + }) { + // Start the packages: [ ... ] list with the root package. + final List packages = [ + { + 'name': rootPackageName, + 'kind': 'root', + 'dependencies': [ + ...dependencies.keys, + ...devDependencies, + ]..sort(), + 'directDependencies': [ + ...?dependencies[rootPackageName], + ...devDependencies, + ]..sort(), + 'devDependencies': [ + ...devDependencies, + ], + }, + ]; + + // Add all non-dev dependencies. + for (final String packageName in dependencies.keys) { + final bool direct = dependencies[rootPackageName]!.contains(packageName); + packages.add({ + 'name': packageName, + 'kind': direct ? 'direct' : 'transitive', + 'dependencies': [ + ...?dependencies[packageName], + ], + 'directDependencies': [ + ...?dependencies[packageName], + ], + }); + } + + // Add all dev-dependencies. + for (final String packageName in devDependencies) { + packages.add({ + 'name': packageName, + 'kind': 'dev', + 'dependencies': [], + 'directDependencies': [], + }); + } + + return FakePubWithPrimedDeps._({ + 'root': rootPackageName, + 'packages': packages, + }); + } + + const FakePubWithPrimedDeps._(this._deps); + final Map _deps; + + @override + Future> deps(FlutterProject project) async => _deps; + + @override + Never noSuchMethod(Invocation invocation) { + throw UnsupportedError('Only .deps is expected to be called'); + } +} diff --git a/packages/flutter_tools/test/src/testbed.dart b/packages/flutter_tools/test/src/testbed.dart index 056de65177..b8b86c742c 100644 --- a/packages/flutter_tools/test/src/testbed.dart +++ b/packages/flutter_tools/test/src/testbed.dart @@ -44,7 +44,7 @@ final Map _testbedDefaults = { Analytics: () => const NoOpAnalytics(), FlutterVersion: () => FakeFlutterVersion(), // prevent requirement to mock git for test runner. Signals: () => FakeSignals(), // prevent registering actual signal handlers. - Pub: () => ThrowingPub(), // prevent accidental invocations of pub. + Pub: () => const ThrowingPub(), // prevent accidental invocations of pub. }; /// Manages interaction with the tool injection and runner system. diff --git a/packages/flutter_tools/test/src/throwing_pub.dart b/packages/flutter_tools/test/src/throwing_pub.dart index 580722a800..e3fc8be232 100644 --- a/packages/flutter_tools/test/src/throwing_pub.dart +++ b/packages/flutter_tools/test/src/throwing_pub.dart @@ -3,47 +3,25 @@ // found in the LICENSE file. import 'package:flutter_tools/src/dart/pub.dart'; -import 'package:flutter_tools/src/project.dart'; -class ThrowingPub implements Pub { - @override - Future batch(List arguments, { - PubContext? context, - String? directory, - MessageFilter? filter, - String? failureMessage = 'pub failed', - }) { - throw UnsupportedError('Attempted to invoke pub during test.'); - } +final class ThrowingPub implements Pub { + const ThrowingPub(); @override - Future get({ - PubContext? context, - required FlutterProject project, - bool upgrade = false, - bool offline = false, - bool checkLastModified = true, - bool skipPubspecYamlCheck = false, - bool generateSyntheticPackage = false, - bool generateSyntheticPackageForExample = false, - String? flutterRootOverride, - bool checkUpToDate = false, - bool shouldSkipThirdPartyGenerator = true, - PubOutputMode outputMode = PubOutputMode.all, - }) { - throw UnsupportedError('Attempted to invoke pub during test.'); - } - - @override - Future interactively( - List arguments, { - FlutterProject? project, - required PubContext context, - required String command, - bool touchesPackageConfig = false, - bool generateSyntheticPackage = false, - PubOutputMode outputMode = PubOutputMode.all, - }) { - throw UnsupportedError('Attempted to invoke pub during test.'); + Never noSuchMethod(Invocation invocation) { + throw UnsupportedError( + 'Attempted to invoke pub during test, which otherwise was unexpected. ' + 'This error may be caused by either changing the implementation details ' + 'of the Flutter CLI in where the "Pub" class is now being used, or ' + 'adding a unit test that transitively depends on "Pub".\n' + '\n' + 'Possible options for resolution:\n' + ' 1. Refactor the code or test to not rely on "Pub".\n' + ' 2. Create and use a test-appropriate Fake (grep for "implements Pub") ' + ' for example code across the test/ repo. It is possible that the ' + ' file you are editing already has an appropriate Fake.\n' + ' 3. Use "FakePubWithPrimedDeps" if your code will transitively call ' + ' "dart pub deps --json" and you need a realistic output.', + ); } }