From 9613b6b6d85ecf121e1f58d620763fbee5706f46 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 20 Mar 2019 09:21:51 +0000 Subject: [PATCH 01/10] Track futures to give better errors --- .../devtools/lib/src/vm_service_wrapper.dart | 216 ++++++++++-------- .../devtools/test/service_manager_test.dart | 2 +- .../support/flutter_test_environment.dart | 7 +- 3 files changed, 133 insertions(+), 92 deletions(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index f26b5de4e74..0cf740c6738 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -23,8 +23,9 @@ class VmServiceWrapper implements VmService { final Map> _activeStreams = {}; // ignore: prefer_collection_literals - final Set> _activeFutures = Set(); - Completer allFuturesCompleted = Completer(); + final Set> activeFutures = Set(); + Completer _allFuturesCompleter = Completer(); + Future get allFuturesCompleted => _allFuturesCompleter.future; @override Future addBreakpoint( @@ -33,13 +34,14 @@ class VmServiceWrapper implements VmService { int line, { int column, }) { - return _trackFuture( + return _trackFuture('addBreakpoint', _vmService.addBreakpoint(isolateId, scriptId, line, column: column)); } @override Future addBreakpointAtEntry(String isolateId, String functionId) { - return _trackFuture(_vmService.addBreakpointAtEntry(isolateId, functionId)); + return _trackFuture('addBreakpointAtEntry', + _vmService.addBreakpointAtEntry(isolateId, functionId)); } @override @@ -49,17 +51,19 @@ class VmServiceWrapper implements VmService { int line, { int column, }) { - return _trackFuture(_vmService.addBreakpointWithScriptUri( - isolateId, - scriptUri, - line, - column: column, - )); + return _trackFuture( + 'addBreakpointWithScriptUri', + _vmService.addBreakpointWithScriptUri( + isolateId, + scriptUri, + line, + column: column, + )); } @override Future callMethod(String method, {String isolateId, Map args}) { - return _trackFuture( + return _trackFuture('callMethod $method', _vmService.callMethod(method, isolateId: isolateId, args: args)); } @@ -69,26 +73,30 @@ class VmServiceWrapper implements VmService { String isolateId, Map args, }) { - return _trackFuture(_vmService.callServiceExtension( - method, - isolateId: isolateId, - args: args, - )); + return _trackFuture( + 'callServiceExtension $method', + _vmService.callServiceExtension( + method, + isolateId: isolateId, + args: args, + )); } @override Future clearCpuProfile(String isolateId) { - return _trackFuture(_vmService.clearCpuProfile(isolateId)); + return _trackFuture( + 'clearCpuProfile', _vmService.clearCpuProfile(isolateId)); } @override Future clearVMTimeline() { - return _trackFuture(_vmService.clearVMTimeline()); + return _trackFuture('clearVMTimeline', _vmService.clearVMTimeline()); } @override Future collectAllGarbage(String isolateId) { - return _trackFuture(_vmService.collectAllGarbage(isolateId)); + return _trackFuture( + 'collectAllGarbage', _vmService.collectAllGarbage(isolateId)); } @override @@ -102,13 +110,15 @@ class VmServiceWrapper implements VmService { Map scope, bool disableBreakpoints, }) { - return _trackFuture(_vmService.evaluate( - isolateId, - targetId, - expression, - scope: scope, - disableBreakpoints: disableBreakpoints, - )); + return _trackFuture( + 'evaluate $expression', + _vmService.evaluate( + isolateId, + targetId, + expression, + scope: scope, + disableBreakpoints: disableBreakpoints, + )); } @override @@ -119,13 +129,15 @@ class VmServiceWrapper implements VmService { Map scope, bool disableBreakpoints, }) { - return _trackFuture(_vmService.evaluateInFrame( - isolateId, - frameIndex, - expression, - scope: scope, - disableBreakpoints: disableBreakpoints, - )); + return _trackFuture( + 'evaluateInFrame $expression', + _vmService.evaluateInFrame( + isolateId, + frameIndex, + expression, + scope: scope, + disableBreakpoints: disableBreakpoints, + )); } @override @@ -134,12 +146,14 @@ class VmServiceWrapper implements VmService { String gc, bool reset, }) { - return _trackFuture(_vmService.getAllocationProfile(isolateId)); + return _trackFuture( + 'getAllocationProfile', _vmService.getAllocationProfile(isolateId)); } @override Future getCpuProfile(String isolateId, String tags) { - return _trackFuture(_vmService.getCpuProfile(isolateId, tags)); + return _trackFuture( + 'getCpuProfile', _vmService.getCpuProfile(isolateId, tags)); } // TODO(kenzie): keep track of all private methods we are currently using to @@ -158,16 +172,18 @@ class VmServiceWrapper implements VmService { } @override - Future getFlagList() => _trackFuture(_vmService.getFlagList()); + Future getFlagList() => + _trackFuture("getFlagList", _vmService.getFlagList()); @override Future getInstances(String isolateId, String classId, int limit) { - return _trackFuture(_vmService.getInstances(isolateId, classId, limit)); + return _trackFuture( + 'getInstances', _vmService.getInstances(isolateId, classId, limit)); } @override Future getIsolate(String isolateId) { - return _trackFuture(_vmService.getIsolate(isolateId)); + return _trackFuture('getIsolate', _vmService.getIsolate(isolateId)); } @override @@ -177,12 +193,12 @@ class VmServiceWrapper implements VmService { int offset, int count, }) { - return _trackFuture(_vmService.getObject(isolateId, objectId)); + return _trackFuture('getObject', _vmService.getObject(isolateId, objectId)); } @override Future getScripts(String isolateId) { - return _trackFuture(_vmService.getScripts(isolateId)); + return _trackFuture('getScripts', _vmService.getScripts(isolateId)); } @override @@ -194,29 +210,33 @@ class VmServiceWrapper implements VmService { int endTokenPos, bool forceCompile, }) { - return _trackFuture(_vmService.getSourceReport( - isolateId, - reports, - scriptId: scriptId, - tokenPos: tokenPos, - endTokenPos: endTokenPos, - forceCompile: forceCompile, - )); + return _trackFuture( + 'getSourceReport', + _vmService.getSourceReport( + isolateId, + reports, + scriptId: scriptId, + tokenPos: tokenPos, + endTokenPos: endTokenPos, + forceCompile: forceCompile, + )); } @override Future getStack(String isolateId) { - return _trackFuture(_vmService.getStack(isolateId)); + return _trackFuture('getStack', _vmService.getStack(isolateId)); } @override - Future getVM() => _trackFuture(_vmService.getVM()); + Future getVM() => _trackFuture('getVM', _vmService.getVM()); @override - Future getVMTimeline() => _trackFuture(_vmService.getVMTimeline()); + Future getVMTimeline() => + _trackFuture('getVMTimeline', _vmService.getVMTimeline()); @override - Future getVersion() => _trackFuture(_vmService.getVersion()); + Future getVersion() => + _trackFuture('getVersion', _vmService.getVersion()); @override Future invoke( @@ -226,18 +246,20 @@ class VmServiceWrapper implements VmService { List argumentIds, { bool disableBreakpoints, }) { - return _trackFuture(_vmService.invoke( - isolateId, - targetId, - selector, - argumentIds, - disableBreakpoints: disableBreakpoints, - )); + return _trackFuture( + 'invoke $selector', + _vmService.invoke( + isolateId, + targetId, + selector, + argumentIds, + disableBreakpoints: disableBreakpoints, + )); } @override Future kill(String isolateId) { - return _trackFuture(_vmService.kill(isolateId)); + return _trackFuture('kill', _vmService.kill(isolateId)); } @override @@ -278,12 +300,13 @@ class VmServiceWrapper implements VmService { @override Future pause(String isolateId) { - return _trackFuture(_vmService.pause(isolateId)); + return _trackFuture('pause', _vmService.pause(isolateId)); } @override Future registerService(String service, String alias) { - return _trackFuture(_vmService.registerService(service, alias)); + return _trackFuture( + 'registerService $service', _vmService.registerService(service, alias)); } @override @@ -299,18 +322,21 @@ class VmServiceWrapper implements VmService { String rootLibUri, String packagesUri, }) { - return _trackFuture(_vmService.reloadSources( - isolateId, - force: force, - pause: pause, - rootLibUri: rootLibUri, - packagesUri: packagesUri, - )); + return _trackFuture( + 'reloadSources', + _vmService.reloadSources( + isolateId, + force: force, + pause: pause, + rootLibUri: rootLibUri, + packagesUri: packagesUri, + )); } @override Future removeBreakpoint(String isolateId, String breakpointId) { - return _trackFuture(_vmService.removeBreakpoint(isolateId, breakpointId)); + return _trackFuture('removeBreakpoint', + _vmService.removeBreakpoint(isolateId, breakpointId)); } @override @@ -319,24 +345,25 @@ class VmServiceWrapper implements VmService { String roots, bool collectGarbage, ) { - return _trackFuture( + return _trackFuture('requestHeapSnapshot', _vmService.requestHeapSnapshot(isolateId, roots, collectGarbage)); } @override Future resume(String isolateId, {String step, int frameIndex}) { - return _trackFuture( + return _trackFuture('resume', _vmService.resume(isolateId, step: step, frameIndex: frameIndex)); } @override Future setExceptionPauseMode(String isolateId, String mode) { - return _trackFuture(_vmService.setExceptionPauseMode(isolateId, mode)); + return _trackFuture('setExceptionPauseMode', + _vmService.setExceptionPauseMode(isolateId, mode)); } @override Future setFlag(String name, String value) { - return _trackFuture(_vmService.setFlag(name, value)); + return _trackFuture('setFlag', _vmService.setFlag(name, value)); } @override @@ -345,29 +372,30 @@ class VmServiceWrapper implements VmService { String libraryId, bool isDebuggable, ) { - return _trackFuture( + return _trackFuture('setLibraryDebuggable', _vmService.setLibraryDebuggable(isolateId, libraryId, isDebuggable)); } @override Future setName(String isolateId, String name) { - return _trackFuture(_vmService.setName(isolateId, name)); + return _trackFuture('setName', _vmService.setName(isolateId, name)); } @override Future setVMName(String name) { - return _trackFuture(_vmService.setVMName(name)); + return _trackFuture('setVMName', _vmService.setVMName(name)); } @override Future setVMTimelineFlags(List recordedStreams) { - return _trackFuture(_vmService.setVMTimelineFlags(recordedStreams)); + return _trackFuture( + 'setVMTimelineFlags', _vmService.setVMTimelineFlags(recordedStreams)); } @override Future streamCancel(String streamId) { _activeStreams.remove(streamId); - return _trackFuture(_vmService.streamCancel(streamId)); + return _trackFuture('streamCancel', _vmService.streamCancel(streamId)); } // We tweaked this method so that we do not try to listen to the same stream @@ -377,7 +405,7 @@ class VmServiceWrapper implements VmService { Future streamListen(String streamId) { if (!_activeStreams.containsKey(streamId)) { final Future future = - _trackFuture(_vmService.streamListen(streamId)); + _trackFuture('streamListen', _vmService.streamListen(streamId)); _activeStreams[streamId] = future; return future; } else { @@ -393,21 +421,22 @@ class VmServiceWrapper implements VmService { /// used after a hot restart to avoid bugs where we have zombie futures lying /// around causing tests to flake. void doNotWaitForPendingFuturesBeforeExit() { - allFuturesCompleted = Completer(); - allFuturesCompleted.complete(true); - _activeFutures.clear(); + _allFuturesCompleter = Completer(); + _allFuturesCompleter.complete(true); + activeFutures.clear(); } - Future _trackFuture(Future future) { - if (allFuturesCompleted.isCompleted) { - allFuturesCompleted = Completer(); + Future _trackFuture(String name, Future future) { + final trackedFuture = new TrackedFuture(name, future); + if (_allFuturesCompleter.isCompleted) { + _allFuturesCompleter = Completer(); } - _activeFutures.add(future); + activeFutures.add(trackedFuture); void futureComplete() { - _activeFutures.remove(future); - if (_activeFutures.isEmpty && !allFuturesCompleted.isCompleted) { - allFuturesCompleted.complete(true); + activeFutures.remove(trackedFuture); + if (activeFutures.isEmpty && !_allFuturesCompleter.isCompleted) { + _allFuturesCompleter.complete(true); } } @@ -418,3 +447,10 @@ class VmServiceWrapper implements VmService { return future; } } + +class TrackedFuture { + TrackedFuture(this.name, this.future); + + final String name; + final Future future; +} diff --git a/packages/devtools/test/service_manager_test.dart b/packages/devtools/test/service_manager_test.dart index b3a5822428f..1c5421f51dc 100644 --- a/packages/devtools/test/service_manager_test.dart +++ b/packages/devtools/test/service_manager_test.dart @@ -281,7 +281,7 @@ void main() { }); tearDown(() async { - await service.allFuturesCompleted.future; + await service.allFuturesCompleted; await _flutter.stop(); }); diff --git a/packages/devtools/test/support/flutter_test_environment.dart b/packages/devtools/test/support/flutter_test_environment.dart index c3995abec65..2001e1196d7 100644 --- a/packages/devtools/test/support/flutter_test_environment.dart +++ b/packages/devtools/test/support/flutter_test_environment.dart @@ -89,7 +89,12 @@ class FlutterTestEnvironment { } if (_beforeTearDown != null) await _beforeTearDown(); - await _service.allFuturesCompleted.future; + await _service.allFuturesCompleted.timeout(Duration(seconds: 20), + onTimeout: () { + throw 'Timed out waiting for futures to complete during teardown. ' + '${_service.activeFutures.length} futures remained:\n\n' + ' ${_service.activeFutures.map((tf) => tf.name).join('\n ')}'; + }); await _flutter.stop(); _flutter = null; From 75883fc6c671c595673ec0ec61797b5fc38394e6 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Tue, 26 Mar 2019 07:43:47 +0000 Subject: [PATCH 02/10] Change future tracking to use a Map --- .../devtools/lib/src/vm_service_wrapper.dart | 20 ++++++++----------- .../support/flutter_test_environment.dart | 6 ++++-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index 0cf740c6738..b3782639665 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -23,7 +23,8 @@ class VmServiceWrapper implements VmService { final Map> _activeStreams = {}; // ignore: prefer_collection_literals - final Set> activeFutures = Set(); + final Set> activeFutures = Set(); + final Map activeFutureDescriptions = {}; Completer _allFuturesCompleter = Completer(); Future get allFuturesCompleted => _allFuturesCompleter.future; @@ -173,7 +174,7 @@ class VmServiceWrapper implements VmService { @override Future getFlagList() => - _trackFuture("getFlagList", _vmService.getFlagList()); + _trackFuture('getFlagList', _vmService.getFlagList()); @override Future getInstances(String isolateId, String classId, int limit) { @@ -424,17 +425,19 @@ class VmServiceWrapper implements VmService { _allFuturesCompleter = Completer(); _allFuturesCompleter.complete(true); activeFutures.clear(); + activeFutureDescriptions.clear(); } Future _trackFuture(String name, Future future) { - final trackedFuture = new TrackedFuture(name, future); if (_allFuturesCompleter.isCompleted) { _allFuturesCompleter = Completer(); } - activeFutures.add(trackedFuture); + activeFutures.add(future); + activeFutureDescriptions.putIfAbsent(future, () => name); void futureComplete() { - activeFutures.remove(trackedFuture); + activeFutures.remove(future); + activeFutureDescriptions.remove(future); if (activeFutures.isEmpty && !_allFuturesCompleter.isCompleted) { _allFuturesCompleter.complete(true); } @@ -447,10 +450,3 @@ class VmServiceWrapper implements VmService { return future; } } - -class TrackedFuture { - TrackedFuture(this.name, this.future); - - final String name; - final Future future; -} diff --git a/packages/devtools/test/support/flutter_test_environment.dart b/packages/devtools/test/support/flutter_test_environment.dart index 2001e1196d7..62a21918fa9 100644 --- a/packages/devtools/test/support/flutter_test_environment.dart +++ b/packages/devtools/test/support/flutter_test_environment.dart @@ -91,9 +91,11 @@ class FlutterTestEnvironment { await _service.allFuturesCompleted.timeout(Duration(seconds: 20), onTimeout: () { + final List remainingFutures = + _service.activeFutureDescriptions.values.toList(); throw 'Timed out waiting for futures to complete during teardown. ' - '${_service.activeFutures.length} futures remained:\n\n' - ' ${_service.activeFutures.map((tf) => tf.name).join('\n ')}'; + '${remainingFutures.length} futures remained:\n\n' + ' ${remainingFutures.join('\n ')}'; }); await _flutter.stop(); _flutter = null; From 67c55cff784c79f881f5d44d318aaede5f6d1170 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 27 Mar 2019 08:58:14 +0000 Subject: [PATCH 03/10] Revert "Change future tracking to use a Map" This reverts commit f28feff3d94c982b42612c91b4e10b770f4401d5. --- .../devtools/lib/src/vm_service_wrapper.dart | 20 +++++++++++-------- .../support/flutter_test_environment.dart | 6 ++---- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index b3782639665..0cf740c6738 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -23,8 +23,7 @@ class VmServiceWrapper implements VmService { final Map> _activeStreams = {}; // ignore: prefer_collection_literals - final Set> activeFutures = Set(); - final Map activeFutureDescriptions = {}; + final Set> activeFutures = Set(); Completer _allFuturesCompleter = Completer(); Future get allFuturesCompleted => _allFuturesCompleter.future; @@ -174,7 +173,7 @@ class VmServiceWrapper implements VmService { @override Future getFlagList() => - _trackFuture('getFlagList', _vmService.getFlagList()); + _trackFuture("getFlagList", _vmService.getFlagList()); @override Future getInstances(String isolateId, String classId, int limit) { @@ -425,19 +424,17 @@ class VmServiceWrapper implements VmService { _allFuturesCompleter = Completer(); _allFuturesCompleter.complete(true); activeFutures.clear(); - activeFutureDescriptions.clear(); } Future _trackFuture(String name, Future future) { + final trackedFuture = new TrackedFuture(name, future); if (_allFuturesCompleter.isCompleted) { _allFuturesCompleter = Completer(); } - activeFutures.add(future); - activeFutureDescriptions.putIfAbsent(future, () => name); + activeFutures.add(trackedFuture); void futureComplete() { - activeFutures.remove(future); - activeFutureDescriptions.remove(future); + activeFutures.remove(trackedFuture); if (activeFutures.isEmpty && !_allFuturesCompleter.isCompleted) { _allFuturesCompleter.complete(true); } @@ -450,3 +447,10 @@ class VmServiceWrapper implements VmService { return future; } } + +class TrackedFuture { + TrackedFuture(this.name, this.future); + + final String name; + final Future future; +} diff --git a/packages/devtools/test/support/flutter_test_environment.dart b/packages/devtools/test/support/flutter_test_environment.dart index 62a21918fa9..2001e1196d7 100644 --- a/packages/devtools/test/support/flutter_test_environment.dart +++ b/packages/devtools/test/support/flutter_test_environment.dart @@ -91,11 +91,9 @@ class FlutterTestEnvironment { await _service.allFuturesCompleted.timeout(Duration(seconds: 20), onTimeout: () { - final List remainingFutures = - _service.activeFutureDescriptions.values.toList(); throw 'Timed out waiting for futures to complete during teardown. ' - '${remainingFutures.length} futures remained:\n\n' - ' ${remainingFutures.join('\n ')}'; + '${_service.activeFutures.length} futures remained:\n\n' + ' ${_service.activeFutures.map((tf) => tf.name).join('\n ')}'; }); await _flutter.stop(); _flutter = null; From 85b5891f0fe3af11a8a81f1912a6df633364c9d1 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 27 Mar 2019 09:17:44 +0000 Subject: [PATCH 04/10] Only track futures in tests --- packages/devtools/lib/src/vm_service_wrapper.dart | 15 +++++++++++---- .../test/support/flutter_test_driver.dart | 4 +++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index 0cf740c6738..e62c0440273 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -7,23 +7,27 @@ import 'dart:async'; import 'package:vm_service_lib/vm_service_lib.dart'; class VmServiceWrapper implements VmService { - VmServiceWrapper(this._vmService); + VmServiceWrapper( + this._vmService, { + this.trackFutures = false, + }); VmServiceWrapper.fromNewVmService( Stream /*String|List*/ inStream, void writeMessage(String message), { Log log, DisposeHandler disposeHandler, + this.trackFutures = false, }) { _vmService = VmService(inStream, writeMessage, log: log, disposeHandler: disposeHandler); } VmService _vmService; + final bool trackFutures; final Map> _activeStreams = {}; - // ignore: prefer_collection_literals - final Set> activeFutures = Set(); + final Set> activeFutures = {}; Completer _allFuturesCompleter = Completer(); Future get allFuturesCompleted => _allFuturesCompleter.future; @@ -173,7 +177,7 @@ class VmServiceWrapper implements VmService { @override Future getFlagList() => - _trackFuture("getFlagList", _vmService.getFlagList()); + _trackFuture('getFlagList', _vmService.getFlagList()); @override Future getInstances(String isolateId, String classId, int limit) { @@ -427,6 +431,9 @@ class VmServiceWrapper implements VmService { } Future _trackFuture(String name, Future future) { + if (!trackFutures) { + return future; + } final trackedFuture = new TrackedFuture(name, future); if (_allFuturesCompleter.isCompleted) { _allFuturesCompleter = Completer(); diff --git a/packages/devtools/test/support/flutter_test_driver.dart b/packages/devtools/test/support/flutter_test_driver.dart index fbd6398faab..448020ecc8d 100644 --- a/packages/devtools/test/support/flutter_test_driver.dart +++ b/packages/devtools/test/support/flutter_test_driver.dart @@ -327,7 +327,9 @@ class FlutterRunTestDriver extends FlutterTestDriver { _vmServiceWsUri = getVmServiceUriFromObservatoryUri(_vmServiceWsUri); vmService = VmServiceWrapper( - await vmServiceConnectUri(_vmServiceWsUri.toString())); + await vmServiceConnectUri(_vmServiceWsUri.toString()), + trackFutures: true, + ); vmService.onSend.listen((String s) => _debugPrint('==> $s')); vmService.onReceive.listen((String s) => _debugPrint('<== $s')); await Future.wait(>[ From 7b87866801bdfefb917f5a49402c4b15101cacda Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 27 Mar 2019 09:18:40 +0000 Subject: [PATCH 05/10] Ensure the default future tracker complete is complete --- packages/devtools/lib/src/vm_service_wrapper.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index e62c0440273..5deb4af0f43 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -28,7 +28,11 @@ class VmServiceWrapper implements VmService { final Map> _activeStreams = {}; final Set> activeFutures = {}; - Completer _allFuturesCompleter = Completer(); + Completer _allFuturesCompleter = Completer() + // Mark the future as completed by default so if we don't track any + // futures but someone tries to wait on [allFuturesCompleted] they don't + // hang. The first tracked future will replace this with a new completer. + ..complete(true); Future get allFuturesCompleted => _allFuturesCompleter.future; @override From 6443dd60eb3e078dd4707878dd7c66bcf61940e3 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 27 Mar 2019 09:59:58 +0000 Subject: [PATCH 06/10] Fix prefer-const lint --- packages/devtools/test/support/flutter_test_environment.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools/test/support/flutter_test_environment.dart b/packages/devtools/test/support/flutter_test_environment.dart index 2001e1196d7..72a20d98177 100644 --- a/packages/devtools/test/support/flutter_test_environment.dart +++ b/packages/devtools/test/support/flutter_test_environment.dart @@ -89,7 +89,7 @@ class FlutterTestEnvironment { } if (_beforeTearDown != null) await _beforeTearDown(); - await _service.allFuturesCompleted.timeout(Duration(seconds: 20), + await _service.allFuturesCompleted.timeout(const Duration(seconds: 20), onTimeout: () { throw 'Timed out waiting for futures to complete during teardown. ' '${_service.activeFutures.length} futures remained:\n\n' From 7625cb83dc607f098ea6d28af86464a7d224a9a0 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 3 Apr 2019 17:41:59 +0100 Subject: [PATCH 07/10] Remove Set() literal --- packages/devtools/lib/src/vm_service_wrapper.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index 5deb4af0f43..a6ca90677ef 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -27,7 +27,7 @@ class VmServiceWrapper implements VmService { final bool trackFutures; final Map> _activeStreams = {}; - final Set> activeFutures = {}; + final Set> activeFutures = Set(); Completer _allFuturesCompleter = Completer() // Mark the future as completed by default so if we don't track any // futures but someone tries to wait on [allFuturesCompleted] they don't From a7801ee80ed7eb90fbb1044d2ed5cbe873948ae7 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Wed, 3 Apr 2019 18:14:09 +0100 Subject: [PATCH 08/10] Update new methods to work with new trackFuture signature --- .../devtools/lib/src/vm_service_wrapper.dart | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index a6ca90677ef..25e896e75f9 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -168,15 +168,17 @@ class VmServiceWrapper implements VmService { // share with the VM team and request that they be made public. Future getCpuProfileTimeline( String isolateId, int origin, int extent) async { - return _trackFuture(callMethod( - '_getCpuProfileTimeline', - isolateId: isolateId, - args: { - 'tags': 'None', - 'timeOriginMicros': origin, - 'timeExtentMicros': extent, - }, - )); + return _trackFuture( + 'getCpuProfileTimeline', + callMethod( + '_getCpuProfileTimeline', + isolateId: isolateId, + args: { + 'tags': 'None', + 'timeOriginMicros': origin, + 'timeExtentMicros': extent, + }, + )); } @override From 7fcba272663bdab300a593d7f9a8168a7e8967bf Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Mon, 8 Apr 2019 16:21:46 +0100 Subject: [PATCH 09/10] Increase minimum SDK version to 2.2.0-dev --- packages/devtools/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools/pubspec.yaml b/packages/devtools/pubspec.yaml index e2d793f8962..c76013893a9 100644 --- a/packages/devtools/pubspec.yaml +++ b/packages/devtools/pubspec.yaml @@ -9,7 +9,7 @@ author: Dart Team homepage: https://github.com/flutter/devtools environment: - sdk: '>=2.1.0-dev <3.0.0' + sdk: '>=2.2.0-dev <3.0.0' dependencies: args: ^1.5.1 From 7436c6d482a23cb28b55d98a8b64ff7c70c540c1 Mon Sep 17 00:00:00 2001 From: Danny Tuppeny Date: Mon, 8 Apr 2019 17:00:08 +0100 Subject: [PATCH 10/10] Revert "Remove Set() literal" This reverts commit 7625cb83dc607f098ea6d28af86464a7d224a9a0. --- packages/devtools/lib/src/vm_service_wrapper.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devtools/lib/src/vm_service_wrapper.dart b/packages/devtools/lib/src/vm_service_wrapper.dart index 25e896e75f9..0138f58f97c 100644 --- a/packages/devtools/lib/src/vm_service_wrapper.dart +++ b/packages/devtools/lib/src/vm_service_wrapper.dart @@ -27,7 +27,7 @@ class VmServiceWrapper implements VmService { final bool trackFutures; final Map> _activeStreams = {}; - final Set> activeFutures = Set(); + final Set> activeFutures = {}; Completer _allFuturesCompleter = Completer() // Mark the future as completed by default so if we don't track any // futures but someone tries to wait on [allFuturesCompleted] they don't