Make initial daemon devices population fast (#56959)

This commit is contained in:
Jenn Magder 2020-05-14 11:00:51 -07:00 committed by GitHub
parent f66d3c5ab2
commit bd430081e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 10 deletions

View File

@ -297,19 +297,21 @@ abstract class PollingDeviceDiscovery extends DeviceDiscovery {
void startPolling() { void startPolling() {
if (_timer == null) { if (_timer == null) {
_items ??= ItemListNotifier<Device>(); _items ??= ItemListNotifier<Device>();
_timer = _initTimer(); // Make initial population the default, fast polling timeout.
_timer = _initTimer(null);
} }
} }
Timer _initTimer() { Timer _initTimer(Duration pollingTimeout) {
return Timer(_pollingInterval, () async { return Timer(_pollingInterval, () async {
try { try {
final List<Device> devices = await pollingGetDevices(timeout: _pollingTimeout); final List<Device> devices = await pollingGetDevices(timeout: pollingTimeout);
_items.updateWithNewList(devices); _items.updateWithNewList(devices);
} on TimeoutException { } on TimeoutException {
globals.printTrace('Device poll timed out. Will retry.'); globals.printTrace('Device poll timed out. Will retry.');
} }
_timer = _initTimer(); // Subsequent timeouts after initial population should wait longer.
_timer = _initTimer(_pollingTimeout);
}); });
} }

View File

@ -194,7 +194,7 @@ void main() {
responses.add, responses.add,
notifyingLogger: notifyingLogger, notifyingLogger: notifyingLogger,
); );
final MockPollingDeviceDiscovery discoverer = MockPollingDeviceDiscovery(); final FakePollingDeviceDiscovery discoverer = FakePollingDeviceDiscovery();
daemon.deviceDomain.addDeviceDiscoverer(discoverer); daemon.deviceDomain.addDeviceDiscoverer(discoverer);
discoverer.addDevice(MockAndroidDevice()); discoverer.addDevice(MockAndroidDevice());
commands.add(<String, dynamic>{'id': 0, 'method': 'device.getDevices'}); commands.add(<String, dynamic>{'id': 0, 'method': 'device.getDevices'});
@ -216,7 +216,7 @@ void main() {
notifyingLogger: notifyingLogger, notifyingLogger: notifyingLogger,
); );
final MockPollingDeviceDiscovery discoverer = MockPollingDeviceDiscovery(); final FakePollingDeviceDiscovery discoverer = FakePollingDeviceDiscovery();
daemon.deviceDomain.addDeviceDiscoverer(discoverer); daemon.deviceDomain.addDeviceDiscoverer(discoverer);
discoverer.addDevice(MockAndroidDevice()); discoverer.addDevice(MockAndroidDevice());

View File

@ -9,6 +9,7 @@ import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/io.dart';
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:mockito/mockito.dart'; import 'package:mockito/mockito.dart';
import 'package:quiver/testing/async.dart';
import '../src/common.dart'; import '../src/common.dart';
import '../src/context.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', () { group('Filter devices', () {
FakeDevice ephemeral; FakeDevice ephemeral;
FakeDevice nonEphemeralOne; FakeDevice nonEphemeralOne;
@ -198,12 +219,12 @@ void main() {
class TestDeviceManager extends DeviceManager { class TestDeviceManager extends DeviceManager {
TestDeviceManager(List<Device> allDevices) { TestDeviceManager(List<Device> allDevices) {
_deviceDiscoverer = MockPollingDeviceDiscovery(); _deviceDiscoverer = FakePollingDeviceDiscovery();
resetDevices(allDevices); resetDevices(allDevices);
} }
@override @override
List<DeviceDiscovery> get deviceDiscoverers => <DeviceDiscovery>[_deviceDiscoverer]; List<DeviceDiscovery> get deviceDiscoverers => <DeviceDiscovery>[_deviceDiscoverer];
MockPollingDeviceDiscovery _deviceDiscoverer; FakePollingDeviceDiscovery _deviceDiscoverer;
void resetDevices(List<Device> allDevices) { void resetDevices(List<Device> allDevices) {
_deviceDiscoverer.setDevices(allDevices); _deviceDiscoverer.setDevices(allDevices);

View File

@ -482,8 +482,8 @@ class MockStdio extends Stdio {
List<String> get writtenToStderr => _stderr.writes.map<String>(_stderr.encoding.decode).toList(); List<String> get writtenToStderr => _stderr.writes.map<String>(_stderr.encoding.decode).toList();
} }
class MockPollingDeviceDiscovery extends PollingDeviceDiscovery { class FakePollingDeviceDiscovery extends PollingDeviceDiscovery {
MockPollingDeviceDiscovery() : super('mock'); FakePollingDeviceDiscovery() : super('mock');
final List<Device> _devices = <Device>[]; final List<Device> _devices = <Device>[];
final StreamController<Device> _onAddedController = StreamController<Device>.broadcast(); final StreamController<Device> _onAddedController = StreamController<Device>.broadcast();