root / test / ganeti.utils.log_unittest.py @ b6fa9a44
History | View | Annotate | Download (4.1 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 | b6fa9a44 | Michael Hanselmann | |
29 | b6fa9a44 | Michael Hanselmann | from ganeti import constants |
30 | b6fa9a44 | Michael Hanselmann | from ganeti import errors |
31 | b6fa9a44 | Michael Hanselmann | from ganeti import utils |
32 | b6fa9a44 | Michael Hanselmann | |
33 | b6fa9a44 | Michael Hanselmann | import testutils |
34 | b6fa9a44 | Michael Hanselmann | |
35 | b6fa9a44 | Michael Hanselmann | |
36 | b6fa9a44 | Michael Hanselmann | class TestLogHandler(unittest.TestCase): |
37 | b6fa9a44 | Michael Hanselmann | def test(self): |
38 | b6fa9a44 | Michael Hanselmann | tmpfile = tempfile.NamedTemporaryFile() |
39 | b6fa9a44 | Michael Hanselmann | |
40 | b6fa9a44 | Michael Hanselmann | handler = utils.log._ReopenableLogHandler(tmpfile.name) |
41 | b6fa9a44 | Michael Hanselmann | handler.setFormatter(logging.Formatter("%(asctime)s: %(message)s"))
|
42 | b6fa9a44 | Michael Hanselmann | |
43 | b6fa9a44 | Michael Hanselmann | logger = logging.Logger("TestLogger")
|
44 | b6fa9a44 | Michael Hanselmann | logger.addHandler(handler) |
45 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(logger.handlers), 1) |
46 | b6fa9a44 | Michael Hanselmann | |
47 | b6fa9a44 | Michael Hanselmann | logger.error("Test message ERROR")
|
48 | b6fa9a44 | Michael Hanselmann | logger.info("Test message INFO")
|
49 | b6fa9a44 | Michael Hanselmann | |
50 | b6fa9a44 | Michael Hanselmann | logger.removeHandler(handler) |
51 | b6fa9a44 | Michael Hanselmann | self.assertFalse(logger.handlers)
|
52 | b6fa9a44 | Michael Hanselmann | handler.close() |
53 | b6fa9a44 | Michael Hanselmann | |
54 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 2) |
55 | b6fa9a44 | Michael Hanselmann | |
56 | b6fa9a44 | Michael Hanselmann | def testReopen(self): |
57 | b6fa9a44 | Michael Hanselmann | tmpfile = tempfile.NamedTemporaryFile() |
58 | b6fa9a44 | Michael Hanselmann | tmpfile2 = tempfile.NamedTemporaryFile() |
59 | b6fa9a44 | Michael Hanselmann | |
60 | b6fa9a44 | Michael Hanselmann | handler = utils.log._ReopenableLogHandler(tmpfile.name) |
61 | b6fa9a44 | Michael Hanselmann | |
62 | b6fa9a44 | Michael Hanselmann | self.assertFalse(utils.ReadFile(tmpfile.name))
|
63 | b6fa9a44 | Michael Hanselmann | self.assertFalse(utils.ReadFile(tmpfile2.name))
|
64 | b6fa9a44 | Michael Hanselmann | |
65 | b6fa9a44 | Michael Hanselmann | logger = logging.Logger("TestLoggerReopen")
|
66 | b6fa9a44 | Michael Hanselmann | logger.addHandler(handler) |
67 | b6fa9a44 | Michael Hanselmann | |
68 | b6fa9a44 | Michael Hanselmann | for _ in range(3): |
69 | b6fa9a44 | Michael Hanselmann | logger.error("Test message ERROR")
|
70 | b6fa9a44 | Michael Hanselmann | handler.flush() |
71 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 3) |
72 | b6fa9a44 | Michael Hanselmann | before_id = utils.GetFileID(tmpfile.name) |
73 | b6fa9a44 | Michael Hanselmann | |
74 | b6fa9a44 | Michael Hanselmann | handler.RequestReopen() |
75 | b6fa9a44 | Michael Hanselmann | self.assertTrue(handler._reopen)
|
76 | b6fa9a44 | Michael Hanselmann | self.assertTrue(utils.VerifyFileID(utils.GetFileID(tmpfile.name),
|
77 | b6fa9a44 | Michael Hanselmann | before_id)) |
78 | b6fa9a44 | Michael Hanselmann | |
79 | b6fa9a44 | Michael Hanselmann | # Rename only after requesting reopen
|
80 | b6fa9a44 | Michael Hanselmann | os.rename(tmpfile.name, tmpfile2.name) |
81 | b6fa9a44 | Michael Hanselmann | assert not os.path.exists(tmpfile.name) |
82 | b6fa9a44 | Michael Hanselmann | |
83 | b6fa9a44 | Michael Hanselmann | # Write another message, should reopen
|
84 | b6fa9a44 | Michael Hanselmann | for _ in range(4): |
85 | b6fa9a44 | Michael Hanselmann | logger.info("Test message INFO")
|
86 | b6fa9a44 | Michael Hanselmann | self.assertFalse(utils.VerifyFileID(utils.GetFileID(tmpfile.name),
|
87 | b6fa9a44 | Michael Hanselmann | before_id)) |
88 | b6fa9a44 | Michael Hanselmann | |
89 | b6fa9a44 | Michael Hanselmann | logger.removeHandler(handler) |
90 | b6fa9a44 | Michael Hanselmann | self.assertFalse(logger.handlers)
|
91 | b6fa9a44 | Michael Hanselmann | handler.close() |
92 | b6fa9a44 | Michael Hanselmann | |
93 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 4) |
94 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(utils.ReadFile(tmpfile2.name).splitlines()), 3) |
95 | b6fa9a44 | Michael Hanselmann | |
96 | b6fa9a44 | Michael Hanselmann | def testConsole(self): |
97 | b6fa9a44 | Michael Hanselmann | for (console, check) in [(None, False), |
98 | b6fa9a44 | Michael Hanselmann | (tempfile.NamedTemporaryFile(), True),
|
99 | b6fa9a44 | Michael Hanselmann | (self._FailingFile(os.devnull), False)]: |
100 | b6fa9a44 | Michael Hanselmann | # Create a handler which will fail when handling errors
|
101 | b6fa9a44 | Michael Hanselmann | cls = utils.log._LogErrorsToConsole(self._FailingHandler)
|
102 | b6fa9a44 | Michael Hanselmann | |
103 | b6fa9a44 | Michael Hanselmann | # Instantiate handler with file which will fail when writing,
|
104 | b6fa9a44 | Michael Hanselmann | # provoking a write to the console
|
105 | b6fa9a44 | Michael Hanselmann | handler = cls(console, self._FailingFile(os.devnull))
|
106 | b6fa9a44 | Michael Hanselmann | |
107 | b6fa9a44 | Michael Hanselmann | logger = logging.Logger("TestLogger")
|
108 | b6fa9a44 | Michael Hanselmann | logger.addHandler(handler) |
109 | b6fa9a44 | Michael Hanselmann | self.assertEqual(len(logger.handlers), 1) |
110 | b6fa9a44 | Michael Hanselmann | |
111 | b6fa9a44 | Michael Hanselmann | # Provoke write
|
112 | b6fa9a44 | Michael Hanselmann | logger.error("Test message ERROR")
|
113 | b6fa9a44 | Michael Hanselmann | |
114 | b6fa9a44 | Michael Hanselmann | # Take everything apart
|
115 | b6fa9a44 | Michael Hanselmann | logger.removeHandler(handler) |
116 | b6fa9a44 | Michael Hanselmann | self.assertFalse(logger.handlers)
|
117 | b6fa9a44 | Michael Hanselmann | handler.close() |
118 | b6fa9a44 | Michael Hanselmann | |
119 | b6fa9a44 | Michael Hanselmann | if console and check: |
120 | b6fa9a44 | Michael Hanselmann | console.flush() |
121 | b6fa9a44 | Michael Hanselmann | |
122 | b6fa9a44 | Michael Hanselmann | # Check console output
|
123 | b6fa9a44 | Michael Hanselmann | consout = utils.ReadFile(console.name) |
124 | b6fa9a44 | Michael Hanselmann | self.assertTrue("Cannot log message" in consout) |
125 | b6fa9a44 | Michael Hanselmann | self.assertTrue("Test message ERROR" in consout) |
126 | b6fa9a44 | Michael Hanselmann | |
127 | b6fa9a44 | Michael Hanselmann | class _FailingFile(file): |
128 | b6fa9a44 | Michael Hanselmann | def write(self, _): |
129 | b6fa9a44 | Michael Hanselmann | raise Exception |
130 | b6fa9a44 | Michael Hanselmann | |
131 | b6fa9a44 | Michael Hanselmann | class _FailingHandler(logging.StreamHandler): |
132 | b6fa9a44 | Michael Hanselmann | def handleError(self, _): |
133 | b6fa9a44 | Michael Hanselmann | raise Exception |
134 | b6fa9a44 | Michael Hanselmann | |
135 | b6fa9a44 | Michael Hanselmann | |
136 | b6fa9a44 | Michael Hanselmann | if __name__ == "__main__": |
137 | b6fa9a44 | Michael Hanselmann | testutils.GanetiTestProgram() |