|
26 | 26 | class PerThreadLoggingContextTest(unittest.TestCase): |
27 | 27 |
|
28 | 28 | def thread_check_attribute(self, name): |
29 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, name)) |
30 | | - with logger.PerThreadLoggingContext(xyz='thread-value'): |
| 29 | + self.assertFalse(name in logger.per_thread_worker_data.get_data()) |
| 30 | + with logger.PerThreadLoggingContext(**{name: 'thread-value'}): |
31 | 31 | self.assertEqual( |
32 | | - getattr(logger.per_thread_worker_data, name), 'thread-value') |
33 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, name)) |
| 32 | + logger.per_thread_worker_data.get_data()[name], 'thread-value') |
| 33 | + self.assertFalse(name in logger.per_thread_worker_data.get_data()) |
34 | 34 |
|
35 | 35 | def test_no_positional_args(self): |
36 | | - with self.assertRaises(ValueError) as exn: |
| 36 | + with self.assertRaises(TypeError): |
37 | 37 | with logger.PerThreadLoggingContext('something'): |
38 | 38 | pass |
39 | | - self.assertEqual( |
40 | | - exn.exception.message, |
41 | | - 'PerThreadLoggingContext expects only keyword arguments.') |
42 | 39 |
|
43 | 40 | def test_per_thread_attribute(self): |
44 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, 'xyz')) |
| 41 | + self.assertFalse('xyz' in logger.per_thread_worker_data.get_data()) |
45 | 42 | with logger.PerThreadLoggingContext(xyz='value'): |
46 | | - self.assertEqual(logger.per_thread_worker_data.xyz, 'value') |
| 43 | + self.assertEqual(logger.per_thread_worker_data.get_data()['xyz'], 'value') |
47 | 44 | thread = threading.Thread( |
48 | 45 | target=self.thread_check_attribute, args=('xyz',)) |
49 | 46 | thread.start() |
50 | 47 | thread.join() |
51 | | - self.assertEqual(logger.per_thread_worker_data.xyz, 'value') |
52 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, 'xyz')) |
| 48 | + self.assertEqual(logger.per_thread_worker_data.get_data()['xyz'], 'value') |
| 49 | + self.assertFalse('xyz' in logger.per_thread_worker_data.get_data()) |
53 | 50 |
|
54 | 51 | def test_set_when_undefined(self): |
55 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, 'xyz')) |
| 52 | + self.assertFalse('xyz' in logger.per_thread_worker_data.get_data()) |
56 | 53 | with logger.PerThreadLoggingContext(xyz='value'): |
57 | | - self.assertEqual(logger.per_thread_worker_data.xyz, 'value') |
58 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, 'xyz')) |
| 54 | + self.assertEqual(logger.per_thread_worker_data.get_data()['xyz'], 'value') |
| 55 | + self.assertFalse('xyz' in logger.per_thread_worker_data.get_data()) |
59 | 56 |
|
60 | 57 | def test_set_when_already_defined(self): |
61 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, 'xyz')) |
| 58 | + self.assertFalse('xyz' in logger.per_thread_worker_data.get_data()) |
62 | 59 | with logger.PerThreadLoggingContext(xyz='value'): |
63 | | - self.assertEqual(logger.per_thread_worker_data.xyz, 'value') |
| 60 | + self.assertEqual(logger.per_thread_worker_data.get_data()['xyz'], 'value') |
64 | 61 | with logger.PerThreadLoggingContext(xyz='value2'): |
65 | | - self.assertEqual(logger.per_thread_worker_data.xyz, 'value2') |
66 | | - self.assertEqual(logger.per_thread_worker_data.xyz, 'value') |
67 | | - self.assertFalse(hasattr(logger.per_thread_worker_data, 'xyz')) |
| 62 | + self.assertEqual( |
| 63 | + logger.per_thread_worker_data.get_data()['xyz'], 'value2') |
| 64 | + self.assertEqual(logger.per_thread_worker_data.get_data()['xyz'], 'value') |
| 65 | + self.assertFalse('xyz' in logger.per_thread_worker_data.get_data()) |
68 | 66 |
|
69 | 67 |
|
70 | 68 | class JsonLogFormatterTest(unittest.TestCase): |
@@ -140,6 +138,31 @@ def test_record_with_per_thread_info(self): |
140 | 138 | {'work': 'workitem', 'stage': 'stage', 'step': 'step'}) |
141 | 139 | self.assertEqual(log_output, expected_output) |
142 | 140 |
|
| 141 | + def test_nested_with_per_thread_info(self): |
| 142 | + formatter = logger.JsonLogFormatter(job_id='jobid', worker_id='workerid') |
| 143 | + with logger.PerThreadLoggingContext( |
| 144 | + work_item_id='workitem', stage_name='stage', step_name='step1'): |
| 145 | + record = self.create_log_record(**self.SAMPLE_RECORD) |
| 146 | + log_output1 = json.loads(formatter.format(record)) |
| 147 | + |
| 148 | + with logger.PerThreadLoggingContext(step_name='step2'): |
| 149 | + record = self.create_log_record(**self.SAMPLE_RECORD) |
| 150 | + log_output2 = json.loads(formatter.format(record)) |
| 151 | + |
| 152 | + record = self.create_log_record(**self.SAMPLE_RECORD) |
| 153 | + log_output3 = json.loads(formatter.format(record)) |
| 154 | + |
| 155 | + record = self.create_log_record(**self.SAMPLE_RECORD) |
| 156 | + log_output4 = json.loads(formatter.format(record)) |
| 157 | + |
| 158 | + self.assertEqual(log_output1, dict( |
| 159 | + self.SAMPLE_OUTPUT, work='workitem', stage='stage', step='step1')) |
| 160 | + self.assertEqual(log_output2, dict( |
| 161 | + self.SAMPLE_OUTPUT, work='workitem', stage='stage', step='step2')) |
| 162 | + self.assertEqual(log_output3, dict( |
| 163 | + self.SAMPLE_OUTPUT, work='workitem', stage='stage', step='step1')) |
| 164 | + self.assertEqual(log_output4, self.SAMPLE_OUTPUT) |
| 165 | + |
143 | 166 | def test_exception_record(self): |
144 | 167 | formatter = logger.JsonLogFormatter(job_id='jobid', worker_id='workerid') |
145 | 168 | try: |
|
0 commit comments