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(
logReader,
portForwarder: _device._config.usesPortForwarding ? _device.portForwarder : null,
hostPort: null, devicePort: null,
logger: _logger,
ipv6: ipv6,
);

View File

@ -214,7 +214,7 @@ abstract class DeviceManager {
///
/// * If [flutterProject] is null, then assume the project supports all
/// device types.
Future<List<Device>> findTargetDevices(FlutterProject flutterProject, { Duration? timeout }) async {
Future<List<Device>> findTargetDevices(FlutterProject? flutterProject, { Duration? timeout }) async {
if (timeout != null) {
// Reset the cache with the specified 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
/// [flutterProject] is null then return true.
bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) {
bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) {
if (flutterProject == null) {
return true;
}

View File

@ -2,12 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
import 'package:meta/meta.dart';
import 'base/io.dart';
import 'base/logger.dart';
import 'device.dart';
@ -20,28 +16,27 @@ class ProtocolDiscovery {
this.logReader,
this.serviceName, {
this.portForwarder,
this.throttleDuration,
required this.throttleDuration,
this.hostPort,
this.devicePort,
this.ipv6,
Logger logger,
required this.ipv6,
required Logger logger,
}) : _logger = logger,
assert(logReader != null) {
_deviceLogSubscription = logReader.logLines.listen(
_handleLine,
onDone: _stopScrapingLogs,
);
_uriStreamController = _BufferedStreamController<Uri>();
}
factory ProtocolDiscovery.observatory(
DeviceLogReader logReader, {
DevicePortForwarder portForwarder,
Duration throttleDuration,
@required int hostPort,
@required int devicePort,
@required bool ipv6,
@required Logger logger,
DevicePortForwarder? portForwarder,
Duration? throttleDuration,
int? hostPort,
int? devicePort,
required bool ipv6,
required Logger logger,
}) {
const String kObservatoryService = 'Observatory';
return ProtocolDiscovery._(
@ -58,17 +53,17 @@ class ProtocolDiscovery {
final DeviceLogReader logReader;
final String serviceName;
final DevicePortForwarder portForwarder;
final int hostPort;
final int devicePort;
final DevicePortForwarder? portForwarder;
final int? hostPort;
final int? devicePort;
final bool ipv6;
final Logger _logger;
/// The time to wait before forwarding a new observatory URIs from [logReader].
final Duration throttleDuration;
StreamSubscription<String> _deviceLogSubscription;
_BufferedStreamController<Uri> _uriStreamController;
StreamSubscription<String>? _deviceLogSubscription;
final _BufferedStreamController<Uri> _uriStreamController = _BufferedStreamController<Uri>();
/// The discovered service URL.
///
@ -76,7 +71,7 @@ class ProtocolDiscovery {
///
/// Use [uris] instead.
// TODO(egarciad): replace `uri` for `uris`.
Future<Uri> get uri async {
Future<Uri?> get uri async {
try {
return await uris.first;
} on StateError {
@ -103,26 +98,26 @@ class ProtocolDiscovery {
Future<void> cancel() => _stopScrapingLogs();
Future<void> _stopScrapingLogs() async {
await _uriStreamController?.close();
await _uriStreamController.close();
await _deviceLogSubscription?.cancel();
_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:/=_\-\.\[\]]+)');
return r.firstMatch(line);
}
Uri _getObservatoryUri(String line) {
final Match match = _getPatternMatch(line);
Uri? _getObservatoryUri(String line) {
final Match? match = _getPatternMatch(line);
if (match != null) {
return Uri.parse(match[1]);
return Uri.parse(match[1]!);
}
return null;
}
void _handleLine(String line) {
Uri uri;
Uri? uri;
try {
uri = _getObservatoryUri(line);
} on FormatException catch (error, stackTrace) {
@ -142,9 +137,10 @@ class ProtocolDiscovery {
_logger.printTrace('$serviceName URL on device: $deviceUri');
Uri hostUri = deviceUri;
if (portForwarder != null) {
final DevicePortForwarder? forwarder = portForwarder;
if (forwarder != null) {
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');
hostUri = deviceUri.replace(port: actualHostPort);
}
@ -167,25 +163,24 @@ class _BufferedStreamController<T> {
return _streamController.stream;
}
StreamController<T> _streamControllerInstance;
StreamController<T> get _streamController {
_streamControllerInstance ??= StreamController<T>.broadcast(onListen: () {
late final StreamController<T> _streamController = () {
final StreamController<T> streamControllerInstance = StreamController<T>.broadcast();
streamControllerInstance.onListen = () {
for (final dynamic event in _events) {
assert(T is! List);
if (event is T) {
_streamControllerInstance.add(event);
streamControllerInstance.add(event);
} else {
_streamControllerInstance.addError(
streamControllerInstance.addError(
(event as Iterable<dynamic>).first as Object,
(event as Iterable<dynamic>).last as StackTrace,
event.last as StackTrace,
);
}
}
_events.clear();
});
return _streamControllerInstance;
}
};
return streamControllerInstance;
}();
final List<dynamic> _events;
@ -200,7 +195,7 @@ class _BufferedStreamController<T> {
}
/// Sends or enqueues an error event.
void addError(Object error, [StackTrace stackTrace]) {
void addError(Object error, [StackTrace? stackTrace]) {
if (_streamController.hasListener) {
_streamController.addError(error, stackTrace);
} else {
@ -220,13 +215,13 @@ class _BufferedStreamController<T> {
/// and arrival times: `a (0ms), b (5ms), c (11ms), d (21ms)`.
/// The events `a`, `c`, and `d` will be produced as a result.
StreamTransformer<S, S> _throttle<S>({
@required Duration waitDuration,
required Duration waitDuration,
}) {
assert(waitDuration != null);
S latestLine;
int lastExecution;
Future<void> throttleFuture;
int? lastExecution;
Future<void>? throttleFuture;
bool done = false;
return StreamTransformer<S, S>
@ -237,7 +232,7 @@ StreamTransformer<S, S> _throttle<S>({
final bool isFirstMessage = lastExecution == null;
final int currentTime = DateTime.now().millisecondsSinceEpoch;
lastExecution ??= currentTime;
final int remainingTime = currentTime - lastExecution;
final int remainingTime = currentTime - lastExecution!;
// Always send the first event immediately.
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
// found in the LICENSE file.
// @dart = 2.8
import 'dart:async';
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/device.dart';
import 'package:flutter_tools/src/project.dart';
import 'package:meta/meta.dart';
import 'package:test/fake.dart';
import '../src/common.dart';
@ -491,37 +488,37 @@ void main() {
class TestDeviceManager extends DeviceManager {
TestDeviceManager(
List<Device> allDevices, {
List<DeviceDiscovery> deviceDiscoveryOverrides,
@required Logger logger,
@required Terminal terminal,
String wellKnownId,
}) : super(logger: logger, terminal: terminal, userMessages: UserMessages()) {
_fakeDeviceDiscoverer = FakePollingDeviceDiscovery();
List<DeviceDiscovery>? deviceDiscoveryOverrides,
required Logger logger,
required Terminal terminal,
String? wellKnownId,
}) : _fakeDeviceDiscoverer = FakePollingDeviceDiscovery(),
_deviceDiscoverers = <DeviceDiscovery>[],
super(logger: logger, terminal: terminal, userMessages: UserMessages()) {
if (wellKnownId != null) {
_fakeDeviceDiscoverer.wellKnownIds.add(wellKnownId);
}
_deviceDiscoverers = <DeviceDiscovery>[
_fakeDeviceDiscoverer,
if (deviceDiscoveryOverrides != null)
...deviceDiscoveryOverrides
];
_deviceDiscoverers.add(_fakeDeviceDiscoverer);
if (deviceDiscoveryOverrides != null) {
_deviceDiscoverers.addAll(deviceDiscoveryOverrides);
}
resetDevices(allDevices);
}
@override
List<DeviceDiscovery> get deviceDiscoverers => _deviceDiscoverers;
List<DeviceDiscovery> _deviceDiscoverers;
FakePollingDeviceDiscovery _fakeDeviceDiscoverer;
final List<DeviceDiscovery> _deviceDiscoverers;
final FakePollingDeviceDiscovery _fakeDeviceDiscoverer;
void resetDevices(List<Device> allDevices) {
_fakeDeviceDiscoverer.setDevices(allDevices);
}
bool isAlwaysSupportedOverride;
bool? isAlwaysSupportedOverride;
@override
bool isDeviceSupportedForProject(Device device, FlutterProject flutterProject) {
bool isDeviceSupportedForProject(Device device, FlutterProject? flutterProject) {
if (isAlwaysSupportedOverride != null) {
return isAlwaysSupportedOverride;
return isAlwaysSupportedOverride!;
}
return super.isDeviceSupportedForProject(device, flutterProject);
}
@ -543,7 +540,7 @@ class MockDeviceDiscovery extends Fake implements DeviceDiscovery {
}
@override
Future<List<Device>> discoverDevices({Duration timeout}) async {
Future<List<Device>> discoverDevices({Duration? timeout}) async {
discoverDevicesCalled += 1;
return deviceValues;
}
@ -560,18 +557,18 @@ class LongPollingDeviceDiscovery extends PollingDeviceDiscovery {
final Completer<List<Device>> _completer = Completer<List<Device>>();
@override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async {
Future<List<Device>> pollingGetDevices({ Duration? timeout }) async {
return _completer.future;
}
@override
Future<void> stopPolling() async {
_completer.complete();
_completer.complete(<Device>[]);
}
@override
Future<void> dispose() async {
_completer.complete();
_completer.complete(<Device>[]);
}
@override
@ -588,7 +585,7 @@ class ThrowingPollingDeviceDiscovery extends PollingDeviceDiscovery {
ThrowingPollingDeviceDiscovery() : super('throw');
@override
Future<List<Device>> pollingGetDevices({ Duration timeout }) async {
Future<List<Device>> pollingGetDevices({ Duration? timeout }) async {
throw const ProcessException('fake-discovery', <String>[]);
}
@ -614,15 +611,15 @@ class FakeTerminal extends Fake implements Terminal {
_nextResult = result;
}
List<String> _nextPrompt;
String _nextResult;
List<String>? _nextPrompt;
late String _nextResult;
@override
Future<String> promptForCharInput(
List<String> acceptedCharacters, {
Logger logger,
String prompt,
int defaultChoiceIndex,
Logger? logger,
String? prompt,
int? defaultChoiceIndex,
bool displayAcceptedCharacters = true,
}) async {
expect(acceptedCharacters, _nextPrompt);

View File

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

View File

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