Log and exit on config failure, instead of dumping a stacktrace
authorKarl O. Pinc <kop@karlpinc.com>
Wed, 11 Dec 2019 17:42:46 +0000 (11:42 -0600)
committerKarl O. Pinc <kop@karlpinc.com>
Wed, 11 Dec 2019 17:42:46 +0000 (11:42 -0600)
src/pgwui_server/__init__.py
tests/test___init__.py

index 0f39fc1076a0b0bde4aa566218ac96592fb3823f..be9fa286069f646ca95e4be7818921e478d274ad 100644 (file)
@@ -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.
 #
 # <http://www.gnu.org/licenses/>.
 #
 
-# Karl O. Pinc <kop@meme.com>
+# Karl O. Pinc <kop@karlpinc.com>
 
 '''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:
index ca504059d4ddd64e07d81f274703cc64609eccd2..2891807dd9d7065dac3b61171676d6945346e330 100644 (file)
 
 # Karl O. Pinc <kop@meme.com>
 
+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():