From e06620e8eca2049f09eb94f041bd989e0f7f078a Mon Sep 17 00:00:00 2001 From: "Karl O. Pinc" Date: Wed, 11 Dec 2019 11:42:46 -0600 Subject: [PATCH] Log and exit on config failure, instead of dumping a stacktrace --- src/pgwui_server/__init__.py | 22 +++++++++++++++--- tests/test___init__.py | 43 ++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/src/pgwui_server/__init__.py b/src/pgwui_server/__init__.py index 0f39fc1..be9fa28 100644 --- a/src/pgwui_server/__init__.py +++ b/src/pgwui_server/__init__.py @@ -1,4 +1,4 @@ -# Copyright (C) 2018 The Meme Factory, Inc. http://www.meme.com/ +# Copyright (C) 2018, 2019 The Meme Factory, Inc. http://www.karlpinc.com/ # This file is part of PGWUI_Server. # @@ -17,13 +17,15 @@ # . # -# Karl O. Pinc +# Karl O. Pinc '''Provide a way to configure PGWUI. ''' from ast import literal_eval from pyramid.config import Configurator +import logging +import sys # Constants @@ -43,6 +45,10 @@ SETTINGS = set( HMAC_LEN = 40 +# Logging +log = logging.getLogger(__name__) + + # Exceptions class Error(Exception): '''Base error class for module @@ -175,6 +181,16 @@ def validate_settings(settings): validate_hmac(settings) +def exit_on_invalid_settings(settings): + '''Exit when settings don't validate + ''' + try: + validate_settings(settings) + except Error as ex: + log.critical(ex) + sys.exit(1) + + def parse_assignments(lines): '''Return a list of key/value tuples from the lines of a setting ''' @@ -203,7 +219,7 @@ def add_routes(config, settings): def pgwui_server_config(settings): '''Configure pyramid ''' - validate_settings(settings) + exit_on_invalid_settings(settings) rp = settings.get('pgwui.route_prefix') with Configurator(settings=settings, route_prefix=rp) as config: diff --git a/tests/test___init__.py b/tests/test___init__.py index ca50405..2891807 100644 --- a/tests/test___init__.py +++ b/tests/test___init__.py @@ -19,7 +19,10 @@ # Karl O. Pinc +import logging import pytest +import sys + import pgwui_server.__init__ as pgwui_server_init @@ -253,6 +256,46 @@ def test_validate_settings(monkeypatch): assert count == len(settings) +# exit_on_invalid_settings() + +def test_exit_on_invalid_settings_exits(monkeypatch, caplog): + '''Logs critical and exits with 1 when a setting is invalid''' + caplog.set_level(logging.CRITICAL) + + exit1_called = False + + def mock_exit(status): + nonlocal exit1_called + exit1_called = status == 1 + + def mock_validate_settings(settings): + raise pgwui_server_init.Error() + + monkeypatch.setattr(pgwui_server_init, 'validate_settings', + mock_validate_settings) + monkeypatch.setattr(sys, 'exit', mock_exit) + + pgwui_server_init.exit_on_invalid_settings({}) + + assert exit1_called + assert len(caplog.record_tuples) == 1 + + +def test_exit_on_invalid_settings_valid(monkeypatch, caplog): + '''Returns without logging when all settings are valid''' + caplog.set_level(logging.INFO) + + def mock_validate_settings(settings): + pass + + monkeypatch.setattr(pgwui_server_init, 'validate_settings', + mock_validate_settings) + + pgwui_server_init.exit_on_invalid_settings({}) + + assert len(caplog.record_tuples) == 0 + + # parse_assignments() def test_parse_assignments_str(): -- 2.34.1