| Index: third_party/WebKit/Tools/Scripts/webkitpy/common/system/logtesting.py
|
| diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/logtesting.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/system/logtesting.py
|
| deleted file mode 100644
|
| index 9dd82898cf41b41d9addefd51726613194ec8520..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Tools/Scripts/webkitpy/common/system/logtesting.py
|
| +++ /dev/null
|
| @@ -1,230 +0,0 @@
|
| -# Copyright (C) 2010 Chris Jerdonek (cjerdonek@webkit.org)
|
| -#
|
| -# Redistribution and use in source and binary forms, with or without
|
| -# modification, are permitted provided that the following conditions
|
| -# are met:
|
| -# 1. Redistributions of source code must retain the above copyright
|
| -# notice, this list of conditions and the following disclaimer.
|
| -# 2. Redistributions in binary form must reproduce the above copyright
|
| -# notice, this list of conditions and the following disclaimer in the
|
| -# documentation and/or other materials provided with the distribution.
|
| -#
|
| -# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
|
| -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
| -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
| -# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
|
| -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
| -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
| -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
| -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
| -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| -
|
| -"""Supports the unit-testing of logging code.
|
| -
|
| -Provides support for unit-testing messages logged using the built-in
|
| -logging module.
|
| -
|
| -Inherit from the LoggingTestCase class for basic testing needs. For
|
| -more advanced needs (e.g. unit-testing methods that configure logging),
|
| -see the TestLogStream class, and perhaps also the LogTesting class.
|
| -"""
|
| -
|
| -import logging
|
| -import unittest
|
| -
|
| -
|
| -class TestLogStream(object):
|
| - """Represents a file-like object for unit-testing logging.
|
| -
|
| - This is meant for passing to the logging.StreamHandler constructor.
|
| - Log messages captured by instances of this object can be tested
|
| - using self.assertMessages() below.
|
| - """
|
| -
|
| - def __init__(self, test_case):
|
| - """Creates an instance.
|
| -
|
| - Args:
|
| - test_case: A unittest.TestCase instance.
|
| - """
|
| - self._test_case = test_case
|
| - self.messages = [] # A list of log messages written to the stream.
|
| -
|
| - # Python documentation says that any object passed to the StreamHandler
|
| - # constructor should support write() and flush().
|
| - #
|
| - # http://docs.python.org/library/logging.html#module-logging.handlers
|
| -
|
| - def write(self, message):
|
| - self.messages.append(message)
|
| -
|
| - def flush(self):
|
| - pass
|
| -
|
| - def assertMessages(self, messages):
|
| - """Asserts that the given messages match the logged messages."""
|
| - self._test_case.assertEqual(messages, self.messages)
|
| -
|
| -
|
| -class LogTesting(object):
|
| - """Supports end-to-end unit-testing of log messages.
|
| -
|
| - Sample usage:
|
| -
|
| - class SampleTest(unittest.TestCase):
|
| -
|
| - def setUp(self):
|
| - self._log = LogTesting.setUp(self) # Turn logging on.
|
| -
|
| - def tearDown(self):
|
| - self._log.tearDown() # Turn off and reset logging.
|
| -
|
| - def test_logging_in_some_method(self):
|
| - call_some_method() # Contains calls to _log.info(), etc.
|
| -
|
| - # Check the resulting log messages.
|
| - self._log.assertMessages(["INFO: expected message #1",
|
| - "WARNING: expected message #2"])
|
| - """
|
| -
|
| - def __init__(self, test_stream, handler):
|
| - """Creates an instance.
|
| -
|
| - This method should never be called directly. Instances should
|
| - instead be created using the static setUp() method.
|
| -
|
| - Args:
|
| - test_stream: A TestLogStream instance.
|
| - handler: The handler added to the logger.
|
| - """
|
| - self._test_stream = test_stream
|
| - self._handler = handler
|
| -
|
| - @staticmethod
|
| - def _getLogger():
|
| - """Returns the logger being tested."""
|
| - # It is possible we might want to return something other than
|
| - # the root logger in some special situation. For now, the
|
| - # root logger seems to suffice.
|
| - return logging.getLogger()
|
| -
|
| - @staticmethod
|
| - def setUp(test_case, logging_level=logging.INFO):
|
| - """Configures logging for unit testing.
|
| -
|
| - Configures the root logger to log to a testing log stream.
|
| - Only messages logged at or above the given level are logged
|
| - to the stream. Messages logged to the stream are formatted
|
| - in the following way, for example--
|
| -
|
| - "INFO: This is a test log message."
|
| -
|
| - This method should normally be called in the setUp() method
|
| - of a unittest.TestCase. See the docstring of this class
|
| - for more details.
|
| -
|
| - Args:
|
| - test_case: A unittest.TestCase instance.
|
| - logging_level: An integer logging level that is the minimum level
|
| - of log messages you would like to test.
|
| -
|
| - Returns:
|
| - A LogTesting instance.
|
| - """
|
| - stream = TestLogStream(test_case)
|
| - handler = logging.StreamHandler(stream)
|
| - handler.setLevel(logging_level)
|
| - formatter = logging.Formatter("%(levelname)s: %(message)s")
|
| - handler.setFormatter(formatter)
|
| -
|
| - # Notice that we only change the root logger by adding a handler
|
| - # to it. In particular, we do not reset its level using
|
| - # logger.setLevel(). This ensures that we have not interfered
|
| - # with how the code being tested may have configured the root
|
| - # logger.
|
| - logger = LogTesting._getLogger()
|
| - logger.setLevel(logging_level)
|
| - logger.addHandler(handler)
|
| -
|
| - return LogTesting(stream, handler)
|
| -
|
| - def tearDown(self):
|
| - """Resets logging."""
|
| - logger = LogTesting._getLogger()
|
| - logger.removeHandler(self._handler)
|
| -
|
| - def messages(self):
|
| - """Returns the current list of log messages."""
|
| - return self._test_stream.messages
|
| -
|
| - # FIXME: Add a clearMessages() method for cases where the caller
|
| - # deliberately doesn't want to assert every message.
|
| -
|
| - def assertMessages(self, messages):
|
| - """Asserts the current array of log messages, and clear its contents.
|
| -
|
| - We clear the log messages after asserting since they are no longer
|
| - needed after asserting. This serves two purposes: (1) it simplifies
|
| - the calling code when we want to check multiple logging calls in a
|
| - single test method, and (2) it lets us check in the tearDown() method
|
| - that there are no remaining log messages to be asserted.
|
| -
|
| - The latter ensures that no extra log messages are getting logged that
|
| - the caller might not be aware of or may have forgotten to check for.
|
| - This gets us a bit more mileage out of our tests without writing any
|
| - additional code.
|
| -
|
| - We want to clear the array of messages even in the case of
|
| - an Exception (e.g. an AssertionError). Otherwise, another
|
| - AssertionError can occur in the tearDown() because the
|
| - array might not have gotten emptied.
|
| -
|
| - Args:
|
| - messages: A list of log message strings.
|
| - """
|
| - try:
|
| - self._test_stream.assertMessages(messages)
|
| - finally:
|
| - self._test_stream.messages = []
|
| -
|
| -
|
| -class LoggingTestCase(unittest.TestCase):
|
| -
|
| - """Supports end-to-end unit-testing of log messages.
|
| -
|
| - This class needs to inherit from unittest.TestCase. Otherwise, the
|
| - setUp() and tearDown() methods will not get fired for test case classes
|
| - that inherit from this class -- even if the class inherits from *both*
|
| - unittest.TestCase and LoggingTestCase.
|
| -
|
| - Sample usage:
|
| -
|
| - class SampleTest(LoggingTestCase):
|
| -
|
| - def test_logging_in_some_method(self):
|
| - call_some_method() # Contains calls to _log.info(), etc.
|
| -
|
| - # Check the resulting log messages.
|
| - self.assertLog(["INFO: expected message #1",
|
| - "WARNING: expected message #2"])
|
| - """
|
| -
|
| - def setUp(self):
|
| - self._log = LogTesting.setUp(self)
|
| -
|
| - def tearDown(self):
|
| - self._log.tearDown()
|
| -
|
| - def logMessages(self):
|
| - """Return the current list of log messages."""
|
| - return self._log.messages()
|
| -
|
| - # FIXME: Add a clearMessages() method for cases where the caller
|
| - # deliberately doesn't want to assert every message.
|
| -
|
| - # See the docstring for LogTesting.assertMessages() for an explanation
|
| - # of why we clear the array of messages after asserting its contents.
|
| - def assertLog(self, messages):
|
| - """Asserts the current array of log messages, and clear its contents."""
|
| - self._log.assertMessages(messages)
|
|
|