~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/TestUtil.py

  • Committer: Andrew Bennetts
  • Date: 2009-11-25 07:27:43 UTC
  • mto: This revision was merged to the branch mainline in revision 4825.
  • Revision ID: andrew.bennetts@canonical.com-20091125072743-v6sv4m2mkt9iyslp
Terminate SSHSubprocesses when no refs to them are left, in case .close is never called.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2004, 2005, 2006 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
20
20
import logging
21
21
import unittest
22
22
 
23
 
from bzrlib import pyutils
24
 
 
25
23
# Mark this python module as being part of the implementation
26
24
# of unittest: this gives us better tracebacks where the last
27
25
# shown frame is the test code, not our assertXYZ.
29
27
 
30
28
 
31
29
class LogCollector(logging.Handler):
32
 
 
33
30
    def __init__(self):
34
31
        logging.Handler.__init__(self)
35
32
        self.records=[]
36
 
 
37
33
    def emit(self, record):
38
34
        self.records.append(record.getMessage())
39
35
 
62
58
                visitor.visitSuite(test)
63
59
                visitTests(test, visitor)
64
60
            else:
65
 
                print "unvisitable non-unittest.TestCase element %r (%r)" % (
66
 
                    test, test.__class__)
 
61
                print "unvisitable non-unittest.TestCase element %r (%r)" % (test, test.__class__)
67
62
 
68
63
 
69
64
class TestSuite(unittest.TestSuite):
77
72
        visitor.visitSuite(self)
78
73
        visitTests(self, visitor)
79
74
 
80
 
    def run(self, result):
81
 
        """Run the tests in the suite, discarding references after running."""
82
 
        tests = list(self)
83
 
        tests.reverse()
84
 
        self._tests = []
85
 
        while tests:
86
 
            if result.shouldStop:
87
 
                self._tests = reversed(tests)
88
 
                break
89
 
            tests.pop().run(result)
90
 
        return result
91
 
 
92
75
 
93
76
class TestLoader(unittest.TestLoader):
94
77
    """Custom TestLoader to extend the stock python one."""
111
94
 
112
95
    def loadTestsFromModuleName(self, name):
113
96
        result = self.suiteClass()
114
 
        module = pyutils.get_named_object(name)
 
97
        module = _load_module_by_name(name)
115
98
 
116
99
        result.addTests(self.loadTestsFromModule(module))
117
100
        return result
140
123
        >>>         result.addTests([test, test])
141
124
        >>>     return result
142
125
        """
143
 
        if sys.version_info < (2, 7):
144
 
            basic_tests = super(TestLoader, self).loadTestsFromModule(module)
145
 
        else:
146
 
            # GZ 2010-07-19: Python 2.7 unittest also uses load_tests but with
147
 
            #                a different and incompatible signature
148
 
            basic_tests = super(TestLoader, self).loadTestsFromModule(module,
149
 
                use_load_tests=False)
 
126
        basic_tests = super(TestLoader, self).loadTestsFromModule(module)
150
127
        load_tests = getattr(module, "load_tests", None)
151
128
        if load_tests is not None:
152
129
            return load_tests(basic_tests, module, self)
184
161
            return self.suiteClass()
185
162
 
186
163
 
 
164
def _load_module_by_name(mod_name):
 
165
    parts = mod_name.split('.')
 
166
    module = __import__(mod_name)
 
167
    del parts[0]
 
168
    # for historical reasons python returns the top-level module even though
 
169
    # it loads the submodule; we need to walk down to get the one we want.
 
170
    while parts:
 
171
        module = getattr(module, parts.pop(0))
 
172
    return module
 
173
 
 
174
 
187
175
class TestVisitor(object):
188
176
    """A visitor for Tests"""
189
 
 
190
177
    def visitSuite(self, aTestSuite):
191
178
        pass
192
 
 
193
179
    def visitCase(self, aTestCase):
194
180
        pass