Fix a potential resource leakage in `_print_test_names`. (#688)
diff --git a/mobly/test_runner.py b/mobly/test_runner.py
index 84ddd34..c3c3b54 100644
--- a/mobly/test_runner.py
+++ b/mobly/test_runner.py
@@ -167,12 +167,16 @@
test_class: module, the test module to print names from.
"""
cls = test_class(config_parser.TestRunConfig())
+ test_names = []
try:
cls.setup_generated_tests()
+ test_names = cls.get_existing_test_names()
except:
logging.exception('Failed to retrieve generated tests.')
+ finally:
+ cls._controller_manager.unregister_controllers()
print('==========> %s <==========' % cls.TAG)
- for name in cls.get_existing_test_names():
+ for name in test_names:
print(name)
diff --git a/tests/mobly/test_runner_test.py b/tests/mobly/test_runner_test.py
index 8d65336..65b9e72 100755
--- a/tests/mobly/test_runner_test.py
+++ b/tests/mobly/test_runner_test.py
@@ -360,6 +360,26 @@
__main__=multiple_subclasses_module):
test_class = test_runner._find_test_class()
+ def test_print_test_names(self):
+ mock_test_class = mock.MagicMock()
+ mock_cls_instance = mock.MagicMock()
+ mock_test_class.return_value = mock_cls_instance
+ test_runner._print_test_names(mock_test_class)
+ mock_cls_instance.setup_generated_tests.assert_called_once()
+ mock_cls_instance.get_existing_test_names.assert_called_once()
+ mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
+ )
+
+ def test_print_test_names_with_exception(self):
+ mock_test_class = mock.MagicMock()
+ mock_cls_instance = mock.MagicMock()
+ mock_test_class.return_value = mock_cls_instance
+ test_runner._print_test_names(mock_test_class)
+ mock_cls_instance.setup_generated_tests.side_effect = Exception(
+ 'Something went wrong.')
+ mock_cls_instance._controller_manager.unregister_controllers.assert_called_once(
+ )
+
if __name__ == "__main__":
unittest.main()