Unverified Commit 7ab8517f authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

[flutter_tools] refactor devtools handler to expose single method for...

[flutter_tools] refactor devtools handler to expose single method for run/attach and restart (#75807)
parent b05d6ec8
...@@ -13,10 +13,27 @@ import 'base/logger.dart'; ...@@ -13,10 +13,27 @@ import 'base/logger.dart';
import 'resident_runner.dart'; import 'resident_runner.dart';
import 'vmservice.dart'; import 'vmservice.dart';
typedef ResidentDevtoolsHandlerFactory = ResidentDevtoolsHandler Function(DevtoolsLauncher, ResidentRunner, Logger);
ResidentDevtoolsHandler createDefaultHandler(DevtoolsLauncher launcher, ResidentRunner runner, Logger logger) {
return FlutterResidentDevtoolsHandler(launcher, runner, logger);
}
/// Helper class to manage the life-cycle of devtools and its interaction with /// Helper class to manage the life-cycle of devtools and its interaction with
/// the resident runner. /// the resident runner.
class ResidentDevtoolsHandler { abstract class ResidentDevtoolsHandler {
ResidentDevtoolsHandler(this._devToolsLauncher, this._residentRunner, this._logger); /// The current devtools server, or null if one is not running.
DevToolsServerAddress get activeDevToolsServer;
Future<void> hotRestart(List<FlutterDevice> flutterDevices);
Future<void> serveAndAnnounceDevTools({Uri devToolsServerAddress, List<FlutterDevice> flutterDevices});
Future<void> shutdown();
}
class FlutterResidentDevtoolsHandler implements ResidentDevtoolsHandler {
FlutterResidentDevtoolsHandler(this._devToolsLauncher, this._residentRunner, this._logger);
final DevtoolsLauncher _devToolsLauncher; final DevtoolsLauncher _devToolsLauncher;
final ResidentRunner _residentRunner; final ResidentRunner _residentRunner;
...@@ -24,10 +41,11 @@ class ResidentDevtoolsHandler { ...@@ -24,10 +41,11 @@ class ResidentDevtoolsHandler {
bool _shutdown = false; bool _shutdown = false;
bool _served = false; bool _served = false;
/// The current devtools server, or null if one is not running. @override
DevToolsServerAddress get activeDevToolsServer => _devToolsLauncher?.activeDevToolsServer; DevToolsServerAddress get activeDevToolsServer => _devToolsLauncher?.activeDevToolsServer;
// This must be guaranteed not to return a Future that fails. // This must be guaranteed not to return a Future that fails.
@override
Future<void> serveAndAnnounceDevTools({ Future<void> serveAndAnnounceDevTools({
Uri devToolsServerAddress, Uri devToolsServerAddress,
@required List<FlutterDevice> flutterDevices, @required List<FlutterDevice> flutterDevices,
...@@ -48,12 +66,16 @@ class ResidentDevtoolsHandler { ...@@ -48,12 +66,16 @@ class ResidentDevtoolsHandler {
// report their URLs yet. Do so now. // report their URLs yet. Do so now.
_residentRunner.printDebuggerList(includeObservatory: false); _residentRunner.printDebuggerList(includeObservatory: false);
} }
await maybeCallDevToolsUriServiceExtension( await _waitForExtensions(flutterDevices);
await _maybeCallDevToolsUriServiceExtension(
flutterDevices,
);
await _callConnectedVmServiceUriExtension(
flutterDevices, flutterDevices,
); );
} }
Future<void> maybeCallDevToolsUriServiceExtension( Future<void> _maybeCallDevToolsUriServiceExtension(
List<FlutterDevice> flutterDevices, List<FlutterDevice> flutterDevices,
) async { ) async {
if (_devToolsLauncher?.activeDevToolsServer == null) { if (_devToolsLauncher?.activeDevToolsServer == null) {
...@@ -69,7 +91,6 @@ class ResidentDevtoolsHandler { ...@@ -69,7 +91,6 @@ class ResidentDevtoolsHandler {
Future<void> _callDevToolsUriExtension( Future<void> _callDevToolsUriExtension(
FlutterDevice device, FlutterDevice device,
) async { ) async {
await waitForExtension(device.vmService, 'ext.flutter.activeDevToolsServerAddress');
try { try {
await _invokeRpcOnFirstView( await _invokeRpcOnFirstView(
'ext.flutter.activeDevToolsServerAddress', 'ext.flutter.activeDevToolsServerAddress',
...@@ -86,7 +107,15 @@ class ResidentDevtoolsHandler { ...@@ -86,7 +107,15 @@ class ResidentDevtoolsHandler {
} }
} }
Future<void> callConnectedVmServiceUriExtension(List<FlutterDevice> flutterDevices) async { Future<void> _waitForExtensions(List<FlutterDevice> flutterDevices) async {
await Future.wait(<Future<void>>[
for (final FlutterDevice device in flutterDevices)
if (device.vmService != null)
waitForExtension(device.vmService, 'ext.flutter.connectedVmServiceUri'),
]);
}
Future<void> _callConnectedVmServiceUriExtension(List<FlutterDevice> flutterDevices) async {
await Future.wait(<Future<void>>[ await Future.wait(<Future<void>>[
for (final FlutterDevice device in flutterDevices) for (final FlutterDevice device in flutterDevices)
if (device.vmService != null) if (device.vmService != null)
...@@ -95,9 +124,10 @@ class ResidentDevtoolsHandler { ...@@ -95,9 +124,10 @@ class ResidentDevtoolsHandler {
} }
Future<void> _callConnectedVmServiceExtension(FlutterDevice device) async { Future<void> _callConnectedVmServiceExtension(FlutterDevice device) async {
if (device.vmService.httpAddress != null || device.vmService.wsAddress != null) {
final Uri uri = device.vmService.httpAddress ?? device.vmService.wsAddress; final Uri uri = device.vmService.httpAddress ?? device.vmService.wsAddress;
await waitForExtension(device.vmService, 'ext.flutter.connectedVmServiceUri'); if (uri == null) {
return;
}
try { try {
await _invokeRpcOnFirstView( await _invokeRpcOnFirstView(
'ext.flutter.connectedVmServiceUri', 'ext.flutter.connectedVmServiceUri',
...@@ -114,13 +144,15 @@ class ResidentDevtoolsHandler { ...@@ -114,13 +144,15 @@ class ResidentDevtoolsHandler {
); );
} }
} }
}
Future<void> _invokeRpcOnFirstView(String method, { Future<void> _invokeRpcOnFirstView(String method, {
@required FlutterDevice device, @required FlutterDevice device,
@required Map<String, dynamic> params, @required Map<String, dynamic> params,
}) async { }) async {
final List<FlutterView> views = await device.vmService.getFlutterViews(); final List<FlutterView> views = await device.vmService.getFlutterViews();
if (views.isEmpty) {
return;
}
await device.vmService await device.vmService
.invokeFlutterExtensionRpcRaw( .invokeFlutterExtensionRpcRaw(
method, method,
...@@ -130,13 +162,16 @@ class ResidentDevtoolsHandler { ...@@ -130,13 +162,16 @@ class ResidentDevtoolsHandler {
); );
} }
@override
Future<void> hotRestart(List<FlutterDevice> flutterDevices) async { Future<void> hotRestart(List<FlutterDevice> flutterDevices) async {
await _waitForExtensions(flutterDevices);
await Future.wait(<Future<void>>[ await Future.wait(<Future<void>>[
maybeCallDevToolsUriServiceExtension(flutterDevices), _maybeCallDevToolsUriServiceExtension(flutterDevices),
callConnectedVmServiceUriExtension(flutterDevices), _callConnectedVmServiceUriExtension(flutterDevices),
]); ]);
} }
@override
Future<void> shutdown() async { Future<void> shutdown() async {
if (_devToolsLauncher == null || _shutdown || !_served) { if (_devToolsLauncher == null || _shutdown || !_served) {
return; return;
...@@ -176,3 +211,29 @@ Future<void> waitForExtension(vm_service.VmService vmService, String extension) ...@@ -176,3 +211,29 @@ Future<void> waitForExtension(vm_service.VmService vmService, String extension)
} }
await completer.future; await completer.future;
} }
@visibleForTesting
NoOpDevtoolsHandler createNoOpHandler(DevtoolsLauncher launcher, ResidentRunner runner, Logger logger) {
return NoOpDevtoolsHandler();
}
@visibleForTesting
class NoOpDevtoolsHandler implements ResidentDevtoolsHandler {
@override
DevToolsServerAddress get activeDevToolsServer => null;
@override
Future<void> hotRestart(List<FlutterDevice> flutterDevices) async {
return;
}
@override
Future<void> serveAndAnnounceDevTools({Uri devToolsServerAddress, List<FlutterDevice> flutterDevices}) async {
return;
}
@override
Future<void> shutdown() async {
return;
}
}
...@@ -758,6 +758,7 @@ abstract class ResidentRunner { ...@@ -758,6 +758,7 @@ abstract class ResidentRunner {
this.hotMode = true, this.hotMode = true,
String dillOutputPath, String dillOutputPath,
this.machine = false, this.machine = false,
ResidentDevtoolsHandlerFactory devtoolsHandler = createDefaultHandler,
}) : mainPath = globals.fs.path.absolute(target), }) : mainPath = globals.fs.path.absolute(target),
packagesFilePath = debuggingOptions.buildInfo.packagesPath, packagesFilePath = debuggingOptions.buildInfo.packagesPath,
projectRootPath = projectRootPath ?? globals.fs.currentDirectory.path, projectRootPath = projectRootPath ?? globals.fs.currentDirectory.path,
...@@ -775,7 +776,7 @@ abstract class ResidentRunner { ...@@ -775,7 +776,7 @@ abstract class ResidentRunner {
if (!artifactDirectory.existsSync()) { if (!artifactDirectory.existsSync()) {
artifactDirectory.createSync(recursive: true); artifactDirectory.createSync(recursive: true);
} }
_residentDevtoolsHandler = ResidentDevtoolsHandler(DevtoolsLauncher.instance, this, globals.logger); _residentDevtoolsHandler = devtoolsHandler(DevtoolsLauncher.instance, this, globals.logger);
} }
@protected @protected
......
...@@ -13,6 +13,7 @@ import 'base/file_system.dart'; ...@@ -13,6 +13,7 @@ import 'base/file_system.dart';
import 'build_info.dart'; import 'build_info.dart';
import 'device.dart'; import 'device.dart';
import 'globals.dart' as globals; import 'globals.dart' as globals;
import 'resident_devtools_handler.dart';
import 'resident_runner.dart'; import 'resident_runner.dart';
import 'tracing.dart'; import 'tracing.dart';
import 'vmservice.dart'; import 'vmservice.dart';
...@@ -28,6 +29,7 @@ class ColdRunner extends ResidentRunner { ...@@ -28,6 +29,7 @@ class ColdRunner extends ResidentRunner {
bool ipv6 = false, bool ipv6 = false,
bool stayResident = true, bool stayResident = true,
bool machine = false, bool machine = false,
ResidentDevtoolsHandlerFactory devtoolsHandler = createDefaultHandler,
}) : super( }) : super(
devices, devices,
target: target, target: target,
...@@ -36,6 +38,7 @@ class ColdRunner extends ResidentRunner { ...@@ -36,6 +38,7 @@ class ColdRunner extends ResidentRunner {
stayResident: stayResident, stayResident: stayResident,
ipv6: ipv6, ipv6: ipv6,
machine: machine, machine: machine,
devtoolsHandler: devtoolsHandler,
); );
final bool traceStartup; final bool traceStartup;
...@@ -73,14 +76,6 @@ class ColdRunner extends ResidentRunner { ...@@ -73,14 +76,6 @@ class ColdRunner extends ResidentRunner {
return 1; return 1;
} }
if (enableDevTools) {
// The method below is guaranteed never to return a failing future.
unawaited(residentDevtoolsHandler.serveAndAnnounceDevTools(
devToolsServerAddress: debuggingOptions.devToolsServerAddress,
flutterDevices: flutterDevices,
));
}
// Connect to observatory. // Connect to observatory.
if (debuggingEnabled) { if (debuggingEnabled) {
try { try {
...@@ -92,6 +87,14 @@ class ColdRunner extends ResidentRunner { ...@@ -92,6 +87,14 @@ class ColdRunner extends ResidentRunner {
} }
} }
if (enableDevTools && debuggingEnabled) {
// The method below is guaranteed never to return a failing future.
unawaited(residentDevtoolsHandler.serveAndAnnounceDevTools(
devToolsServerAddress: debuggingOptions.devToolsServerAddress,
flutterDevices: flutterDevices,
));
}
if (flutterDevices.first.observatoryUris != null) { if (flutterDevices.first.observatoryUris != null) {
// For now, only support one debugger connection. // For now, only support one debugger connection.
connectionInfoCompleter?.complete(DebugConnectionInfo( connectionInfoCompleter?.complete(DebugConnectionInfo(
...@@ -125,12 +128,6 @@ class ColdRunner extends ResidentRunner { ...@@ -125,12 +128,6 @@ class ColdRunner extends ResidentRunner {
appFinished(); appFinished();
} }
if (debuggingEnabled) {
unawaited(residentDevtoolsHandler.callConnectedVmServiceUriExtension(
flutterDevices,
));
}
appStartedCompleter?.complete(); appStartedCompleter?.complete();
writeVmServiceFile(); writeVmServiceFile();
...@@ -160,14 +157,6 @@ class ColdRunner extends ResidentRunner { ...@@ -160,14 +157,6 @@ class ColdRunner extends ResidentRunner {
return 2; return 2;
} }
if (enableDevTools) {
// The method below is guaranteed never to return a failing future.
unawaited(residentDevtoolsHandler.serveAndAnnounceDevTools(
devToolsServerAddress: debuggingOptions.devToolsServerAddress,
flutterDevices: flutterDevices,
));
}
for (final FlutterDevice device in flutterDevices) { for (final FlutterDevice device in flutterDevices) {
await device.initLogReader(); await device.initLogReader();
} }
...@@ -178,9 +167,13 @@ class ColdRunner extends ResidentRunner { ...@@ -178,9 +167,13 @@ class ColdRunner extends ResidentRunner {
} }
} }
unawaited(residentDevtoolsHandler.callConnectedVmServiceUriExtension( if (enableDevTools && debuggingEnabled) {
flutterDevices, // The method below is guaranteed never to return a failing future.
unawaited(residentDevtoolsHandler.serveAndAnnounceDevTools(
devToolsServerAddress: debuggingOptions.devToolsServerAddress,
flutterDevices: flutterDevices,
)); ));
}
appStartedCompleter?.complete(); appStartedCompleter?.complete();
if (stayResident) { if (stayResident) {
......
...@@ -5,10 +5,11 @@ ...@@ -5,10 +5,11 @@
// @dart = 2.8 // @dart = 2.8
import 'dart:async'; import 'dart:async';
import 'package:package_config/package_config.dart';
import 'package:vm_service/vm_service.dart' as vm_service;
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart';
import 'package:pool/pool.dart'; import 'package:pool/pool.dart';
import 'package:vm_service/vm_service.dart' as vm_service;
import 'base/common.dart'; import 'base/common.dart';
import 'base/context.dart'; import 'base/context.dart';
...@@ -26,6 +27,7 @@ import 'device.dart'; ...@@ -26,6 +27,7 @@ import 'device.dart';
import 'features.dart'; import 'features.dart';
import 'globals.dart' as globals; import 'globals.dart' as globals;
import 'reporting/reporting.dart'; import 'reporting/reporting.dart';
import 'resident_devtools_handler.dart';
import 'resident_runner.dart'; import 'resident_runner.dart';
import 'vmservice.dart'; import 'vmservice.dart';
...@@ -78,6 +80,7 @@ class HotRunner extends ResidentRunner { ...@@ -78,6 +80,7 @@ class HotRunner extends ResidentRunner {
bool stayResident = true, bool stayResident = true,
bool ipv6 = false, bool ipv6 = false,
bool machine = false, bool machine = false,
ResidentDevtoolsHandlerFactory devtoolsHandler = createDefaultHandler,
}) : super( }) : super(
devices, devices,
target: target, target: target,
...@@ -88,6 +91,7 @@ class HotRunner extends ResidentRunner { ...@@ -88,6 +91,7 @@ class HotRunner extends ResidentRunner {
dillOutputPath: dillOutputPath, dillOutputPath: dillOutputPath,
ipv6: ipv6, ipv6: ipv6,
machine: machine, machine: machine,
devtoolsHandler: devtoolsHandler,
); );
final bool benchmarkMode; final bool benchmarkMode;
...@@ -222,10 +226,6 @@ class HotRunner extends ResidentRunner { ...@@ -222,10 +226,6 @@ class HotRunner extends ResidentRunner {
return 3; return 3;
} }
unawaited(residentDevtoolsHandler.callConnectedVmServiceUriExtension(
flutterDevices,
));
final Stopwatch initialUpdateDevFSsTimer = Stopwatch()..start(); final Stopwatch initialUpdateDevFSsTimer = Stopwatch()..start();
final UpdateFSReport devfsResult = await _updateDevFS(fullRestart: true); final UpdateFSReport devfsResult = await _updateDevFS(fullRestart: true);
_addBenchmarkData( _addBenchmarkData(
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import 'package:file/memory.dart'; import 'package:file/memory.dart';
import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/file_system.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/resident_devtools_handler.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import 'package:flutter_tools/src/artifacts.dart'; import 'package:flutter_tools/src/artifacts.dart';
import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/io.dart';
...@@ -187,6 +188,7 @@ void main() { ...@@ -187,6 +188,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
).restart(fullRestart: true); ).restart(fullRestart: true);
// Expect hot restart failed. // Expect hot restart failed.
expect(result.isOk, false); expect(result.isOk, false);
...@@ -219,6 +221,7 @@ void main() { ...@@ -219,6 +221,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
).restart(fullRestart: true); ).restart(fullRestart: true);
// Expect hot restart failed. // Expect hot restart failed.
expect(result.isOk, false); expect(result.isOk, false);
...@@ -322,6 +325,7 @@ void main() { ...@@ -322,6 +325,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
final OperationResult result = await hotRunner.restart(fullRestart: true); final OperationResult result = await hotRunner.restart(fullRestart: true);
// Expect hot restart was successful. // Expect hot restart was successful.
...@@ -351,6 +355,7 @@ void main() { ...@@ -351,6 +355,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
).restart(fullRestart: true); ).restart(fullRestart: true);
expect(result.isOk, false); expect(result.isOk, false);
expect(result.message, 'setupHotRestart failed'); expect(result.message, 'setupHotRestart failed');
...@@ -417,6 +422,7 @@ void main() { ...@@ -417,6 +422,7 @@ void main() {
devices, devices,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.disabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
final OperationResult result = await hotRunner.restart(fullRestart: true); final OperationResult result = await hotRunner.restart(fullRestart: true);
// Expect hot restart successful. // Expect hot restart successful.
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/devtools_launcher.dart'; import 'package:flutter_tools/src/devtools_launcher.dart';
import 'package:flutter_tools/src/vmservice.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
...@@ -16,6 +17,31 @@ import 'package:test/fake.dart'; ...@@ -16,6 +17,31 @@ import 'package:test/fake.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.dart'; import '../src/context.dart';
final vm_service.Isolate isolate = vm_service.Isolate(
id: '1',
pauseEvent: vm_service.Event(
kind: vm_service.EventKind.kResume,
timestamp: 0
),
breakpoints: <vm_service.Breakpoint>[],
exceptionPauseMode: null,
libraries: <vm_service.LibraryRef>[
vm_service.LibraryRef(
id: '1',
uri: 'file:///hello_world/main.dart',
name: '',
),
],
livePorts: 0,
name: 'test',
number: '1',
pauseOnExit: false,
runnable: true,
startTime: 0,
isSystemIsolate: false,
isolateFlags: <vm_service.IsolateFlag>[],
extensionRPCs: <String>['foo']
);
final vm_service.Isolate fakeUnpausedIsolate = vm_service.Isolate( final vm_service.Isolate fakeUnpausedIsolate = vm_service.Isolate(
id: '1', id: '1',
...@@ -58,9 +84,23 @@ final vm_service.VM fakeVM = vm_service.VM( ...@@ -58,9 +84,23 @@ final vm_service.VM fakeVM = vm_service.VM(
systemIsolates: <vm_service.IsolateRef>[], systemIsolates: <vm_service.IsolateRef>[],
); );
final FlutterView fakeFlutterView = FlutterView(
id: 'a',
uiIsolate: fakeUnpausedIsolate,
);
final FakeVmServiceRequest listViews = FakeVmServiceRequest(
method: kListViewsMethod,
jsonResponse: <String, Object>{
'views': <Object>[
fakeFlutterView.toJson(),
],
},
);
void main() { void main() {
testWithoutContext('Does not serve devtools if launcher is null', () async { testWithoutContext('Does not serve devtools if launcher is null', () async {
final ResidentDevtoolsHandler handler = ResidentDevtoolsHandler( final ResidentDevtoolsHandler handler = FlutterResidentDevtoolsHandler(
null, null,
FakeResidentRunner(), FakeResidentRunner(),
BufferLogger.test(), BufferLogger.test(),
...@@ -72,7 +112,7 @@ void main() { ...@@ -72,7 +112,7 @@ void main() {
}); });
testWithoutContext('Does not serve devtools if ResidentRunner does not support the service protocol', () async { testWithoutContext('Does not serve devtools if ResidentRunner does not support the service protocol', () async {
final ResidentDevtoolsHandler handler = ResidentDevtoolsHandler( final ResidentDevtoolsHandler handler = FlutterResidentDevtoolsHandler(
FakeDevtoolsLauncher(), FakeDevtoolsLauncher(),
FakeResidentRunner()..supportsServiceProtocol = false, FakeResidentRunner()..supportsServiceProtocol = false,
BufferLogger.test(), BufferLogger.test(),
...@@ -91,7 +131,7 @@ void main() { ...@@ -91,7 +131,7 @@ void main() {
platform: FakePlatform(), platform: FakePlatform(),
persistentToolState: null, persistentToolState: null,
); );
final ResidentDevtoolsHandler handler = ResidentDevtoolsHandler( final ResidentDevtoolsHandler handler = FlutterResidentDevtoolsHandler(
// Uses real devtools instance which should be a no-op if // Uses real devtools instance which should be a no-op if
// URI is already set. // URI is already set.
launcher, launcher,
...@@ -108,8 +148,8 @@ void main() { ...@@ -108,8 +148,8 @@ void main() {
expect(handler.activeDevToolsServer.port, 8181); expect(handler.activeDevToolsServer.port, 8181);
}); });
testWithoutContext('can serveAndAnnounceDevTools with attached device does not fail on null vm service', () async { testWithoutContext('serveAndAnnounceDevTools with attached device does not fail on null vm service', () async {
final ResidentDevtoolsHandler handler = ResidentDevtoolsHandler( final ResidentDevtoolsHandler handler = FlutterResidentDevtoolsHandler(
FakeDevtoolsLauncher()..activeDevToolsServer = DevToolsServerAddress('localhost', 8080), FakeDevtoolsLauncher()..activeDevToolsServer = DevToolsServerAddress('localhost', 8080),
FakeResidentRunner(), FakeResidentRunner(),
BufferLogger.test(), BufferLogger.test(),
...@@ -123,33 +163,63 @@ void main() { ...@@ -123,33 +163,63 @@ void main() {
); );
}); });
testWithoutContext('wait for extension handles an immediate extension', () { testWithoutContext('serveAndAnnounceDevTools with invokes devtools and vm_service setter', () async {
final vm_service.Isolate isolate = vm_service.Isolate( final ResidentDevtoolsHandler handler = FlutterResidentDevtoolsHandler(
id: '1', FakeDevtoolsLauncher()..activeDevToolsServer = DevToolsServerAddress('localhost', 8080),
pauseEvent: vm_service.Event( FakeResidentRunner(),
kind: vm_service.EventKind.kResume, BufferLogger.test(),
timestamp: 0 );
final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
const FakeVmServiceRequest(
method: 'streamListen',
args: <String, Object>{
'streamId': 'Extension',
}
), ),
breakpoints: <vm_service.Breakpoint>[], FakeVmServiceRequest(method: 'getVM', jsonResponse: fakeVM.toJson()),
exceptionPauseMode: null, FakeVmServiceRequest(
libraries: <vm_service.LibraryRef>[ method: 'getIsolate',
vm_service.LibraryRef( jsonResponse: isolate.toJson(),
id: '1', args: <String, Object>{
uri: 'file:///hello_world/main.dart', 'isolateId': '1',
name: '', },
), ),
], FakeVmServiceStreamResponse(
livePorts: 0, streamId: 'Extension',
name: 'test', event: vm_service.Event(
number: '1', timestamp: 0,
pauseOnExit: false, extensionKind: 'Flutter.FrameworkInitialization',
runnable: true, kind: 'test',
startTime: 0, ),
isSystemIsolate: false, ),
isolateFlags: <vm_service.IsolateFlag>[], listViews,
extensionRPCs: <String>['foo'] const FakeVmServiceRequest(
method: 'ext.flutter.activeDevToolsServerAddress',
args: <String, Object>{
'isolateId': '1',
'value': 'http://localhost:8080',
},
),
listViews,
const FakeVmServiceRequest(
method: 'ext.flutter.connectedVmServiceUri',
args: <String, Object>{
'isolateId': '1',
'value': 'http://localhost:1234',
},
),
]);
final FakeFlutterDevice device = FakeFlutterDevice()
..vmService = fakeVmServiceHost.vmService;
setHttpAddress(Uri.parse('http://localhost:1234'), fakeVmServiceHost.vmService);
await handler.serveAndAnnounceDevTools(
flutterDevices: <FlutterDevice>[device],
); );
});
testWithoutContext('wait for extension handles an immediate extension', () {
final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ final FakeVmServiceHost fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
const FakeVmServiceRequest( const FakeVmServiceRequest(
method: 'streamListen', method: 'streamListen',
......
...@@ -10,6 +10,7 @@ import 'package:flutter_tools/src/application_package.dart'; ...@@ -10,6 +10,7 @@ import 'package:flutter_tools/src/application_package.dart';
import 'package:flutter_tools/src/base/dds.dart'; import 'package:flutter_tools/src/base/dds.dart';
import 'package:flutter_tools/src/base/platform.dart'; import 'package:flutter_tools/src/base/platform.dart';
import 'package:flutter_tools/src/features.dart'; import 'package:flutter_tools/src/features.dart';
import 'package:flutter_tools/src/resident_devtools_handler.dart';
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:vm_service/vm_service.dart' as vm_service; import 'package:vm_service/vm_service.dart' as vm_service;
...@@ -132,11 +133,6 @@ const FakeVmServiceRequest setAssetBundlePath = FakeVmServiceRequest( ...@@ -132,11 +133,6 @@ const FakeVmServiceRequest setAssetBundlePath = FakeVmServiceRequest(
} }
); );
const FakeVmServiceRequest listenToExtensionStream = FakeVmServiceRequest(
method: 'streamListen',
args: <String, Object>{'streamId': 'Extension'},
);
final Uri testUri = Uri.parse('foo://bar'); final Uri testUri = Uri.parse('foo://bar');
void main() { void main() {
...@@ -163,6 +159,7 @@ void main() { ...@@ -163,6 +159,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
}); });
mockFlutterDevice = MockFlutterDevice(); mockFlutterDevice = MockFlutterDevice();
...@@ -261,6 +258,7 @@ void main() { ...@@ -261,6 +258,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.generator).thenReturn(residentCompiler); when(mockFlutterDevice.generator).thenReturn(residentCompiler);
when(residentCompiler.recompile( when(residentCompiler.recompile(
...@@ -305,6 +303,7 @@ void main() { ...@@ -305,6 +303,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.generator).thenReturn(residentCompiler); when(mockFlutterDevice.generator).thenReturn(residentCompiler);
when(residentCompiler.recompile( when(residentCompiler.recompile(
...@@ -340,6 +339,7 @@ void main() { ...@@ -340,6 +339,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.release), debuggingOptions: DebuggingOptions.enabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runCold( when(mockFlutterDevice.runCold(
coldRunner: anyNamed('coldRunner'), coldRunner: anyNamed('coldRunner'),
...@@ -365,6 +365,7 @@ void main() { ...@@ -365,6 +365,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.release), debuggingOptions: DebuggingOptions.enabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runCold( when(mockFlutterDevice.runCold(
coldRunner: anyNamed('coldRunner'), coldRunner: anyNamed('coldRunner'),
...@@ -395,6 +396,7 @@ void main() { ...@@ -395,6 +396,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.generator).thenReturn(residentCompiler); when(mockFlutterDevice.generator).thenReturn(residentCompiler);
when(residentCompiler.recompile( when(residentCompiler.recompile(
...@@ -477,6 +479,7 @@ void main() { ...@@ -477,6 +479,7 @@ void main() {
startPaused: true, startPaused: true,
), ),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
final Completer<DebugConnectionInfo> futureConnectionInfo = Completer<DebugConnectionInfo>.sync(); final Completer<DebugConnectionInfo> futureConnectionInfo = Completer<DebugConnectionInfo>.sync();
final Completer<void> futureAppStart = Completer<void>.sync(); final Completer<void> futureAppStart = Completer<void>.sync();
...@@ -639,6 +642,7 @@ void main() { ...@@ -639,6 +642,7 @@ void main() {
'--enable-experiment=non-nullable', '--enable-experiment=non-nullable',
], ],
)), )),
devtoolsHandler: createNoOpHandler,
); );
final Completer<DebugConnectionInfo> futureConnectionInfo = Completer<DebugConnectionInfo>.sync(); final Completer<DebugConnectionInfo> futureConnectionInfo = Completer<DebugConnectionInfo>.sync();
final Completer<void> futureAppStart = Completer<void>.sync(); final Completer<void> futureAppStart = Completer<void>.sync();
...@@ -709,6 +713,7 @@ void main() { ...@@ -709,6 +713,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
final Completer<DebugConnectionInfo> futureConnectionInfo = Completer<DebugConnectionInfo>.sync(); final Completer<DebugConnectionInfo> futureConnectionInfo = Completer<DebugConnectionInfo>.sync();
final Completer<void> futureAppStart = Completer<void>.sync(); final Completer<void> futureAppStart = Completer<void>.sync();
...@@ -1029,6 +1034,7 @@ void main() { ...@@ -1029,6 +1034,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockDevFS.update( when(mockDevFS.update(
mainUri: anyNamed('mainUri'), mainUri: anyNamed('mainUri'),
...@@ -1402,6 +1408,7 @@ void main() { ...@@ -1402,6 +1408,7 @@ void main() {
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
dillOutputPath: globals.fs.path.join('foobar', 'app.dill'), dillOutputPath: globals.fs.path.join('foobar', 'app.dill'),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(otherRunner.artifactDirectory.path, contains('foobar')); expect(otherRunner.artifactDirectory.path, contains('foobar'));
})); }));
...@@ -1511,6 +1518,7 @@ void main() { ...@@ -1511,6 +1518,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
residentRunner.printHelp(details: true); residentRunner.printHelp(details: true);
...@@ -1587,59 +1595,6 @@ void main() { ...@@ -1587,59 +1595,6 @@ void main() {
) )
})); }));
testUsingContext('ResidentRunner invokes DevToolsLauncher when attaching and shutting down DevTools', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews,
listViews,
setAssetBundlePath,
]);
final Future<int> result = residentRunner.attach(enableDevTools: true);
expect(await result, 0);
// Verify DevTools was served.
verify(mockDevtoolsLauncher.serve()).called(1);
// Shutdown
await residentRunner.residentDevtoolsHandler.shutdown();
verify(mockDevtoolsLauncher.close()).called(1);
}), overrides: <Type, Generator>{
DevtoolsLauncher: () => mockDevtoolsLauncher,
});
testUsingContext('ResidentRunner invokes DevtoolsLauncher when attaching and shutting down - cold mode', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews,
listViews,
setAssetBundlePath,
]);
residentRunner = ColdRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile, vmserviceOutFile: 'foo'),
target: 'main.dart',
);
when(mockFlutterDevice.runCold(
coldRunner: anyNamed('coldRunner'),
route: anyNamed('route'),
)).thenAnswer((Invocation invocation) async {
return 0;
});
final Future<int> result = residentRunner.attach(enableDevTools: true);
expect(await result, 0);
// Verify DevTools was served.
verify(mockDevtoolsLauncher.serve()).called(1);
// Shutdown
await residentRunner.residentDevtoolsHandler.shutdown();
verify(mockDevtoolsLauncher.close()).called(1);
}), overrides: <Type, Generator>{
DevtoolsLauncher: () => mockDevtoolsLauncher,
});
testUsingContext('ResidentRunner ignores DevToolsLauncher when attaching with enableDevTools: false', () => testbed.run(() async { testUsingContext('ResidentRunner ignores DevToolsLauncher when attaching with enableDevTools: false', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
...@@ -1668,6 +1623,7 @@ void main() { ...@@ -1668,6 +1623,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile, vmserviceOutFile: 'foo'), debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile, vmserviceOutFile: 'foo'),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runCold( when(mockFlutterDevice.runCold(
coldRunner: anyNamed('coldRunner'), coldRunner: anyNamed('coldRunner'),
...@@ -1685,40 +1641,6 @@ void main() { ...@@ -1685,40 +1641,6 @@ void main() {
DevtoolsLauncher: () => mockDevtoolsLauncher, DevtoolsLauncher: () => mockDevtoolsLauncher,
}); });
testUsingContext('ResidentRunner invokes DevtoolsLauncher when running and shutting down - cold mode', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews,
listViews,
setAssetBundlePath,
]);
residentRunner = ColdRunner(
<FlutterDevice>[
mockFlutterDevice,
],
stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile, vmserviceOutFile: 'foo'),
target: 'main.dart',
);
when(mockFlutterDevice.runCold(
coldRunner: anyNamed('coldRunner'),
route: anyNamed('route'),
)).thenAnswer((Invocation invocation) async {
return 0;
});
final Future<int> result = residentRunner.run(enableDevTools: true);
expect(await result, 0);
// Verify DevTools was served.
verify(mockDevtoolsLauncher.serve()).called(1);
// Shutdown
await residentRunner.residentDevtoolsHandler.shutdown();
verify(mockDevtoolsLauncher.close()).called(1);
}), overrides: <Type, Generator>{
DevtoolsLauncher: () => mockDevtoolsLauncher,
});
testUsingContext('ResidentRunner can take screenshot on debug device', () => testbed.run(() async { testUsingContext('ResidentRunner can take screenshot on debug device', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
...@@ -1751,6 +1673,7 @@ void main() { ...@@ -1751,6 +1673,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
await residentRunner.screenshot(mockFlutterDevice); await residentRunner.screenshot(mockFlutterDevice);
...@@ -1856,6 +1779,7 @@ void main() { ...@@ -1856,6 +1779,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
await residentRunner.screenshot(mockFlutterDevice); await residentRunner.screenshot(mockFlutterDevice);
...@@ -1994,6 +1918,7 @@ void main() { ...@@ -1994,6 +1918,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugDumpApp(), false); expect(await residentRunner.debugDumpApp(), false);
...@@ -2016,6 +1941,7 @@ void main() { ...@@ -2016,6 +1941,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugDumpRenderTree(), false); expect(await residentRunner.debugDumpRenderTree(), false);
...@@ -2038,6 +1964,7 @@ void main() { ...@@ -2038,6 +1964,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugDumpLayerTree(), false); expect(await residentRunner.debugDumpLayerTree(), false);
...@@ -2060,6 +1987,7 @@ void main() { ...@@ -2060,6 +1987,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugDumpSemanticsTreeInTraversalOrder(), false); expect(await residentRunner.debugDumpSemanticsTreeInTraversalOrder(), false);
...@@ -2082,6 +2010,7 @@ void main() { ...@@ -2082,6 +2010,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder(), false); expect(await residentRunner.debugDumpSemanticsTreeInInverseHitTestOrder(), false);
...@@ -2104,6 +2033,7 @@ void main() { ...@@ -2104,6 +2033,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleDebugPaintSizeEnabled(), false); expect(await residentRunner.debugToggleDebugPaintSizeEnabled(), false);
...@@ -2126,6 +2056,7 @@ void main() { ...@@ -2126,6 +2056,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleBrightness(), false); expect(await residentRunner.debugToggleBrightness(), false);
...@@ -2171,6 +2102,7 @@ void main() { ...@@ -2171,6 +2102,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleInvertOversizedImages(), false); expect(await residentRunner.debugToggleInvertOversizedImages(), false);
...@@ -2186,6 +2118,7 @@ void main() { ...@@ -2186,6 +2118,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile), debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleInvertOversizedImages(), false); expect(await residentRunner.debugToggleInvertOversizedImages(), false);
...@@ -2231,6 +2164,7 @@ void main() { ...@@ -2231,6 +2164,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleDebugCheckElevationsEnabled(), false); expect(await residentRunner.debugToggleDebugCheckElevationsEnabled(), false);
...@@ -2253,6 +2187,7 @@ void main() { ...@@ -2253,6 +2187,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugTogglePerformanceOverlayOverride(), false); expect(await residentRunner.debugTogglePerformanceOverlayOverride(), false);
...@@ -2276,6 +2211,7 @@ void main() { ...@@ -2276,6 +2211,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleWidgetInspector(), false); expect(await residentRunner.debugToggleWidgetInspector(), false);
...@@ -2298,6 +2234,7 @@ void main() { ...@@ -2298,6 +2234,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.disabled(BuildInfo.release), debuggingOptions: DebuggingOptions.disabled(BuildInfo.release),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
expect(await residentRunner.debugToggleProfileWidgetBuilds(), false); expect(await residentRunner.debugToggleProfileWidgetBuilds(), false);
...@@ -2307,19 +2244,7 @@ void main() { ...@@ -2307,19 +2244,7 @@ void main() {
testUsingContext('HotRunner writes vm service file when providing debugging option', () => testbed.run(() async { testUsingContext('HotRunner writes vm service file when providing debugging option', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
listViews, listViews,
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
setAssetBundlePath, setAssetBundlePath,
]); ]);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2331,6 +2256,7 @@ void main() { ...@@ -2331,6 +2256,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, vmserviceOutFile: 'foo'), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, vmserviceOutFile: 'foo'),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
hotRunner: anyNamed('hotRunner'), hotRunner: anyNamed('hotRunner'),
...@@ -2340,6 +2266,7 @@ void main() { ...@@ -2340,6 +2266,7 @@ void main() {
}); });
await residentRunner.run(enableDevTools: true); await residentRunner.run(enableDevTools: true);
expect(fakeVmServiceHost.hasRemainingExpectations, false);
expect(await globals.fs.file('foo').readAsString(), testUri.toString()); expect(await globals.fs.file('foo').readAsString(), testUri.toString());
}), overrides: <Type, Generator>{ }), overrides: <Type, Generator>{
DevtoolsLauncher: () => mockDevtoolsLauncher, DevtoolsLauncher: () => mockDevtoolsLauncher,
...@@ -2348,19 +2275,7 @@ void main() { ...@@ -2348,19 +2275,7 @@ void main() {
testUsingContext('HotRunner copies compiled app.dill to cache during startup', () => testbed.run(() async { testUsingContext('HotRunner copies compiled app.dill to cache during startup', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
listViews, listViews,
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
setAssetBundlePath, setAssetBundlePath,
]); ]);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2372,6 +2287,7 @@ void main() { ...@@ -2372,6 +2287,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
...@@ -2390,19 +2306,7 @@ void main() { ...@@ -2390,19 +2306,7 @@ void main() {
testUsingContext('HotRunner copies compiled app.dill to cache during startup with dart defines', () => testbed.run(() async { testUsingContext('HotRunner copies compiled app.dill to cache during startup with dart defines', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
listViews, listViews,
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
setAssetBundlePath, setAssetBundlePath,
]); ]);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2421,6 +2325,7 @@ void main() { ...@@ -2421,6 +2325,7 @@ void main() {
) )
), ),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
...@@ -2440,19 +2345,7 @@ void main() { ...@@ -2440,19 +2345,7 @@ void main() {
testUsingContext('HotRunner copies compiled app.dill to cache during startup with null safety', () => testbed.run(() async { testUsingContext('HotRunner copies compiled app.dill to cache during startup with null safety', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
listViews, listViews,
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
setAssetBundlePath, setAssetBundlePath,
]); ]);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2471,6 +2364,7 @@ void main() { ...@@ -2471,6 +2364,7 @@ void main() {
) )
), ),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
...@@ -2490,19 +2384,7 @@ void main() { ...@@ -2490,19 +2384,7 @@ void main() {
testUsingContext('HotRunner does not copy app.dill if a dillOutputPath is given', () => testbed.run(() async { testUsingContext('HotRunner does not copy app.dill if a dillOutputPath is given', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
listViews, listViews,
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
setAssetBundlePath, setAssetBundlePath,
]); ]);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2515,6 +2397,7 @@ void main() { ...@@ -2515,6 +2397,7 @@ void main() {
dillOutputPath: 'test', dillOutputPath: 'test',
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
...@@ -2533,19 +2416,7 @@ void main() { ...@@ -2533,19 +2416,7 @@ void main() {
testUsingContext('HotRunner copies compiled app.dill to cache during startup with --track-widget-creation', () => testbed.run(() async { testUsingContext('HotRunner copies compiled app.dill to cache during startup with --track-widget-creation', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
listViews, listViews,
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
setAssetBundlePath, setAssetBundlePath,
]); ]);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2562,6 +2433,7 @@ void main() { ...@@ -2562,6 +2433,7 @@ void main() {
trackWidgetCreation: true, trackWidgetCreation: true,
)), )),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC'); residentRunner.artifactDirectory.childFile('app.dill').writeAsStringSync('ABC');
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
...@@ -2591,6 +2463,7 @@ void main() { ...@@ -2591,6 +2463,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
hotRunner: anyNamed('hotRunner'), hotRunner: anyNamed('hotRunner'),
...@@ -2619,6 +2492,7 @@ void main() { ...@@ -2619,6 +2492,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, vmserviceOutFile: 'foo'), debuggingOptions: DebuggingOptions.enabled(BuildInfo.debug, vmserviceOutFile: 'foo'),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runHot( when(mockFlutterDevice.runHot(
hotRunner: anyNamed('hotRunner'), hotRunner: anyNamed('hotRunner'),
...@@ -2640,18 +2514,6 @@ void main() { ...@@ -2640,18 +2514,6 @@ void main() {
testUsingContext('ColdRunner writes vm service file when providing debugging option', () => testbed.run(() async { testUsingContext('ColdRunner writes vm service file when providing debugging option', () => testbed.run(() async {
fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[ fakeVmServiceHost = FakeVmServiceHost(requests: <VmServiceExpectation>[
listViews, listViews,
listenToExtensionStream,
FakeVmServiceRequest(
method: 'getVM',
jsonResponse: fakeVM.toJson(),
),
FakeVmServiceRequest(
method: 'getIsolate',
args: <String, Object>{
'isolateId': '1',
},
jsonResponse: fakeUnpausedIsolate.toJson(),
),
]); ]);
globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true); globals.fs.file(globals.fs.path.join('lib', 'main.dart')).createSync(recursive: true);
setWsAddress(testUri, fakeVmServiceHost.vmService); setWsAddress(testUri, fakeVmServiceHost.vmService);
...@@ -2662,6 +2524,7 @@ void main() { ...@@ -2662,6 +2524,7 @@ void main() {
stayResident: false, stayResident: false,
debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile, vmserviceOutFile: 'foo'), debuggingOptions: DebuggingOptions.enabled(BuildInfo.profile, vmserviceOutFile: 'foo'),
target: 'main.dart', target: 'main.dart',
devtoolsHandler: createNoOpHandler,
); );
when(mockFlutterDevice.runCold( when(mockFlutterDevice.runCold(
coldRunner: anyNamed('coldRunner'), coldRunner: anyNamed('coldRunner'),
...@@ -2670,10 +2533,6 @@ void main() { ...@@ -2670,10 +2533,6 @@ void main() {
return 0; return 0;
}); });
await residentRunner.run(enableDevTools: true); await residentRunner.run(enableDevTools: true);
// Await a short delay so that we don't try to exit before all the expected
// VM service requests have been fired.
// TODO(ianh): remove this delay, it's almost certainly going to cause flakes
await Future<void>.delayed(const Duration(milliseconds: 200));
expect(await globals.fs.file('foo').readAsString(), testUri.toString()); expect(await globals.fs.file('foo').readAsString(), testUri.toString());
expect(fakeVmServiceHost.hasRemainingExpectations, false); expect(fakeVmServiceHost.hasRemainingExpectations, false);
......
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