Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.log_unittest.py @ 415feb2e

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()