From 305a855f6d275fc5fbb70d09d369d3ce8333cd74 Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Wed, 20 Oct 2021 14:58:05 -0700 Subject: [PATCH] Migrate integration test shard test data to null safety (#92147) --- .../test_data/deferred_components_config.dart | 9 +- .../test/integration.shard/test_driver.dart | 288 +++++++++--------- .../test/integration.shard/test_utils.dart | 15 +- 3 files changed, 156 insertions(+), 156 deletions(-) diff --git a/packages/flutter_tools/test/integration.shard/test_data/deferred_components_config.dart b/packages/flutter_tools/test/integration.shard/test_data/deferred_components_config.dart index 61be3ad5b0b..5de7e2dfa17 100644 --- a/packages/flutter_tools/test/integration.shard/test_data/deferred_components_config.dart +++ b/packages/flutter_tools/test/integration.shard/test_data/deferred_components_config.dart @@ -2,15 +2,13 @@ // 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:file/file.dart'; import '../test_utils.dart'; abstract class DeferredComponentsConfig { String get deferredLibrary; - String get deferredComponentsGolden; + String? get deferredComponentsGolden; String get androidSettings; String get androidBuild; String get androidLocalProperties; @@ -30,8 +28,9 @@ abstract class DeferredComponentsConfig { if (deferredLibrary != null) { writeFile(fileSystem.path.join(dir.path, 'lib', 'deferred_library.dart'), deferredLibrary); } - if (deferredComponentsGolden != null) { - writeFile(fileSystem.path.join(dir.path, 'deferred_components_loading_units.yaml'), deferredComponentsGolden); + final String? golden = deferredComponentsGolden; + if (golden != null) { + writeFile(fileSystem.path.join(dir.path, 'deferred_components_loading_units.yaml'), golden); } if (androidSettings != null) { writeFile(fileSystem.path.join(dir.path, 'android', 'settings.gradle'), androidSettings); diff --git a/packages/flutter_tools/test/integration.shard/test_driver.dart b/packages/flutter_tools/test/integration.shard/test_driver.dart index b34061ec7fe..1b83ddf110c 100644 --- a/packages/flutter_tools/test/integration.shard/test_driver.dart +++ b/packages/flutter_tools/test/integration.shard/test_driver.dart @@ -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 'dart:convert'; import 'dart:io' as io; // flutter_ignore: dart_io_import @@ -13,7 +11,6 @@ import 'package:flutter_tools/src/base/common.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/utils.dart'; -import 'package:meta/meta.dart'; import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart'; import 'package:vm_service/vm_service_io.dart'; @@ -42,28 +39,28 @@ const Duration quitTimeout = Duration(seconds: 10); abstract class FlutterTestDriver { FlutterTestDriver( this._projectFolder, { - String logPrefix, + String? logPrefix, }) : _logPrefix = logPrefix != null ? '$logPrefix: ' : ''; final Directory _projectFolder; final String _logPrefix; - Process _process; - int _processPid; + Process? _process; + int? _processPid; final StreamController _stdout = StreamController.broadcast(); final StreamController _stderr = StreamController.broadcast(); final StreamController _allMessages = StreamController.broadcast(); final StringBuffer _errorBuffer = StringBuffer(); - String _lastResponse; - Uri _vmServiceWsUri; - int _attachPort; + String? _lastResponse; + Uri? _vmServiceWsUri; + int? _attachPort; bool _hasExited = false; - VmService _vmService; + VmService? _vmService; String get lastErrorInfo => _errorBuffer.toString(); Stream get stdout => _stdout.stream; - int get vmServicePort => _vmServiceWsUri.port; + int? get vmServicePort => _vmServiceWsUri?.port; bool get hasExited => _hasExited; - Uri get vmServiceWsUri => _vmServiceWsUri; + Uri? get vmServiceWsUri => _vmServiceWsUri; String lastTime = ''; void _debugPrint(String message, { String topic = '' }) { @@ -89,7 +86,7 @@ abstract class FlutterTestDriver { Future _setupProcess( List arguments, { - String script, + String? script, bool withDebugger = false, bool singleWidgetReloads = false, }) async { @@ -122,12 +119,12 @@ abstract class FlutterTestDriver { // This class doesn't use the result of the future. It's made available // via a getter for external uses. - unawaited(_process.exitCode.then((int code) { + unawaited(_process!.exitCode.then((int code) { _debugPrint('Process exited ($code)'); _hasExited = true; })); - transformToLines(_process.stdout).listen(_stdout.add); - transformToLines(_process.stderr).listen(_stderr.add); + transformToLines(_process!.stdout).listen(_stdout.add); + transformToLines(_process!.stderr).listen(_stderr.add); // Capture stderr to a buffer so we can show it all if any requests fail. _stderr.stream.listen(_errorBuffer.writeln); @@ -137,18 +134,18 @@ abstract class FlutterTestDriver { _stderr.stream.listen((String message) => _debugPrint(message, topic: '<=stderr=')); } - Future get done => _process.exitCode; + Future get done async => _process?.exitCode; Future connectToVmService({ bool pauseOnExceptions = false }) async { _vmService = await vmServiceConnectUri('$_vmServiceWsUri'); - _vmService.onSend.listen((String s) => _debugPrint(s, topic: '=vm=>')); - _vmService.onReceive.listen((String s) => _debugPrint(s, topic: '<=vm=')); + _vmService!.onSend.listen((String s) => _debugPrint(s, topic: '=vm=>')); + _vmService!.onReceive.listen((String s) => _debugPrint(s, topic: '<=vm=')); final Completer isolateStarted = Completer(); - _vmService.onIsolateEvent.listen((Event event) { + _vmService!.onIsolateEvent.listen((Event event) { if (event.kind == EventKind.kIsolateStart) { isolateStarted.complete(); - } else if (event.kind == EventKind.kIsolateExit && event.isolate.id == _flutterIsolateId) { + } else if (event.kind == EventKind.kIsolateExit && event.isolate?.id == _flutterIsolateId) { // Hot restarts cause all the isolates to exit, so we need to refresh // our idea of what the Flutter isolate ID is. _flutterIsolateId = null; @@ -156,17 +153,17 @@ abstract class FlutterTestDriver { }); await Future.wait(>[ - _vmService.streamListen('Isolate'), - _vmService.streamListen('Debug'), + _vmService!.streamListen('Isolate'), + _vmService!.streamListen('Debug'), ]); - if ((await _vmService.getVM()).isolates.isEmpty) { + if ((await _vmService!.getVM()).isolates?.isEmpty != false) { await isolateStarted.future; } await waitForPause(); if (pauseOnExceptions) { - await _vmService.setExceptionPauseMode( + await _vmService!.setExceptionPauseMode( await _getFlutterIsolateId(), ExceptionPauseMode.kUnhandled, ); @@ -175,9 +172,9 @@ abstract class FlutterTestDriver { Future callServiceExtension( String extension, { - Map args = const {}, + Map args = const {}, }) async { - final int port = _vmServiceWsUri != null ? vmServicePort : _attachPort; + final int? port = _vmServiceWsUri != null ? vmServicePort : _attachPort; final VmService vmService = await vmServiceConnectUri('ws://localhost:$port/ws'); final Isolate isolate = await waitForExtension(vmService, extension); return vmService.callServiceExtension( @@ -203,29 +200,29 @@ abstract class FlutterTestDriver { }); _debugPrint('Sending SIGTERM to $_processPid..'); - io.Process.killPid(_processPid, io.ProcessSignal.sigterm); - return _process.exitCode.timeout(quitTimeout, onTimeout: _killForcefully); + io.Process.killPid(_processPid!); + return _process!.exitCode.timeout(quitTimeout, onTimeout: _killForcefully); } Future _killForcefully() { _debugPrint('Sending SIGKILL to $_processPid..'); - ProcessSignal.sigkill.send(_processPid); - return _process.exitCode; + ProcessSignal.sigkill.send(_processPid!); + return _process!.exitCode; } - String _flutterIsolateId; + String? _flutterIsolateId; Future _getFlutterIsolateId() async { // Currently these tests only have a single isolate. If this // ceases to be the case, this code will need changing. if (_flutterIsolateId == null) { - final VM vm = await _vmService.getVM(); - _flutterIsolateId = vm.isolates.single.id; + final VM vm = await _vmService!.getVM(); + _flutterIsolateId = vm.isolates!.single.id; } - return _flutterIsolateId; + return _flutterIsolateId!; } Future getFlutterIsolate() async { - final Isolate isolate = await _vmService.getIsolate(await _getFlutterIsolateId()); + final Isolate isolate = await _vmService!.getIsolate(await _getFlutterIsolateId()); return isolate; } @@ -247,7 +244,7 @@ abstract class FlutterTestDriver { Future addBreakpoint(Uri uri, int line) async { _debugPrint('Sending breakpoint for: $uri:$line'); - await _vmService.addBreakpointWithScriptUri( + await _vmService!.addBreakpointWithScriptUri( await _getFlutterIsolateId(), uri.toString(), line, @@ -286,10 +283,10 @@ abstract class FlutterTestDriver { Future subscribeToDebugEvent(String kind, String isolateId) { _debugPrint('Start listening for $kind events'); - return _vmService.onDebugEvent + return _vmService!.onDebugEvent .where((Event event) { - return event.isolate.id == isolateId - && event.kind.startsWith(kind); + return event.isolate?.id == isolateId + && event.kind?.startsWith(kind) == true; }).first; } @@ -302,85 +299,87 @@ abstract class FlutterTestDriver { // But also check if the isolate was already at the state we need (only after we've // set up the subscription) to avoid races. If it already in the desired state, we // don't need to wait for the event. - final Isolate isolate = await _vmService.getIsolate(isolateId); - if (isolate.pauseEvent.kind.startsWith(kind)) { - _debugPrint('Isolate was already at "$kind" (${isolate.pauseEvent.kind}).'); + final VmService vmService = _vmService!; + final Isolate isolate = await vmService.getIsolate(isolateId); + if (isolate.pauseEvent?.kind?.startsWith(kind) == true) { + _debugPrint('Isolate was already at "$kind" (${isolate.pauseEvent!.kind}).'); event.ignore(); } else { _debugPrint('Waiting for "$kind" event to arrive...'); await event; } - return _vmService.getIsolate(isolateId); + return vmService.getIsolate(isolateId); }, task: 'Waiting for isolate to $kind', ); } - Future resume({ bool waitForNextPause = false }) => _resume(null, waitForNextPause); - Future stepOver({ bool waitForNextPause = true }) => _resume(StepOption.kOver, waitForNextPause); - Future stepOverAsync({ bool waitForNextPause = true }) => _resume(StepOption.kOverAsyncSuspension, waitForNextPause); - Future stepInto({ bool waitForNextPause = true }) => _resume(StepOption.kInto, waitForNextPause); - Future stepOut({ bool waitForNextPause = true }) => _resume(StepOption.kOut, waitForNextPause); + Future resume({ bool waitForNextPause = false }) => _resume(null, waitForNextPause); + Future stepOver({ bool waitForNextPause = true }) => _resume(StepOption.kOver, waitForNextPause); + Future stepOverAsync({ bool waitForNextPause = true }) => _resume(StepOption.kOverAsyncSuspension, waitForNextPause); + Future stepInto({ bool waitForNextPause = true }) => _resume(StepOption.kInto, waitForNextPause); + Future stepOut({ bool waitForNextPause = true }) => _resume(StepOption.kOut, waitForNextPause); Future isAtAsyncSuspension() async { final Isolate isolate = await getFlutterIsolate(); - return isolate.pauseEvent.atAsyncSuspension == true; + return isolate.pauseEvent?.atAsyncSuspension == true; } - Future stepOverOrOverAsyncSuspension({ bool waitForNextPause = true }) async { + Future stepOverOrOverAsyncSuspension({ bool waitForNextPause = true }) async { if (await isAtAsyncSuspension()) { return stepOverAsync(waitForNextPause: waitForNextPause); } return stepOver(waitForNextPause: waitForNextPause); } - Future _resume(String step, bool waitForNextPause) async { + Future _resume(String? step, bool waitForNextPause) async { assert(waitForNextPause != null); final String isolateId = await _getFlutterIsolateId(); final Future resume = subscribeToResumeEvent(isolateId); final Future pause = subscribeToPauseEvent(isolateId); - await _timeoutWithMessages( - () async => _vmService.resume(isolateId, step: step), + await _timeoutWithMessages( + () async => _vmService!.resume(isolateId, step: step), task: 'Resuming isolate (step=$step)', ); await waitForResumeEvent(isolateId, resume); - return waitForNextPause? waitForPauseEvent(isolateId, pause): null; + return waitForNextPause ? waitForPauseEvent(isolateId, pause) : null; } Future evaluateInFrame(String expression) async { return _timeoutWithMessages( - () async => await _vmService.evaluateInFrame(await _getFlutterIsolateId(), 0, expression) as ObjRef, + () async => await _vmService!.evaluateInFrame(await _getFlutterIsolateId(), 0, expression) as ObjRef, task: 'Evaluating expression ($expression)', ); } Future evaluate(String targetId, String expression) async { return _timeoutWithMessages( - () async => await _vmService.evaluate(await _getFlutterIsolateId(), targetId, expression) as InstanceRef, + () async => await _vmService!.evaluate(await _getFlutterIsolateId(), targetId, expression) as InstanceRef, task: 'Evaluating expression ($expression for $targetId)', ); } Future getTopStackFrame() async { final String flutterIsolateId = await _getFlutterIsolateId(); - final Stack stack = await _vmService.getStack(flutterIsolateId); - if (stack.frames.isEmpty) { + final Stack stack = await _vmService!.getStack(flutterIsolateId); + final List? frames = stack.frames; + if (frames == null || frames.isEmpty) { throw Exception('Stack is empty'); } - return stack.frames.first; + return frames.first; } - Future getSourceLocation() async { + Future getSourceLocation() async { final String flutterIsolateId = await _getFlutterIsolateId(); final Frame frame = await getTopStackFrame(); - final Script script = await _vmService.getObject(flutterIsolateId, frame.location.script.id) as Script; - return _lookupTokenPos(script.tokenPosTable, frame.location.tokenPos); + final Script script = await _vmService!.getObject(flutterIsolateId, frame.location!.script!.id!) as Script; + return _lookupTokenPos(script.tokenPosTable!, frame.location!.tokenPos!); } - SourcePosition _lookupTokenPos(List> table, int tokenPos) { + SourcePosition? _lookupTokenPos(List> table, int tokenPos) { for (final List row in table) { final int lineNumber = row[0]; int index = 1; @@ -395,9 +394,9 @@ abstract class FlutterTestDriver { return null; } - Future> _waitFor({ - String event, - int id, + Future> _waitFor({ + String? event, + int? id, Duration timeout = defaultTimeout, bool ignoreAppStopEvent = false, }) async { @@ -405,30 +404,31 @@ abstract class FlutterTestDriver { assert(event != null || id != null); assert(event == null || id == null); final String interestingOccurrence = event != null ? '$event event' : 'response to request $id'; - final Completer> response = Completer>(); - StreamSubscription subscription; + final Completer> response = Completer>(); + StreamSubscription? subscription; subscription = _stdout.stream.listen((String line) async { - final Map json = parseFlutterResponse(line); + final Map? json = parseFlutterResponse(line); _lastResponse = line; if (json == null) { return; } if ((event != null && json['event'] == event) || (id != null && json['id'] == id)) { - await subscription.cancel(); + await subscription?.cancel(); _debugPrint('OK ($interestingOccurrence)'); response.complete(json); } else if (!ignoreAppStopEvent && json['event'] == 'app.stop') { - await subscription.cancel(); + await subscription?.cancel(); final StringBuffer error = StringBuffer(); error.write('Received app.stop event while waiting for $interestingOccurrence\n\n$_errorBuffer'); - if (json['params'] != null) { - final Map params = json['params'] as Map; - if (params['error'] != null) { - error.write('${params['error']}\n\n'); + final Object? jsonParams = json['params']; + if (jsonParams is Map) { + if (jsonParams['error'] != null) { + error.write('${jsonParams['error']}\n\n'); } - if (json['params'] != null && params['trace'] != null) { - error.write('${params['trace']}\n\n'); + final Object? trace = jsonParams['trace']; + if (trace != null) { + error.write('$trace\n\n'); } } response.completeError(Exception(error.toString())); @@ -444,7 +444,7 @@ abstract class FlutterTestDriver { Future _timeoutWithMessages( Future Function() callback, { - @required String task, + required String task, Duration timeout = defaultTimeout, }) { assert(task != null); @@ -476,7 +476,7 @@ abstract class FlutterTestDriver { }); final Future future = callback().whenComplete(longWarning.cancel); - return future.catchError((dynamic error) { + return future.catchError((Object error) { if (!timeoutExpired) { timeoutExpired = true; _debugPrint(messages.toString()); @@ -489,11 +489,11 @@ abstract class FlutterTestDriver { class FlutterRunTestDriver extends FlutterTestDriver { FlutterRunTestDriver( Directory projectFolder, { - String logPrefix, + String? logPrefix, this.spawnDdsInstance = true, }) : super(projectFolder, logPrefix: logPrefix); - String _currentRunningAppId; + String? _currentRunningAppId; Future run({ bool withDebugger = false, @@ -503,8 +503,8 @@ class FlutterRunTestDriver extends FlutterTestDriver { bool expressionEvaluation = true, bool structuredErrors = false, bool singleWidgetReloads = false, - String script, - List additionalCommandArgs, + String? script, + List? additionalCommandArgs, }) async { await _setupProcess( [ @@ -541,7 +541,7 @@ class FlutterRunTestDriver extends FlutterTestDriver { bool startPaused = false, bool pauseOnExceptions = false, bool singleWidgetReloads = false, - List additionalCommandArgs, + List? additionalCommandArgs, }) async { _attachPort = port; await _setupProcess( @@ -568,12 +568,12 @@ class FlutterRunTestDriver extends FlutterTestDriver { @override Future _setupProcess( List args, { - String script, + String? script, bool withDebugger = false, bool startPaused = false, bool pauseOnExceptions = false, bool singleWidgetReloads = false, - int attachPort, + int? attachPort, }) async { assert(!startPaused || withDebugger); await super._setupProcess( @@ -589,7 +589,7 @@ class FlutterRunTestDriver extends FlutterTestDriver { // exited prematurely. This causes the currently suspended `await` to // deadlock until the test times out. Instead, this causes the test to fail // fast. - unawaited(_process.exitCode.then((_) { + unawaited(_process?.exitCode.then((_) { if (!prematureExitGuard.isCompleted) { prematureExitGuard.completeError(Exception('Process exited prematurely: ${args.join(' ')}: $_errorBuffer')); } @@ -600,16 +600,16 @@ class FlutterRunTestDriver extends FlutterTestDriver { // Stash the PID so that we can terminate the VM more reliably than using // _process.kill() (`flutter` is a shell script so _process itself is a // shell, not the flutter tool's Dart process). - final Map connected = await _waitFor(event: 'daemon.connected'); - _processPid = (connected['params'] as Map)['pid'] as int; + final Map connected = await _waitFor(event: 'daemon.connected'); + _processPid = (connected['params'] as Map?)?['pid'] as int?; // Set this up now, but we don't wait it yet. We want to make sure we don't // miss it while waiting for debugPort below. - final Future> started = _waitFor(event: 'app.started', timeout: appStartTimeout); + final Future> started = _waitFor(event: 'app.started', timeout: appStartTimeout); if (withDebugger) { - final Map debugPort = await _waitFor(event: 'app.debugPort', timeout: appStartTimeout); - final String wsUriString = (debugPort['params'] as Map)['wsUri'] as String; + final Map debugPort = await _waitFor(event: 'app.debugPort', timeout: appStartTimeout); + final String wsUriString = (debugPort['params']! as Map)['wsUri']! as String; _vmServiceWsUri = Uri.parse(wsUriString); await connectToVmService(pauseOnExceptions: pauseOnExceptions); if (!startPaused) { @@ -626,7 +626,7 @@ class FlutterRunTestDriver extends FlutterTestDriver { // Now await the started event; if it had already happened the future will // have already completed. - _currentRunningAppId = ((await started)['params'] as Map)['appId'] as String; + _currentRunningAppId = ((await started)['params'] as Map?)?['appId'] as String?; prematureExitGuard.complete(); } on Exception catch (error, stackTrace) { prematureExitGuard.completeError(Exception(error.toString()), stackTrace); @@ -637,7 +637,7 @@ class FlutterRunTestDriver extends FlutterTestDriver { } Future hotRestart({ bool pause = false, bool debounce = false}) => _restart(fullRestart: true, pause: pause); - Future hotReload({ bool debounce = false, int debounceDurationOverrideMs }) => + Future hotReload({ bool debounce = false, int? debounceDurationOverrideMs }) => _restart(debounce: debounce, debounceDurationOverrideMs: debounceDurationOverrideMs); Future scheduleFrame() async { @@ -646,20 +646,20 @@ class FlutterRunTestDriver extends FlutterTestDriver { } await _sendRequest( 'app.callServiceExtension', - {'appId': _currentRunningAppId, 'methodName': 'ext.ui.window.scheduleFrame'}, + {'appId': _currentRunningAppId, 'methodName': 'ext.ui.window.scheduleFrame'}, ); } - Future _restart({ bool fullRestart = false, bool pause = false, bool debounce = false, int debounceDurationOverrideMs }) async { + Future _restart({ bool fullRestart = false, bool pause = false, bool debounce = false, int? debounceDurationOverrideMs }) async { if (_currentRunningAppId == null) { throw Exception('App has not started yet'); } _debugPrint('Performing ${ pause ? "paused " : "" }${ fullRestart ? "hot restart" : "hot reload" }...'); - final Map hotReloadResponse = await _sendRequest( + final Map? hotReloadResponse = await _sendRequest( 'app.restart', - {'appId': _currentRunningAppId, 'fullRestart': fullRestart, 'pause': pause, 'debounce': debounce, 'debounceDurationOverrideMs': debounceDurationOverrideMs}, - ) as Map; + {'appId': _currentRunningAppId, 'fullRestart': fullRestart, 'pause': pause, 'debounce': debounce, 'debounceDurationOverrideMs': debounceDurationOverrideMs}, + ) as Map?; _debugPrint('${fullRestart ? "Hot restart" : "Hot reload"} complete.'); if (hotReloadResponse == null || hotReloadResponse['code'] != 0) { @@ -668,20 +668,22 @@ class FlutterRunTestDriver extends FlutterTestDriver { } Future detach() async { - if (_process == null) { + final Process? process = _process; + if (process == null) { return 0; } - if (_vmService != null) { + final VmService? vmService = _vmService; + if (vmService != null) { _debugPrint('Closing VM service...'); - await _vmService.dispose(); + await vmService.dispose(); } if (_currentRunningAppId != null) { _debugPrint('Detaching from app...'); await Future.any(>[ - _process.exitCode, + process.exitCode, _sendRequest( 'app.detach', - {'appId': _currentRunningAppId}, + {'appId': _currentRunningAppId}, ), ]).timeout( quitTimeout, @@ -690,21 +692,23 @@ class FlutterRunTestDriver extends FlutterTestDriver { _currentRunningAppId = null; } _debugPrint('Waiting for process to end...'); - return _process.exitCode.timeout(quitTimeout, onTimeout: _killGracefully); + return process.exitCode.timeout(quitTimeout, onTimeout: _killGracefully); } Future stop() async { - if (_vmService != null) { + final VmService? vmService = _vmService; + if (vmService != null) { _debugPrint('Closing VM service...'); - await _vmService.dispose(); + await vmService.dispose(); } + final Process? process = _process; if (_currentRunningAppId != null) { _debugPrint('Stopping application...'); await Future.any(>[ - _process.exitCode, + process!.exitCode, _sendRequest( 'app.stop', - {'appId': _currentRunningAppId}, + {'appId': _currentRunningAppId}, ), ]).timeout( quitTimeout, @@ -712,33 +716,33 @@ class FlutterRunTestDriver extends FlutterTestDriver { ); _currentRunningAppId = null; } - if (_process != null) { + if (process != null) { _debugPrint('Waiting for process to end...'); - return _process.exitCode.timeout(quitTimeout, onTimeout: _killGracefully); + return process.exitCode.timeout(quitTimeout, onTimeout: _killGracefully); } return 0; } int id = 1; - Future _sendRequest(String method, dynamic params) async { + Future _sendRequest(String method, Object? params) async { final int requestId = id++; - final Map request = { + final Map request = { 'id': requestId, 'method': method, 'params': params, }; - final String jsonEncoded = json.encode(>[request]); + final String jsonEncoded = json.encode(>[request]); _debugPrint(jsonEncoded, topic: '=stdin=>'); // Set up the response future before we send the request to avoid any // races. If the method we're calling is app.stop then we tell _waitFor not // to throw if it sees an app.stop event before the response to this request. - final Future> responseFuture = _waitFor( + final Future> responseFuture = _waitFor( id: requestId, ignoreAppStopEvent: method == 'app.stop', ); - _process.stdin.writeln(jsonEncoded); - final Map response = await responseFuture; + _process?.stdin.writeln(jsonEncoded); + final Map response = await responseFuture; if (response['error'] != null || response['result'] == null) { _throwErrorResponse('Unexpected error response'); @@ -755,7 +759,7 @@ class FlutterRunTestDriver extends FlutterTestDriver { } class FlutterTestTestDriver extends FlutterTestDriver { - FlutterTestTestDriver(Directory _projectFolder, {String logPrefix}) + FlutterTestTestDriver(Directory _projectFolder, {String? logPrefix}) : super(_projectFolder, logPrefix: logPrefix); Future test({ @@ -763,7 +767,7 @@ class FlutterTestTestDriver extends FlutterTestDriver { bool withDebugger = false, bool pauseOnExceptions = false, bool coverage = false, - Future Function() beforeStart, + Future Function()? beforeStart, }) async { await _setupProcess([ 'test', @@ -778,10 +782,10 @@ class FlutterTestTestDriver extends FlutterTestDriver { @override Future _setupProcess( List args, { - String script, + String? script, bool withDebugger = false, bool pauseOnExceptions = false, - Future Function() beforeStart, + Future Function()? beforeStart, bool singleWidgetReloads = false, }) async { await super._setupProcess( @@ -794,13 +798,13 @@ class FlutterTestTestDriver extends FlutterTestDriver { // Stash the PID so that we can terminate the VM more reliably than using // _proc.kill() (because _proc is a shell, because `flutter` is a shell // script). - final Map version = await _waitForJson(); - _processPid = version['pid'] as int; + final Map? version = await _waitForJson(); + _processPid = version?['pid'] as int?; if (withDebugger) { - final Map startedProcessParams = - (await _waitFor(event: 'test.startedProcess', timeout: appStartTimeout))['params'] as Map; - final String vmServiceHttpString = startedProcessParams['observatoryUri'] as String; + final Map startedProcessParams = + (await _waitFor(event: 'test.startedProcess', timeout: appStartTimeout))['params']! as Map; + final String vmServiceHttpString = startedProcessParams['observatoryUri']! as String; _vmServiceWsUri = Uri.parse(vmServiceHttpString).replace(scheme: 'ws', path: '/ws'); await connectToVmService(pauseOnExceptions: pauseOnExceptions); // Allow us to run code before we start, eg. to set up breakpoints. @@ -811,19 +815,19 @@ class FlutterTestTestDriver extends FlutterTestDriver { } } - Future> _waitForJson({ + Future?> _waitForJson({ Duration timeout = defaultTimeout, }) async { assert(timeout != null); - return _timeoutWithMessages>( - () => _stdout.stream.map>(_parseJsonResponse) - .firstWhere((Map output) => output != null), + return _timeoutWithMessages?>( + () => _stdout.stream.map?>(_parseJsonResponse) + .firstWhere((Map? output) => output != null), timeout: timeout, task: 'Waiting for JSON', ); } - Map _parseJsonResponse(String line) { + Map? _parseJsonResponse(String line) { try { return castStringKeyedMap(json.decode(line)); } on Exception { @@ -838,7 +842,7 @@ class FlutterTestTestDriver extends FlutterTestDriver { // end of test run. final StreamSubscription subscription = _stdout.stream.listen( (String line) async { - final Map json = _parseJsonResponse(line); + final Map? json = _parseJsonResponse(line); if (json != null && json['type'] != null && json['success'] != null) { done.complete(json['type'] == 'done' && json['success'] == true); } @@ -846,9 +850,9 @@ class FlutterTestTestDriver extends FlutterTestDriver { await resume(); - final Future timeoutFuture = - Future.delayed(defaultTimeout); - await Future.any(>[done.future, timeoutFuture]); + final Future timeoutFuture = + Future.delayed(defaultTimeout); + await Future.any(>[done.future, timeoutFuture]); await subscription.cancel(); if (!done.isCompleted) { await quit(); @@ -860,10 +864,10 @@ Stream transformToLines(Stream> byteStream) { return byteStream.transform(utf8.decoder).transform(const LineSplitter()); } -Map parseFlutterResponse(String line) { +Map? parseFlutterResponse(String line) { if (line.startsWith('[') && line.endsWith(']') && line.length > 2) { try { - final Map response = castStringKeyedMap((json.decode(line) as List)[0]); + final Map? response = castStringKeyedMap((json.decode(line) as List)[0]); return response; } on FormatException { // Not valid JSON, so likely some other output that was surrounded by [brackets] @@ -888,13 +892,13 @@ Future waitForExtension(VmService vmService, String extension) async { // Do nothing, already subscribed. } vmService.onExtensionEvent.listen((Event event) { - if (event.json['extensionKind'] == 'Flutter.FrameworkInitialization') { + if (event.json?['extensionKind'] == 'Flutter.FrameworkInitialization') { completer.complete(); } }); - final IsolateRef isolateRef = (await vmService.getVM()).isolates.first; - final Isolate isolate = await vmService.getIsolate(isolateRef.id); - if (isolate.extensionRPCs.contains(extension)) { + final IsolateRef isolateRef = (await vmService.getVM()).isolates!.first; + final Isolate isolate = await vmService.getIsolate(isolateRef.id!); + if (isolate.extensionRPCs!.contains(extension)) { return isolate; } await completer.future; diff --git a/packages/flutter_tools/test/integration.shard/test_utils.dart b/packages/flutter_tools/test/integration.shard/test_utils.dart index 87b1dc23788..fe2af161380 100644 --- a/packages/flutter_tools/test/integration.shard/test_utils.dart +++ b/packages/flutter_tools/test/integration.shard/test_utils.dart @@ -2,13 +2,10 @@ // 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:file/file.dart'; import 'package:file/local.dart'; import 'package:flutter_tools/src/base/io.dart'; import 'package:flutter_tools/src/base/platform.dart'; -import 'package:meta/meta.dart'; import 'package:process/process.dart'; import 'package:vm_service/vm_service.dart'; @@ -91,18 +88,18 @@ List getLocalEngineArguments() { } Future pollForServiceExtensionValue({ - @required FlutterTestDriver testDriver, - @required String extension, - @required T continuePollingValue, - @required Matcher matches, + required FlutterTestDriver testDriver, + required String extension, + required T continuePollingValue, + required Matcher matches, String valueKey = 'value', }) async { for (int i = 0; i < 10; i++) { final Response response = await testDriver.callServiceExtension(extension); - if (response.json[valueKey] as T == continuePollingValue) { + if (response.json?[valueKey] as T == continuePollingValue) { await Future.delayed(const Duration(seconds: 1)); } else { - expect(response.json[valueKey] as T, matches); + expect(response.json?[valueKey] as T, matches); return; } }