diff --git a/mobly/controllers/android_device.py b/mobly/controllers/android_device.py index 06748d76..c0e4845a 100644 --- a/mobly/controllers/android_device.py +++ b/mobly/controllers/android_device.py @@ -332,7 +332,7 @@ def get_instances_with_configs(configs): except Exception: if is_required: raise - ad.log.exception('Skipping this optional device due to error.') + logging.exception('Skipping optional device %s due to error.', serial) continue results.append(ad) return results diff --git a/tests/mobly/controllers/android_device_test.py b/tests/mobly/controllers/android_device_test.py index 940906c5..1486d590 100755 --- a/tests/mobly/controllers/android_device_test.py +++ b/tests/mobly/controllers/android_device_test.py @@ -251,6 +251,66 @@ def test_get_instances_with_configs_invalid_config(self): ): android_device.get_instances_with_configs([config]) + @mock.patch('mobly.controllers.android_device.list_fastboot_devices') + @mock.patch('mobly.controllers.android_device.list_adb_devices') + @mock.patch('mobly.controllers.android_device.list_adb_devices_by_usb_id') + @mock.patch('mobly.controllers.android_device.AndroidDevice') + def test_get_instances_with_configs_skips_optional_device_on_init_error( + self, mock_ad_class, mock_list_adb_usb, mock_list_adb, mock_list_fastboot + ): + mock_list_fastboot.return_value = [] + mock_list_adb.return_value = ['1', '2'] + mock_list_adb_usb.return_value = [] + mock_ad = mock.MagicMock() + + def _make_ad(serial): + if serial == '1': + raise Exception('Something went wrong.') + return mock_ad + + mock_ad_class.side_effect = _make_ad + configs = [{'serial': '1', 'required': False}, {'serial': '2'}] + with self.assertLogs(level='ERROR') as cm: + ads = android_device.get_instances_with_configs(configs) + self.assertEqual(ads, [mock_ad]) + self.assertTrue( + any( + 'Skipping optional device 1 due to error.' in line + for line in cm.output + ) + ) + mock_ad.log.exception.assert_not_called() + + @mock.patch('mobly.controllers.android_device.list_fastboot_devices') + @mock.patch('mobly.controllers.android_device.list_adb_devices') + @mock.patch('mobly.controllers.android_device.list_adb_devices_by_usb_id') + @mock.patch('mobly.controllers.android_device.AndroidDevice') + def test_get_instances_with_configs_skips_later_optional_device_on_init_error( + self, mock_ad_class, mock_list_adb_usb, mock_list_adb, mock_list_fastboot + ): + mock_list_fastboot.return_value = [] + mock_list_adb.return_value = ['1', '2'] + mock_list_adb_usb.return_value = [] + mock_ad = mock.MagicMock() + + def _make_ad(serial): + if serial == '2': + raise Exception('Something went wrong.') + return mock_ad + + mock_ad_class.side_effect = _make_ad + configs = [{'serial': '1'}, {'serial': '2', 'required': False}] + with self.assertLogs(level='ERROR') as cm: + ads = android_device.get_instances_with_configs(configs) + self.assertEqual(ads, [mock_ad]) + self.assertTrue( + any( + 'Skipping optional device 2 due to error.' in line + for line in cm.output + ) + ) + mock_ad.log.exception.assert_not_called() + @mock.patch('mobly.controllers.android_device.list_fastboot_devices') @mock.patch('mobly.controllers.android_device.list_adb_devices') @mock.patch('mobly.controllers.android_device.list_adb_devices_by_usb_id')