diff --git a/packages/flutter_tools/lib/src/device.dart b/packages/flutter_tools/lib/src/device.dart index 61d46ff5ce..cef0855e2f 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 2520562632..7b37797873 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 42a0131929..bad20c24c0 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 3ababad8e2..5f69d05b38 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();