Add new license claim
[com/pylog.git] / mdclogpy / tst / test_Logger.py
1 # Copyright (c) 2019 AT&T Intellectual Property.
2 # Copyright (c) 2018-2019 Nokia.
3 #
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
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
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.
15 #
16 # This source code is part of the near-RT RIC (RAN Intelligent Controller)
17 # platform project (RICP).
18 #
19 """Unit tests for Logger.py"""
20 import unittest
21 from unittest.mock import patch
22 import sys
23
24 from mdclogpy import Logger
25 from mdclogpy import Level
26 import mdclogpy
27 from .mdclogtestutils import TestMdcLogUtils
28
29
30 class TestMdcLog(unittest.TestCase):
31     """Unit tests for mdclog.py"""
32
33     def setUp(self):
34         self.logger = Logger()
35
36     def tearDown(self):
37         pass
38
39
40     def test_that_get_level_returns_the_current_log_level(self):
41
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)
52
53     def test_that_set_level_does_not_accept_incorrect_level(self):
54
55         self.logger.set_level(Level.INFO)
56         self.logger.set_level(55)
57         self.assertEqual(self.logger.get_level(), Level.INFO)
58
59     @patch('mdclogpy.Logger._output_log')
60     def test_that_logs_with_lower_than_current_level_(self, output_mock):
61
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")
67
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")
72
73     @patch('mdclogpy.Logger._output_log')
74     def test_that_logs_with_lower_than_current_level_are_not_logged(self, output_mock):
75
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")
81
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")
86
87     @patch('mdclogpy.Logger._output_log')
88     def test_that_log_contains_correct_criticality(self, output_mock):
89
90         self.logger.set_level(Level.DEBUG)
91
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")
96
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")
101
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")
112
113     @patch('time.time')
114     @patch('mdclogpy.Logger._output_log')
115     def test_that_log_contains_correct_timestamp(self, output_mock, mock_time):
116
117         mock_time.return_value = 1554806251.4388545
118         self.logger.info("timestamp test")
119
120         logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
121         self.assertEqual(logs[0]["ts"], 1554806251439)
122
123     @patch('mdclogpy.Logger._output_log')
124     def test_that_log_contains_correct_message(self, output_mock):
125
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")
129
130     @patch('mdclogpy.Logger._output_log')
131     def test_that_log_message_is_escaped_to_valid_json_string(self, output_mock):
132
133         self.logger.set_level(Level.DEBUG)
134
135         self.logger.info('\ and "')
136
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 "')
141
142
143     @patch('mdclogpy.Logger._output_log')
144     def test_that_empty_mdc_is_logged_correctly(self, output_mock):
145
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"], {})
149
150     @patch('mdclogpy.Logger._output_log')
151     def test_that_mdc_values_are_logged_correctly(self, output_mock):
152
153         self.logger.add_mdc("key1", "value1")
154         self.logger.add_mdc("key2", "value2")
155         self.logger.error("mdc test")
156
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")
160
161     def test_that_mdc_values_can_be_added_and_removed(self):
162
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)
173
174     @patch('mdclogpy.Logger._output_log')
175     def test_multiple_logger_instances(self, output_mock):
176
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")
184
185         logger1.error("error msg")
186         logger2.warning("warning msg")
187         mdclogpy.info("info msg")
188
189         logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
190         self.assertEqual(3, output_mock.call_count)
191
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)
198
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)
205
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)
211
212 if __name__ == '__main__':
213     unittest.main()