~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/TestUtil.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-10-05 21:15:13 UTC
  • mfrom: (5448.3.5 374700-Add-gnu-lsh-support)
  • Revision ID: pqm@pqm.ubuntu.com-20101005211513-whouyj5t7oo92gmq
(gz) Add support for GNU lsh as a secure shell client (Matthew Gordon)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#       Author: Robert Collins <robert.collins@canonical.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
19
19
import sys
20
20
import logging
21
21
import unittest
22
 
import weakref
23
 
 
24
 
from bzrlib import pyutils
25
22
 
26
23
# Mark this python module as being part of the implementation
27
24
# of unittest: this gives us better tracebacks where the last
30
27
 
31
28
 
32
29
class LogCollector(logging.Handler):
33
 
 
34
30
    def __init__(self):
35
31
        logging.Handler.__init__(self)
36
32
        self.records=[]
37
 
 
38
33
    def emit(self, record):
39
34
        self.records.append(record.getMessage())
40
35
 
63
58
                visitor.visitSuite(test)
64
59
                visitTests(test, visitor)
65
60
            else:
66
 
                print "unvisitable non-unittest.TestCase element %r (%r)" % (
67
 
                    test, test.__class__)
68
 
 
69
 
 
70
 
class FailedCollectionCase(unittest.TestCase):
71
 
    """Pseudo-test to run and report failure if given case was uncollected"""
72
 
 
73
 
    def __init__(self, case):
74
 
        super(FailedCollectionCase, self).__init__("fail_uncollected")
75
 
        # GZ 2011-09-16: Maybe catch errors from id() method as cases may be
76
 
        #                in a bit of a funny state by now.
77
 
        self._problem_case_id = case.id()
78
 
 
79
 
    def id(self):
80
 
        if self._problem_case_id[-1:] == ")":
81
 
            return self._problem_case_id[:-1] + ",uncollected)"
82
 
        return self._problem_case_id + "(uncollected)"
83
 
 
84
 
    def fail_uncollected(self):
85
 
        self.fail("Uncollected test case: " + self._problem_case_id)
 
61
                print "unvisitable non-unittest.TestCase element %r (%r)" % (test, test.__class__)
86
62
 
87
63
 
88
64
class TestSuite(unittest.TestSuite):
101
77
        tests = list(self)
102
78
        tests.reverse()
103
79
        self._tests = []
104
 
        stored_count = 0
105
 
        count_stored_tests = getattr(result, "_count_stored_tests", int)
106
 
        from bzrlib.tests import selftest_debug_flags
107
 
        notify = "uncollected_cases" in selftest_debug_flags
108
80
        while tests:
109
81
            if result.shouldStop:
110
82
                self._tests = reversed(tests)
111
83
                break
112
 
            case = _run_and_collect_case(tests.pop(), result)()
113
 
            new_stored_count = count_stored_tests()
114
 
            if case is not None and isinstance(case, unittest.TestCase):
115
 
                if stored_count == new_stored_count and notify:
116
 
                    # Testcase didn't fail, but somehow is still alive
117
 
                    FailedCollectionCase(case).run(result)
118
 
                    # Adding a new failure so need to reupdate the count
119
 
                    new_stored_count = count_stored_tests()
120
 
                # GZ 2011-09-16: Previously zombied the case at this point by
121
 
                #                clearing the dict as fallback, skip for now.
122
 
            stored_count = new_stored_count
 
84
            tests.pop().run(result)
123
85
        return result
124
86
 
125
87
 
126
 
def _run_and_collect_case(case, res):
127
 
    """Run test case against result and use weakref to drop the refcount"""
128
 
    case.run(res)
129
 
    return weakref.ref(case)
130
 
 
131
 
 
132
88
class TestLoader(unittest.TestLoader):
133
89
    """Custom TestLoader to extend the stock python one."""
134
90
 
150
106
 
151
107
    def loadTestsFromModuleName(self, name):
152
108
        result = self.suiteClass()
153
 
        module = pyutils.get_named_object(name)
 
109
        module = _load_module_by_name(name)
154
110
 
155
111
        result.addTests(self.loadTestsFromModule(module))
156
112
        return result
223
179
            return self.suiteClass()
224
180
 
225
181
 
 
182
def _load_module_by_name(mod_name):
 
183
    parts = mod_name.split('.')
 
184
    module = __import__(mod_name)
 
185
    del parts[0]
 
186
    # for historical reasons python returns the top-level module even though
 
187
    # it loads the submodule; we need to walk down to get the one we want.
 
188
    while parts:
 
189
        module = getattr(module, parts.pop(0))
 
190
    return module
 
191
 
 
192
 
226
193
class TestVisitor(object):
227
194
    """A visitor for Tests"""
228
 
 
229
195
    def visitSuite(self, aTestSuite):
230
196
        pass
231
 
 
232
197
    def visitCase(self, aTestCase):
233
198
        pass