~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/__init__.py

Add TestCase.addCleanup method.

This is an alternative to overriding the tearDown() method, which tends to 
cause confusion when subclasses want different cleanups, or cleanups that 
should be done in only particular cases.

Show diffs side-by-side

added added

removed removed

Lines of Context:
41
41
from logging import debug, warning, error
42
42
 
43
43
 
44
 
 
45
44
class EarlyStoppingTestResultAdapter(object):
46
45
    """An adapter for TestResult to stop at the first first failure or error"""
47
46
 
162
161
    retrieved by _get_log().
163
162
       
164
163
    There are also convenience functions to invoke bzr's command-line
165
 
    routine, and to build and check bzr trees."""
 
164
    routine, and to build and check bzr trees.
 
165
   
 
166
    In addition to the usual method of overriding tearDown(), this class also
 
167
    allows subclasses to register functions into the _cleanups list, which is
 
168
    run in order as the object is torn down.  It's less likely this will be
 
169
    accidentally overlooked.
 
170
    """
166
171
 
167
172
    BZRPATH = 'bzr'
168
173
    _log_file_name = None
169
174
 
170
175
    def setUp(self):
171
176
        unittest.TestCase.setUp(self)
 
177
        self._cleanups = []
172
178
        self.oldenv = os.environ.get('HOME', None)
173
179
        os.environ['HOME'] = os.getcwd()
174
180
        self.bzr_email = os.environ.get('BZREMAIL')
228
234
        
229
235
        self._log_file_name = name
230
236
 
 
237
    def addCleanup(self, callable):
 
238
        """Arrange to run a callable when this case is torn down.
 
239
 
 
240
        Callables are run in the reverse of the order they are registered, 
 
241
        ie last-in first-out.
 
242
        """
 
243
        self._cleanups.append(callable)
 
244
 
231
245
    def tearDown(self):
232
246
        os.environ['HOME'] = self.oldenv
233
247
        if os.environ.get('BZREMAIL') is not None:
242
256
        bzrlib.trace.enable_default_logging()
243
257
        logging.debug('%s teardown', self.id())
244
258
        self._log_file.close()
 
259
        self._runCleanups()
245
260
        unittest.TestCase.tearDown(self)
246
261
 
 
262
    def _runCleanups(self):
 
263
        """Run registered cleanup functions. 
 
264
 
 
265
        This should only be called from TestCase.tearDown.
 
266
        """
 
267
        for callable in reversed(self._cleanups):
 
268
            callable()
 
269
 
247
270
    def log(self, *args):
248
271
        logging.debug(*args)
249
272