1 # Copyright (c) 2019 AT&T Intellectual Property.
2 # Copyright (c) 2018-2019 Nokia.
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 """Unit tests for Logger.py"""
18 from unittest.mock import patch
21 from mdclogpy import Logger
22 from mdclogpy import Level
24 from .mdclogtestutils import TestMdcLogUtils
27 class TestMdcLog(unittest.TestCase):
28 """Unit tests for mdclog.py"""
31 self.logger = Logger()
37 def test_that_get_level_returns_the_current_log_level(self):
39 # default level is DEBUG
40 self.assertEqual(self.logger.get_level(), Level.DEBUG)
41 self.logger.set_level(Level.INFO)
42 self.assertEqual(self.logger.get_level(), Level.INFO)
43 self.logger.set_level(Level.WARNING)
44 self.assertEqual(self.logger.get_level(), Level.WARNING)
45 self.logger.set_level(Level.ERROR)
46 self.assertEqual(self.logger.get_level(), Level.ERROR)
47 self.logger.set_level(Level.DEBUG)
48 self.assertEqual(self.logger.get_level(), Level.DEBUG)
50 def test_that_set_level_does_not_accept_incorrect_level(self):
52 self.logger.set_level(Level.INFO)
53 self.logger.set_level(55)
54 self.assertEqual(self.logger.get_level(), Level.INFO)
56 @patch('mdclogpy.Logger._output_log')
57 def test_that_logs_with_lower_than_current_level_(self, output_mock):
59 self.logger.set_level(Level.WARNING)
60 self.logger.log(Level.DEBUG, "DEBUG")
61 self.logger.log(Level.INFO, "INFO")
62 self.logger.log(Level.WARNING, "WARNING")
63 self.logger.log(Level.ERROR, "ERROR")
65 self.assertEqual(2, output_mock.call_count)
66 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
67 self.assertEqual(logs[0]["msg"], "WARNING")
68 self.assertEqual(logs[1]["msg"], "ERROR")
70 @patch('mdclogpy.Logger._output_log')
71 def test_that_logs_with_lower_than_current_level_are_not_logged(self, output_mock):
73 self.logger.set_level(Level.WARNING)
74 self.logger.log(Level.DEBUG, "DEBUG")
75 self.logger.log(Level.INFO, "INFO")
76 self.logger.log(Level.WARNING, "WARNING")
77 self.logger.log(Level.ERROR, "ERROR")
79 self.assertEqual(2, output_mock.call_count)
80 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
81 self.assertEqual(logs[0]["msg"], "WARNING")
82 self.assertEqual(logs[1]["msg"], "ERROR")
84 @patch('mdclogpy.Logger._output_log')
85 def test_that_log_contains_correct_criticality(self, output_mock):
87 self.logger.set_level(Level.DEBUG)
89 self.logger.log(Level.DEBUG, "debug test log")
90 self.logger.log(Level.INFO, "info test log")
91 self.logger.log(Level.WARNING, "warning test log")
92 self.logger.log(Level.ERROR, "error test log")
94 self.logger.debug("another debug test log")
95 self.logger.info("another info test log")
96 self.logger.warning("another warning test log")
97 self.logger.error("another error test log")
99 self.assertEqual(8, output_mock.call_count)
100 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
101 self.assertEqual(logs[0]["crit"], "DEBUG")
102 self.assertEqual(logs[1]["crit"], "INFO")
103 self.assertEqual(logs[2]["crit"], "WARNING")
104 self.assertEqual(logs[3]["crit"], "ERROR")
105 self.assertEqual(logs[4]["crit"], "DEBUG")
106 self.assertEqual(logs[5]["crit"], "INFO")
107 self.assertEqual(logs[6]["crit"], "WARNING")
108 self.assertEqual(logs[7]["crit"], "ERROR")
111 @patch('mdclogpy.Logger._output_log')
112 def test_that_log_contains_correct_timestamp(self, output_mock, mock_time):
114 mock_time.return_value = 1554806251.4388545
115 self.logger.info("timestamp test")
117 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
118 self.assertEqual(logs[0]["ts"], 1554806251439)
120 @patch('mdclogpy.Logger._output_log')
121 def test_that_log_contains_correct_message(self, output_mock):
123 self.logger.info("message test")
124 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
125 self.assertEqual(logs[0]["msg"], "message test")
127 @patch('mdclogpy.Logger._output_log')
128 def test_that_log_message_is_escaped_to_valid_json_string(self, output_mock):
130 self.logger.set_level(Level.DEBUG)
132 self.logger.info('\ and "')
134 logs = TestMdcLogUtils.get_logs(output_mock.call_args_list)
135 self.assertTrue(r'\\ and \"' in logs[0])
136 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
137 self.assertEqual(logs[0]["msg"], '\ and "')
140 @patch('mdclogpy.Logger._output_log')
141 def test_that_empty_mdc_is_logged_correctly(self, output_mock):
143 self.logger.error("empty mdc test")
144 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
145 self.assertEqual(logs[0]["mdc"], {})
147 @patch('mdclogpy.Logger._output_log')
148 def test_that_mdc_values_are_logged_correctly(self, output_mock):
150 self.logger.add_mdc("key1", "value1")
151 self.logger.add_mdc("key2", "value2")
152 self.logger.error("mdc test")
154 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
155 self.assertEqual(logs[0]["mdc"]["key1"], "value1")
156 self.assertEqual(logs[0]["mdc"]["key2"], "value2")
158 def test_that_mdc_values_can_be_added_and_removed(self):
160 self.logger.add_mdc("key1", "value1")
161 self.logger.add_mdc("key2", "value2")
162 self.assertEqual(self.logger.get_mdc("key2"), "value2")
163 self.assertEqual(self.logger.get_mdc("key1"), "value1")
164 self.assertEqual(self.logger.get_mdc("non_existent"), None)
165 self.logger.remove_mdc("key1")
166 self.assertEqual(self.logger.get_mdc("key1"), None)
167 self.logger.remove_mdc("non_existent")
168 self.logger.clean_mdc()
169 self.assertEqual(self.logger.get_mdc("key2"), None)
171 @patch('mdclogpy.Logger._output_log')
172 def test_multiple_logger_instances(self, output_mock):
174 logger1 = Logger("logger1")
175 logger2 = Logger("logger2")
176 logger1.add_mdc("logger1_key1", "logger1_value1")
177 logger1.add_mdc("logger1_key2", "logger1_value2")
178 logger2.add_mdc("logger2_key1", "logger2_value1")
179 logger2.add_mdc("logger2_key2", "logger2_value2")
180 mdclogpy.add_mdc("key", "value")
182 logger1.error("error msg")
183 logger2.warning("warning msg")
184 mdclogpy.info("info msg")
186 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
187 self.assertEqual(3, output_mock.call_count)
189 self.assertEqual(logs[0]["id"], "logger1")
190 self.assertEqual(logs[0]["crit"], "ERROR")
191 self.assertEqual(logs[0]["msg"], "error msg")
192 self.assertEqual(logs[0]["mdc"]["logger1_key1"], "logger1_value1")
193 self.assertEqual(logs[0]["mdc"]["logger1_key2"], "logger1_value2")
194 self.assertEqual(len(logs[0]["mdc"]), 2)
196 self.assertEqual(logs[1]["id"], "logger2")
197 self.assertEqual(logs[1]["crit"], "WARNING")
198 self.assertEqual(logs[1]["msg"], "warning msg")
199 self.assertEqual(logs[1]["mdc"]["logger2_key1"], "logger2_value1")
200 self.assertEqual(logs[1]["mdc"]["logger2_key2"], "logger2_value2")
201 self.assertEqual(len(logs[1]["mdc"]), 2)
203 self.assertEqual(logs[2]["id"], sys.argv[0])
204 self.assertEqual(logs[2]["crit"], "INFO")
205 self.assertEqual(logs[2]["msg"], "info msg")
206 self.assertEqual(logs[2]["mdc"]["key"], "value")
207 self.assertEqual(len(logs[2]["mdc"]), 1)
209 if __name__ == '__main__':