From 8ed9e5f1e07a492ba45f698c5083bc9dee16edc3 Mon Sep 17 00:00:00 2001 From: Thomas Adamcik Date: Mon, 11 May 2015 21:20:37 +0200 Subject: [PATCH] ext: Catch exceptions in extension helpers --- mopidy/ext.py | 10 ++++++---- tests/test_ext.py | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/mopidy/ext.py b/mopidy/ext.py index 32e06d1c..a59eeae1 100644 --- a/mopidy/ext.py +++ b/mopidy/ext.py @@ -165,13 +165,15 @@ def load_extensions(): try: extension = extension_class() + config_schema = extension.get_config_schema() + default_config = extension.get_default_config() except Exception: continue # TODO: log this - # TODO: handle exceptions and validate result... - config_schema = extension.get_config_schema() - default_config = extension.get_default_config() - command = extension.get_command() + try: + command = extension.get_command() + except Exception: + command = None # TODO: log this. installed_extensions.append(ExtensionData( extension, entry_point, config_schema, default_config, command)) diff --git a/tests/test_ext.py b/tests/test_ext.py index 4d9a4638..f6f31c21 100644 --- a/tests/test_ext.py +++ b/tests/test_ext.py @@ -124,6 +124,46 @@ def test_load_extensions_creating_instance_fails(iter_entry_points_mock): assert [] == ext.load_extensions() +def test_load_extensions_get_config_schema_fails(iter_entry_points_mock): + mock_entry_point = mock.Mock() + mock_entry_point.load.return_value = TestExtension + + iter_entry_points_mock.return_value = [mock_entry_point] + + with mock.patch.object(TestExtension, 'get_config_schema') as get_schema: + get_schema.side_effect = Exception + assert [] == ext.load_extensions() + get_schema.assert_called_once_with() + + +def test_load_extensions_get_default_config_fails(iter_entry_points_mock): + mock_entry_point = mock.Mock() + mock_entry_point.load.return_value = TestExtension + + iter_entry_points_mock.return_value = [mock_entry_point] + + with mock.patch.object(TestExtension, 'get_default_config') as get_default: + get_default.side_effect = Exception + assert [] == ext.load_extensions() + get_default.assert_called_once_with() + + +def test_load_extensions_get_command_fails(iter_entry_points_mock): + mock_entry_point = mock.Mock() + mock_entry_point.load.return_value = TestExtension + + iter_entry_points_mock.return_value = [mock_entry_point] + + expected = ext.ExtensionData( + any_testextension, mock_entry_point, IsA(config.ConfigSchema), + any_unicode, None) + + with mock.patch.object(TestExtension, 'get_command') as get_command: + get_command.side_effect = Exception + assert [expected] == ext.load_extensions() + get_command.assert_called_once_with() + + # ext.validate_extension @pytest.fixture