Migrate protocol_discovery to null safety (#91267)

This commit is contained in:
Jenn Magder 2021-10-12 12:13:02 -07:00 committed by GitHub
parent bdeefecc57
commit 1dbafdb53b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 112 additions and 144 deletions

View File

@ -385,7 +385,6 @@ class CustomDeviceAppSession {
final ProtocolDiscovery discovery = ProtocolDiscovery.observatory( final ProtocolDiscovery discovery = ProtocolDiscovery.observatory(
logReader, logReader,
portForwarder: _device._config.usesPortForwarding ? _device.portForwarder : null, portForwarder: _device._config.usesPortForwarding ? _device.portForwarder : null,
hostPort: null, devicePort: null,
logger: _logger, logger: _logger,
ipv6: ipv6, ipv6: ipv6,
); );

View File

@ -214,7 +214,7 @@ abstract class DeviceManager {
/// ///
/// * If [flutterProject] is null, then assume the project supports all /// * If [flutterProject] is null, then assume the project supports all
/// device types. /// device types.
Future<List<Device>> findTargetDevices(FlutterProject flutterProject, { Duration? timeout }) async { Future<List<Device>> findTargetDevices(FlutterProject? flutterProject, { Duration? timeout }) async {
if (timeout != null) { if (timeout != null) {
// Reset the cache with the specified timeout. // Reset the cache with the specified timeout.
await refreshAllConnectedDevices(timeout: timeout); await refreshAllConnectedDevices(timeout: timeout);
@ -317,7 +317,7 @@ abstract class DeviceManager {
/// ///
/// This exists to allow the check to be overridden for google3 clients. If /// This exists to allow the check to be overridden for google3 clients. If
/// [flutterProject] is null then return true. /// [flutterProject] is null then return true.
bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) { bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) {
if (flutterProject == null) { if (flutterProject == null) {
return true; return true;
} }

View File

@ -2,12 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.8
import 'dart:async'; import 'dart:async';
import 'package:meta/meta.dart';
import 'base/io.dart'; import 'base/io.dart';
import 'base/logger.dart'; import 'base/logger.dart';
import 'device.dart'; import 'device.dart';
@ -20,28 +16,27 @@ class ProtocolDiscovery {
this.logReader, this.logReader,
this.serviceName, { this.serviceName, {
this.portForwarder, this.portForwarder,
this.throttleDuration, required this.throttleDuration,
this.hostPort, this.hostPort,
this.devicePort, this.devicePort,
this.ipv6, required this.ipv6,
Logger logger, required Logger logger,
}) : _logger = logger, }) : _logger = logger,
assert(logReader != null) { assert(logReader != null) {
_deviceLogSubscription = logReader.logLines.listen( _deviceLogSubscription = logReader.logLines.listen(
_handleLine, _handleLine,
onDone: _stopScrapingLogs, onDone: _stopScrapingLogs,
); );
_uriStreamController = _BufferedStreamController<Uri>();
} }
factory ProtocolDiscovery.observatory( factory ProtocolDiscovery.observatory(
DeviceLogReader logReader, { DeviceLogReader logReader, {
DevicePortForwarder portForwarder, DevicePortForwarder? portForwarder,
Duration throttleDuration, Duration? throttleDuration,
@required int hostPort, int? hostPort,
@required int devicePort, int? devicePort,
@required bool ipv6, required bool ipv6,
@required Logger logger, required Logger logger,
}) { }) {
const String kObservatoryService = 'Observatory'; const String kObservatoryService = 'Observatory';
return ProtocolDiscovery._( return ProtocolDiscovery._(
@ -58,17 +53,17 @@ class ProtocolDiscovery {
final DeviceLogReader logReader; final DeviceLogReader logReader;
final String serviceName; final String serviceName;
final DevicePortForwarder portForwarder; final DevicePortForwarder? portForwarder;
final int hostPort; final int? hostPort;
final int devicePort; final int? devicePort;
final bool ipv6; final bool ipv6;
final Logger _logger; final Logger _logger;
/// The time to wait before forwarding a new observatory URIs from [logReader]. /// The time to wait before forwarding a new observatory URIs from [logReader].
final Duration throttleDuration; final Duration throttleDuration;
StreamSubscription<String> _deviceLogSubscription; StreamSubscription<String>? _deviceLogSubscription;
_BufferedStreamController<Uri> _uriStreamController; final _BufferedStreamController<Uri> _uriStreamController = _BufferedStreamController<Uri>();
/// The discovered service URL. /// The discovered service URL.
/// ///
@ -76,7 +71,7 @@ class ProtocolDiscovery {
/// ///
/// Use [uris] instead. /// Use [uris] instead.
// TODO(egarciad): replace `uri` for `uris`. // TODO(egarciad): replace `uri` for `uris`.
Future<Uri> get uri async { Future<Uri?> get uri async {
try { try {
return await uris.first; return await uris.first;
} on StateError { } on StateError {
@ -103,26 +98,26 @@ class ProtocolDiscovery {
Future<void> cancel() => _stopScrapingLogs(); Future<void> cancel() => _stopScrapingLogs();
Future<void> _stopScrapingLogs() async { Future<void> _stopScrapingLogs() async {
await _uriStreamController?.close(); await _uriStreamController.close();
await _deviceLogSubscription?.cancel(); await _deviceLogSubscription?.cancel();
_deviceLogSubscription = null; _deviceLogSubscription = null;
} }
Match _getPatternMatch(String line) { Match? _getPatternMatch(String line) {
final RegExp r = RegExp(RegExp.escape(serviceName) + r' listening on ((http|//)[a-zA-Z0-9:/=_\-\.\[\]]+)'); final RegExp r = RegExp(RegExp.escape(serviceName) + r' listening on ((http|//)[a-zA-Z0-9:/=_\-\.\[\]]+)');
return r.firstMatch(line); return r.firstMatch(line);
} }
Uri _getObservatoryUri(String line) { Uri? _getObservatoryUri(String line) {
final Match match = _getPatternMatch(line); final Match? match = _getPatternMatch(line);
if (match != null) { if (match != null) {
return Uri.parse(match[1]); return Uri.parse(match[1]!);
} }
return null; return null;
} }
void _handleLine(String line) { void _handleLine(String line) {
Uri uri; Uri? uri;
try { try {
uri = _getObservatoryUri(line); uri = _getObservatoryUri(line);
} on FormatException catch (error, stackTrace) { } on FormatException catch (error, stackTrace) {
@ -142,9 +137,10 @@ class ProtocolDiscovery {
_logger.printTrace('$serviceName URL on device: $deviceUri'); _logger.printTrace('$serviceName URL on device: $deviceUri');
Uri hostUri = deviceUri; Uri hostUri = deviceUri;
if (portForwarder != null) { final DevicePortForwarder? forwarder = portForwarder;
if (forwarder != null) {
final int actualDevicePort = deviceUri.port; final int actualDevicePort = deviceUri.port;
final int actualHostPort = await portForwarder.forward(actualDevicePort, hostPort: hostPort); final int actualHostPort = await forwarder.forward(actualDevicePort, hostPort: hostPort);
_logger.printTrace('Forwarded host port $actualHostPort to device port $actualDevicePort for $serviceName'); _logger.printTrace('Forwarded host port $actualHostPort to device port $actualDevicePort for $serviceName');
hostUri = deviceUri.replace(port: actualHostPort); hostUri = deviceUri.replace(port: actualHostPort);
} }
@ -167,25 +163,24 @@ class _BufferedStreamController<T> {
return _streamController.stream; return _streamController.stream;
} }
StreamController<T> _streamControllerInstance; late final StreamController<T> _streamController = () {
final StreamController<T> streamControllerInstance = StreamController<T>.broadcast();
StreamController<T> get _streamController { streamControllerInstance.onListen = () {
_streamControllerInstance ??= StreamController<T>.broadcast(onListen: () {
for (final dynamic event in _events) { for (final dynamic event in _events) {
assert(T is! List); assert(T is! List);
if (event is T) { if (event is T) {
_streamControllerInstance.add(event); streamControllerInstance.add(event);
} else { } else {
_streamControllerInstance.addError( streamControllerInstance.addError(
(event as Iterable<dynamic>).first as Object, (event as Iterable<dynamic>).first as Object,
(event as Iterable<dynamic>).last as StackTrace, event.last as StackTrace,
); );
} }
} }
_events.clear(); _events.clear();
}); };
return _streamControllerInstance; return streamControllerInstance;
} }();
final List<dynamic> _events; final List<dynamic> _events;
@ -200,7 +195,7 @@ class _BufferedStreamController<T> {
} }
/// Sends or enqueues an error event. /// Sends or enqueues an error event.
void addError(Object error, [StackTrace stackTrace]) { void addError(Object error, [StackTrace? stackTrace]) {
if (_streamController.hasListener) { if (_streamController.hasListener) {
_streamController.addError(error, stackTrace); _streamController.addError(error, stackTrace);
} else { } else {
@ -220,13 +215,13 @@ class _BufferedStreamController<T> {
/// and arrival times: `a (0ms), b (5ms), c (11ms), d (21ms)`. /// and arrival times: `a (0ms), b (5ms), c (11ms), d (21ms)`.
/// The events `a`, `c`, and `d` will be produced as a result. /// The events `a`, `c`, and `d` will be produced as a result.
StreamTransformer<S, S> _throttle<S>({ StreamTransformer<S, S> _throttle<S>({
@required Duration waitDuration, required Duration waitDuration,
}) { }) {
assert(waitDuration != null); assert(waitDuration != null);
S latestLine; S latestLine;
int lastExecution; int? lastExecution;
Future<void> throttleFuture; Future<void>? throttleFuture;
bool done = false; bool done = false;
return StreamTransformer<S, S> return StreamTransformer<S, S>
@ -237,7 +232,7 @@ StreamTransformer<S, S> _throttle<S>({
final bool isFirstMessage = lastExecution == null; final bool isFirstMessage = lastExecution == null;
final int currentTime = DateTime.now().millisecondsSinceEpoch; final int currentTime = DateTime.now().millisecondsSinceEpoch;
lastExecution ??= currentTime; lastExecution ??= currentTime;
final int remainingTime = currentTime - lastExecution; final int remainingTime = currentTime - lastExecution!;
// Always send the first event immediately. // Always send the first event immediately.
final int nextExecutionTime = isFirstMessage || remainingTime > waitDuration.inMilliseconds final int nextExecutionTime = isFirstMessage || remainingTime > waitDuration.inMilliseconds

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.8
import 'dart:async'; import 'dart:async';
import 'package:fake_async/fake_async.dart'; import 'package:fake_async/fake_async.dart';
@ -14,7 +12,6 @@ import 'package:flutter_tools/src/base/user_messages.dart';
import 'package:flutter_tools/src/build_info.dart'; import 'package:flutter_tools/src/build_info.dart';
import 'package:flutter_tools/src/device.dart'; import 'package:flutter_tools/src/device.dart';
import 'package:flutter_tools/src/project.dart'; import 'package:flutter_tools/src/project.dart';
import 'package:meta/meta.dart';
import 'package:test/fake.dart'; import 'package:test/fake.dart';
import '../src/common.dart'; import '../src/common.dart';
@ -491,37 +488,37 @@ void main() {
class TestDeviceManager extends DeviceManager { class TestDeviceManager extends DeviceManager {
TestDeviceManager( TestDeviceManager(
List<Device> allDevices, { List<Device> allDevices, {
List<DeviceDiscovery> deviceDiscoveryOverrides, List<DeviceDiscovery>? deviceDiscoveryOverrides,
@required Logger logger, required Logger logger,
@required Terminal terminal, required Terminal terminal,
String wellKnownId, String? wellKnownId,
}) : super(logger: logger, terminal: terminal, userMessages: UserMessages()) { }) : _fakeDeviceDiscoverer = FakePollingDeviceDiscovery(),
_fakeDeviceDiscoverer = FakePollingDeviceDiscovery(); _deviceDiscoverers = <DeviceDiscovery>[],
super(logger: logger, terminal: terminal, userMessages: UserMessages()) {
if (wellKnownId != null) { if (wellKnownId != null) {
_fakeDeviceDiscoverer.wellKnownIds.add(wellKnownId); _fakeDeviceDiscoverer.wellKnownIds.add(wellKnownId);
} }
_deviceDiscoverers = <DeviceDiscovery>[ _deviceDiscoverers.add(_fakeDeviceDiscoverer);
_fakeDeviceDiscoverer, if (deviceDiscoveryOverrides != null) {
if (deviceDiscoveryOverrides != null) _deviceDiscoverers.addAll(deviceDiscoveryOverrides);
...deviceDiscoveryOverrides }
];
resetDevices(allDevices); resetDevices(allDevices);
} }
@override @override
List<DeviceDiscovery> get deviceDiscoverers => _deviceDiscoverers; List<DeviceDiscovery> get deviceDiscoverers => _deviceDiscoverers;
List<DeviceDiscovery> _deviceDiscoverers; final List<DeviceDiscovery> _deviceDiscoverers;
FakePollingDeviceDiscovery _fakeDeviceDiscoverer; final FakePollingDeviceDiscovery _fakeDeviceDiscoverer;
void resetDevices(List<Device> allDevices) { void resetDevices(List<Device> allDevices) {
_fakeDeviceDiscoverer.setDevices(allDevices); _fakeDeviceDiscoverer.setDevices(allDevices);
} }
bool isAlwaysSupportedOverride; bool? isAlwaysSupportedOverride;
@override @override
bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) { bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) {
if (isAlwaysSupportedOverride != null) { if (isAlwaysSupportedOverride != null) {
return isAlwaysSupportedOverride; return isAlwaysSupportedOverride!;
} }
return super.isDeviceSupportedForProject(device, flutterProject); return super.isDeviceSupportedForProject(device, flutterProject);
} }
@ -543,7 +540,7 @@ class MockDeviceDiscovery extends Fake implements DeviceDiscovery {
} }
@override @override
Future<List<Device>> discoverDevices({Duration timeout}) async { Future<List<Device>> discoverDevices({Duration? timeout}) async {
discoverDevicesCalled += 1; discoverDevicesCalled += 1;
return deviceValues; return deviceValues;
} }
@ -560,18 +557,18 @@ class LongPollingDeviceDiscovery extends PollingDeviceDiscovery {
final Completer<List<Device>> _completer = Completer<List<Device>>(); final Completer<List<Device>> _completer = Completer<List<Device>>();
@override @override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async { Future<List<Device>> pollingGetDevices({ Duration? timeout }) async {
return _completer.future; return _completer.future;
} }
@override @override
Future<void> stopPolling() async { Future<void> stopPolling() async {
_completer.complete(); _completer.complete(<Device>[]);
} }
@override @override
Future<void> dispose() async { Future<void> dispose() async {
_completer.complete(); _completer.complete(<Device>[]);
} }
@override @override
@ -588,7 +585,7 @@ class ThrowingPollingDeviceDiscovery extends PollingDeviceDiscovery {
ThrowingPollingDeviceDiscovery() : super('throw'); ThrowingPollingDeviceDiscovery() : super('throw');
@override @override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async { Future<List<Device>> pollingGetDevices({ Duration? timeout }) async {
throw const ProcessException('fake-discovery', <String>[]); throw const ProcessException('fake-discovery', <String>[]);
} }
@ -614,15 +611,15 @@ class FakeTerminal extends Fake implements Terminal {
_nextResult = result; _nextResult = result;
} }
List<String> _nextPrompt; List<String>? _nextPrompt;
String _nextResult; late String _nextResult;
@override @override
Future<String> promptForCharInput( Future<String> promptForCharInput(
List<String> acceptedCharacters, { List<String> acceptedCharacters, {
Logger logger, Logger? logger,
String prompt, String? prompt,
int defaultChoiceIndex, int? defaultChoiceIndex,
bool displayAcceptedCharacters = true, bool displayAcceptedCharacters = true,
}) async { }) async {
expect(acceptedCharacters, _nextPrompt); expect(acceptedCharacters, _nextPrompt);

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.8
import 'package:fake_async/fake_async.dart'; import 'package:fake_async/fake_async.dart';
import 'package:flutter_tools/src/base/logger.dart'; import 'package:flutter_tools/src/base/logger.dart';
import 'package:flutter_tools/src/device_port_forwarder.dart'; import 'package:flutter_tools/src/device_port_forwarder.dart';
@ -14,16 +12,14 @@ import '../src/fake_devices.dart';
void main() { void main() {
group('service_protocol discovery', () { group('service_protocol discovery', () {
FakeDeviceLogReader logReader; late FakeDeviceLogReader logReader;
ProtocolDiscovery discoverer; late ProtocolDiscovery discoverer;
setUp(() { setUp(() {
logReader = FakeDeviceLogReader(); logReader = FakeDeviceLogReader();
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: null,
throttleDuration: const Duration(milliseconds: 5), throttleDuration: const Duration(milliseconds: 5),
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
@ -42,20 +38,20 @@ void main() {
testWithoutContext('discovers uri if logs already produced output', () async { testWithoutContext('discovers uri if logs already produced output', () async {
logReader.addLine('HELLO WORLD'); logReader.addLine('HELLO WORLD');
logReader.addLine('Observatory listening on http://127.0.0.1:9999'); logReader.addLine('Observatory listening on http://127.0.0.1:9999');
final Uri uri = await discoverer.uri; final Uri uri = (await discoverer.uri)!;
expect(uri.port, 9999); expect(uri.port, 9999);
expect('$uri', 'http://127.0.0.1:9999'); expect('$uri', 'http://127.0.0.1:9999');
}); });
testWithoutContext('does not discover uri with no host', () async { testWithoutContext('does not discover uri with no host', () async {
final Future<Uri> pendingUri = discoverer.uri; final Future<Uri?> pendingUri = discoverer.uri;
logReader.addLine('Observatory listening on http12asdasdsd9999'); logReader.addLine('Observatory listening on http12asdasdsd9999');
await Future<void>.delayed(const Duration(milliseconds: 10)); await Future<void>.delayed(const Duration(milliseconds: 10));
logReader.addLine('Observatory listening on http://127.0.0.1:9999'); logReader.addLine('Observatory listening on http://127.0.0.1:9999');
await Future<void>.delayed(Duration.zero); await Future<void>.delayed(Duration.zero);
final Uri uri = await pendingUri; final Uri uri = (await pendingUri)!;
expect(uri, isNotNull); expect(uri, isNotNull);
expect(uri.port, 9999); expect(uri.port, 9999);
expect('$uri', 'http://127.0.0.1:9999'); expect('$uri', 'http://127.0.0.1:9999');
@ -67,7 +63,7 @@ void main() {
await Future<void>.delayed(Duration.zero); await Future<void>.delayed(Duration.zero);
final Uri uri = await discoverer.uri; final Uri uri = (await discoverer.uri)!;
expect(uri, isNotNull); expect(uri, isNotNull);
expect(uri.port, 9999); expect(uri.port, 9999);
expect('$uri', 'http://127.0.0.1:9999'); expect('$uri', 'http://127.0.0.1:9999');
@ -82,16 +78,16 @@ void main() {
}); });
testWithoutContext('discovers uri if logs not yet produced output', () async { testWithoutContext('discovers uri if logs not yet produced output', () async {
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
logReader.addLine('Observatory listening on http://127.0.0.1:3333'); logReader.addLine('Observatory listening on http://127.0.0.1:3333');
final Uri uri = await uriFuture; final Uri uri = (await uriFuture)!;
expect(uri.port, 3333); expect(uri.port, 3333);
expect('$uri', 'http://127.0.0.1:3333'); expect('$uri', 'http://127.0.0.1:3333');
}); });
testWithoutContext('discovers uri with Ascii Esc code', () async { testWithoutContext('discovers uri with Ascii Esc code', () async {
logReader.addLine('Observatory listening on http://127.0.0.1:3333\x1b['); logReader.addLine('Observatory listening on http://127.0.0.1:3333\x1b[');
final Uri uri = await discoverer.uri; final Uri uri = (await discoverer.uri)!;
expect(uri.port, 3333); expect(uri.port, 3333);
expect('$uri', 'http://127.0.0.1:3333'); expect('$uri', 'http://127.0.0.1:3333');
}); });
@ -102,17 +98,17 @@ void main() {
}); });
testWithoutContext('uri is null when the log reader closes early', () async { testWithoutContext('uri is null when the log reader closes early', () async {
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
await logReader.dispose(); await logReader.dispose();
expect(await uriFuture, isNull); expect(await uriFuture, isNull);
}); });
testWithoutContext('uri waits for correct log line', () async { testWithoutContext('uri waits for correct log line', () async {
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
logReader.addLine('Observatory not listening...'); logReader.addLine('Observatory not listening...');
final Uri timeoutUri = Uri.parse('http://timeout'); final Uri timeoutUri = Uri.parse('http://timeout');
final Uri actualUri = await uriFuture.timeout( final Uri? actualUri = await uriFuture.timeout(
const Duration(milliseconds: 100), const Duration(milliseconds: 100),
onTimeout: () => timeoutUri, onTimeout: () => timeoutUri,
); );
@ -121,23 +117,23 @@ void main() {
testWithoutContext('discovers uri if log line contains Android prefix', () async { testWithoutContext('discovers uri if log line contains Android prefix', () async {
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:52584'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:52584');
final Uri uri = await discoverer.uri; final Uri uri = (await discoverer.uri)!;
expect(uri.port, 52584); expect(uri.port, 52584);
expect('$uri', 'http://127.0.0.1:52584'); expect('$uri', 'http://127.0.0.1:52584');
}); });
testWithoutContext('discovers uri if log line contains auth key', () async { testWithoutContext('discovers uri if log line contains auth key', () async {
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/');
final Uri uri = await uriFuture; final Uri uri = (await uriFuture)!;
expect(uri.port, 54804); expect(uri.port, 54804);
expect('$uri', 'http://127.0.0.1:54804/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:54804/PTwjm8Ii8qg=/');
}); });
testWithoutContext('discovers uri if log line contains non-localhost', () async { testWithoutContext('discovers uri if log line contains non-localhost', () async {
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/');
final Uri uri = await uriFuture; final Uri uri = (await uriFuture)!;
expect(uri.port, 54804); expect(uri.port, 54804);
expect('$uri', 'http://127.0.0.1:54804/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:54804/PTwjm8Ii8qg=/');
}); });
@ -146,15 +142,14 @@ void main() {
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: 12346, devicePort: 12346,
throttleDuration: const Duration(milliseconds: 200), throttleDuration: const Duration(milliseconds: 200),
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12345/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12345/PTwjm8Ii8qg=/');
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12346/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12346/PTwjm8Ii8qg=/');
final Uri uri = await uriFuture; final Uri uri = (await uriFuture)!;
expect(uri.port, 12346); expect(uri.port, 12346);
expect('$uri', 'http://127.0.0.1:12346/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:12346/PTwjm8Ii8qg=/');
}); });
@ -163,15 +158,14 @@ void main() {
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: 12346, devicePort: 12346,
throttleDuration: const Duration(milliseconds: 200), throttleDuration: const Duration(milliseconds: 200),
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
final Future<Uri> uriFuture = discoverer.uri; final Future<Uri?> uriFuture = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12346/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12346/PTwjm8Ii8qg=/');
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12345/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:12345/PTwjm8Ii8qg=/');
final Uri uri = await uriFuture; final Uri uri = (await uriFuture)!;
expect(uri.port, 12346); expect(uri.port, 12346);
expect('$uri', 'http://127.0.0.1:12346/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:12346/PTwjm8Ii8qg=/');
}); });
@ -188,7 +182,6 @@ void main() {
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: 12345, devicePort: 12345,
throttleDuration: const Duration(milliseconds: 200), throttleDuration: const Duration(milliseconds: 200),
logger: BufferLogger.test(), logger: BufferLogger.test(),
@ -205,7 +198,6 @@ void main() {
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: 12346, devicePort: 12346,
throttleDuration: const Duration(milliseconds: 10), throttleDuration: const Duration(milliseconds: 10),
logger: BufferLogger.test(), logger: BufferLogger.test(),
@ -227,8 +219,6 @@ void main() {
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: null,
throttleDuration: kThrottleDuration, throttleDuration: kThrottleDuration,
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
@ -263,7 +253,6 @@ void main() {
discoverer = ProtocolDiscovery.observatory( discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
ipv6: false, ipv6: false,
hostPort: null,
devicePort: 12345, devicePort: 12345,
throttleDuration: kThrottleTimeInMilliseconds, throttleDuration: kThrottleTimeInMilliseconds,
logger: BufferLogger.test(), logger: BufferLogger.test(),
@ -299,16 +288,14 @@ void main() {
final ProtocolDiscovery discoverer = ProtocolDiscovery.observatory( final ProtocolDiscovery discoverer = ProtocolDiscovery.observatory(
logReader, logReader,
portForwarder: MockPortForwarder(99), portForwarder: MockPortForwarder(99),
hostPort: null,
devicePort: null,
ipv6: false, ipv6: false,
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
// Get next port future. // Get next port future.
final Future<Uri> nextUri = discoverer.uri; final Future<Uri?> nextUri = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/');
final Uri uri = await nextUri; final Uri uri = (await nextUri)!;
expect(uri.port, 99); expect(uri.port, 99);
expect('$uri', 'http://127.0.0.1:99/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:99/PTwjm8Ii8qg=/');
@ -322,15 +309,14 @@ void main() {
logReader, logReader,
portForwarder: MockPortForwarder(99), portForwarder: MockPortForwarder(99),
hostPort: 1243, hostPort: 1243,
devicePort: null,
ipv6: false, ipv6: false,
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
// Get next port future. // Get next port future.
final Future<Uri> nextUri = discoverer.uri; final Future<Uri?> nextUri = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/');
final Uri uri = await nextUri; final Uri uri = (await nextUri)!;
expect(uri.port, 1243); expect(uri.port, 1243);
expect('$uri', 'http://127.0.0.1:1243/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:1243/PTwjm8Ii8qg=/');
@ -344,15 +330,14 @@ void main() {
logReader, logReader,
portForwarder: MockPortForwarder(99), portForwarder: MockPortForwarder(99),
hostPort: 0, hostPort: 0,
devicePort: null,
ipv6: false, ipv6: false,
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
// Get next port future. // Get next port future.
final Future<Uri> nextUri = discoverer.uri; final Future<Uri?> nextUri = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/');
final Uri uri = await nextUri; final Uri uri = (await nextUri)!;
expect(uri.port, 99); expect(uri.port, 99);
expect('$uri', 'http://127.0.0.1:99/PTwjm8Ii8qg=/'); expect('$uri', 'http://127.0.0.1:99/PTwjm8Ii8qg=/');
@ -367,14 +352,13 @@ void main() {
portForwarder: MockPortForwarder(99), portForwarder: MockPortForwarder(99),
hostPort: 54777, hostPort: 54777,
ipv6: true, ipv6: true,
devicePort: null,
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
// Get next port future. // Get next port future.
final Future<Uri> nextUri = discoverer.uri; final Future<Uri?> nextUri = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/'); logReader.addLine('I/flutter : Observatory listening on http://127.0.0.1:54804/PTwjm8Ii8qg=/');
final Uri uri = await nextUri; final Uri uri = (await nextUri)!;
expect(uri.port, 54777); expect(uri.port, 54777);
expect('$uri', 'http://[::1]:54777/PTwjm8Ii8qg=/'); expect('$uri', 'http://[::1]:54777/PTwjm8Ii8qg=/');
@ -389,14 +373,13 @@ void main() {
portForwarder: MockPortForwarder(99), portForwarder: MockPortForwarder(99),
hostPort: 54777, hostPort: 54777,
ipv6: true, ipv6: true,
devicePort: null,
logger: BufferLogger.test(), logger: BufferLogger.test(),
); );
// Get next port future. // Get next port future.
final Future<Uri> nextUri = discoverer.uri; final Future<Uri?> nextUri = discoverer.uri;
logReader.addLine('I/flutter : Observatory listening on http://[::1]:54777/PTwjm8Ii8qg=/\x1b['); logReader.addLine('I/flutter : Observatory listening on http://[::1]:54777/PTwjm8Ii8qg=/\x1b[');
final Uri uri = await nextUri; final Uri uri = (await nextUri)!;
expect(uri.port, 54777); expect(uri.port, 54777);
expect('$uri', 'http://[::1]:54777/PTwjm8Ii8qg=/'); expect('$uri', 'http://[::1]:54777/PTwjm8Ii8qg=/');
@ -410,13 +393,13 @@ void main() {
class MockPortForwarder extends DevicePortForwarder { class MockPortForwarder extends DevicePortForwarder {
MockPortForwarder([this.availablePort]); MockPortForwarder([this.availablePort]);
final int availablePort; final int? availablePort;
@override @override
Future<int> forward(int devicePort, { int hostPort }) async { Future<int> forward(int devicePort, { int? hostPort }) async {
hostPort ??= 0; hostPort ??= 0;
if (hostPort == 0) { if (hostPort == 0) {
return availablePort; return availablePort!;
} }
return hostPort; return hostPort;
} }

View File

@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
// @dart = 2.8
import 'dart:async'; import 'dart:async';
import 'package:flutter_tools/src/application_package.dart'; import 'package:flutter_tools/src/application_package.dart';
@ -64,7 +62,7 @@ class FakeDevice extends Device {
bool ephemeral = true, bool ephemeral = true,
bool isSupported = true, bool isSupported = true,
PlatformType type = PlatformType.web, PlatformType type = PlatformType.web,
LaunchResult launchResult, LaunchResult? launchResult,
}) : _isSupported = isSupported, }) : _isSupported = isSupported,
_launchResult = launchResult ?? LaunchResult.succeeded(), _launchResult = launchResult ?? LaunchResult.succeeded(),
super( super(
@ -82,24 +80,24 @@ class FakeDevice extends Device {
@override @override
Future<LaunchResult> startApp(covariant ApplicationPackage package, { Future<LaunchResult> startApp(covariant ApplicationPackage package, {
String mainPath, String? mainPath,
String route, String? route,
DebuggingOptions debuggingOptions, DebuggingOptions? debuggingOptions,
Map<String, dynamic> platformArgs, Map<String, dynamic>? platformArgs,
bool prebuiltApplication = false, bool prebuiltApplication = false,
bool ipv6 = false, bool ipv6 = false,
String userIdentifier, String? userIdentifier,
}) async => _launchResult; }) async => _launchResult;
@override @override
Future<bool> stopApp(covariant ApplicationPackage app, { Future<bool> stopApp(covariant ApplicationPackage app, {
String userIdentifier, String? userIdentifier,
}) async => true; }) async => true;
@override @override
Future<bool> uninstallApp( Future<bool> uninstallApp(
covariant ApplicationPackage app, { covariant ApplicationPackage app, {
String userIdentifier, String? userIdentifier,
}) async => true; }) async => true;
@override @override
@ -140,12 +138,12 @@ class FakePollingDeviceDiscovery extends PollingDeviceDiscovery {
final StreamController<Device> _onRemovedController = StreamController<Device>.broadcast(); final StreamController<Device> _onRemovedController = StreamController<Device>.broadcast();
@override @override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async { Future<List<Device>> pollingGetDevices({ Duration? timeout }) async {
lastPollingTimeout = timeout; lastPollingTimeout = timeout;
return _devices; return _devices;
} }
Duration lastPollingTimeout; Duration? lastPollingTimeout;
@override @override
bool get supportsPlatform => true; bool get supportsPlatform => true;
@ -185,19 +183,15 @@ class FakeDeviceLogReader extends DeviceLogReader {
@override @override
String get name => 'FakeLogReader'; String get name => 'FakeLogReader';
StreamController<String> _cachedLinesController;
bool disposed = false; bool disposed = false;
final List<String> _lineQueue = <String>[]; final List<String> _lineQueue = <String>[];
StreamController<String> get _linesController { late final StreamController<String> _linesController =
_cachedLinesController ??= StreamController<String> StreamController<String>
.broadcast(onListen: () { .broadcast(onListen: () {
_lineQueue.forEach(_linesController.add); _lineQueue.forEach(_linesController.add);
_lineQueue.clear(); _lineQueue.clear();
}); });
return _cachedLinesController;
}
@override @override
Stream<String> get logLines => _linesController.stream; Stream<String> get logLines => _linesController.stream;