From 181fe18e27f5866483acd851dcf639e76347b095 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Mon, 7 Jun 2021 11:44:05 -0700 Subject: [PATCH] [flutter_plugin_tools] Migrate xctest command to NNBD (#4024) --- script/tool/lib/src/xctest_command.dart | 40 ++++++++++++++--------- script/tool/test/mocks.dart | 3 ++ script/tool/test/xctest_command_test.dart | 13 ++++---- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/script/tool/lib/src/xctest_command.dart b/script/tool/lib/src/xctest_command.dart index c8775307bf..1b157ce1ae 100644 --- a/script/tool/lib/src/xctest_command.dart +++ b/script/tool/lib/src/xctest_command.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.9 - import 'dart:async'; import 'dart:convert'; import 'dart:io' as io; @@ -48,7 +46,7 @@ class XCTestCommand extends PluginCommand { Future run() async { String destination = getStringArg(_kiOSDestination); if (destination.isEmpty) { - final String simulatorId = await _findAvailableIphoneSimulator(); + final String? simulatorId = await _findAvailableIphoneSimulator(); if (simulatorId == null) { print(_kFoundNoSimulatorsMessage); throw ToolExit(1); @@ -119,7 +117,7 @@ class XCTestCommand extends PluginCommand { workingDir: example, exitOnError: false); } - Future _findAvailableIphoneSimulator() async { + Future _findAvailableIphoneSimulator() async { // Find the first available destination if not specified. final List findSimulatorsArguments = [ 'simctl', @@ -143,30 +141,40 @@ class XCTestCommand extends PluginCommand { final List> runtimes = (simulatorListJson['runtimes'] as List) .cast>(); - final Map devices = - simulatorListJson['devices'] as Map; + final Map devices = + (simulatorListJson['devices'] as Map) + .cast(); if (runtimes.isEmpty || devices.isEmpty) { return null; } - String id; + String? id; // Looking for runtimes, trying to find one with highest OS version. - for (final Map runtimeMap in runtimes.reversed) { - if (!(runtimeMap['name'] as String).contains('iOS')) { + for (final Map rawRuntimeMap in runtimes.reversed) { + final Map runtimeMap = + rawRuntimeMap.cast(); + if ((runtimeMap['name'] as String?)?.contains('iOS') != true) { continue; } - final String runtimeID = runtimeMap['identifier'] as String; - final List> devicesForRuntime = - (devices[runtimeID] as List).cast>(); - if (devicesForRuntime.isEmpty) { + final String? runtimeID = runtimeMap['identifier'] as String?; + if (runtimeID == null) { + continue; + } + final List>? devicesForRuntime = + (devices[runtimeID] as List?)?.cast>(); + if (devicesForRuntime == null || devicesForRuntime.isEmpty) { continue; } // Looking for runtimes, trying to find latest version of device. - for (final Map device in devicesForRuntime.reversed) { + for (final Map rawDevice in devicesForRuntime.reversed) { + final Map device = rawDevice.cast(); if (device['availabilityError'] != null || - (device['isAvailable'] as bool == false)) { + (device['isAvailable'] as bool?) == false) { + continue; + } + id = device['udid'] as String?; + if (id == null) { continue; } - id = device['udid'] as String; print('device selected: $device'); return id; } diff --git a/script/tool/test/mocks.dart b/script/tool/test/mocks.dart index b984247af9..66267ec582 100644 --- a/script/tool/test/mocks.dart +++ b/script/tool/test/mocks.dart @@ -16,6 +16,9 @@ class MockProcess extends Mock implements io.Process { StreamController>(); final MockIOSink stdinMock = MockIOSink(); + @override + int get pid => 99; + @override Future get exitCode => exitCodeCompleter.future; diff --git a/script/tool/test/xctest_command_test.dart b/script/tool/test/xctest_command_test.dart index ede2311347..ffe9bf4267 100644 --- a/script/tool/test/xctest_command_test.dart +++ b/script/tool/test/xctest_command_test.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.9 - import 'dart:convert'; import 'package:args/command_runner.dart'; @@ -15,6 +13,9 @@ import 'package:test/test.dart'; import 'mocks.dart'; import 'util.dart'; +// Note: This uses `dynamic` deliberately, and should not be updated to Object, +// in order to ensure that the code correctly handles this return type from +// JSON decoding. final Map _kDeviceListMap = { 'runtimes': >[ { @@ -85,10 +86,10 @@ void main() { const String _kDestination = '--ios-destination'; group('test xctest_command', () { - FileSystem fileSystem; - Directory packagesDir; - CommandRunner runner; - RecordingProcessRunner processRunner; + late FileSystem fileSystem; + late Directory packagesDir; + late CommandRunner runner; + late RecordingProcessRunner processRunner; setUp(() { fileSystem = MemoryFileSystem();