Unverified Commit 8f834cf1 authored by Lau Ching Jun's avatar Lau Ching Jun Committed by GitHub

Read dart_plugin_registrant path from FlutterProject to support non-standard path. (#107617)

parent cdf4a6a2
...@@ -328,7 +328,7 @@ class KernelCompiler { ...@@ -328,7 +328,7 @@ class KernelCompiler {
dartPluginRegistrant.path, dartPluginRegistrant.path,
'--source', '--source',
'package:flutter/src/dart_plugin_registrant.dart', 'package:flutter/src/dart_plugin_registrant.dart',
'-Dflutter.dart_plugin_registrant=${dartPluginRegistrant.uri}', '-Dflutter.dart_plugin_registrant=${toMultiRootPath(dartPluginRegistrant.uri, _fileSystemScheme, _fileSystemRoots, _fileSystem.path.separator == r'\')}',
], ],
// See: https://github.com/flutter/flutter/issues/103994 // See: https://github.com/flutter/flutter/issues/103994
'--verbosity=error', '--verbosity=error',
...@@ -375,7 +375,7 @@ class _RecompileRequest extends _CompilationRequest { ...@@ -375,7 +375,7 @@ class _RecompileRequest extends _CompilationRequest {
this.outputPath, this.outputPath,
this.packageConfig, this.packageConfig,
this.suppressErrors, this.suppressErrors,
{this.additionalSource} {this.additionalSourceUri}
); );
Uri mainUri; Uri mainUri;
...@@ -383,7 +383,7 @@ class _RecompileRequest extends _CompilationRequest { ...@@ -383,7 +383,7 @@ class _RecompileRequest extends _CompilationRequest {
String outputPath; String outputPath;
PackageConfig packageConfig; PackageConfig packageConfig;
bool suppressErrors; bool suppressErrors;
final String? additionalSource; final Uri? additionalSourceUri;
@override @override
Future<CompilerOutput?> _run(DefaultResidentCompiler compiler) async => Future<CompilerOutput?> _run(DefaultResidentCompiler compiler) async =>
...@@ -499,6 +499,7 @@ abstract class ResidentCompiler { ...@@ -499,6 +499,7 @@ abstract class ResidentCompiler {
String? projectRootPath, String? projectRootPath,
bool suppressErrors = false, bool suppressErrors = false,
bool checkDartPluginRegistry = false, bool checkDartPluginRegistry = false,
File? dartPluginRegistrant,
}); });
Future<CompilerOutput?> compileExpression( Future<CompilerOutput?> compileExpression(
...@@ -642,6 +643,7 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -642,6 +643,7 @@ class DefaultResidentCompiler implements ResidentCompiler {
required PackageConfig packageConfig, required PackageConfig packageConfig,
bool suppressErrors = false, bool suppressErrors = false,
bool checkDartPluginRegistry = false, bool checkDartPluginRegistry = false,
File? dartPluginRegistrant,
String? projectRootPath, String? projectRootPath,
FileSystem? fs, FileSystem? fs,
}) async { }) async {
...@@ -649,20 +651,10 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -649,20 +651,10 @@ class DefaultResidentCompiler implements ResidentCompiler {
if (!_controller.hasListener) { if (!_controller.hasListener) {
_controller.stream.listen(_handleCompilationRequest); _controller.stream.listen(_handleCompilationRequest);
} }
String? additionalSource; Uri? additionalSourceUri;
// `dart_plugin_registrant.dart` contains the Dart plugin registry. // `dart_plugin_registrant.dart` contains the Dart plugin registry.
if (checkDartPluginRegistry && projectRootPath != null && fs != null) { if (checkDartPluginRegistry && dartPluginRegistrant != null && dartPluginRegistrant.existsSync()) {
final File dartPluginRegistrantDart = fs.file( additionalSourceUri = dartPluginRegistrant.uri;
fs.path.join(
projectRootPath,
'.dart_tool',
'flutter_build',
'dart_plugin_registrant.dart',
),
);
if (dartPluginRegistrantDart != null && dartPluginRegistrantDart.existsSync()) {
additionalSource = dartPluginRegistrantDart.path;
}
} }
final Completer<CompilerOutput?> completer = Completer<CompilerOutput?>(); final Completer<CompilerOutput?> completer = Completer<CompilerOutput?>();
_controller.add(_RecompileRequest( _controller.add(_RecompileRequest(
...@@ -672,7 +664,7 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -672,7 +664,7 @@ class DefaultResidentCompiler implements ResidentCompiler {
outputPath, outputPath,
packageConfig, packageConfig,
suppressErrors, suppressErrors,
additionalSource: additionalSource, additionalSourceUri: additionalSourceUri,
)); ));
return completer.future; return completer.future;
} }
...@@ -685,9 +677,15 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -685,9 +677,15 @@ class DefaultResidentCompiler implements ResidentCompiler {
final String mainUri = request.packageConfig.toPackageUri(request.mainUri)?.toString() ?? final String mainUri = request.packageConfig.toPackageUri(request.mainUri)?.toString() ??
toMultiRootPath(request.mainUri, fileSystemScheme, fileSystemRoots, _platform.isWindows); toMultiRootPath(request.mainUri, fileSystemScheme, fileSystemRoots, _platform.isWindows);
String? additionalSourceUri;
if (request.additionalSourceUri != null) {
additionalSourceUri = request.packageConfig.toPackageUri(request.additionalSourceUri!)?.toString() ??
toMultiRootPath(request.additionalSourceUri!, fileSystemScheme, fileSystemRoots, _platform.isWindows);
}
final Process? server = _server; final Process? server = _server;
if (server == null) { if (server == null) {
return _compile(mainUri, request.outputPath, additionalSource: request.additionalSource); return _compile(mainUri, request.outputPath, additionalSourceUri: additionalSourceUri);
} }
final String inputKey = Uuid().generateV4(); final String inputKey = Uuid().generateV4();
...@@ -733,7 +731,7 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -733,7 +731,7 @@ class DefaultResidentCompiler implements ResidentCompiler {
Future<CompilerOutput?> _compile( Future<CompilerOutput?> _compile(
String scriptUri, String scriptUri,
String? outputPath, String? outputPath,
{String? additionalSource} {String? additionalSourceUri}
) async { ) async {
final String frontendServer = _artifacts.getArtifactPath( final String frontendServer = _artifacts.getArtifactPath(
Artifact.frontendServerSnapshotForEngineDartSdk Artifact.frontendServerSnapshotForEngineDartSdk
...@@ -786,12 +784,12 @@ class DefaultResidentCompiler implements ResidentCompiler { ...@@ -786,12 +784,12 @@ class DefaultResidentCompiler implements ResidentCompiler {
initializeFromDill!, initializeFromDill!,
], ],
if (assumeInitializeFromDillUpToDate) '--assume-initialize-from-dill-up-to-date', if (assumeInitializeFromDillUpToDate) '--assume-initialize-from-dill-up-to-date',
if (additionalSource != null) ...<String>[ if (additionalSourceUri != null) ...<String>[
'--source', '--source',
additionalSource, additionalSourceUri,
'--source', '--source',
'package:flutter/src/dart_plugin_registrant.dart', 'package:flutter/src/dart_plugin_registrant.dart',
'-Dflutter.dart_plugin_registrant=${Uri.file(additionalSource)}', '-Dflutter.dart_plugin_registrant=$additionalSourceUri',
], ],
if (platformDill != null) ...<String>[ if (platformDill != null) ...<String>[
'--platform', '--platform',
......
...@@ -581,6 +581,7 @@ class DevFS { ...@@ -581,6 +581,7 @@ class DevFS {
bool bundleFirstUpload = false, bool bundleFirstUpload = false,
bool fullRestart = false, bool fullRestart = false,
String? projectRootPath, String? projectRootPath,
File? dartPluginRegistrant,
}) async { }) async {
assert(trackWidgetCreation != null); assert(trackWidgetCreation != null);
assert(generator != null); assert(generator != null);
...@@ -610,6 +611,7 @@ class DevFS { ...@@ -610,6 +611,7 @@ class DevFS {
projectRootPath: projectRootPath, projectRootPath: projectRootPath,
packageConfig: packageConfig, packageConfig: packageConfig,
checkDartPluginRegistry: true, // The entry point is assumed not to have changed. checkDartPluginRegistry: true, // The entry point is assumed not to have changed.
dartPluginRegistrant: dartPluginRegistrant,
).then((CompilerOutput? result) { ).then((CompilerOutput? result) {
compileTimer.stop(); compileTimer.stop();
return result; return result;
......
...@@ -799,6 +799,7 @@ class WebDevFS implements DevFS { ...@@ -799,6 +799,7 @@ class WebDevFS implements DevFS {
bool bundleFirstUpload = false, bool bundleFirstUpload = false,
bool fullRestart = false, bool fullRestart = false,
String? projectRootPath, String? projectRootPath,
File? dartPluginRegistrant,
}) async { }) async {
assert(trackWidgetCreation != null); assert(trackWidgetCreation != null);
assert(generator != null); assert(generator != null);
...@@ -866,6 +867,7 @@ class WebDevFS implements DevFS { ...@@ -866,6 +867,7 @@ class WebDevFS implements DevFS {
packageConfig: packageConfig, packageConfig: packageConfig,
projectRootPath: projectRootPath, projectRootPath: projectRootPath,
fs: globals.fs, fs: globals.fs,
dartPluginRegistrant: dartPluginRegistrant,
); );
if (compilerOutput == null || compilerOutput.errorCount > 0) { if (compilerOutput == null || compilerOutput.errorCount > 0) {
return UpdateFSReport(); return UpdateFSReport();
......
...@@ -563,6 +563,7 @@ class FlutterDevice { ...@@ -563,6 +563,7 @@ class FlutterDevice {
invalidatedFiles: invalidatedFiles, invalidatedFiles: invalidatedFiles,
packageConfig: packageConfig, packageConfig: packageConfig,
devFSWriter: devFSWriter, devFSWriter: devFSWriter,
dartPluginRegistrant: FlutterProject.current().dartPluginRegistrant,
); );
} on DevFSException { } on DevFSException {
devFSStatus.cancel(); devFSStatus.cancel();
......
...@@ -373,6 +373,7 @@ class HotRunner extends ResidentRunner { ...@@ -373,6 +373,7 @@ class HotRunner extends ResidentRunner {
// should only be displayed once. // should only be displayed once.
suppressErrors: applicationBinary == null, suppressErrors: applicationBinary == null,
checkDartPluginRegistry: true, checkDartPluginRegistry: true,
dartPluginRegistrant: FlutterProject.current().dartPluginRegistrant,
outputPath: dillOutputPath, outputPath: dillOutputPath,
packageConfig: debuggingOptions.buildInfo.packageConfig, packageConfig: debuggingOptions.buildInfo.packageConfig,
projectRootPath: FlutterProject.current().directory.absolute.path, projectRootPath: FlutterProject.current().directory.absolute.path,
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'dart:async'; import 'dart:async';
import 'package:file/file.dart';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/async_guard.dart'; import 'package:flutter_tools/src/base/async_guard.dart';
...@@ -394,6 +395,43 @@ void main() { ...@@ -394,6 +395,43 @@ void main() {
'line2\nline3\n' 'line2\nline3\n'
)); ));
}); });
testWithoutContext('incremental compile with dartPluginRegistrant', () async {
fakeProcessManager.addCommand(FakeCommand(
command: const <String>[
...frontendServerCommand,
'--filesystem-root',
'/foo/bar/fizz',
'--filesystem-scheme',
'scheme',
'--source',
'some/dir/plugin_registrant.dart',
'--source',
'package:flutter/src/dart_plugin_registrant.dart',
'-Dflutter.dart_plugin_registrant=some/dir/plugin_registrant.dart',
'--verbosity=error',
],
stdout: 'result abc\nline1\nline2\nabc\nabc /path/to/main.dart.dill 0',
stdin: frontendServerStdIn,
));
final MemoryFileSystem fs = MemoryFileSystem();
final File dartPluginRegistrant = fs.file('some/dir/plugin_registrant.dart')..createSync(recursive: true);
final CompilerOutput? output = await generatorWithScheme.recompile(
Uri.parse('file:///foo/bar/fizz/main.dart'),
null /* invalidatedFiles */,
outputPath: '/build/',
packageConfig: PackageConfig.empty,
fs: fs,
projectRootPath: '',
checkDartPluginRegistry: true,
dartPluginRegistrant: dartPluginRegistrant,
);
expect(frontendServerStdIn.getAndClear(), 'compile scheme:///main.dart\n');
expect(testLogger.errorText, equals('line1\nline2\n'));
expect(output?.outputFilename, equals('/path/to/main.dart.dill'));
expect(fakeProcessManager, hasNoRemainingExpectations);
});
} }
Future<void> _recompile( Future<void> _recompile(
......
...@@ -581,7 +581,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler { ...@@ -581,7 +581,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
Future<CompilerOutput> Function(Uri mainUri, List<Uri>? invalidatedFiles)? onRecompile; Future<CompilerOutput> Function(Uri mainUri, List<Uri>? invalidatedFiles)? onRecompile;
@override @override
Future<CompilerOutput> recompile(Uri mainUri, List<Uri>? invalidatedFiles, {String? outputPath, PackageConfig? packageConfig, String? projectRootPath, FileSystem? fs, bool suppressErrors = false, bool checkDartPluginRegistry = false}) { Future<CompilerOutput> recompile(Uri mainUri, List<Uri>? invalidatedFiles, {String? outputPath, PackageConfig? packageConfig, String? projectRootPath, FileSystem? fs, bool suppressErrors = false, bool checkDartPluginRegistry = false, File? dartPluginRegistrant}) {
return onRecompile?.call(mainUri, invalidatedFiles) return onRecompile?.call(mainUri, invalidatedFiles)
?? Future<CompilerOutput>.value(const CompilerOutput('', 1, <Uri>[])); ?? Future<CompilerOutput>.value(const CompilerOutput('', 1, <Uri>[]));
} }
......
...@@ -2464,6 +2464,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler { ...@@ -2464,6 +2464,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
@required FileSystem fs, @required FileSystem fs,
bool suppressErrors = false, bool suppressErrors = false,
bool checkDartPluginRegistry = false, bool checkDartPluginRegistry = false,
File dartPluginRegistrant,
}) async { }) async {
didSuppressErrors = suppressErrors; didSuppressErrors = suppressErrors;
return nextOutput ?? const CompilerOutput('foo.dill', 0, <Uri>[]); return nextOutput ?? const CompilerOutput('foo.dill', 0, <Uri>[]);
...@@ -2623,6 +2624,7 @@ class FakeDevFS extends Fake implements DevFS { ...@@ -2623,6 +2624,7 @@ class FakeDevFS extends Fake implements DevFS {
bool bundleFirstUpload = false, bool bundleFirstUpload = false,
bool fullRestart = false, bool fullRestart = false,
String projectRootPath, String projectRootPath,
File dartPluginRegistrant,
}) async { }) async {
return nextUpdateReport; return nextUpdateReport;
} }
......
...@@ -42,7 +42,8 @@ import '../src/common.dart'; ...@@ -42,7 +42,8 @@ import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
import '../src/fake_vm_services.dart'; import '../src/fake_vm_services.dart';
const List<VmServiceExpectation> kAttachLogExpectations = <VmServiceExpectation>[ const List<VmServiceExpectation> kAttachLogExpectations =
<VmServiceExpectation>[
FakeVmServiceRequest( FakeVmServiceRequest(
method: 'streamListen', method: 'streamListen',
args: <String, Object>{ args: <String, Object>{
...@@ -57,34 +58,23 @@ const List<VmServiceExpectation> kAttachLogExpectations = <VmServiceExpectation> ...@@ -57,34 +58,23 @@ const List<VmServiceExpectation> kAttachLogExpectations = <VmServiceExpectation>
), ),
]; ];
const List<VmServiceExpectation> kAttachIsolateExpectations = <VmServiceExpectation>[ const List<VmServiceExpectation> kAttachIsolateExpectations =
FakeVmServiceRequest( <VmServiceExpectation>[
method: 'streamListen', FakeVmServiceRequest(method: 'streamListen', args: <String, Object>{
args: <String, Object>{ 'streamId': 'Isolate',
'streamId': 'Isolate', }),
} FakeVmServiceRequest(method: 'registerService', args: <String, Object>{
), 'service': 'reloadSources',
FakeVmServiceRequest( 'alias': 'Flutter Tools',
method: 'registerService', }),
args: <String, Object>{ FakeVmServiceRequest(method: 'registerService', args: <String, Object>{
'service': 'reloadSources', 'service': 'flutterVersion',
'alias': 'Flutter Tools', 'alias': 'Flutter Tools',
} }),
), FakeVmServiceRequest(method: 'registerService', args: <String, Object>{
FakeVmServiceRequest( 'service': 'flutterMemoryInfo',
method: 'registerService', 'alias': 'Flutter Tools',
args: <String, Object>{ }),
'service': 'flutterVersion',
'alias': 'Flutter Tools',
}
),
FakeVmServiceRequest(
method: 'registerService',
args: <String, Object>{
'service': 'flutterMemoryInfo',
'alias': 'Flutter Tools',
}
),
FakeVmServiceRequest( FakeVmServiceRequest(
method: 'streamListen', method: 'streamListen',
args: <String, Object>{ args: <String, Object>{
...@@ -148,7 +138,9 @@ void main() { ...@@ -148,7 +138,9 @@ void main() {
chromeConnection.tabs.add(chromeTab); chromeConnection.tabs.add(chromeTab);
} }
testUsingContext('runner with web server device does not support debugging without --start-paused', () { testUsingContext(
'runner with web server device does not support debugging without --start-paused',
() {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
flutterDevice.device = WebServerDevice( flutterDevice.device = WebServerDevice(
logger: BufferLogger.test(), logger: BufferLogger.test(),
...@@ -156,7 +148,8 @@ void main() { ...@@ -156,7 +148,8 @@ void main() {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
final ResidentRunner profileResidentWebRunner = ResidentWebRunner( final ResidentRunner profileResidentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
...@@ -176,7 +169,9 @@ void main() { ...@@ -176,7 +169,9 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('runner with web server device supports debugging with --start-paused', () { testUsingContext(
'runner with web server device supports debugging with --start-paused',
() {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
setupMocks(); setupMocks();
flutterDevice.device = WebServerDevice( flutterDevice.device = WebServerDevice(
...@@ -184,8 +179,10 @@ void main() { ...@@ -184,8 +179,10 @@ void main() {
); );
final ResidentRunner profileResidentWebRunner = ResidentWebRunner( final ResidentRunner profileResidentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true), FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions:
DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
...@@ -202,7 +199,8 @@ void main() { ...@@ -202,7 +199,8 @@ void main() {
testUsingContext('profile does not supportsServiceProtocol', () { testUsingContext('profile does not supportsServiceProtocol', () {
final ResidentRunner residentWebRunner = ResidentWebRunner( final ResidentRunner residentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
...@@ -214,7 +212,8 @@ void main() { ...@@ -214,7 +212,8 @@ void main() {
flutterDevice.device = chromeDevice; flutterDevice.device = chromeDevice;
final ResidentRunner profileResidentWebRunner = ResidentWebRunner( final ResidentRunner profileResidentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile), debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
...@@ -232,70 +231,99 @@ void main() { ...@@ -232,70 +231,99 @@ void main() {
testUsingContext('Can successfully run and connect to vmservice', () async { testUsingContext('Can successfully run and connect to vmservice', () async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
final DebugConnectionInfo debugConnectionInfo = await connectionInfoCompleter.future; final DebugConnectionInfo debugConnectionInfo =
await connectionInfoCompleter.future;
expect(appConnection.ranMain, true); expect(appConnection.ranMain, true);
expect(logger.statusText, contains('Debug service listening on ws://127.0.0.1/abcd/')); expect(logger.statusText,
contains('Debug service listening on ws://127.0.0.1/abcd/'));
expect(debugConnectionInfo.wsUri.toString(), 'ws://127.0.0.1/abcd/'); expect(debugConnectionInfo.wsUri.toString(), 'ws://127.0.0.1/abcd/');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('WebRunner copies compiled app.dill to cache during startup', () async { testUsingContext('WebRunner copies compiled app.dill to cache during startup',
() async {
final DebuggingOptions debuggingOptions = DebuggingOptions.enabled( final DebuggingOptions debuggingOptions = DebuggingOptions.enabled(
const BuildInfo(BuildMode.debug, null, treeShakeIcons: false), const BuildInfo(BuildMode.debug, null, treeShakeIcons: false),
); );
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, debuggingOptions: debuggingOptions); final ResidentRunner residentWebRunner =
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); setUpResidentRunner(flutterDevice, debuggingOptions: debuggingOptions);
fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
residentWebRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentWebRunner.artifactDirectory
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); .childFile('app.dill')
.writeAsStringSync('ABC');
final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
expect(await fileSystem.file(fileSystem.path.join('build', 'cache.dill')).readAsString(), 'ABC'); expect(
await fileSystem
.file(fileSystem.path.join('build', 'cache.dill'))
.readAsString(),
'ABC');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('WebRunner copies compiled app.dill to cache during startup with track-widget-creation', () async { testUsingContext(
'WebRunner copies compiled app.dill to cache during startup with track-widget-creation',
() async {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
residentWebRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentWebRunner.artifactDirectory
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); .childFile('app.dill')
.writeAsStringSync('ABC');
final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
expect(await fileSystem.file(fileSystem.path.join('build', 'cache.dill.track.dill')).readAsString(), 'ABC'); expect(
await fileSystem
.file(fileSystem.path.join('build', 'cache.dill.track.dill'))
.readAsString(),
'ABC');
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
// Regression test for https://github.com/flutter/flutter/issues/60613 // Regression test for https://github.com/flutter/flutter/issues/60613
testUsingContext('ResidentWebRunner calls appFailedToStart if initial compilation fails', () async { testUsingContext(
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); 'ResidentWebRunner calls appFailedToStart if initial compilation fails',
() async {
fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fileSystem.file(globals.fs.path.join('lib', 'main.dart')) fileSystem
.createSync(recursive: true); .file(globals.fs.path.join('lib', 'main.dart'))
.createSync(recursive: true);
webDevFS.report = UpdateFSReport(); webDevFS.report = UpdateFSReport();
expect(await residentWebRunner.run(), 1); expect(await residentWebRunner.run(), 1);
...@@ -306,15 +334,18 @@ void main() { ...@@ -306,15 +334,18 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Can successfully run without an index.html including status warning', () async { testUsingContext(
'Can successfully run without an index.html including status warning',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
fileSystem.file(fileSystem.path.join('web', 'index.html')) fileSystem.file(fileSystem.path.join('web', 'index.html')).deleteSync();
.deleteSync();
final ResidentWebRunner residentWebRunner = ResidentWebRunner( final ResidentWebRunner residentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
stayResident: false, stayResident: false,
...@@ -326,18 +357,21 @@ void main() { ...@@ -326,18 +357,21 @@ void main() {
expect(await residentWebRunner.run(), 0); expect(await residentWebRunner.run(), 0);
expect(logger.statusText, expect(logger.statusText,
contains('This application is not configured to build on the web')); contains('This application is not configured to build on the web'));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Can successfully run and disconnect with --no-resident', () async { testUsingContext('Can successfully run and disconnect with --no-resident',
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); () async {
fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
final ResidentRunner residentWebRunner = ResidentWebRunner( final ResidentRunner residentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
stayResident: false, stayResident: false,
...@@ -353,31 +387,32 @@ void main() { ...@@ -353,31 +387,32 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Listens to stdout and stderr streams before running main', () async { testUsingContext('Listens to stdout and stderr streams before running main',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachLogExpectations, ...kAttachLogExpectations,
FakeVmServiceStreamResponse( FakeVmServiceStreamResponse(
streamId: 'Stdout', streamId: 'Stdout',
event: vm_service.Event( event: vm_service.Event(
timestamp: 0, timestamp: 0,
kind: vm_service.EventStreams.kStdout, kind: vm_service.EventStreams.kStdout,
bytes: base64.encode(utf8.encode('THIS MESSAGE IS IMPORTANT')) bytes: base64.encode(utf8.encode('THIS MESSAGE IS IMPORTANT'))),
),
), ),
FakeVmServiceStreamResponse( FakeVmServiceStreamResponse(
streamId: 'Stderr', streamId: 'Stderr',
event: vm_service.Event( event: vm_service.Event(
timestamp: 0, timestamp: 0,
kind: vm_service.EventStreams.kStderr, kind: vm_service.EventStreams.kStderr,
bytes: base64.encode(utf8.encode('SO IS THIS')) bytes: base64.encode(utf8.encode('SO IS THIS'))),
),
), ),
...kAttachIsolateExpectations, ...kAttachIsolateExpectations,
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
...@@ -390,8 +425,10 @@ void main() { ...@@ -390,8 +425,10 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Listens to extension events with structured errors', () async { testUsingContext('Listens to extension events with structured errors',
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: testLogger); () async {
final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: testLogger);
final Map<String, String> extensionData = <String, String>{ final Map<String, String> extensionData = <String, String>{
'test': 'data', 'test': 'data',
'renderedErrorText': 'error text', 'renderedErrorText': 'error text',
...@@ -437,7 +474,8 @@ void main() { ...@@ -437,7 +474,8 @@ void main() {
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
...@@ -454,17 +492,21 @@ void main() { ...@@ -454,17 +492,21 @@ void main() {
testUsingContext('Does not run main with --start-paused', () async { testUsingContext('Does not run main with --start-paused', () async {
final ResidentRunner residentWebRunner = ResidentWebRunner( final ResidentRunner residentWebRunner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, startPaused: true), FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions:
DebuggingOptions.enabled(BuildInfo.debug, startPaused: true),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
logger: BufferLogger.test(), logger: BufferLogger.test(),
usage: globals.flutterUsage, usage: globals.flutterUsage,
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
...@@ -487,11 +529,10 @@ void main() { ...@@ -487,11 +529,10 @@ void main() {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachExpectations, ...kAttachExpectations,
const FakeVmServiceRequest( const FakeVmServiceRequest(
method: 'hotRestart', method: 'hotRestart',
jsonResponse: <String, Object>{ jsonResponse: <String, Object>{
'type': 'Success', 'type': 'Success',
} }),
),
const FakeVmServiceRequest( const FakeVmServiceRequest(
method: 'streamListen', method: 'streamListen',
args: <String, Object>{ args: <String, Object>{
...@@ -501,7 +542,8 @@ void main() { ...@@ -501,7 +542,8 @@ void main() {
]); ]);
setupMocks(); setupMocks();
final TestChromiumLauncher chromiumLauncher = TestChromiumLauncher(); final TestChromiumLauncher chromiumLauncher = TestChromiumLauncher();
final Chromium chrome = Chromium(1, chromeConnection, chromiumLauncher: chromiumLauncher); final Chromium chrome =
Chromium(1, chromeConnection, chromiumLauncher: chromiumLauncher);
chromiumLauncher.setInstance(chrome); chromiumLauncher.setInstance(chrome);
flutterDevice.device = GoogleChromeDevice( flutterDevice.device = GoogleChromeDevice(
...@@ -513,11 +555,13 @@ void main() { ...@@ -513,11 +555,13 @@ void main() {
); );
webDevFS.report = UpdateFSReport(success: true); webDevFS.report = UpdateFSReport(success: true);
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
final DebugConnectionInfo debugConnectionInfo = await connectionInfoCompleter.future; final DebugConnectionInfo debugConnectionInfo =
await connectionInfoCompleter.future;
expect(debugConnectionInfo, isNotNull); expect(debugConnectionInfo, isNotNull);
...@@ -529,7 +573,15 @@ void main() { ...@@ -529,7 +573,15 @@ void main() {
// ensure that analytics are sent. // ensure that analytics are sent.
expect(testUsage.events, <TestUsageEvent>[ expect(testUsage.events, <TestUsageEvent>[
TestUsageEvent('hot', 'restart', parameters: CustomDimensions.fromMap(<String, String>{'cd27': 'web-javascript', 'cd28': '', 'cd29': 'false', 'cd30': 'true', 'cd13': '0', 'cd48': 'false'})), TestUsageEvent('hot', 'restart',
parameters: CustomDimensions.fromMap(<String, String>{
'cd27': 'web-javascript',
'cd28': '',
'cd29': 'false',
'cd30': 'true',
'cd13': '0',
'cd48': 'false'
})),
]); ]);
expect(testUsage.timings, const <TestTimingEvent>[ expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero), TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
...@@ -550,15 +602,15 @@ void main() { ...@@ -550,15 +602,15 @@ void main() {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachExpectations, ...kAttachExpectations,
const FakeVmServiceRequest( const FakeVmServiceRequest(
method: 'hotRestart', method: 'hotRestart',
jsonResponse: <String, Object>{ jsonResponse: <String, Object>{
'type': 'Success', 'type': 'Success',
} }),
),
]); ]);
setupMocks(); setupMocks();
final TestChromiumLauncher chromiumLauncher = TestChromiumLauncher(); final TestChromiumLauncher chromiumLauncher = TestChromiumLauncher();
final Chromium chrome = Chromium(1, chromeConnection, chromiumLauncher: chromiumLauncher); final Chromium chrome =
Chromium(1, chromeConnection, chromiumLauncher: chromiumLauncher);
chromiumLauncher.setInstance(chrome); chromiumLauncher.setInstance(chrome);
flutterDevice.device = GoogleChromeDevice( flutterDevice.device = GoogleChromeDevice(
...@@ -570,16 +622,19 @@ void main() { ...@@ -570,16 +622,19 @@ void main() {
); );
webDevFS.report = UpdateFSReport(success: true); webDevFS.report = UpdateFSReport(success: true);
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
final OperationResult result = await residentWebRunner.restart(fullRestart: true); final OperationResult result =
await residentWebRunner.restart(fullRestart: true);
// Ensure that generated entrypoint is generated correctly. // Ensure that generated entrypoint is generated correctly.
expect(webDevFS.mainUri, isNotNull); expect(webDevFS.mainUri, isNotNull);
final String entrypointContents = fileSystem.file(webDevFS.mainUri).readAsStringSync(); final String entrypointContents =
fileSystem.file(webDevFS.mainUri).readAsStringSync();
expect(entrypointContents, contains('// Flutter web bootstrap script')); expect(entrypointContents, contains('// Flutter web bootstrap script'));
expect(entrypointContents, contains("import 'dart:ui' as ui;")); expect(entrypointContents, contains("import 'dart:ui' as ui;"));
expect(entrypointContents, contains('await ui.webOnlyWarmupEngine(')); expect(entrypointContents, contains('await ui.webOnlyWarmupEngine('));
...@@ -587,9 +642,17 @@ void main() { ...@@ -587,9 +642,17 @@ void main() {
expect(logger.statusText, contains('Restarted application in')); expect(logger.statusText, contains('Restarted application in'));
expect(result.code, 0); expect(result.code, 0);
// ensure that analytics are sent. // ensure that analytics are sent.
expect(testUsage.events, <TestUsageEvent>[ expect(testUsage.events, <TestUsageEvent>[
TestUsageEvent('hot', 'restart', parameters: CustomDimensions.fromMap(<String, String>{'cd27': 'web-javascript', 'cd28': '', 'cd29': 'false', 'cd30': 'true', 'cd13': '0', 'cd48': 'false'})), TestUsageEvent('hot', 'restart',
parameters: CustomDimensions.fromMap(<String, String>{
'cd27': 'web-javascript',
'cd28': '',
'cd29': 'false',
'cd30': 'true',
'cd13': '0',
'cd48': 'false'
})),
]); ]);
expect(testUsage.timings, const <TestTimingEvent>[ expect(testUsage.timings, const <TestTimingEvent>[
TestTimingEvent('hot', 'web-incremental-restart', Duration.zero), TestTimingEvent('hot', 'web-incremental-restart', Duration.zero),
...@@ -600,29 +663,32 @@ void main() { ...@@ -600,29 +663,32 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Can hot restart after attaching with web-server device', () async { testUsingContext('Can hot restart after attaching with web-server device',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner( final ResidentRunner residentWebRunner = setUpResidentRunner(
flutterDevice, flutterDevice,
logger: logger, logger: logger,
systemClock: SystemClock.fixed(DateTime(2001)), systemClock: SystemClock.fixed(DateTime(2001)),
); );
fakeVmServiceHost = FakeVmServiceHost(requests :kAttachExpectations); fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations);
setupMocks(); setupMocks();
flutterDevice.device = webServerDevice; flutterDevice.device = webServerDevice;
webDevFS.report = UpdateFSReport(success: true); webDevFS.report = UpdateFSReport(success: true);
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
final OperationResult result = await residentWebRunner.restart(fullRestart: true); final OperationResult result =
await residentWebRunner.restart(fullRestart: true);
expect(logger.statusText, contains('Restarted application in')); expect(logger.statusText, contains('Restarted application in'));
expect(result.code, 0); expect(result.code, 0);
// web-server device does not send restart analytics // web-server device does not send restart analytics
expect(testUsage.events, isEmpty); expect(testUsage.events, isEmpty);
expect(testUsage.timings, isEmpty); expect(testUsage.timings, isEmpty);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
...@@ -633,7 +699,8 @@ void main() { ...@@ -633,7 +699,8 @@ void main() {
testUsingContext('web resident runner is debuggable', () { testUsingContext('web resident runner is debuggable', () {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
expect(residentWebRunner.debuggingEnabled, true); expect(residentWebRunner.debuggingEnabled, true);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
...@@ -647,7 +714,8 @@ void main() { ...@@ -647,7 +714,8 @@ void main() {
setupMocks(); setupMocks();
webDevFS.report = UpdateFSReport(); webDevFS.report = UpdateFSReport();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
...@@ -661,9 +729,12 @@ void main() { ...@@ -661,9 +729,12 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Faithfully displays stdout messages with leading/trailing spaces', () async { testUsingContext(
'Faithfully displays stdout messages with leading/trailing spaces',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachLogExpectations, ...kAttachLogExpectations,
FakeVmServiceStreamResponse( FakeVmServiceStreamResponse(
...@@ -672,21 +743,25 @@ void main() { ...@@ -672,21 +743,25 @@ void main() {
timestamp: 0, timestamp: 0,
kind: vm_service.EventStreams.kStdout, kind: vm_service.EventStreams.kStdout,
bytes: base64.encode( bytes: base64.encode(
utf8.encode(' This is a message with 4 leading and trailing spaces '), utf8.encode(
' This is a message with 4 leading and trailing spaces '),
), ),
), ),
), ),
...kAttachIsolateExpectations, ...kAttachIsolateExpectations,
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
expect(logger.statusText, expect(
contains(' This is a message with 4 leading and trailing spaces ')); logger.statusText,
contains(
' This is a message with 4 leading and trailing spaces '));
expect(fakeVmServiceHost.hasRemainingExpectations, false); expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
...@@ -695,16 +770,19 @@ void main() { ...@@ -695,16 +770,19 @@ void main() {
testUsingContext('Fails on compilation errors in hot restart', () async { testUsingContext('Fails on compilation errors in hot restart', () async {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fakeVmServiceHost = FakeVmServiceHost(requests: kAttachExpectations.toList()); fakeVmServiceHost =
FakeVmServiceHost(requests: kAttachExpectations.toList());
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
webDevFS.report = UpdateFSReport(); webDevFS.report = UpdateFSReport();
final OperationResult result = await residentWebRunner.restart(fullRestart: true); final OperationResult result =
await residentWebRunner.restart(fullRestart: true);
expect(result.code, 1); expect(result.code, 1);
expect(result.message, contains('Failed to recompile application.')); expect(result.message, contains('Failed to recompile application.'));
...@@ -716,7 +794,9 @@ void main() { ...@@ -716,7 +794,9 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Fails non-fatally on vmservice response error for hot restart', () async { testUsingContext(
'Fails non-fatally on vmservice response error for hot restart',
() async {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachExpectations, ...kAttachExpectations,
...@@ -728,7 +808,8 @@ void main() { ...@@ -728,7 +808,8 @@ void main() {
), ),
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
...@@ -753,7 +834,8 @@ void main() { ...@@ -753,7 +834,8 @@ void main() {
), ),
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
...@@ -761,16 +843,17 @@ void main() { ...@@ -761,16 +843,17 @@ void main() {
final OperationResult result = await residentWebRunner.restart(); final OperationResult result = await residentWebRunner.restart();
expect(result.code, 1); expect(result.code, 1);
expect(result.message, expect(result.message, contains(RPCErrorCodes.kInternalError.toString()));
contains(RPCErrorCodes.kInternalError.toString()));
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('printHelp without details shows hot restart help message', () async { testUsingContext('printHelp without details shows hot restart help message',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
residentWebRunner.printHelp(details: false); residentWebRunner.printHelp(details: false);
...@@ -780,14 +863,16 @@ void main() { ...@@ -780,14 +863,16 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('cleanup of resources is safe to call multiple times', () async { testUsingContext('cleanup of resources is safe to call multiple times',
() async {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
mockDevice.dds = DartDevelopmentService(); mockDevice.dds = DartDevelopmentService();
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachExpectations, ...kAttachExpectations,
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
...@@ -809,7 +894,8 @@ void main() { ...@@ -809,7 +894,8 @@ void main() {
...kAttachExpectations, ...kAttachExpectations,
]); ]);
setupMocks(); setupMocks();
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
final Future<int> result = residentWebRunner.run( final Future<int> result = residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
); );
...@@ -825,29 +911,34 @@ void main() { ...@@ -825,29 +911,34 @@ void main() {
testUsingContext('Prints target and device name on run', () async { testUsingContext('Prints target and device name on run', () async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachExpectations, ...kAttachExpectations,
]); ]);
setupMocks(); setupMocks();
mockDevice.name = 'Chromez'; mockDevice.name = 'Chromez';
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(residentWebRunner.run( unawaited(residentWebRunner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
expect(logger.statusText, contains( expect(
'Launching ${fileSystem.path.join('lib', 'main.dart')} on ' logger.statusText,
'Chromez in debug mode', contains(
)); 'Launching ${fileSystem.path.join('lib', 'main.dart')} on '
'Chromez in debug mode',
));
expect(fakeVmServiceHost.hasRemainingExpectations, false); expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Sends launched app.webLaunchUrl event for Chrome device', () async { testUsingContext('Sends launched app.webLaunchUrl event for Chrome device',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
...kAttachLogExpectations, ...kAttachLogExpectations,
...@@ -856,7 +947,8 @@ void main() { ...@@ -856,7 +947,8 @@ void main() {
setupMocks(); setupMocks();
final FakeChromeConnection chromeConnection = FakeChromeConnection(); final FakeChromeConnection chromeConnection = FakeChromeConnection();
final TestChromiumLauncher chromiumLauncher = TestChromiumLauncher(); final TestChromiumLauncher chromiumLauncher = TestChromiumLauncher();
final Chromium chrome = Chromium(1, chromeConnection, chromiumLauncher: chromiumLauncher); final Chromium chrome =
Chromium(1, chromeConnection, chromiumLauncher: chromiumLauncher);
chromiumLauncher.setInstance(chrome); chromiumLauncher.setInstance(chrome);
flutterDevice.device = GoogleChromeDevice( flutterDevice.device = GoogleChromeDevice(
...@@ -873,7 +965,8 @@ void main() { ...@@ -873,7 +965,8 @@ void main() {
final ResidentWebRunner runner = ResidentWebRunner( final ResidentWebRunner runner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
...@@ -882,29 +975,34 @@ void main() { ...@@ -882,29 +975,34 @@ void main() {
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(runner.run( unawaited(runner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
// Ensure we got the URL and that it was already launched. // Ensure we got the URL and that it was already launched.
expect(logger.eventText, expect(
contains(json.encode(<String, Object>{ logger.eventText,
'name': 'app.webLaunchUrl', contains(json.encode(
'args': <String, Object>{ <String, Object>{
'url': 'http://localhost:8765/app/', 'name': 'app.webLaunchUrl',
'launched': true, 'args': <String, Object>{
}, 'url': 'http://localhost:8765/app/',
}, 'launched': true,
))); },
},
)));
expect(fakeVmServiceHost.hasRemainingExpectations, false); expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Sends unlaunched app.webLaunchUrl event for Web Server device', () async { testUsingContext(
'Sends unlaunched app.webLaunchUrl event for Web Server device',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
setupMocks(); setupMocks();
...@@ -915,7 +1013,8 @@ void main() { ...@@ -915,7 +1013,8 @@ void main() {
final ResidentWebRunner runner = ResidentWebRunner( final ResidentWebRunner runner = ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(fileSystem.currentDirectory), flutterProject:
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory),
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
fileSystem: fileSystem, fileSystem: fileSystem,
...@@ -924,22 +1023,25 @@ void main() { ...@@ -924,22 +1023,25 @@ void main() {
systemClock: globals.systemClock, systemClock: globals.systemClock,
); );
final Completer<DebugConnectionInfo> connectionInfoCompleter = Completer<DebugConnectionInfo>(); final Completer<DebugConnectionInfo> connectionInfoCompleter =
Completer<DebugConnectionInfo>();
unawaited(runner.run( unawaited(runner.run(
connectionInfoCompleter: connectionInfoCompleter, connectionInfoCompleter: connectionInfoCompleter,
)); ));
await connectionInfoCompleter.future; await connectionInfoCompleter.future;
// Ensure we got the URL and that it was not already launched. // Ensure we got the URL and that it was not already launched.
expect(logger.eventText, expect(
contains(json.encode(<String, Object>{ logger.eventText,
'name': 'app.webLaunchUrl', contains(json.encode(
'args': <String, Object>{ <String, Object>{
'url': 'http://localhost:8765/app/', 'name': 'app.webLaunchUrl',
'launched': false, 'args': <String, Object>{
}, 'url': 'http://localhost:8765/app/',
}, 'launched': false,
))); },
},
)));
expect(fakeVmServiceHost.hasRemainingExpectations, false); expect(fakeVmServiceHost.hasRemainingExpectations, false);
}, overrides: <Type, Generator>{ }, overrides: <Type, Generator>{
FileSystem: () => fileSystem, FileSystem: () => fileSystem,
...@@ -950,8 +1052,8 @@ void main() { ...@@ -950,8 +1052,8 @@ void main() {
// perf regression in hot restart. // perf regression in hot restart.
testUsingContext('Does not generate dart_plugin_registrant.dart', () async { testUsingContext('Does not generate dart_plugin_registrant.dart', () async {
// Create necessary files for [DartPluginRegistrantTarget] // Create necessary files for [DartPluginRegistrantTarget]
final File packageConfig = globals.fs.directory('.dart_tool') final File packageConfig =
.childFile('package_config.json'); globals.fs.directory('.dart_tool').childFile('package_config.json');
packageConfig.createSync(recursive: true); packageConfig.createSync(recursive: true);
packageConfig.writeAsStringSync(''' packageConfig.writeAsStringSync('''
{ {
...@@ -967,12 +1069,14 @@ void main() { ...@@ -967,12 +1069,14 @@ void main() {
} }
'''); ''');
// Start with a dart_plugin_registrant.dart file. // Start with a dart_plugin_registrant.dart file.
globals.fs.directory('.dart_tool') globals.fs
.childDirectory('flutter_build') .directory('.dart_tool')
.childFile('dart_plugin_registrant.dart') .childDirectory('flutter_build')
.createSync(recursive: true); .childFile('dart_plugin_registrant.dart')
.createSync(recursive: true);
final FlutterProject project = FlutterProject.fromDirectoryTest(fileSystem.currentDirectory); final FlutterProject project =
FlutterProject.fromDirectoryTest(fileSystem.currentDirectory);
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
await residentWebRunner.runSourceGenerators(); await residentWebRunner.runSourceGenerators();
...@@ -987,9 +1091,11 @@ void main() { ...@@ -987,9 +1091,11 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Successfully turns WebSocketException into ToolExit', () async { testUsingContext('Successfully turns WebSocketException into ToolExit',
() async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
setupMocks(); setupMocks();
webDevFS.exception = const WebSocketException(); webDevFS.exception = const WebSocketException();
...@@ -1002,7 +1108,8 @@ void main() { ...@@ -1002,7 +1108,8 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Successfully turns AppConnectionException into ToolExit', () async { testUsingContext('Successfully turns AppConnectionException into ToolExit',
() async {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
setupMocks(); setupMocks();
...@@ -1015,7 +1122,8 @@ void main() { ...@@ -1015,7 +1122,8 @@ void main() {
ProcessManager: () => processManager, ProcessManager: () => processManager,
}); });
testUsingContext('Successfully turns ChromeDebugError into ToolExit', () async { testUsingContext('Successfully turns ChromeDebugError into ToolExit',
() async {
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice); final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
setupMocks(); setupMocks();
...@@ -1044,7 +1152,8 @@ void main() { ...@@ -1044,7 +1152,8 @@ void main() {
testUsingContext('Rethrows unknown Error type from dwds tooling', () async { testUsingContext('Rethrows unknown Error type from dwds tooling', () async {
final BufferLogger logger = BufferLogger.test(); final BufferLogger logger = BufferLogger.test();
final ResidentRunner residentWebRunner = setUpResidentRunner(flutterDevice, logger: logger); final ResidentRunner residentWebRunner =
setUpResidentRunner(flutterDevice, logger: logger);
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]); fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[]);
setupMocks(); setupMocks();
webDevFS.exception = StateError(''); webDevFS.exception = StateError('');
...@@ -1057,15 +1166,18 @@ void main() { ...@@ -1057,15 +1166,18 @@ void main() {
}); });
} }
ResidentRunner setUpResidentRunner(FlutterDevice flutterDevice, { ResidentRunner setUpResidentRunner(
FlutterDevice flutterDevice, {
Logger logger, Logger logger,
SystemClock systemClock, SystemClock systemClock,
DebuggingOptions debuggingOptions, DebuggingOptions debuggingOptions,
}) { }) {
return ResidentWebRunner( return ResidentWebRunner(
flutterDevice, flutterDevice,
flutterProject: FlutterProject.fromDirectoryTest(globals.fs.currentDirectory), flutterProject:
debuggingOptions: debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug), FlutterProject.fromDirectoryTest(globals.fs.currentDirectory),
debuggingOptions:
debuggingOptions ?? DebuggingOptions.enabled(BuildInfo.debug),
ipv6: true, ipv6: true,
usage: globals.flutterUsage, usage: globals.flutterUsage,
systemClock: systemClock ?? SystemClock.fixed(DateTime.now()), systemClock: systemClock ?? SystemClock.fixed(DateTime.now()),
...@@ -1078,7 +1190,7 @@ ResidentRunner setUpResidentRunner(FlutterDevice flutterDevice, { ...@@ -1078,7 +1190,7 @@ ResidentRunner setUpResidentRunner(FlutterDevice flutterDevice, {
// Unfortunately Device, despite not being immutable, has an `operator ==`. // Unfortunately Device, despite not being immutable, has an `operator ==`.
// Until we fix that, we have to also ignore related lints here. // Until we fix that, we have to also ignore related lints here.
// ignore: avoid_implementing_value_types // ignore: avoid_implementing_value_types
class FakeWebServerDevice extends FakeDevice implements WebServerDevice { } class FakeWebServerDevice extends FakeDevice implements WebServerDevice {}
// Unfortunately Device, despite not being immutable, has an `operator ==`. // Unfortunately Device, despite not being immutable, has an `operator ==`.
// Until we fix that, we have to also ignore related lints here. // Until we fix that, we have to also ignore related lints here.
...@@ -1126,7 +1238,8 @@ class FakeDebugConnection extends Fake implements DebugConnection { ...@@ -1126,7 +1238,8 @@ class FakeDebugConnection extends Fake implements DebugConnection {
FakeVmServiceHost Function() fakeVmServiceHost; FakeVmServiceHost Function() fakeVmServiceHost;
@override @override
vm_service.VmService get vmService => fakeVmServiceHost.call().vmService.service; vm_service.VmService get vmService =>
fakeVmServiceHost.call().vmService.service;
@override @override
String uri; String uri;
...@@ -1155,9 +1268,9 @@ class FakeAppConnection extends Fake implements AppConnection { ...@@ -1155,9 +1268,9 @@ class FakeAppConnection extends Fake implements AppConnection {
// Unfortunately Device, despite not being immutable, has an `operator ==`. // Unfortunately Device, despite not being immutable, has an `operator ==`.
// Until we fix that, we have to also ignore related lints here. // Until we fix that, we have to also ignore related lints here.
// ignore: avoid_implementing_value_types // ignore: avoid_implementing_value_types
class FakeChromeDevice extends Fake implements ChromiumDevice { } class FakeChromeDevice extends Fake implements ChromiumDevice {}
class FakeWipDebugger extends Fake implements WipDebugger { } class FakeWipDebugger extends Fake implements WipDebugger {}
class FakeResidentCompiler extends Fake implements ResidentCompiler { class FakeResidentCompiler extends Fake implements ResidentCompiler {
@override @override
...@@ -1170,15 +1283,16 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler { ...@@ -1170,15 +1283,16 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
@required FileSystem fs, @required FileSystem fs,
bool suppressErrors = false, bool suppressErrors = false,
bool checkDartPluginRegistry = false, bool checkDartPluginRegistry = false,
File dartPluginRegistrant,
}) async { }) async {
return const CompilerOutput('foo.dill', 0, <Uri>[]); return const CompilerOutput('foo.dill', 0, <Uri>[]);
} }
@override @override
void accept() { } void accept() {}
@override @override
void reset() { } void reset() {}
@override @override
Future<CompilerOutput> reject() async { Future<CompilerOutput> reject() async {
...@@ -1186,7 +1300,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler { ...@@ -1186,7 +1300,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
} }
@override @override
void addFileSystemRoot(String root) { } void addFileSystemRoot(String root) {}
} }
class FakeWebDevFS extends Fake implements WebDevFS { class FakeWebDevFS extends Fake implements WebDevFS {
...@@ -1229,6 +1343,7 @@ class FakeWebDevFS extends Fake implements WebDevFS { ...@@ -1229,6 +1343,7 @@ class FakeWebDevFS extends Fake implements WebDevFS {
bool bundleFirstUpload = false, bool bundleFirstUpload = false,
bool fullRestart = false, bool fullRestart = false,
String projectRootPath, String projectRootPath,
File dartPluginRegistrant,
}) async { }) async {
this.mainUri = mainUri; this.mainUri = mainUri;
return report; return report;
...@@ -1249,7 +1364,8 @@ class FakeChromeConnection extends Fake implements ChromeConnection { ...@@ -1249,7 +1364,8 @@ class FakeChromeConnection extends Fake implements ChromeConnection {
final List<ChromeTab> tabs = <ChromeTab>[]; final List<ChromeTab> tabs = <ChromeTab>[];
@override @override
Future<ChromeTab> getTab(bool Function(ChromeTab tab) accept, {Duration retryFor}) async { Future<ChromeTab> getTab(bool Function(ChromeTab tab) accept,
{Duration retryFor}) async {
return tabs.firstWhere(accept); return tabs.firstWhere(accept);
} }
...@@ -1347,16 +1463,16 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -1347,16 +1463,16 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
DevFS get devFS => _devFS; DevFS get devFS => _devFS;
@override @override
set devFS(DevFS value) { } set devFS(DevFS value) {}
@override @override
Device device; Device device;
@override @override
Future<void> stopEchoingDeviceLog() async { } Future<void> stopEchoingDeviceLog() async {}
@override @override
Future<void> initLogReader() async { } Future<void> initLogReader() async {}
@override @override
Future<Uri> setupDevFS(String fsName, Directory rootDirectory) async { Future<Uri> setupDevFS(String fsName, Directory rootDirectory) async {
...@@ -1364,7 +1480,8 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -1364,7 +1480,8 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
} }
@override @override
Future<void> exitApps({Duration timeoutDelay = const Duration(seconds: 10)}) async { } Future<void> exitApps(
{Duration timeoutDelay = const Duration(seconds: 10)}) async {}
@override @override
Future<void> connect({ Future<void> connect({
...@@ -1380,7 +1497,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -1380,7 +1497,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
bool cacheStartupProfile = false, bool cacheStartupProfile = false,
@required bool allowExistingDdsInstance, @required bool allowExistingDdsInstance,
bool ipv6 = false, bool ipv6 = false,
}) async { } }) async {}
@override @override
Future<UpdateFSReport> updateDevFS({ Future<UpdateFSReport> updateDevFS({
...@@ -1396,6 +1513,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -1396,6 +1513,7 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
String dillOutputPath, String dillOutputPath,
List<Uri> invalidatedFiles, List<Uri> invalidatedFiles,
PackageConfig packageConfig, PackageConfig packageConfig,
File dartPluginRegistrant,
}) async { }) async {
if (reportError != null) { if (reportError != null) {
throw reportError; throw reportError;
...@@ -1404,5 +1522,5 @@ class FakeFlutterDevice extends Fake implements FlutterDevice { ...@@ -1404,5 +1522,5 @@ class FakeFlutterDevice extends Fake implements FlutterDevice {
} }
@override @override
Future<void> updateReloadStatus(bool wasReloadSuccessful) async { } Future<void> updateReloadStatus(bool wasReloadSuccessful) async {}
} }
...@@ -200,6 +200,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler { ...@@ -200,6 +200,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
FileSystem? fs, FileSystem? fs,
bool suppressErrors = false, bool suppressErrors = false,
bool checkDartPluginRegistry = false, bool checkDartPluginRegistry = false,
File? dartPluginRegistrant,
}) async { }) async {
if (compilerOutput != null) { if (compilerOutput != null) {
fileSystem!.file(compilerOutput!.outputFilename).createSync(recursive: true); fileSystem!.file(compilerOutput!.outputFilename).createSync(recursive: true);
......
...@@ -1120,6 +1120,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler { ...@@ -1120,6 +1120,7 @@ class FakeResidentCompiler extends Fake implements ResidentCompiler {
FileSystem fs, FileSystem fs,
bool suppressErrors = false, bool suppressErrors = false,
bool checkDartPluginRegistry = false, bool checkDartPluginRegistry = false,
File dartPluginRegistrant,
}) async { }) async {
return output; return output;
} }
......
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