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 # This source code is part of the near-RT RIC (RAN Intelligent Controller)
17 # platform project (RICP).
19 """Unit tests for Logger.py"""
21 from unittest.mock import patch
24 from mdclogpy import Logger
25 from mdclogpy import Level
27 from .mdclogtestutils import TestMdcLogUtils
30 class TestMdcLog(unittest.TestCase):
31 """Unit tests for mdclog.py"""
34 self.logger = Logger()
40 def test_that_get_level_returns_the_current_log_level(self):
42 # default level is DEBUG
43 self.assertEqual(self.logger.get_level(), Level.DEBUG)
44 self.logger.set_level(Level.INFO)
45 self.assertEqual(self.logger.get_level(), Level.INFO)
46 self.logger.set_level(Level.WARNING)
47 self.assertEqual(self.logger.get_level(), Level.WARNING)
48 self.logger.set_level(Level.ERROR)
49 self.assertEqual(self.logger.get_level(), Level.ERROR)
50 self.logger.set_level(Level.DEBUG)
51 self.assertEqual(self.logger.get_level(), Level.DEBUG)
53 def test_that_set_level_does_not_accept_incorrect_level(self):
55 self.logger.set_level(Level.INFO)
56 self.logger.set_level(55)
57 self.assertEqual(self.logger.get_level(), Level.INFO)
59 @patch('mdclogpy.Logger._output_log')
60 def test_that_logs_with_lower_than_current_level_(self, output_mock):
62 self.logger.set_level(Level.WARNING)
63 self.logger.log(Level.DEBUG, "DEBUG")
64 self.logger.log(Level.INFO, "INFO")
65 self.logger.log(Level.WARNING, "WARNING")
66 self.logger.log(Level.ERROR, "ERROR")
68 self.assertEqual(2, output_mock.call_count)
69 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
70 self.assertEqual(logs[0]["msg"], "WARNING")
71 self.assertEqual(logs[1]["msg"], "ERROR")
73 @patch('mdclogpy.Logger._output_log')
74 def test_that_logs_with_lower_than_current_level_are_not_logged(self, output_mock):
76 self.logger.set_level(Level.WARNING)
77 self.logger.log(Level.DEBUG, "DEBUG")
78 self.logger.log(Level.INFO, "INFO")
79 self.logger.log(Level.WARNING, "WARNING")
80 self.logger.log(Level.ERROR, "ERROR")
82 self.assertEqual(2, output_mock.call_count)
83 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
84 self.assertEqual(logs[0]["msg"], "WARNING")
85 self.assertEqual(logs[1]["msg"], "ERROR")
87 @patch('mdclogpy.Logger._output_log')
88 def test_that_log_contains_correct_criticality(self, output_mock):
90 self.logger.set_level(Level.DEBUG)
92 self.logger.log(Level.DEBUG, "debug test log")
93 self.logger.log(Level.INFO, "info test log")
94 self.logger.log(Level.WARNING, "warning test log")
95 self.logger.log(Level.ERROR, "error test log")
97 self.logger.debug("another debug test log")
98 self.logger.info("another info test log")
99 self.logger.warning("another warning test log")
100 self.logger.error("another error test log")
102 self.assertEqual(8, output_mock.call_count)
103 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
104 self.assertEqual(logs[0]["crit"], "DEBUG")
105 self.assertEqual(logs[1]["crit"], "INFO")
106 self.assertEqual(logs[2]["crit"], "WARNING")
107 self.assertEqual(logs[3]["crit"], "ERROR")
108 self.assertEqual(logs[4]["crit"], "DEBUG")
109 self.assertEqual(logs[5]["crit"], "INFO")
110 self.assertEqual(logs[6]["crit"], "WARNING")
111 self.assertEqual(logs[7]["crit"], "ERROR")
114 @patch('mdclogpy.Logger._output_log')
115 def test_that_log_contains_correct_timestamp(self, output_mock, mock_time):
117 mock_time.return_value = 1554806251.4388545
118 self.logger.info("timestamp test")
120 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
121 self.assertEqual(logs[0]["ts"], 1554806251439)
123 @patch('mdclogpy.Logger._output_log')
124 def test_that_log_contains_correct_message(self, output_mock):
126 self.logger.info("message test")
127 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
128 self.assertEqual(logs[0]["msg"], "message test")
130 @patch('mdclogpy.Logger._output_log')
131 def test_that_log_message_is_escaped_to_valid_json_string(self, output_mock):
133 self.logger.set_level(Level.DEBUG)
135 self.logger.info('\ and "')
137 logs = TestMdcLogUtils.get_logs(output_mock.call_args_list)
138 self.assertTrue(r'\\ and \"' in logs[0])
139 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
140 self.assertEqual(logs[0]["msg"], '\ and "')
143 @patch('mdclogpy.Logger._output_log')
144 def test_that_empty_mdc_is_logged_correctly(self, output_mock):
146 self.logger.error("empty mdc test")
147 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
148 self.assertEqual(logs[0]["mdc"], {})
150 @patch('mdclogpy.Logger._output_log')
151 def test_that_mdc_values_are_logged_correctly(self, output_mock):
153 self.logger.add_mdc("key1", "value1")
154 self.logger.add_mdc("key2", "value2")
155 self.logger.error("mdc test")
157 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
158 self.assertEqual(logs[0]["mdc"]["key1"], "value1")
159 self.assertEqual(logs[0]["mdc"]["key2"], "value2")
161 def test_that_mdc_values_can_be_added_and_removed(self):
163 self.logger.add_mdc("key1", "value1")
164 self.logger.add_mdc("key2", "value2")
165 self.assertEqual(self.logger.get_mdc("key2"), "value2")
166 self.assertEqual(self.logger.get_mdc("key1"), "value1")
167 self.assertEqual(self.logger.get_mdc("non_existent"), None)
168 self.logger.remove_mdc("key1")
169 self.assertEqual(self.logger.get_mdc("key1"), None)
170 self.logger.remove_mdc("non_existent")
171 self.logger.clean_mdc()
172 self.assertEqual(self.logger.get_mdc("key2"), None)
174 @patch('mdclogpy.Logger._output_log')
175 def test_multiple_logger_instances(self, output_mock):
177 logger1 = Logger("logger1")
178 logger2 = Logger("logger2")
179 logger1.add_mdc("logger1_key1", "logger1_value1")
180 logger1.add_mdc("logger1_key2", "logger1_value2")
181 logger2.add_mdc("logger2_key1", "logger2_value1")
182 logger2.add_mdc("logger2_key2", "logger2_value2")
183 mdclogpy.add_mdc("key", "value")
185 logger1.error("error msg")
186 logger2.warning("warning msg")
187 mdclogpy.info("info msg")
189 logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
190 self.assertEqual(3, output_mock.call_count)
192 self.assertEqual(logs[0]["id"], "logger1")
193 self.assertEqual(logs[0]["crit"], "ERROR")
194 self.assertEqual(logs[0]["msg"], "error msg")
195 self.assertEqual(logs[0]["mdc"]["logger1_key1"], "logger1_value1")
196 self.assertEqual(logs[0]["mdc"]["logger1_key2"], "logger1_value2")
197 self.assertEqual(len(logs[0]["mdc"]), 2)
199 self.assertEqual(logs[1]["id"], "logger2")
200 self.assertEqual(logs[1]["crit"], "WARNING")
201 self.assertEqual(logs[1]["msg"], "warning msg")
202 self.assertEqual(logs[1]["mdc"]["logger2_key1"], "logger2_value1")
203 self.assertEqual(logs[1]["mdc"]["logger2_key2"], "logger2_value2")
204 self.assertEqual(len(logs[1]["mdc"]), 2)
206 self.assertEqual(logs[2]["id"], sys.argv[0])
207 self.assertEqual(logs[2]["crit"], "INFO")
208 self.assertEqual(logs[2]["msg"], "info msg")
209 self.assertEqual(logs[2]["mdc"]["key"], "value")
210 self.assertEqual(len(logs[2]["mdc"]), 1)
212 if __name__ == '__main__':