Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.log_unittest.py @ 9a6813ac

History | View | Annotate | Download (6.2 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 b6fa9a44 Michael Hanselmann
  def test(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 b6fa9a44 Michael Hanselmann
      self.assertFalse(utils.VerifyFileID(utils.GetFileID(tmpfile.name),
88 b6fa9a44 Michael Hanselmann
                                          before_id))
89 b6fa9a44 Michael Hanselmann
90 b6fa9a44 Michael Hanselmann
    logger.removeHandler(handler)
91 b6fa9a44 Michael Hanselmann
    self.assertFalse(logger.handlers)
92 b6fa9a44 Michael Hanselmann
    handler.close()
93 b6fa9a44 Michael Hanselmann
94 b6fa9a44 Michael Hanselmann
    self.assertEqual(len(utils.ReadFile(tmpfile.name).splitlines()), 4)
95 b6fa9a44 Michael Hanselmann
    self.assertEqual(len(utils.ReadFile(tmpfile2.name).splitlines()), 3)
96 b6fa9a44 Michael Hanselmann
97 b6fa9a44 Michael Hanselmann
  def testConsole(self):
98 b6fa9a44 Michael Hanselmann
    for (console, check) in [(None, False),
99 b6fa9a44 Michael Hanselmann
                             (tempfile.NamedTemporaryFile(), True),
100 b6fa9a44 Michael Hanselmann
                             (self._FailingFile(os.devnull), False)]:
101 b6fa9a44 Michael Hanselmann
      # Create a handler which will fail when handling errors
102 b6fa9a44 Michael Hanselmann
      cls = utils.log._LogErrorsToConsole(self._FailingHandler)
103 b6fa9a44 Michael Hanselmann
104 b6fa9a44 Michael Hanselmann
      # Instantiate handler with file which will fail when writing,
105 b6fa9a44 Michael Hanselmann
      # provoking a write to the console
106 b6fa9a44 Michael Hanselmann
      handler = cls(console, self._FailingFile(os.devnull))
107 b6fa9a44 Michael Hanselmann
108 b6fa9a44 Michael Hanselmann
      logger = logging.Logger("TestLogger")
109 b6fa9a44 Michael Hanselmann
      logger.addHandler(handler)
110 b6fa9a44 Michael Hanselmann
      self.assertEqual(len(logger.handlers), 1)
111 b6fa9a44 Michael Hanselmann
112 b6fa9a44 Michael Hanselmann
      # Provoke write
113 b6fa9a44 Michael Hanselmann
      logger.error("Test message ERROR")
114 b6fa9a44 Michael Hanselmann
115 b6fa9a44 Michael Hanselmann
      # Take everything apart
116 b6fa9a44 Michael Hanselmann
      logger.removeHandler(handler)
117 b6fa9a44 Michael Hanselmann
      self.assertFalse(logger.handlers)
118 b6fa9a44 Michael Hanselmann
      handler.close()
119 b6fa9a44 Michael Hanselmann
120 b6fa9a44 Michael Hanselmann
      if console and check:
121 b6fa9a44 Michael Hanselmann
        console.flush()
122 b6fa9a44 Michael Hanselmann
123 b6fa9a44 Michael Hanselmann
        # Check console output
124 b6fa9a44 Michael Hanselmann
        consout = utils.ReadFile(console.name)
125 b6fa9a44 Michael Hanselmann
        self.assertTrue("Cannot log message" in consout)
126 b6fa9a44 Michael Hanselmann
        self.assertTrue("Test message ERROR" in consout)
127 b6fa9a44 Michael Hanselmann
128 b6fa9a44 Michael Hanselmann
  class _FailingFile(file):
129 b6fa9a44 Michael Hanselmann
    def write(self, _):
130 b6fa9a44 Michael Hanselmann
      raise Exception
131 b6fa9a44 Michael Hanselmann
132 b6fa9a44 Michael Hanselmann
  class _FailingHandler(logging.StreamHandler):
133 b6fa9a44 Michael Hanselmann
    def handleError(self, _):
134 b6fa9a44 Michael Hanselmann
      raise Exception
135 b6fa9a44 Michael Hanselmann
136 b6fa9a44 Michael Hanselmann
137 9a6813ac Michael Hanselmann
class TestSetupLogging(unittest.TestCase):
138 9a6813ac Michael Hanselmann
  def setUp(self):
139 9a6813ac Michael Hanselmann
    self.tmpdir = tempfile.mkdtemp()
140 9a6813ac Michael Hanselmann
141 9a6813ac Michael Hanselmann
  def tearDown(self):
142 9a6813ac Michael Hanselmann
    shutil.rmtree(self.tmpdir)
143 9a6813ac Michael Hanselmann
144 9a6813ac Michael Hanselmann
  def testSimple(self):
145 9a6813ac Michael Hanselmann
    logfile = utils.PathJoin(self.tmpdir, "basic.log")
146 9a6813ac Michael Hanselmann
    logger = logging.Logger("TestLogger")
147 9a6813ac Michael Hanselmann
    self.assertTrue(callable(utils.SetupLogging(logfile, "test",
148 9a6813ac Michael Hanselmann
                                                console_logging=False,
149 9a6813ac Michael Hanselmann
                                                syslog=constants.SYSLOG_NO,
150 9a6813ac Michael Hanselmann
                                                stderr_logging=False,
151 9a6813ac Michael Hanselmann
                                                multithreaded=False,
152 9a6813ac Michael Hanselmann
                                                root_logger=logger)))
153 9a6813ac Michael Hanselmann
    self.assertEqual(utils.ReadFile(logfile), "")
154 9a6813ac Michael Hanselmann
    logger.error("This is a test")
155 9a6813ac Michael Hanselmann
156 9a6813ac Michael Hanselmann
    # Ensure SetupLogging used custom logger
157 9a6813ac Michael Hanselmann
    logging.error("This message should not show up in the test log file")
158 9a6813ac Michael Hanselmann
159 9a6813ac Michael Hanselmann
    self.assertTrue(utils.ReadFile(logfile).endswith("This is a test\n"))
160 9a6813ac Michael Hanselmann
161 9a6813ac Michael Hanselmann
  def testReopen(self):
162 9a6813ac Michael Hanselmann
    logfile = utils.PathJoin(self.tmpdir, "reopen.log")
163 9a6813ac Michael Hanselmann
    logfile2 = utils.PathJoin(self.tmpdir, "reopen.log.OLD")
164 9a6813ac Michael Hanselmann
    logger = logging.Logger("TestLogger")
165 9a6813ac Michael Hanselmann
    reopen_fn = utils.SetupLogging(logfile, "test",
166 9a6813ac Michael Hanselmann
                                   console_logging=False,
167 9a6813ac Michael Hanselmann
                                   syslog=constants.SYSLOG_NO,
168 9a6813ac Michael Hanselmann
                                   stderr_logging=False,
169 9a6813ac Michael Hanselmann
                                   multithreaded=False,
170 9a6813ac Michael Hanselmann
                                   root_logger=logger)
171 9a6813ac Michael Hanselmann
    self.assertTrue(callable(reopen_fn))
172 9a6813ac Michael Hanselmann
173 9a6813ac Michael Hanselmann
    self.assertEqual(utils.ReadFile(logfile), "")
174 9a6813ac Michael Hanselmann
    logger.error("This is a test")
175 9a6813ac Michael Hanselmann
    self.assertTrue(utils.ReadFile(logfile).endswith("This is a test\n"))
176 9a6813ac Michael Hanselmann
177 9a6813ac Michael Hanselmann
    os.rename(logfile, logfile2)
178 9a6813ac Michael Hanselmann
    assert not os.path.exists(logfile)
179 9a6813ac Michael Hanselmann
180 9a6813ac Michael Hanselmann
    # Notify logger to reopen on the next message
181 9a6813ac Michael Hanselmann
    reopen_fn()
182 9a6813ac Michael Hanselmann
    assert not os.path.exists(logfile)
183 9a6813ac Michael Hanselmann
184 9a6813ac Michael Hanselmann
    # Provoke actual reopen
185 9a6813ac Michael Hanselmann
    logger.error("First message")
186 9a6813ac Michael Hanselmann
187 9a6813ac Michael Hanselmann
    self.assertTrue(utils.ReadFile(logfile).endswith("First message\n"))
188 9a6813ac Michael Hanselmann
    self.assertTrue(utils.ReadFile(logfile2).endswith("This is a test\n"))
189 9a6813ac Michael Hanselmann
190 9a6813ac Michael Hanselmann
191 b6fa9a44 Michael Hanselmann
if __name__ == "__main__":
192 b6fa9a44 Michael Hanselmann
  testutils.GanetiTestProgram()