Prevent crashes on range errors when selecting device (#129290)
Prevent the cli from crashing when a user selects a number that is not valid for `flutter run` device selection Fixes issue: - https://github.com/flutter/flutter/issues/129191 *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].*
This commit is contained in:
parent
7c259deaf9
commit
18b94b7f57
@ -774,7 +774,7 @@ class TargetDeviceSelection {
|
|||||||
throwToolExit('');
|
throwToolExit('');
|
||||||
}
|
}
|
||||||
final int deviceIndex = int.parse(userInputString) - 1;
|
final int deviceIndex = int.parse(userInputString) - 1;
|
||||||
if (deviceIndex < devices.length) {
|
if (deviceIndex > -1 && deviceIndex < devices.length) {
|
||||||
chosenDevice = devices[deviceIndex];
|
chosenDevice = devices[deviceIndex];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1459,7 +1459,7 @@ No devices found yet. Checking for wireless devices...
|
|||||||
logger: logger,
|
logger: logger,
|
||||||
);
|
);
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '1';
|
targetDevices.deviceSelection.input = <String>['1'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Connected devices:
|
Connected devices:
|
||||||
target-device-9 (mobile) • xxx • ios • iOS 16
|
target-device-9 (mobile) • xxx • ios • iOS 16
|
||||||
@ -1486,6 +1486,49 @@ Please choose one (or "q" to quit): '''));
|
|||||||
}, overrides: <Type, Generator>{
|
}, overrides: <Type, Generator>{
|
||||||
AnsiTerminal: () => terminal,
|
AnsiTerminal: () => terminal,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
testUsingContext('handle invalid options for device', () async {
|
||||||
|
deviceManager.iosDiscoverer.deviceList = <Device>[nonEphemeralDevice];
|
||||||
|
|
||||||
|
final TestTargetDevicesWithExtendedWirelessDeviceDiscovery targetDevices = TestTargetDevicesWithExtendedWirelessDeviceDiscovery(
|
||||||
|
deviceManager: deviceManager,
|
||||||
|
logger: logger,
|
||||||
|
);
|
||||||
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
|
|
||||||
|
// Having the '0' first is an invalid choice for a device, the second
|
||||||
|
// item in the list is a '2' which is out of range since we only have
|
||||||
|
// one item in the deviceList. The final item in the list, is '1'
|
||||||
|
// which is a valid option though which will return a valid device
|
||||||
|
//
|
||||||
|
// Important: if none of the values in the list are valid, the test will
|
||||||
|
// hang indefinitely since the [userSelectDevice()] method uses a while
|
||||||
|
// loop to listen for valid devices
|
||||||
|
targetDevices.deviceSelection.input = <String>['0', '2', '1'];
|
||||||
|
logger.originalStatusText = '''
|
||||||
|
Connected devices:
|
||||||
|
target-device-9 (mobile) • xxx • ios • iOS 16
|
||||||
|
|
||||||
|
Checking for wireless devices...
|
||||||
|
|
||||||
|
[1]: target-device-9 (xxx)
|
||||||
|
''';
|
||||||
|
|
||||||
|
final List<Device>? devices = await targetDevices.findAllTargetDevices();
|
||||||
|
|
||||||
|
expect(logger.statusText, equals('''
|
||||||
|
Connected devices:
|
||||||
|
target-device-9 (mobile) • xxx • ios • iOS 16
|
||||||
|
|
||||||
|
No wireless devices were found.
|
||||||
|
|
||||||
|
[1]: target-device-9 (xxx)
|
||||||
|
Please choose one (or "q" to quit): '''));
|
||||||
|
expect(devices, <Device>[nonEphemeralDevice]);
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
AnsiTerminal: () => terminal,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
group('without stdinHasTerminal', () {
|
group('without stdinHasTerminal', () {
|
||||||
@ -1753,7 +1796,7 @@ Checking for wireless devices...
|
|||||||
];
|
];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '3';
|
targetDevices.deviceSelection.input = <String>['3'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Connected devices:
|
Connected devices:
|
||||||
target-device-1 (mobile) • xxx • ios • iOS 16
|
target-device-1 (mobile) • xxx • ios • iOS 16
|
||||||
@ -1791,7 +1834,7 @@ Please choose one (or "q" to quit): '''));
|
|||||||
deviceManager.iosDiscoverer.deviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2];
|
deviceManager.iosDiscoverer.deviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '2';
|
targetDevices.deviceSelection.input = <String>['2'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Connected devices:
|
Connected devices:
|
||||||
target-device-1 (mobile) • xxx • ios • iOS 16
|
target-device-1 (mobile) • xxx • ios • iOS 16
|
||||||
@ -1828,7 +1871,7 @@ Please choose one (or "q" to quit): '''));
|
|||||||
deviceManager.iosDiscoverer.refreshDeviceList = <Device>[connectedWirelessIOSDevice1, connectedWirelessIOSDevice2];
|
deviceManager.iosDiscoverer.refreshDeviceList = <Device>[connectedWirelessIOSDevice1, connectedWirelessIOSDevice2];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '2';
|
targetDevices.deviceSelection.input = <String>['2'];
|
||||||
terminal.setPrompt(<String>['1', '2', 'q', 'Q'], '1');
|
terminal.setPrompt(<String>['1', '2', 'q', 'Q'], '1');
|
||||||
|
|
||||||
final List<Device>? devices = await targetDevices.findAllTargetDevices();
|
final List<Device>? devices = await targetDevices.findAllTargetDevices();
|
||||||
@ -1906,7 +1949,7 @@ target-device-5 (mobile) • xxx • ios • iOS 16
|
|||||||
deviceManager.iosDiscoverer.deviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2];
|
deviceManager.iosDiscoverer.deviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '2';
|
targetDevices.deviceSelection.input = <String>['2'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Connected devices:
|
Connected devices:
|
||||||
target-device-1 (mobile) • xxx • ios • iOS 16
|
target-device-1 (mobile) • xxx • ios • iOS 16
|
||||||
@ -1951,7 +1994,7 @@ Please choose one (or "q" to quit): '''));
|
|||||||
deviceManager.iosDiscoverer.refreshDeviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2, connectedWirelessIOSDevice1];
|
deviceManager.iosDiscoverer.refreshDeviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2, connectedWirelessIOSDevice1];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '2';
|
targetDevices.deviceSelection.input = <String>['2'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Connected devices:
|
Connected devices:
|
||||||
target-device-1 (mobile) • xxx • ios • iOS 16
|
target-device-1 (mobile) • xxx • ios • iOS 16
|
||||||
@ -2133,7 +2176,7 @@ target-device-6 (mobile) • xxx • ios • iOS 16
|
|||||||
];
|
];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '3';
|
targetDevices.deviceSelection.input = <String>['3'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Found multiple devices with name or id matching target-device:
|
Found multiple devices with name or id matching target-device:
|
||||||
target-device-1 (mobile) • xxx • ios • iOS 16
|
target-device-1 (mobile) • xxx • ios • iOS 16
|
||||||
@ -2173,7 +2216,7 @@ Please choose one (or "q" to quit): '''));
|
|||||||
deviceManager.iosDiscoverer.deviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2];
|
deviceManager.iosDiscoverer.deviceList = <Device>[attachedIOSDevice1, attachedIOSDevice2];
|
||||||
|
|
||||||
targetDevices.waitForWirelessBeforeInput = true;
|
targetDevices.waitForWirelessBeforeInput = true;
|
||||||
targetDevices.deviceSelection.input = '2';
|
targetDevices.deviceSelection.input = <String>['2'];
|
||||||
logger.originalStatusText = '''
|
logger.originalStatusText = '''
|
||||||
Found multiple devices with name or id matching target-device:
|
Found multiple devices with name or id matching target-device:
|
||||||
target-device-1 (mobile) • xxx • ios • iOS 16
|
target-device-1 (mobile) • xxx • ios • iOS 16
|
||||||
@ -2443,11 +2486,21 @@ class TestTargetDevicesWithExtendedWirelessDeviceDiscovery extends TargetDevices
|
|||||||
class TestTargetDeviceSelection extends TargetDeviceSelection {
|
class TestTargetDeviceSelection extends TargetDeviceSelection {
|
||||||
TestTargetDeviceSelection(super.logger);
|
TestTargetDeviceSelection(super.logger);
|
||||||
|
|
||||||
String input = '';
|
List<String> input = <String>[];
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<String> readUserInput() async {
|
Future<String> readUserInput() async {
|
||||||
return input;
|
// If only one value is provided for the input, continue
|
||||||
|
// to return that one input value without popping
|
||||||
|
//
|
||||||
|
// If more than one input values are provided, we are simulating
|
||||||
|
// the user selecting more than one option for a device, so we will pop
|
||||||
|
// them out from the front
|
||||||
|
if (input.length > 1) {
|
||||||
|
return input.removeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return input[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user