Move dart pub deps call to <Pub>.deps and use it accordingly (#158524)

Closes https://github.com/flutter/flutter/issues/158396, closes https://github.com/flutter/flutter/pull/158370.
This commit is contained in:
Matan Lurey 2024-11-13 10:03:53 -08:00 committed by GitHub
parent 4de32b8702
commit 2d1a3efc38
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 600 additions and 337 deletions

View File

@ -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<Set<String>> computeExclusiveDevDependencies(
ProcessManager processes, {
Pub pub, {
required Logger logger,
required String projectPath,
required FlutterProject project,
}) async {
final ProcessResult processResult = await processes.run(
<String>['dart', 'pub', 'deps', '--json'],
workingDirectory: projectPath,
);
final Map<String, Object?> 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<String, Object?> 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 <String>{};
}
jsonResult = json.decode(stdout) as Map<String, Object?>;
} on FormatException catch (e) {
fail('$e');
}
List<T> asListOrFail<T>(Object? value, String name) {
// Allow omitting a list as empty to default to an empty list
if (value == null) {

View File

@ -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<Map<String, Object?>> 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<Map<String, Object?>> deps(FlutterProject project) async {
final List<String> pubCommand = <String>[
..._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<String, Object?>) {
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

View File

@ -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<List<Plugin>> findPlugins(
devDependencies = <String>{};
} else {
devDependencies = await computeExclusiveDevDependencies(
globals.processManager,
pub,
logger: globals.logger,
projectPath: project.directory.path,
project: project,
);
}
for (final Package package in packageConfig.packages) {

View File

@ -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: <String>[
'dart',
'pub',
'deps',
'--json',
]);
FakeCommand setUpRsyncCommand({void Function(List<String> command)? onRun}) {
return FakeCommand(
command: const <String>[
@ -305,9 +300,9 @@ void main() {
expect(testLogger.statusText, contains(RegExp(r'✓ Built build/ios/iphoneos/Runner\.app \(\d+\.\d+MB\)')));
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
Pub: FakePubWithPrimedDeps.new,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(onRun: (_) {
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
}),
@ -331,7 +326,6 @@ void main() {
processManager.addCommands(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(onRun: (_) {
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
}),
@ -345,6 +339,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -369,7 +364,6 @@ void main() {
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(customNaming: true, onRun: (_) {
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
}),
@ -446,6 +440,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -462,7 +457,6 @@ void main() {
);
processManager.addCommands(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(deviceId: '1234', onRun: (_) {
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
}),
@ -477,6 +471,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -493,7 +488,6 @@ void main() {
);
processManager.addCommands(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(simulator: true, onRun: (_) {
fileSystem.directory('build/ios/Debug-iphonesimulator/Runner.app').createSync(recursive: true);
}),
@ -507,6 +501,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -524,7 +519,6 @@ void main() {
createMinimalMockProjectFiles();
processManager.addCommands(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(verbose: true, onRun: (_) {
fileSystem.directory('build/ios/Release-iphoneos/Runner.app').createSync(recursive: true);
}),
@ -537,6 +531,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -553,7 +548,6 @@ void main() {
);
processManager.addCommands(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(exitCode: 1),
setUpXCResultCommand(stdout: kSampleResultJsonWithIssues),
setUpRsyncCommand(),
@ -871,6 +865,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => processManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -887,7 +882,6 @@ void main() {
);
processManager.addCommands(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(
exitCode: 1,
onRun: (_) {
@ -1195,6 +1189,7 @@ Runner requires a provisioning profile. Select a provisioning profile in the Sig
}, overrides: <Type, Generator>{
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(),
});

View File

@ -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: <String>[
'dart',
'pub',
'deps',
'--json',
]);
FakeCommand setUpXCResultCommand({String stdout = '', void Function(List<String> command)? onRun}) {
return FakeCommand(
command: const <String>[
@ -405,7 +400,6 @@ void main() {
);
fakeProcessManager.addCommands(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(),
const FakeCommand(
command: <String>[
@ -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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(),
exportArchiveCommand(exportOptionsPlist: _exportOptionsPlist),
]);
@ -1014,6 +1008,7 @@ void main() {
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => fakeProcessManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -1030,7 +1025,6 @@ void main() {
);
fakeProcessManager.addCommands(<FakeCommand>[
xattrCommand,
dartPubDepsCommand,
const FakeCommand(
command: <String>[
'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: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => fakeProcessManager,
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithBuildSettings(),
});
@ -1115,7 +1110,6 @@ void main() {
..writeAsBytesSync(List<int>.generate(10000, (int index) => 0));
fakeProcessManager.addCommands(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(<FakeCommand>[
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(),
});

View File

@ -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: <String>[
'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: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Debug'),
]),
Pub: FakePubWithPrimedDeps.new,
Platform: () => macosPlatform,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -333,10 +329,10 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Release'),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -358,10 +354,10 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Debug'),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -383,10 +379,10 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Debug', verbose: true),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -409,10 +405,10 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Profile'),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
XcodeProjectInterpreter: () => FakeXcodeProjectInterpreterWithProfile(),
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -435,10 +431,10 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Release'),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -499,10 +495,10 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Release'),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
Artifacts: () => Artifacts.test(),
});
@ -518,7 +514,6 @@ STDERR STUFF
createMinimalMockProjectFiles();
fakeProcessManager.addCommands(<FakeCommand>[
dartPubDepsCommand,
FakeCommand(
command: <String>[
'/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: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler('Debug'),
]),
Platform: () => macosPlatform,
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -664,11 +660,11 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
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: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
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: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(
'Debug',
additionalCommandArguements: <String>[
@ -787,6 +782,7 @@ STDERR STUFF
'LUCI_CI': 'True'
}
),
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
@ -840,7 +836,6 @@ STDERR STUFF
}, overrides: <Type, Generator>{
FileSystem: () => fileSystem,
ProcessManager: () => FakeProcessManager.list(<FakeCommand>[
dartPubDepsCommand,
setUpFakeXcodeBuildHandler(
'Release',
additionalCommandArguements: <String>[
@ -856,6 +851,7 @@ STDERR STUFF
'LUCI_CI': 'True'
}
),
Pub: FakePubWithPrimedDeps.new,
FeatureFlags: () => TestFeatureFlags(isMacOSEnabled: true),
});
}

View File

@ -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<String> 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<String> 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<String> 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<String> 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<String> 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<StateError>().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<StateError>().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>[
FakeCommand(
command: const <String>['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>[
FakeCommand(
command: const <String>['dart', 'pub', 'deps', '--json'],
exitCode: exitCode,
stderr: dartPubDepsError,
workingDirectory: _fakeProjectPath,
command: const <String>[
_dartBin,
'pub',
'--suppress-analytics',
'deps',
'--json',
],
stdout: dartPubDepsOutput,
workingDirectory: project.directory.path,
),
]);
}

View File

@ -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<StateError>().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<StateError>().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<StateError>().having(
(StateError e) => e.message,
'message',
contains(
'Not a JSON object',
),
),
),
);
});
}
ProcessManager _dartPubDepsReturns(
String dartPubDepsOutput, {
required FlutterProject project,
}) {
return FakeProcessManager.list(<FakeCommand>[
FakeCommand(
command: const <String>[
_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>[
FakeCommand(
command: const <String>[
_dartBin,
'pub',
'--suppress-analytics',
'deps',
'--json'
],
exitCode: exitCode,
stderr: dartPubDepsError,
workingDirectory: project.directory.path,
),
]);
}

View File

@ -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<ToolExit>()
.having((ToolExit error) => error.message, 'message', contains('Failed to update packages'))),
throwsA(isA<ToolExit>().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(<FakeCommand>[
final FakeProcessManager processManager =
FakeProcessManager.list(<FakeCommand>[
const FakeCommand(
command: <String>[
'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 <String, String>{
@ -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 <String, String>{
@ -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 <String, String>{
@ -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 <String, String>{
@ -1173,7 +1176,7 @@ exit code: 66
platform: FakePlatform(
environment: <String, String>{},
),
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<bool> get isRunningOnBot async => false;
}

View File

@ -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<String> _xattrArgs(FlutterProject flutterProject) {
@ -74,12 +76,7 @@ const List<String> kRunReleaseArgs = <String>[
// label which plugins are dependency plugins.
//
// Ideally processPodsIfNeeded should rely on the command (removing this call).
const List<String> kCheckDartPubDeps = <String> [
'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: <Type, Generator>{
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: <String>[
'rsync',
@ -258,6 +254,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
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: <String>[
'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: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
OperatingSystemUtils: () => os,
@ -507,6 +505,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
OperatingSystemUtils: () => os,
@ -542,6 +541,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
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: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
OperatingSystemUtils: () => os,
@ -645,6 +646,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
OperatingSystemUtils: () => os,
@ -721,6 +723,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
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: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
OperatingSystemUtils: () => os,
@ -842,6 +846,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
Platform: () => macPlatform,
@ -881,6 +886,7 @@ void main() {
expect(processManager, hasNoRemainingExpectations);
}, overrides: <Type, Generator>{
ProcessManager: () => FakeProcessManager.any(),
Pub: () => fakePubBecauseRefreshPluginsList,
FileSystem: () => fileSystem,
Logger: () => logger,
OperatingSystemUtils: () => os,

View File

@ -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: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -125,7 +128,8 @@ void main() {
expect(cocoaPods.processedPods, isTrue);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -142,7 +146,8 @@ void main() {
expect(cocoaPods.processedPods, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -158,7 +163,8 @@ void main() {
expect(cocoaPods.processedPods, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
});
@ -182,7 +188,8 @@ void main() {
expect(cocoaPods.processedPods, isTrue);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -203,7 +210,7 @@ void main() {
expect(cocoaPods.processedPods, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
CocoaPods: () => cocoaPods,
});
@ -235,7 +242,8 @@ void main() {
);
}, overrides: <Type, Generator>{
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: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -278,7 +287,8 @@ void main() {
expect(cocoaPods.processedPods, isTrue);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -295,7 +305,8 @@ void main() {
expect(cocoaPods.processedPods, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -311,7 +322,8 @@ void main() {
expect(cocoaPods.processedPods, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
});
@ -335,7 +347,8 @@ void main() {
expect(cocoaPods.processedPods, isTrue);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
});
@ -356,7 +369,7 @@ void main() {
expect(cocoaPods.processedPods, isFalse);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
CocoaPods: () => cocoaPods,
});
@ -388,7 +401,8 @@ void main() {
);
}, overrides: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
CocoaPods: () => cocoaPods,
Logger: () => logger,
});

View File

@ -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: <Type, Generator>{
FileSystem: () => fs,
ProcessManager: () => FakeProcessManager.any(),
ProcessManager: FakeProcessManager.empty,
Pub: FakePubWithPrimedDeps.new,
});
testUsingContext(

View File

@ -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(),

View File

@ -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<String> devDependencies = const <String>{},
Map<String, Set<String>> dependencies = const <String, Set<String>>{},
}) {
// Start the packages: [ ... ] list with the root package.
final List<Object?> packages = <Object?>[
<String, Object?>{
'name': rootPackageName,
'kind': 'root',
'dependencies': <String>[
...dependencies.keys,
...devDependencies,
]..sort(),
'directDependencies': <String>[
...?dependencies[rootPackageName],
...devDependencies,
]..sort(),
'devDependencies': <String>[
...devDependencies,
],
},
];
// Add all non-dev dependencies.
for (final String packageName in dependencies.keys) {
final bool direct = dependencies[rootPackageName]!.contains(packageName);
packages.add(<String, Object?>{
'name': packageName,
'kind': direct ? 'direct' : 'transitive',
'dependencies': <String>[
...?dependencies[packageName],
],
'directDependencies': <String>[
...?dependencies[packageName],
],
});
}
// Add all dev-dependencies.
for (final String packageName in devDependencies) {
packages.add(<String, Object?>{
'name': packageName,
'kind': 'dev',
'dependencies': <String>[],
'directDependencies': <String>[],
});
}
return FakePubWithPrimedDeps._(<String, Object?>{
'root': rootPackageName,
'packages': packages,
});
}
const FakePubWithPrimedDeps._(this._deps);
final Map<String, Object?> _deps;
@override
Future<Map<String, Object?>> deps(FlutterProject project) async => _deps;
@override
Never noSuchMethod(Invocation invocation) {
throw UnsupportedError('Only <Pub>.deps is expected to be called');
}
}

View File

@ -44,7 +44,7 @@ final Map<Type, Generator> _testbedDefaults = <Type, Generator>{
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.

View File

@ -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<void> batch(List<String> 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<void> 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<void> interactively(
List<String> 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.',
);
}
}