First release version
[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 """Unit tests for Logger.py"""
17 import unittest
18 from unittest.mock import patch
19 import sys
20
21 from mdclogpy import Logger
22 from mdclogpy import Level
23 import mdclogpy
24 from .mdclogtestutils import TestMdcLogUtils
25
26
27 class TestMdcLog(unittest.TestCase):
28     """Unit tests for mdclog.py"""
29
30     def setUp(self):
31         self.logger = Logger()
32
33     def tearDown(self):
34         pass
35
36
37     def test_that_get_level_returns_the_current_log_level(self):
38
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)
49
50     def test_that_set_level_does_not_accept_incorrect_level(self):
51
52         self.logger.set_level(Level.INFO)
53         self.logger.set_level(55)
54         self.assertEqual(self.logger.get_level(), Level.INFO)
55
56     @patch('mdclogpy.Logger._output_log')
57     def test_that_logs_with_lower_than_current_level_(self, output_mock):
58
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")
64
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")
69
70     @patch('mdclogpy.Logger._output_log')
71     def test_that_logs_with_lower_than_current_level_are_not_logged(self, output_mock):
72
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")
78
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")
83
84     @patch('mdclogpy.Logger._output_log')
85     def test_that_log_contains_correct_criticality(self, output_mock):
86
87         self.logger.set_level(Level.DEBUG)
88
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")
93
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")
98
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")
109
110     @patch('time.time')
111     @patch('mdclogpy.Logger._output_log')
112     def test_that_log_contains_correct_timestamp(self, output_mock, mock_time):
113
114         mock_time.return_value = 1554806251.4388545
115         self.logger.info("timestamp test")
116
117         logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
118         self.assertEqual(logs[0]["ts"], 1554806251439)
119
120     @patch('mdclogpy.Logger._output_log')
121     def test_that_log_contains_correct_message(self, output_mock):
122
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")
126
127     @patch('mdclogpy.Logger._output_log')
128     def test_that_log_message_is_escaped_to_valid_json_string(self, output_mock):
129
130         self.logger.set_level(Level.DEBUG)
131
132         self.logger.info('\ and "')
133
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 "')
138
139
140     @patch('mdclogpy.Logger._output_log')
141     def test_that_empty_mdc_is_logged_correctly(self, output_mock):
142
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"], {})
146
147     @patch('mdclogpy.Logger._output_log')
148     def test_that_mdc_values_are_logged_correctly(self, output_mock):
149
150         self.logger.add_mdc("key1", "value1")
151         self.logger.add_mdc("key2", "value2")
152         self.logger.error("mdc test")
153
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")
157
158     def test_that_mdc_values_can_be_added_and_removed(self):
159
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)
170
171     @patch('mdclogpy.Logger._output_log')
172     def test_multiple_logger_instances(self, output_mock):
173
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")
181
182         logger1.error("error msg")
183         logger2.warning("warning msg")
184         mdclogpy.info("info msg")
185
186         logs = TestMdcLogUtils.get_logs_as_json(output_mock.call_args_list)
187         self.assertEqual(3, output_mock.call_count)
188
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)
195
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)
202
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)
208
209 if __name__ == '__main__':
210     unittest.main()