Statistics
| Branch: | Tag: | Revision:

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