root / test / ganeti.utils.log_unittest.py @ 1fa2c40b
History | View | Annotate | Download (6.3 kB)
1 | b6fa9a44 | Michael Hanselmann | #!/usr/bin/python
|
---|---|---|---|
2 | b6fa9a44 | Michael Hanselmann | #
|
3 | b6fa9a44 | Michael Hanselmann | |
4 | b6fa9a44 | Michael Hanselmann | # Copyright (C) 2011 Google Inc.
|
5 | b6fa9a44 | Michael Hanselmann | #
|
6 | b6fa9a44 | Michael Hanselmann | # This program is free software; you can redistribute it and/or modify
|
7 | b6fa9a44 | Michael Hanselmann | # it under the terms of the GNU General Public License as published by
|
8 | b6fa9a44 | Michael Hanselmann | # the Free Software Foundation; either version 2 of the License, or
|
9 | b6fa9a44 | Michael Hanselmann | # (at your option) any later version.
|
10 | b6fa9a44 | Michael Hanselmann | #
|
11 | b6fa9a44 | Michael Hanselmann | # This program is distributed in the hope that it will be useful, but
|
12 | b6fa9a44 | Michael Hanselmann | # WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | b6fa9a44 | Michael Hanselmann | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | b6fa9a44 | Michael Hanselmann | # General Public License for more details.
|
15 | b6fa9a44 | Michael Hanselmann | #
|
16 | b6fa9a44 | Michael Hanselmann | # You should have received a copy of the GNU General Public License
|
17 | b6fa9a44 | Michael Hanselmann | # along with this program; if not, write to the Free Software
|
18 | b6fa9a44 | Michael Hanselmann | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
19 | b6fa9a44 | Michael Hanselmann | # 02110-1301, USA.
|
20 | b6fa9a44 | Michael Hanselmann | |
21 | b6fa9a44 | Michael Hanselmann | |
22 | b6fa9a44 | Michael Hanselmann | """Script for testing ganeti.utils.log"""
|
23 | b6fa9a44 | Michael Hanselmann | |
24 | b6fa9a44 | Michael Hanselmann | import os |
25 | b6fa9a44 | Michael Hanselmann | import unittest |
26 | b6fa9a44 | Michael Hanselmann | import logging |
27 | b6fa9a44 | Michael Hanselmann | import tempfile |
28 | 9a6813ac | Michael Hanselmann | import shutil |
29 | b6fa9a44 | Michael Hanselmann | |
30 | b6fa9a44 | Michael Hanselmann | from ganeti import constants |
31 | b6fa9a44 | Michael Hanselmann | from ganeti import errors |
32 | b6fa9a44 | Michael Hanselmann | from ganeti import utils |
33 | b6fa9a44 | Michael Hanselmann | |
34 | b6fa9a44 | Michael Hanselmann | import testutils |
35 | b6fa9a44 | Michael Hanselmann | |
36 | b6fa9a44 | Michael Hanselmann | |
37 | b6fa9a44 | Michael Hanselmann | class TestLogHandler(unittest.TestCase): |
38 | ad88650c | Michael Hanselmann | def testNormal(self): |
39 | b6fa9a44 | Michael Hanselmann | tmpfile = tempfile.NamedTemporaryFile() |
40 | b6fa9a44 | Michael Hanselmann | |
41 | b6fa9a44 | Michael Hanselmann | handler = utils.log._ReopenableLogHandler(tmpfile.name) |
42 | b6fa9a44 | Michael Hanselmann | handler.setFormatter(logging.Formatter("%(asctime)s: %(message)s"))
|
43 | b6fa9a44 | Michael Hanselmann | |
44 | b6fa9a44 | Michael Hanselmann | logger = logging.Logger("TestLogger")
|
45 | b6fa9a44 | Michael Hanselmann | logger.addHandler(handler) |
46 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(logger.handlers), 1) |
47 | b6fa9a44 | Michael Hanselmann | |
48 | b6fa9a44 | Michael Hanselmann | logger.error("Test message ERROR")
|
49 | b6fa9a44 | Michael Hanselmann | logger.info("Test message INFO")
|
50 | b6fa9a44 | Michael Hanselmann | |
51 | b6fa9a44 | Michael Hanselmann | logger.removeHandler(handler) |
52 | b6fa9a44 | Michael Hanselmann | self.assertFalse(logger.handlers)
|
53 | b6fa9a44 | Michael Hanselmann | handler.close() |
54 | b6fa9a44 | Michael Hanselmann | |
55 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 2) |
56 | b6fa9a44 | Michael Hanselmann | |
57 | b6fa9a44 | Michael Hanselmann | def testReopen(self): |
58 | b6fa9a44 | Michael Hanselmann | tmpfile = tempfile.NamedTemporaryFile() |
59 | b6fa9a44 | Michael Hanselmann | tmpfile2 = tempfile.NamedTemporaryFile() |
60 | b6fa9a44 | Michael Hanselmann | |
61 | b6fa9a44 | Michael Hanselmann | handler = utils.log._ReopenableLogHandler(tmpfile.name) |
62 | b6fa9a44 | Michael Hanselmann | |
63 | b6fa9a44 | Michael Hanselmann | self.assertFalse(utils.ReadFile(tmpfile.name))
|
64 | b6fa9a44 | Michael Hanselmann | self.assertFalse(utils.ReadFile(tmpfile2.name))
|
65 | b6fa9a44 | Michael Hanselmann | |
66 | b6fa9a44 | Michael Hanselmann | logger = logging.Logger("TestLoggerReopen")
|
67 | b6fa9a44 | Michael Hanselmann | logger.addHandler(handler) |
68 | b6fa9a44 | Michael Hanselmann | |
69 | b6fa9a44 | Michael Hanselmann | for _ in range(3): |
70 | b6fa9a44 | Michael Hanselmann | logger.error("Test message ERROR")
|
71 | b6fa9a44 | Michael Hanselmann | handler.flush() |
72 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 3) |
73 | b6fa9a44 | Michael Hanselmann | before_id = utils.GetFileID(tmpfile.name) |
74 | b6fa9a44 | Michael Hanselmann | |
75 | b6fa9a44 | Michael Hanselmann | handler.RequestReopen() |
76 | b6fa9a44 | Michael Hanselmann | self.assertTrue(handler._reopen)
|
77 | b6fa9a44 | Michael Hanselmann | self.assertTrue(utils.VerifyFileID(utils.GetFileID(tmpfile.name),
|
78 | b6fa9a44 | Michael Hanselmann | before_id)) |
79 | b6fa9a44 | Michael Hanselmann | |
80 | b6fa9a44 | Michael Hanselmann | # Rename only after requesting reopen
|
81 | b6fa9a44 | Michael Hanselmann | os.rename(tmpfile.name, tmpfile2.name) |
82 | b6fa9a44 | Michael Hanselmann | assert not os.path.exists(tmpfile.name) |
83 | b6fa9a44 | Michael Hanselmann | |
84 | b6fa9a44 | Michael Hanselmann | # Write another message, should reopen
|
85 | b6fa9a44 | Michael Hanselmann | for _ in range(4): |
86 | b6fa9a44 | Michael Hanselmann | logger.info("Test message INFO")
|
87 | ad88650c | Michael Hanselmann | |
88 | ad88650c | Michael Hanselmann | # Flag must be reset
|
89 | ad88650c | Michael Hanselmann | self.assertFalse(handler._reopen)
|
90 | ad88650c | Michael Hanselmann | |
91 | b6fa9a44 | Michael Hanselmann | self.assertFalse(utils.VerifyFileID(utils.GetFileID(tmpfile.name),
|
92 | b6fa9a44 | Michael Hanselmann | before_id)) |
93 | b6fa9a44 | Michael Hanselmann | |
94 | b6fa9a44 | Michael Hanselmann | logger.removeHandler(handler) |
95 | b6fa9a44 | Michael Hanselmann | self.assertFalse(logger.handlers)
|
96 | b6fa9a44 | Michael Hanselmann | handler.close() |
97 | b6fa9a44 | Michael Hanselmann | |
98 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 4) |
99 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile2.name).splitlines()), 3) |
100 | b6fa9a44 | Michael Hanselmann | |
101 | b6fa9a44 | Michael Hanselmann | def testConsole(self): |
102 | b6fa9a44 | Michael Hanselmann | for (console, check) in [(None, False), |
103 | b6fa9a44 | Michael Hanselmann | (tempfile.NamedTemporaryFile(), True),
|
104 | b6fa9a44 | Michael Hanselmann | (self._FailingFile(os.devnull), False)]: |
105 | b6fa9a44 | Michael Hanselmann | # Create a handler which will fail when handling errors
|
106 | b6fa9a44 | Michael Hanselmann | cls = utils.log._LogErrorsToConsole(self._FailingHandler)
|
107 | b6fa9a44 | Michael Hanselmann | |
108 | b6fa9a44 | Michael Hanselmann | # Instantiate handler with file which will fail when writing,
|
109 | b6fa9a44 | Michael Hanselmann | # provoking a write to the console
|
110 | b6fa9a44 | Michael Hanselmann | handler = cls(console, self._FailingFile(os.devnull))
|
111 | b6fa9a44 | Michael Hanselmann | |
112 | b6fa9a44 | Michael Hanselmann | logger = logging.Logger("TestLogger")
|
113 | b6fa9a44 | Michael Hanselmann | logger.addHandler(handler) |
114 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(logger.handlers), 1) |
115 | b6fa9a44 | Michael Hanselmann | |
116 | b6fa9a44 | Michael Hanselmann | # Provoke write
|
117 | b6fa9a44 | Michael Hanselmann | logger.error("Test message ERROR")
|
118 | b6fa9a44 | Michael Hanselmann | |
119 | b6fa9a44 | Michael Hanselmann | # Take everything apart
|
120 | b6fa9a44 | Michael Hanselmann | logger.removeHandler(handler) |
121 | b6fa9a44 | Michael Hanselmann | self.assertFalse(logger.handlers)
|
122 | b6fa9a44 | Michael Hanselmann | handler.close() |
123 | b6fa9a44 | Michael Hanselmann | |
124 | b6fa9a44 | Michael Hanselmann | if console and check: |
125 | b6fa9a44 | Michael Hanselmann | console.flush() |
126 | b6fa9a44 | Michael Hanselmann | |
127 | b6fa9a44 | Michael Hanselmann | # Check console output
|
128 | b6fa9a44 | Michael Hanselmann | consout = utils.ReadFile(console.name) |
129 | b6fa9a44 | Michael Hanselmann | self.assertTrue("Cannot log message" in consout) |
130 | b6fa9a44 | Michael Hanselmann | self.assertTrue("Test message ERROR" in consout) |
131 | b6fa9a44 | Michael Hanselmann | |
132 | b6fa9a44 | Michael Hanselmann | class _FailingFile(file): |
133 | b6fa9a44 | Michael Hanselmann | def write(self, _): |
134 | b6fa9a44 | Michael Hanselmann | raise Exception |
135 | b6fa9a44 | Michael Hanselmann | |
136 | b6fa9a44 | Michael Hanselmann | class _FailingHandler(logging.StreamHandler): |
137 | b6fa9a44 | Michael Hanselmann | def handleError(self, _): |
138 | b6fa9a44 | Michael Hanselmann | raise Exception |
139 | b6fa9a44 | Michael Hanselmann | |
140 | b6fa9a44 | Michael Hanselmann | |
141 | 9a6813ac | Michael Hanselmann | class TestSetupLogging(unittest.TestCase): |
142 | 9a6813ac | Michael Hanselmann | def setUp(self): |
143 | 9a6813ac | Michael Hanselmann | self.tmpdir = tempfile.mkdtemp()
|
144 | 9a6813ac | Michael Hanselmann | |
145 | 9a6813ac | Michael Hanselmann | def tearDown(self): |
146 | 9a6813ac | Michael Hanselmann | shutil.rmtree(self.tmpdir)
|
147 | 9a6813ac | Michael Hanselmann | |
148 | 9a6813ac | Michael Hanselmann | def testSimple(self): |
149 | 9a6813ac | Michael Hanselmann | logfile = utils.PathJoin(self.tmpdir, "basic.log") |
150 | 9a6813ac | Michael Hanselmann | logger = logging.Logger("TestLogger")
|
151 | 9a6813ac | Michael Hanselmann | self.assertTrue(callable(utils.SetupLogging(logfile, "test", |
152 | 9a6813ac | Michael Hanselmann | console_logging=False,
|
153 | 9a6813ac | Michael Hanselmann | syslog=constants.SYSLOG_NO, |
154 | 9a6813ac | Michael Hanselmann | stderr_logging=False,
|
155 | 9a6813ac | Michael Hanselmann | multithreaded=False,
|
156 | 9a6813ac | Michael Hanselmann | root_logger=logger))) |
157 | 9a6813ac | Michael Hanselmann | self.assertEqual(utils.ReadFile(logfile), "") |
158 | 9a6813ac | Michael Hanselmann | logger.error("This is a test")
|
159 | 9a6813ac | Michael Hanselmann | |
160 | 9a6813ac | Michael Hanselmann | # Ensure SetupLogging used custom logger
|
161 | 9a6813ac | Michael Hanselmann | logging.error("This message should not show up in the test log file")
|
162 | 9a6813ac | Michael Hanselmann | |
163 | 9a6813ac | Michael Hanselmann | self.assertTrue(utils.ReadFile(logfile).endswith("This is a test\n")) |
164 | 9a6813ac | Michael Hanselmann | |
165 | 9a6813ac | Michael Hanselmann | def testReopen(self): |
166 | 9a6813ac | Michael Hanselmann | logfile = utils.PathJoin(self.tmpdir, "reopen.log") |
167 | 9a6813ac | Michael Hanselmann | logfile2 = utils.PathJoin(self.tmpdir, "reopen.log.OLD") |
168 | 9a6813ac | Michael Hanselmann | logger = logging.Logger("TestLogger")
|
169 | 9a6813ac | Michael Hanselmann | reopen_fn = utils.SetupLogging(logfile, "test",
|
170 | 9a6813ac | Michael Hanselmann | console_logging=False,
|
171 | 9a6813ac | Michael Hanselmann | syslog=constants.SYSLOG_NO, |
172 | 9a6813ac | Michael Hanselmann | stderr_logging=False,
|
173 | 9a6813ac | Michael Hanselmann | multithreaded=False,
|
174 | 9a6813ac | Michael Hanselmann | root_logger=logger) |
175 | 9a6813ac | Michael Hanselmann | self.assertTrue(callable(reopen_fn)) |
176 | 9a6813ac | Michael Hanselmann | |
177 | 9a6813ac | Michael Hanselmann | self.assertEqual(utils.ReadFile(logfile), "") |
178 | 9a6813ac | Michael Hanselmann | logger.error("This is a test")
|
179 | 9a6813ac | Michael Hanselmann | self.assertTrue(utils.ReadFile(logfile).endswith("This is a test\n")) |
180 | 9a6813ac | Michael Hanselmann | |
181 | 9a6813ac | Michael Hanselmann | os.rename(logfile, logfile2) |
182 | 9a6813ac | Michael Hanselmann | assert not os.path.exists(logfile) |
183 | 9a6813ac | Michael Hanselmann | |
184 | 9a6813ac | Michael Hanselmann | # Notify logger to reopen on the next message
|
185 | 9a6813ac | Michael Hanselmann | reopen_fn() |
186 | 9a6813ac | Michael Hanselmann | assert not os.path.exists(logfile) |
187 | 9a6813ac | Michael Hanselmann | |
188 | 9a6813ac | Michael Hanselmann | # Provoke actual reopen
|
189 | 9a6813ac | Michael Hanselmann | logger.error("First message")
|
190 | 9a6813ac | Michael Hanselmann | |
191 | 9a6813ac | Michael Hanselmann | self.assertTrue(utils.ReadFile(logfile).endswith("First message\n")) |
192 | 9a6813ac | Michael Hanselmann | self.assertTrue(utils.ReadFile(logfile2).endswith("This is a test\n")) |
193 | 9a6813ac | Michael Hanselmann | |
194 | 9a6813ac | Michael Hanselmann | |
195 | b6fa9a44 | Michael Hanselmann | if __name__ == "__main__": |
196 | b6fa9a44 | Michael Hanselmann | testutils.GanetiTestProgram() |