Commit 28c0449c0f9f9431eaec782ad22239d5a19f67d0

Authored by Christian Herdtweck
1 parent dc8c0a9d

tests: Add 2 tests for json formatting

Need to make sure that json output is formatted since e.g. warning messages
are created like this:
   log.warning('%s', actual_message)
so without proper formatting the message is just "%s".

Also test that exception info is added as usual.
tests/common/log_helper/log_helper_test_main.py
@@ -49,6 +49,7 @@ def main(args): @@ -49,6 +49,7 @@ def main(args):
49 throw = 'throw' in args 49 throw = 'throw' in args
50 percent_autoformat = '%-autoformat' in args 50 percent_autoformat = '%-autoformat' in args
51 warn = 'warn' in args 51 warn = 'warn' in args
  52 + exc_info = 'exc-info' in args
52 53
53 log_helper_test_imported.logger.setLevel(logging.ERROR) 54 log_helper_test_imported.logger.setLevel(logging.ERROR)
54 55
@@ -64,6 +65,12 @@ def main(args): @@ -64,6 +65,12 @@ def main(args):
64 warnings.warn(ACTUAL_WARNING) 65 warnings.warn(ACTUAL_WARNING)
65 log_helper_test_imported.warn() 66 log_helper_test_imported.warn()
66 67
  68 + if exc_info:
  69 + try:
  70 + raise Exception('This is an exception')
  71 + except Exception:
  72 + logger.exception('Caught exception') # has exc_info=True
  73 +
67 log_helper.end_logging() 74 log_helper.end_logging()
68 75
69 76
tests/common/log_helper/test_log_helper.py
@@ -17,8 +17,7 @@ from os.path import dirname, join, relpath, abspath @@ -17,8 +17,7 @@ from os.path import dirname, join, relpath, abspath
17 from tests.test_utils import PROJECT_ROOT 17 from tests.test_utils import PROJECT_ROOT
18 18
19 # test file we use as "main" module 19 # test file we use as "main" module
20 -TEST_FILE = relpath(join(dirname(abspath(__file__)), 'log_helper_test_main.py'),  
21 - PROJECT_ROOT) 20 +TEST_FILE = join(dirname(abspath(__file__)), 'log_helper_test_main.py')
22 21
23 # test file simulating a third party main module that only imports oletools 22 # test file simulating a third party main module that only imports oletools
24 TEST_FILE_3RD_PARTY = relpath(join(dirname(abspath(__file__)), 23 TEST_FILE_3RD_PARTY = relpath(join(dirname(abspath(__file__)),
@@ -27,6 +26,8 @@ TEST_FILE_3RD_PARTY = relpath(join(dirname(abspath(__file__)), @@ -27,6 +26,8 @@ TEST_FILE_3RD_PARTY = relpath(join(dirname(abspath(__file__)),
27 26
28 PYTHON_EXECUTABLE = sys.executable 27 PYTHON_EXECUTABLE = sys.executable
29 28
  29 +PERCENT_FORMAT_OUTPUT = 'The answer is 47.'
  30 +
30 31
31 class TestLogHelper(unittest.TestCase): 32 class TestLogHelper(unittest.TestCase):
32 def test_it_doesnt_log_when_not_enabled(self): 33 def test_it_doesnt_log_when_not_enabled(self):
@@ -114,7 +115,7 @@ class TestLogHelper(unittest.TestCase): @@ -114,7 +115,7 @@ class TestLogHelper(unittest.TestCase):
114 def test_percent_autoformat(self): 115 def test_percent_autoformat(self):
115 """Test that auto-formatting of log strings with `%` works.""" 116 """Test that auto-formatting of log strings with `%` works."""
116 output = self._run_test(['enable', '%-autoformat', 'info']) 117 output = self._run_test(['enable', '%-autoformat', 'info'])
117 - self.assertIn('The answer is 47.', output) 118 + self.assertIn(PERCENT_FORMAT_OUTPUT, output)
118 119
119 def test_json_correct_on_exceptions(self): 120 def test_json_correct_on_exceptions(self):
120 """ 121 """
@@ -208,6 +209,21 @@ class TestLogHelper(unittest.TestCase): @@ -208,6 +209,21 @@ class TestLogHelper(unittest.TestCase):
208 ]) 209 ])
209 self.assertEqual(output.strip(), expect) 210 self.assertEqual(output.strip(), expect)
210 211
  212 + def test_json_percent_formatting(self):
  213 + """Test that json-output has formatting args included in output."""
  214 + output = self._run_test(['enable', 'as-json', '%-autoformat', 'info'])
  215 + json.loads(output) # check that this does not raise, so json is valid
  216 + self.assertIn(PERCENT_FORMAT_OUTPUT, output)
  217 +
  218 + def test_json_exception_formatting(self):
  219 + """Test that json-output has formatted exception info in output"""
  220 + output = self._run_test(['enable', 'as-json', 'exc-info', 'info'])
  221 + json.loads(output) # check that this does not raise, so json is valid
  222 + self.assertIn('Caught exception', output) # actual log message
  223 + self.assertIn('This is an exception', output) # message of caught exception
  224 + self.assertIn('Traceback (most recent call last)', output) # start of trace
  225 + self.assertIn(TEST_FILE, output) # part of trace
  226 +
211 def _assert_json_messages(self, output, messages): 227 def _assert_json_messages(self, output, messages):
212 try: 228 try:
213 json_data = json.loads(output) 229 json_data = json.loads(output)