From bd430081e0ddfdaf7019f485538a45c7523710ad Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Thu, 14 May 2020 11:00:51 -0700 Subject: [PATCH] Make initial daemon devices population fast (#56959) --- packages/flutter_tools/lib/src/device.dart | 10 +++++--- .../commands.shard/hermetic/daemon_test.dart | 4 +-- .../test/general.shard/device_test.dart | 25 +++++++++++++++++-- packages/flutter_tools/test/src/mocks.dart | 4 +-- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 61d46ff5ce1..cef0855e2f9 100644 --- a/packages/flutter_tools/lib/src/device.dart +++ b/packages/flutter_tools/lib/src/device.dart @@ -297,19 +297,21 @@ abstract class PollingDeviceDiscovery extends DeviceDiscovery { void startPolling() { if (_timer == null) { _items ??= ItemListNotifier(); - _timer = _initTimer(); + // Make initial population the default, fast polling timeout. + _timer = _initTimer(null); } } - Timer _initTimer() { + Timer _initTimer(Duration pollingTimeout) { return Timer(_pollingInterval, () async { try { - final List devices = await pollingGetDevices(timeout: _pollingTimeout); + final List devices = await pollingGetDevices(timeout: pollingTimeout); _items.updateWithNewList(devices); } on TimeoutException { globals.printTrace('Device poll timed out. Will retry.'); } - _timer = _initTimer(); + // Subsequent timeouts after initial population should wait longer. + _timer = _initTimer(_pollingTimeout); }); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart index 2520562632d..7b377978732 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/daemon_test.dart @@ -194,7 +194,7 @@ void main() { responses.add, notifyingLogger: notifyingLogger, ); - final MockPollingDeviceDiscovery discoverer = MockPollingDeviceDiscovery(); + final FakePollingDeviceDiscovery discoverer = FakePollingDeviceDiscovery(); daemon.deviceDomain.addDeviceDiscoverer(discoverer); discoverer.addDevice(MockAndroidDevice()); commands.add({'id': 0, 'method': 'device.getDevices'}); @@ -216,7 +216,7 @@ void main() { notifyingLogger: notifyingLogger, ); - final MockPollingDeviceDiscovery discoverer = MockPollingDeviceDiscovery(); + final FakePollingDeviceDiscovery discoverer = FakePollingDeviceDiscovery(); daemon.deviceDomain.addDeviceDiscoverer(discoverer); discoverer.addDevice(MockAndroidDevice()); diff --git a/packages/flutter_tools/test/general.shard/device_test.dart b/packages/flutter_tools/test/general.shard/device_test.dart index 42a01319294..bad20c24c0c 100644 --- a/packages/flutter_tools/test/general.shard/device_test.dart +++ b/packages/flutter_tools/test/general.shard/device_test.dart @@ -9,6 +9,7 @@ import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/project.dart'; import 'package:mockito/mockito.dart'; +import 'package:quiver/testing/async.dart'; import '../src/common.dart'; import '../src/context.dart'; @@ -63,6 +64,26 @@ void main() { }); }); + group('PollingDeviceDiscovery', () { + testUsingContext('startPolling', () async { + FakeAsync().run((FakeAsync time) { + final FakePollingDeviceDiscovery pollingDeviceDiscovery = FakePollingDeviceDiscovery(); + pollingDeviceDiscovery.startPolling(); + time.elapse(const Duration(milliseconds: 4001)); + time.flushMicrotasks(); + // First check should use the default polling timeout + // to quickly populate the list. + expect(pollingDeviceDiscovery.lastPollingTimeout, isNull); + + time.elapse(const Duration(milliseconds: 4001)); + time.flushMicrotasks(); + // Subsequent polling should be much longer. + expect(pollingDeviceDiscovery.lastPollingTimeout, const Duration(seconds: 30)); + pollingDeviceDiscovery.stopPolling(); + }); + }); + }); + group('Filter devices', () { FakeDevice ephemeral; FakeDevice nonEphemeralOne; @@ -198,12 +219,12 @@ void main() { class TestDeviceManager extends DeviceManager { TestDeviceManager(List allDevices) { - _deviceDiscoverer = MockPollingDeviceDiscovery(); + _deviceDiscoverer = FakePollingDeviceDiscovery(); resetDevices(allDevices); } @override List get deviceDiscoverers => [_deviceDiscoverer]; - MockPollingDeviceDiscovery _deviceDiscoverer; + FakePollingDeviceDiscovery _deviceDiscoverer; void resetDevices(List allDevices) { _deviceDiscoverer.setDevices(allDevices); diff --git a/packages/flutter_tools/test/src/mocks.dart b/packages/flutter_tools/test/src/mocks.dart index 3ababad8e28..5f69d05b381 100644 --- a/packages/flutter_tools/test/src/mocks.dart +++ b/packages/flutter_tools/test/src/mocks.dart @@ -482,8 +482,8 @@ class MockStdio extends Stdio { List get writtenToStderr => _stderr.writes.map(_stderr.encoding.decode).toList(); } -class MockPollingDeviceDiscovery extends PollingDeviceDiscovery { - MockPollingDeviceDiscovery() : super('mock'); +class FakePollingDeviceDiscovery extends PollingDeviceDiscovery { + FakePollingDeviceDiscovery() : super('mock'); final List _devices = []; final StreamController _onAddedController = StreamController.broadcast();