diff options
author | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2010-12-10 08:19:38 (GMT) |
---|---|---|
committer | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2010-12-10 08:19:38 (GMT) |
commit | 129fd04440be35c21975417016479ea8a2bc4700 (patch) | |
tree | 69b54996a0368baa6c64ab02123b848594094997 /Lib/test | |
parent | dfa0a2abcf47c0378c992d9dd3e9ea12f57a8d59 (diff) | |
download | cpython-129fd04440be35c21975417016479ea8a2bc4700.zip cpython-129fd04440be35c21975417016479ea8a2bc4700.tar.gz cpython-129fd04440be35c21975417016479ea8a2bc4700.tar.bz2 |
test.support: Added TestHandler and Matcher classes for better support of assertions about logging.
Diffstat (limited to 'Lib/test')
-rw-r--r-- | Lib/test/support.py | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/Lib/test/support.py b/Lib/test/support.py index 20b0f81..7eb3e7d 100644 --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -21,7 +21,7 @@ import subprocess import imp import time import sysconfig - +import logging.handlers try: import _thread @@ -42,7 +42,8 @@ __all__ = [ "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail", "get_attribute", - "swap_item", "swap_attr", "requires_IEEE_754"] + "swap_item", "swap_attr", "requires_IEEE_754", + "TestHandler", "Matr] class Error(Exception): @@ -1343,3 +1344,68 @@ def args_from_interpreter_flags(): if v > 0: args.append('-' + opt * v) return args + +#============================================================ +# Support for assertions about logging. +#============================================================ + +class TestHandler(logging.handlers.BufferingHandler): + def __init__(self, matcher): + # BufferingHandler takes a "capacity" argument + # so as to know when to flush. As we're overriding + # shouldFlush anyway, we can set a capacity of zero. + # You can call flush() manually to clear out the + # buffer. + logging.handlers.BufferingHandler.__init__(self, 0) + self.matcher = matcher + + def shouldFlush(self): + return False + + def emit(self, record): + self.format(record) + self.buffer.append(record.__dict__) + + def matches(self, **kwargs): + """ + Look for a saved dict whose keys/values match the supplied arguments. + """ + result = False + for d in self.buffer: + if self.matcher.matches(d, **kwargs): + result = True + break + return result + +class Matcher(object): + + _partial_matches = ('msg', 'message') + + def matches(self, d, **kwargs): + """ + Try to match a single dict with the supplied arguments. + + Keys whose values are strings and which are in self._partial_matches + will be checked for partial (i.e. substring) matches. You can extend + this scheme to (for example) do regular expression matching, etc. + """ + result = True + for k in kwargs: + v = kwargs[k] + dv = d.get(k) + if not self.match_value(k, dv, v): + result = False + break + return result + + def match_value(self, k, dv, v): + """ + Try to match a single stored value (dv) with a supplied value (v). + """ + if type(v) != type(dv): + result = False + elif type(dv) is not str or k not in self._partial_matches: + result = (v == dv) + else: + result = dv.find(v) >= 0 + return result |