Unverified Commit 3b15d6a5 authored by Nehal Patel's avatar Nehal Patel Committed by GitHub

Removes retries from "dart pub get" and un-buffers its stdout/stderr output (#115801)

* Removes retries from "pub get" and proxies its stdout output

* Fix issue where ErrorHandlingProcessManager does not forward "mode" parameter to backing ProcessManager's "start" method

* Make "pub get" use ProcessStartMode.inheritStdio instead of forwarding bytes to stdout and stderr

* Fix tests

* Remove unused env var

* Add back 'Running "flutter pub get"...' status log

* Fix indent

* Add Pub.test() constructor which lets tests mock stdio
parent 49f59809
...@@ -699,6 +699,7 @@ class ErrorHandlingProcessManager extends ProcessManager { ...@@ -699,6 +699,7 @@ class ErrorHandlingProcessManager extends ProcessManager {
environment: environment, environment: environment,
includeParentEnvironment: includeParentEnvironment, includeParentEnvironment: includeParentEnvironment,
runInShell: runInShell, runInShell: runInShell,
mode: mode,
); );
}, platform: _platform); }, platform: _platform);
} }
......
...@@ -267,7 +267,6 @@ class Stdio { ...@@ -267,7 +267,6 @@ class Stdio {
} }
io.Stdout? _stdout; io.Stdout? _stdout;
@visibleForTesting
io.IOSink get stderr { io.IOSink get stderr {
if (_stderr != null) { if (_stderr != null) {
return _stderr!; return _stderr!;
......
...@@ -197,6 +197,7 @@ abstract class ProcessUtils { ...@@ -197,6 +197,7 @@ abstract class ProcessUtils {
String? workingDirectory, String? workingDirectory,
bool allowReentrantFlutter = false, bool allowReentrantFlutter = false,
Map<String, String>? environment, Map<String, String>? environment,
ProcessStartMode mode = ProcessStartMode.normal,
}); });
/// This runs the command and streams stdout/stderr from the child process to /// This runs the command and streams stdout/stderr from the child process to
...@@ -422,12 +423,14 @@ class _DefaultProcessUtils implements ProcessUtils { ...@@ -422,12 +423,14 @@ class _DefaultProcessUtils implements ProcessUtils {
String? workingDirectory, String? workingDirectory,
bool allowReentrantFlutter = false, bool allowReentrantFlutter = false,
Map<String, String>? environment, Map<String, String>? environment,
ProcessStartMode mode = ProcessStartMode.normal,
}) { }) {
_traceCommand(cmd, workingDirectory: workingDirectory); _traceCommand(cmd, workingDirectory: workingDirectory);
return _processManager.start( return _processManager.start(
cmd, cmd,
workingDirectory: workingDirectory, workingDirectory: workingDirectory,
environment: _environment(allowReentrantFlutter, environment), environment: _environment(allowReentrantFlutter, environment),
mode: mode,
); );
} }
......
...@@ -311,7 +311,6 @@ Future<T> runInContext<T>( ...@@ -311,7 +311,6 @@ Future<T> runInContext<T>(
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
usage: globals.flutterUsage, usage: globals.flutterUsage,
stdio: globals.stdio,
), ),
Stdio: () => Stdio(), Stdio: () => Stdio(),
SystemClock: () => const SystemClock(), SystemClock: () => const SystemClock(),
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'dart:async'; import 'dart:async';
import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:process/process.dart'; import 'package:process/process.dart';
...@@ -31,10 +32,6 @@ const String _kPubEnvironmentKey = 'PUB_ENVIRONMENT'; ...@@ -31,10 +32,6 @@ const String _kPubEnvironmentKey = 'PUB_ENVIRONMENT';
/// The console environment key used by the pub tool to find the cache directory. /// The console environment key used by the pub tool to find the cache directory.
const String _kPubCacheEnvironmentKey = 'PUB_CACHE'; const String _kPubCacheEnvironmentKey = 'PUB_CACHE';
/// The UNAVAILABLE exit code returned by the pub tool.
/// (see https://github.com/dart-lang/pub/blob/master/lib/src/exit_codes.dart)
const int _kPubExitCodeUnavailable = 69;
typedef MessageFilter = String? Function(String message); typedef MessageFilter = String? Function(String message);
/// globalCachePath is the directory in which the content of the localCachePath will be moved in /// globalCachePath is the directory in which the content of the localCachePath will be moved in
...@@ -150,9 +147,20 @@ abstract class Pub { ...@@ -150,9 +147,20 @@ abstract class Pub {
required Platform platform, required Platform platform,
required BotDetector botDetector, required BotDetector botDetector,
required Usage usage, required Usage usage,
required Stdio stdio,
}) = _DefaultPub; }) = _DefaultPub;
/// Create a [Pub] instance with a mocked [stdio].
@visibleForTesting
factory Pub.test({
required FileSystem fileSystem,
required Logger logger,
required ProcessManager processManager,
required Platform platform,
required BotDetector botDetector,
required Usage usage,
required Stdio stdio,
}) = _DefaultPub.test;
/// Runs `pub get` or `pub upgrade` for [project]. /// Runs `pub get` or `pub upgrade` for [project].
/// ///
/// [context] provides extra information to package server requests to /// [context] provides extra information to package server requests to
...@@ -214,6 +222,26 @@ class _DefaultPub implements Pub { ...@@ -214,6 +222,26 @@ class _DefaultPub implements Pub {
required Platform platform, required Platform platform,
required BotDetector botDetector, required BotDetector botDetector,
required Usage usage, required Usage usage,
}) : _fileSystem = fileSystem,
_logger = logger,
_platform = platform,
_botDetector = botDetector,
_usage = usage,
_processUtils = ProcessUtils(
logger: logger,
processManager: processManager,
),
_processManager = processManager,
_stdio = null;
@visibleForTesting
_DefaultPub.test({
required FileSystem fileSystem,
required Logger logger,
required ProcessManager processManager,
required Platform platform,
required BotDetector botDetector,
required Usage usage,
required Stdio stdio, required Stdio stdio,
}) : _fileSystem = fileSystem, }) : _fileSystem = fileSystem,
_logger = logger, _logger = logger,
...@@ -234,7 +262,7 @@ class _DefaultPub implements Pub { ...@@ -234,7 +262,7 @@ class _DefaultPub implements Pub {
final BotDetector _botDetector; final BotDetector _botDetector;
final Usage _usage; final Usage _usage;
final ProcessManager _processManager; final ProcessManager _processManager;
final Stdio _stdio; final Stdio? _stdio;
@override @override
Future<void> get({ Future<void> get({
...@@ -315,7 +343,7 @@ class _DefaultPub implements Pub { ...@@ -315,7 +343,7 @@ class _DefaultPub implements Pub {
'--offline', '--offline',
'--example', '--example',
]; ];
await _runWithRetries( await _runWithStdioInherited(
args, args,
command: command, command: command,
context: context, context: context,
...@@ -346,15 +374,15 @@ class _DefaultPub implements Pub { ...@@ -346,15 +374,15 @@ class _DefaultPub implements Pub {
} }
} }
/// Runs pub with [arguments]. /// Runs pub with [arguments] and [ProcessStartMode.inheritStdio] mode.
/// ///
/// Retries the command as long as the exit code is /// Uses [ProcessStartMode.normal] and [Pub._stdio] if [Pub.test] constructor
/// `_kPubExitCodeUnavailable`. /// was used.
/// ///
/// Prints the stderr and stdout of the last run. /// Prints the stdout and stderr of the whole run.
/// ///
/// Sends an analytics event /// Sends an analytics event.
Future<void> _runWithRetries( Future<void> _runWithStdioInherited(
List<String> arguments, { List<String> arguments, {
required String command, required String command,
required bool printProgress, required bool printProgress,
...@@ -365,57 +393,47 @@ class _DefaultPub implements Pub { ...@@ -365,57 +393,47 @@ class _DefaultPub implements Pub {
String? flutterRootOverride, String? flutterRootOverride,
}) async { }) async {
int exitCode; int exitCode;
int attempts = 0;
int duration = 1;
List<_OutputLine>? output;
StreamSubscription<String> recordLines(Stream<List<int>> stream, _OutputStream streamName) {
return stream
.transform<String>(utf8.decoder)
.transform<String>(const LineSplitter())
.listen((String line) => output!.add(_OutputLine(line, streamName)));
}
final Status? status = printProgress _logger.printStatus('Running "flutter pub $command" in ${_fileSystem.path.basename(directory)}...');
? _logger.startProgress('Running "flutter pub $command" in ${_fileSystem.path.basename(directory)}...',)
: null;
final List<String> pubCommand = _pubCommand(arguments); final List<String> pubCommand = _pubCommand(arguments);
final Map<String, String> pubEnvironment = await _createPubEnvironment(context, flutterRootOverride); final Map<String, String> pubEnvironment = await _createPubEnvironment(context, flutterRootOverride);
try { try {
do { final io.Process process;
output = <_OutputLine>[]; final io.Stdio? stdio = _stdio;
attempts += 1;
final io.Process process = await _processUtils.start( if (stdio != null) {
// Omit mode parameter and direct pub output to [Pub._stdio] for tests.
process = await _processUtils.start(
pubCommand, pubCommand,
workingDirectory: _fileSystem.path.current, workingDirectory: _fileSystem.path.current,
environment: pubEnvironment, environment: pubEnvironment,
); );
final StreamSubscription<String> stdoutSubscription =
recordLines(process.stdout, _OutputStream.stdout);
final StreamSubscription<String> stderrSubscription =
recordLines(process.stderr, _OutputStream.stderr);
exitCode = await process.exitCode; final StreamSubscription<List<int>> stdoutSubscription =
process.stdout.listen(stdio.stdout.add);
final StreamSubscription<List<int>> stderrSubscription =
process.stderr.listen(stdio.stderr.add);
await Future.wait<void>(<Future<void>>[
stdoutSubscription.asFuture<void>(),
stderrSubscription.asFuture<void>(),
]);
unawaited(stdoutSubscription.cancel()); unawaited(stdoutSubscription.cancel());
unawaited(stderrSubscription.cancel()); unawaited(stderrSubscription.cancel());
} else {
// Let pub inherit stdio for normal operation.
process = await _processUtils.start(
pubCommand,
workingDirectory: _fileSystem.path.current,
environment: pubEnvironment,
mode: ProcessStartMode.inheritStdio,
);
}
if (retry && exitCode == _kPubExitCodeUnavailable) { exitCode = await process.exitCode;
_logger.printStatus(
'$failureMessage (server unavailable) -- attempting retry $attempts in $duration '
'second${ duration == 1 ? "" : "s"}...',
);
await Future<void>.delayed(Duration(seconds: duration));
if (duration < 64) {
duration *= 2;
}
// This will cause a retry.
output = null;
}
} while (output == null);
status?.stop();
// The exception is rethrown, so don't catch only Exceptions. // The exception is rethrown, so don't catch only Exceptions.
} catch (exception) { // ignore: avoid_catches_without_on_clauses } catch (exception) { // ignore: avoid_catches_without_on_clauses
status?.cancel();
if (exception is io.ProcessException) { if (exception is io.ProcessException) {
final StringBuffer buffer = StringBuffer('${exception.message}\n'); final StringBuffer buffer = StringBuffer('${exception.message}\n');
final String directoryExistsMessage = _fileSystem.directory(directory).existsSync() final String directoryExistsMessage = _fileSystem.directory(directory).existsSync()
...@@ -434,40 +452,19 @@ class _DefaultPub implements Pub { ...@@ -434,40 +452,19 @@ class _DefaultPub implements Pub {
rethrow; rethrow;
} }
if (printProgress) {
// Show the output of the last run.
for (final _OutputLine line in output) {
switch (line.stream) {
case _OutputStream.stdout:
_stdio.stdoutWrite('${line.line}\n');
break;
case _OutputStream.stderr:
_stdio.stderrWrite('${line.line}\n');
break;
}
}
}
final int code = exitCode; final int code = exitCode;
String result = 'success'; final String result = code == 0 ? 'success' : 'failure';
if (output.any((_OutputLine line) => line.line.contains('version solving failed'))) {
result = 'version-solving-failed';
} else if (code != 0) {
result = 'failure';
}
PubResultEvent( PubResultEvent(
context: context.toAnalyticsString(), context: context.toAnalyticsString(),
result: result, result: result,
usage: _usage, usage: _usage,
).send(); ).send();
final String lastPubMessage = output.isEmpty ? 'no message' : output.last.line;
if (code != 0) { if (code != 0) {
final StringBuffer buffer = StringBuffer('$failureMessage\n'); final StringBuffer buffer = StringBuffer('$failureMessage\n');
buffer.writeln('command: "${pubCommand.join(' ')}"'); buffer.writeln('command: "${pubCommand.join(' ')}"');
buffer.write(_stringifyPubEnv(pubEnvironment)); buffer.write(_stringifyPubEnv(pubEnvironment));
buffer.writeln('exit code: $code'); buffer.writeln('exit code: $code');
buffer.writeln('last line of pub output: "${lastPubMessage.trim()}"');
throwToolExit( throwToolExit(
buffer.toString(), buffer.toString(),
exitCode: code, exitCode: code,
...@@ -813,14 +810,3 @@ class _DefaultPub implements Pub { ...@@ -813,14 +810,3 @@ class _DefaultPub implements Pub {
return buffer.toString(); return buffer.toString();
} }
} }
class _OutputLine {
_OutputLine(this.line, this.stream);
final String line;
final _OutputStream stream;
}
enum _OutputStream {
stdout,
stderr,
}
...@@ -77,7 +77,7 @@ void main() { ...@@ -77,7 +77,7 @@ void main() {
testUsingContext('AnalysisServer success', () async { testUsingContext('AnalysisServer success', () async {
createSampleProject(tempDir); createSampleProject(tempDir);
final Pub pub = Pub( final Pub pub = Pub.test(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
processManager: processManager, processManager: processManager,
...@@ -117,7 +117,7 @@ void main() { ...@@ -117,7 +117,7 @@ void main() {
testUsingContext('AnalysisServer errors', () async { testUsingContext('AnalysisServer errors', () async {
createSampleProject(tempDir, brokenCode: true); createSampleProject(tempDir, brokenCode: true);
final Pub pub = Pub( final Pub pub = Pub.test(
fileSystem: fileSystem, fileSystem: fileSystem,
logger: logger, logger: logger,
processManager: processManager, processManager: processManager,
......
...@@ -171,7 +171,7 @@ void main() { ...@@ -171,7 +171,7 @@ void main() {
// check that the tests run clean // check that the tests run clean
return _runFlutterTest(projectDir); return _runFlutterTest(projectDir);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: logger, logger: logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -220,7 +220,7 @@ void main() { ...@@ -220,7 +220,7 @@ void main() {
); );
return _runFlutterTest(projectDir); return _runFlutterTest(projectDir);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -247,7 +247,7 @@ void main() { ...@@ -247,7 +247,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -277,7 +277,7 @@ void main() { ...@@ -277,7 +277,7 @@ void main() {
]); ]);
return _runFlutterTest(projectDir); return _runFlutterTest(projectDir);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -303,7 +303,7 @@ void main() { ...@@ -303,7 +303,7 @@ void main() {
]), ]),
throwsToolExit(message: 'Sorry, unable to detect the type of project to recreate')); throwsToolExit(message: 'Sorry, unable to detect the type of project to recreate'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -329,7 +329,7 @@ void main() { ...@@ -329,7 +329,7 @@ void main() {
expect(exec.exitCode, 2); expect(exec.exitCode, 2);
expect(exec.stderr, contains('Cannot create a project within the Flutter SDK')); expect(exec.stderr, contains('Cannot create a project within the Flutter SDK'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -363,7 +363,7 @@ void main() { ...@@ -363,7 +363,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -396,7 +396,7 @@ void main() { ...@@ -396,7 +396,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -424,7 +424,7 @@ void main() { ...@@ -424,7 +424,7 @@ void main() {
'example/android/app/src/main/java/com/example/flutter_project_example/MainActivity.java',] 'example/android/app/src/main/java/com/example/flutter_project_example/MainActivity.java',]
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -463,7 +463,7 @@ void main() { ...@@ -463,7 +463,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -493,7 +493,7 @@ void main() { ...@@ -493,7 +493,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -532,7 +532,7 @@ void main() { ...@@ -532,7 +532,7 @@ void main() {
); );
return _runFlutterTest(projectDir); return _runFlutterTest(projectDir);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -563,7 +563,7 @@ void main() { ...@@ -563,7 +563,7 @@ void main() {
); );
return _runFlutterTest(projectDir.childDirectory('example')); return _runFlutterTest(projectDir.childDirectory('example'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -594,7 +594,7 @@ void main() { ...@@ -594,7 +594,7 @@ void main() {
expect(logger.errorText, isNot(contains(_kNoPlatformsMessage))); expect(logger.errorText, isNot(contains(_kNoPlatformsMessage)));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FeatureFlags: () => TestFeatureFlags(isWebEnabled: true), FeatureFlags: () => TestFeatureFlags(isWebEnabled: true),
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -622,7 +622,7 @@ void main() { ...@@ -622,7 +622,7 @@ void main() {
final PathDependency pathDependency = pubspec.dependencies[pluginName]! as PathDependency; final PathDependency pathDependency = pubspec.dependencies[pluginName]! as PathDependency;
expect(pathDependency.path, '../'); expect(pathDependency.path, '../');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -744,7 +744,7 @@ void main() { ...@@ -744,7 +744,7 @@ void main() {
'.android/Flutter/src/main/java/io/flutter/facade/Flutter.java', '.android/Flutter/src/main/java/io/flutter/facade/Flutter.java',
]); ]);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -1443,7 +1443,7 @@ void main() { ...@@ -1443,7 +1443,7 @@ void main() {
final String displayName = _getStringValueFromPlist(plistFile: plistFile, key: 'CFBundleDisplayName'); final String displayName = _getStringValueFromPlist(plistFile: plistFile, key: 'CFBundleDisplayName');
expect(displayName, 'My Project'); expect(displayName, 'My Project');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -1472,7 +1472,7 @@ void main() { ...@@ -1472,7 +1472,7 @@ void main() {
final String displayName = _getStringValueFromPlist(plistFile: plistFile, key: 'CFBundleDisplayName'); final String displayName = _getStringValueFromPlist(plistFile: plistFile, key: 'CFBundleDisplayName');
expect(displayName, 'My Project'); expect(displayName, 'My Project');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -1730,7 +1730,7 @@ void main() { ...@@ -1730,7 +1730,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -1755,7 +1755,7 @@ void main() { ...@@ -1755,7 +1755,7 @@ void main() {
'com.bar.foo.flutterProject', 'com.bar.foo.flutterProject',
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -1906,7 +1906,7 @@ void main() { ...@@ -1906,7 +1906,7 @@ void main() {
], ],
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -1941,14 +1941,14 @@ void main() { ...@@ -1941,14 +1941,14 @@ void main() {
}, },
overrides: <Type, Generator>{ overrides: <Type, Generator>{
ProcessManager: () => loggingProcessManager, ProcessManager: () => loggingProcessManager,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
usage: globals.flutterUsage, usage: globals.flutterUsage,
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
stdio: mockStdio, stdio: mockStdio,
), ),
}, },
); );
...@@ -2917,7 +2917,7 @@ void main() { ...@@ -2917,7 +2917,7 @@ void main() {
expectedFailures: expectedFailures, expectedFailures: expectedFailures,
); );
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
......
...@@ -211,7 +211,7 @@ void main() { ...@@ -211,7 +211,7 @@ void main() {
expect(mockStdio.stdout.writes.map(utf8.decode), expect(mockStdio.stdout.writes.map(utf8.decode),
allOf( allOf(
contains(matches(RegExp(r'Resolving dependencies in .+flutter_project\.\.\.'))), contains(matches(RegExp(r'Resolving dependencies in .+flutter_project\.\.\.'))),
contains('+ flutter 0.0.0 from sdk flutter\n'), contains(matches(RegExp(r'\+ flutter 0.0.0 from sdk flutter\n'))),
contains(matches(RegExp(r'Changed \d+ dependencies in .+flutter_project!'))), contains(matches(RegExp(r'Changed \d+ dependencies in .+flutter_project!'))),
), ),
); );
...@@ -220,7 +220,7 @@ void main() { ...@@ -220,7 +220,7 @@ void main() {
expectZeroPluginsInjected(projectPath); expectZeroPluginsInjected(projectPath);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -242,7 +242,7 @@ void main() { ...@@ -242,7 +242,7 @@ void main() {
expectZeroPluginsInjected(projectPath); expectZeroPluginsInjected(projectPath);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -264,7 +264,7 @@ void main() { ...@@ -264,7 +264,7 @@ void main() {
expect((await getCommand.usageValues).commandPackagesNumberPlugins, 0); expect((await getCommand.usageValues).commandPackagesNumberPlugins, 0);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -288,7 +288,7 @@ void main() { ...@@ -288,7 +288,7 @@ void main() {
expect((await getCommand.usageValues).commandPackagesNumberPlugins, 1); expect((await getCommand.usageValues).commandPackagesNumberPlugins, 1);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -310,7 +310,7 @@ void main() { ...@@ -310,7 +310,7 @@ void main() {
expect((await getCommand.usageValues).commandPackagesProjectModule, false); expect((await getCommand.usageValues).commandPackagesProjectModule, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -332,7 +332,7 @@ void main() { ...@@ -332,7 +332,7 @@ void main() {
expect((await getCommand.usageValues).commandPackagesProjectModule, true); expect((await getCommand.usageValues).commandPackagesProjectModule, true);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -363,7 +363,7 @@ void main() { ...@@ -363,7 +363,7 @@ void main() {
expect((await getCommand.usageValues).commandPackagesAndroidEmbeddingVersion, 'v1'); expect((await getCommand.usageValues).commandPackagesAndroidEmbeddingVersion, 'v1');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -385,7 +385,7 @@ void main() { ...@@ -385,7 +385,7 @@ void main() {
expect((await getCommand.usageValues).commandPackagesAndroidEmbeddingVersion, 'v2'); expect((await getCommand.usageValues).commandPackagesAndroidEmbeddingVersion, 'v2');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -407,7 +407,7 @@ void main() { ...@@ -407,7 +407,7 @@ void main() {
expectZeroPluginsInjected(projectPath); expectZeroPluginsInjected(projectPath);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -429,7 +429,7 @@ void main() { ...@@ -429,7 +429,7 @@ void main() {
expectModulePluginInjected(projectPath); expectModulePluginInjected(projectPath);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -459,7 +459,7 @@ void main() { ...@@ -459,7 +459,7 @@ void main() {
expectPluginInjected(exampleProjectPath); expectPluginInjected(exampleProjectPath);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -496,7 +496,7 @@ void main() { ...@@ -496,7 +496,7 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
Stdio: () => mockStdio, Stdio: () => mockStdio,
BotDetector: () => const FakeBotDetector(false), BotDetector: () => const FakeBotDetector(false),
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -522,7 +522,7 @@ void main() { ...@@ -522,7 +522,7 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
Stdio: () => mockStdio, Stdio: () => mockStdio,
BotDetector: () => const FakeBotDetector(true), BotDetector: () => const FakeBotDetector(true),
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -553,7 +553,7 @@ void main() { ...@@ -553,7 +553,7 @@ void main() {
Platform: () => FakePlatform(environment: <String, String>{}), Platform: () => FakePlatform(environment: <String, String>{}),
ProcessManager: () => processManager, ProcessManager: () => processManager,
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -584,7 +584,7 @@ void main() { ...@@ -584,7 +584,7 @@ void main() {
Platform: () => FakePlatform(environment: <String, String>{}), Platform: () => FakePlatform(environment: <String, String>{}),
ProcessManager: () => processManager, ProcessManager: () => processManager,
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
...@@ -613,7 +613,7 @@ void main() { ...@@ -613,7 +613,7 @@ void main() {
Platform: () => FakePlatform(environment: <String, String>{}), Platform: () => FakePlatform(environment: <String, String>{}),
ProcessManager: () => processManager, ProcessManager: () => processManager,
Stdio: () => mockStdio, Stdio: () => mockStdio,
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
......
...@@ -68,15 +68,15 @@ void main() { ...@@ -68,15 +68,15 @@ void main() {
expect(contents, contains('SharedPreferencesPlugin.registerWith(registrar);')); expect(contents, contains('SharedPreferencesPlugin.registerWith(registrar);'));
expect(contents, contains('registrar.registerMessageHandler();')); expect(contents, contains('registrar.registerMessageHandler();'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
usage: globals.flutterUsage, usage: globals.flutterUsage,
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
stdio: globals.stdio, stdio: globals.stdio,
), ),
}); });
testUsingContext('generated plugin registrant passes analysis without null safety', () async { testUsingContext('generated plugin registrant passes analysis without null safety', () async {
...@@ -116,15 +116,15 @@ void main() { ...@@ -116,15 +116,15 @@ void main() {
expect(contents, contains('SharedPreferencesPlugin.registerWith(registrar);')); expect(contents, contains('SharedPreferencesPlugin.registerWith(registrar);'));
expect(contents, contains('registrar.registerMessageHandler();')); expect(contents, contains('registrar.registerMessageHandler();'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
usage: globals.flutterUsage, usage: globals.flutterUsage,
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
stdio: globals.stdio, stdio: globals.stdio,
), ),
}); });
...@@ -148,15 +148,15 @@ void main() { ...@@ -148,15 +148,15 @@ void main() {
final String contents = registrant.readAsStringSync(); final String contents = registrant.readAsStringSync();
expect(contents, contains('void registerPlugins() {}')); expect(contents, contains('void registerPlugins() {}'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
usage: globals.flutterUsage, usage: globals.flutterUsage,
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
stdio: globals.stdio, stdio: globals.stdio,
), ),
}); });
// See: https://github.com/dart-lang/dart-services/pull/874 // See: https://github.com/dart-lang/dart-services/pull/874
...@@ -179,15 +179,15 @@ void main() { ...@@ -179,15 +179,15 @@ void main() {
final Directory buildDir = projectDir.childDirectory('.dart_tool/flutter_build'); final Directory buildDir = projectDir.childDirectory('.dart_tool/flutter_build');
expect(buildDir, isNot(exists)); expect(buildDir, isNot(exists));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
usage: globals.flutterUsage, usage: globals.flutterUsage,
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
stdio: globals.stdio, stdio: globals.stdio,
), ),
}); });
testUsingContext( testUsingContext(
...@@ -229,15 +229,15 @@ void main() { ...@@ -229,15 +229,15 @@ void main() {
); );
await _analyzeEntity(buildDir.childFile('web_plugin_registrant.dart')); await _analyzeEntity(buildDir.childFile('web_plugin_registrant.dart'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
Pub: () => Pub( Pub: () => Pub.test(
fileSystem: globals.fs, fileSystem: globals.fs,
logger: globals.logger, logger: globals.logger,
processManager: globals.processManager, processManager: globals.processManager,
usage: globals.flutterUsage, usage: globals.flutterUsage,
botDetector: globals.botDetector, botDetector: globals.botDetector,
platform: globals.platform, platform: globals.platform,
stdio: globals.stdio, stdio: globals.stdio,
), ),
}); });
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment