From e4d05e3fecbb4208a69280f4fe6230516b077bf8 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Sun, 17 Sep 2017 14:13:36 +0200 Subject: [PATCH] Log error information when config init fails --- qutebrowser/config/config.py | 2 ++ qutebrowser/config/configexc.py | 11 ++++++++++- tests/unit/config/test_config.py | 6 ++++-- tests/unit/config/test_configexc.py | 19 +++++++++++++++++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py index 75c669eb9..9907eb205 100644 --- a/qutebrowser/config/config.py +++ b/qutebrowser/config/config.py @@ -665,6 +665,7 @@ def init(parent=None): if config_api.errors: raise configexc.ConfigFileErrors('config.py', config_api.errors) except configexc.ConfigFileErrors as e: + log.config.exception("Error while loading config.py") errbox = msgbox.msgbox(parent=None, title="Error while reading config", text=e.to_html(), @@ -682,6 +683,7 @@ def init(parent=None): desc = configexc.ConfigErrorDesc("Error", e) raise configexc.ConfigFileErrors('autoconfig.yml', [desc]) except configexc.ConfigFileErrors as e: + log.config.exception("Error while loading autoconfig.yml") errbox = msgbox.msgbox(parent=None, title="Error while reading config", text=e.to_html(), diff --git a/qutebrowser/config/configexc.py b/qutebrowser/config/configexc.py index b81461dfa..dd0da5401 100644 --- a/qutebrowser/config/configexc.py +++ b/qutebrowser/config/configexc.py @@ -19,6 +19,8 @@ """Exceptions related to config parsing.""" +from qutebrowser.utils import utils + class Error(Exception): @@ -87,13 +89,20 @@ class ConfigErrorDesc: self.exception = exception self.traceback = traceback + def __repr__(self): + return utils.get_repr(self, text=self.text, exception=self.exception) + + def __str__(self): + return '{}: {}'.format(self.text, self.exception) + class ConfigFileErrors(Error): """Raised when multiple errors occurred inside the config.""" def __init__(self, basename, errors): - super().__init__("Errors occurred while reading {}".format(basename)) + super().__init__("Errors occurred while reading {}:\n{}".format( + basename, '\n'.join(' {}'.format(e) for e in errors))) self.basename = basename self.errors = errors diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index a6144e2fb..4e4816e7c 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -20,6 +20,7 @@ import copy import types +import logging import unittest.mock import pytest @@ -884,7 +885,7 @@ def init_patch(qapp, fake_save_manager, monkeypatch, config_tmpdir, @pytest.mark.parametrize('config_py', [True, 'error', False]) @pytest.mark.parametrize('invalid_yaml', ['42', 'unknown', False]) # pylint: disable=too-many-branches -def test_init(init_patch, fake_save_manager, config_tmpdir, mocker, +def test_init(init_patch, fake_save_manager, config_tmpdir, mocker, caplog, load_autoconfig, config_py, invalid_yaml): # Prepare files autoconfig_file = config_tmpdir / 'autoconfig.yml' @@ -912,7 +913,8 @@ def test_init(init_patch, fake_save_manager, config_tmpdir, mocker, msgbox_mock = mocker.patch('qutebrowser.config.config.msgbox.msgbox', autospec=True) - config.init() + with caplog.at_level(logging.ERROR): + config.init() # Check error messages expected_errors = [] diff --git a/tests/unit/config/test_configexc.py b/tests/unit/config/test_configexc.py index 1b89e7df8..8eaa21f05 100644 --- a/tests/unit/config/test_configexc.py +++ b/tests/unit/config/test_configexc.py @@ -20,6 +20,8 @@ import textwrap +import pytest + from qutebrowser.config import configexc from qutebrowser.utils import usertypes @@ -47,11 +49,24 @@ def test_duplicate_key_error(): assert str(e) == "Duplicate key asdf" -def test_config_file_errors(): +@pytest.fixture +def errors(): + """Get a ConfigFileErrors object.""" err1 = configexc.ConfigErrorDesc("Error text 1", Exception("Exception 1")) err2 = configexc.ConfigErrorDesc("Error text 2", Exception("Exception 2"), "Fake traceback") - errors = configexc.ConfigFileErrors("config.py", [err1, err2]) + return configexc.ConfigFileErrors("config.py", [err1, err2]) + + +def test_config_file_errors_str(errors): + assert str(errors).splitlines() == [ + 'Errors occurred while reading config.py:', + ' Error text 1: Exception 1', + ' Error text 2: Exception 2', + ] + + +def test_config_file_errors_html(errors): html = errors.to_html() assert textwrap.dedent(html) == textwrap.dedent(""" Errors occurred while reading config.py: