~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: Andrew Bennetts
  • Date: 2010-10-08 04:25:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5472.
  • Revision ID: andrew.bennetts@canonical.com-20101008042510-sg9vdhmnggilzxsk
Fix stray TAB in source.

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
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
55
55
import testtools
56
56
# nb: check this before importing anything else from within it
57
57
_testtools_version = getattr(testtools, '__version__', ())
58
 
if _testtools_version < (0, 9, 5):
59
 
    raise ImportError("need at least testtools 0.9.5: %s is %r"
 
58
if _testtools_version < (0, 9, 2):
 
59
    raise ImportError("need at least testtools 0.9.2: %s is %r"
60
60
        % (testtools.__file__, _testtools_version))
61
61
from testtools import content
62
62
 
63
 
import bzrlib
64
63
from bzrlib import (
65
64
    branchbuilder,
66
65
    bzrdir,
67
66
    chk_map,
68
 
    commands as _mod_commands,
69
67
    config,
70
68
    debug,
71
69
    errors,
72
70
    hooks,
73
71
    lock as _mod_lock,
74
 
    lockdir,
75
72
    memorytree,
76
73
    osutils,
77
 
    plugin as _mod_plugin,
78
 
    pyutils,
79
74
    ui,
80
75
    urlutils,
81
76
    registry,
82
 
    symbol_versioning,
83
 
    trace,
84
77
    transport as _mod_transport,
85
78
    workingtree,
86
79
    )
 
80
import bzrlib.branch
 
81
import bzrlib.commands
 
82
import bzrlib.timestamp
 
83
import bzrlib.export
 
84
import bzrlib.inventory
 
85
import bzrlib.iterablefile
 
86
import bzrlib.lockdir
87
87
try:
88
88
    import bzrlib.lsprof
89
89
except ImportError:
90
90
    # lsprof not available
91
91
    pass
92
 
from bzrlib.smart import client, request
 
92
from bzrlib.merge import merge_inner
 
93
import bzrlib.merge3
 
94
import bzrlib.plugin
 
95
from bzrlib.smart import client, request, server
 
96
import bzrlib.store
 
97
from bzrlib import symbol_versioning
 
98
from bzrlib.symbol_versioning import (
 
99
    DEPRECATED_PARAMETER,
 
100
    deprecated_function,
 
101
    deprecated_in,
 
102
    deprecated_method,
 
103
    deprecated_passed,
 
104
    )
 
105
import bzrlib.trace
93
106
from bzrlib.transport import (
94
107
    memory,
95
108
    pathfilter,
96
109
    )
 
110
from bzrlib.trace import mutter, note
97
111
from bzrlib.tests import (
98
112
    test_server,
99
113
    TestUtil,
101
115
    )
102
116
from bzrlib.ui import NullProgressView
103
117
from bzrlib.ui.text import TextUIFactory
 
118
import bzrlib.version_info_formats.format_custom
 
119
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
104
120
 
105
121
# Mark this python module as being part of the implementation
106
122
# of unittest: this gives us better tracebacks where the last
123
139
TestSuite = TestUtil.TestSuite
124
140
TestLoader = TestUtil.TestLoader
125
141
 
126
 
# Tests should run in a clean and clearly defined environment. The goal is to
127
 
# keep them isolated from the running environment as mush as possible. The test
128
 
# framework ensures the variables defined below are set (or deleted if the
129
 
# value is None) before a test is run and reset to their original value after
130
 
# the test is run. Generally if some code depends on an environment variable,
131
 
# the tests should start without this variable in the environment. There are a
132
 
# few exceptions but you shouldn't violate this rule lightly.
133
 
isolated_environ = {
134
 
    'BZR_HOME': None,
135
 
    'HOME': None,
136
 
    # bzr now uses the Win32 API and doesn't rely on APPDATA, but the
137
 
    # tests do check our impls match APPDATA
138
 
    'BZR_EDITOR': None, # test_msgeditor manipulates this variable
139
 
    'VISUAL': None,
140
 
    'EDITOR': None,
141
 
    'BZR_EMAIL': None,
142
 
    'BZREMAIL': None, # may still be present in the environment
143
 
    'EMAIL': 'jrandom@example.com', # set EMAIL as bzr does not guess
144
 
    'BZR_PROGRESS_BAR': None,
145
 
    'BZR_LOG': None,
146
 
    'BZR_PLUGIN_PATH': None,
147
 
    'BZR_DISABLE_PLUGINS': None,
148
 
    'BZR_PLUGINS_AT': None,
149
 
    'BZR_CONCURRENCY': None,
150
 
    # Make sure that any text ui tests are consistent regardless of
151
 
    # the environment the test case is run in; you may want tests that
152
 
    # test other combinations.  'dumb' is a reasonable guess for tests
153
 
    # going to a pipe or a StringIO.
154
 
    'TERM': 'dumb',
155
 
    'LINES': '25',
156
 
    'COLUMNS': '80',
157
 
    'BZR_COLUMNS': '80',
158
 
    # Disable SSH Agent
159
 
    'SSH_AUTH_SOCK': None,
160
 
    # Proxies
161
 
    'http_proxy': None,
162
 
    'HTTP_PROXY': None,
163
 
    'https_proxy': None,
164
 
    'HTTPS_PROXY': None,
165
 
    'no_proxy': None,
166
 
    'NO_PROXY': None,
167
 
    'all_proxy': None,
168
 
    'ALL_PROXY': None,
169
 
    # Nobody cares about ftp_proxy, FTP_PROXY AFAIK. So far at
170
 
    # least. If you do (care), please update this comment
171
 
    # -- vila 20080401
172
 
    'ftp_proxy': None,
173
 
    'FTP_PROXY': None,
174
 
    'BZR_REMOTE_PATH': None,
175
 
    # Generally speaking, we don't want apport reporting on crashes in
176
 
    # the test envirnoment unless we're specifically testing apport,
177
 
    # so that it doesn't leak into the real system environment.  We
178
 
    # use an env var so it propagates to subprocesses.
179
 
    'APPORT_DISABLE': '1',
180
 
    }
181
 
 
182
 
 
183
 
def override_os_environ(test, env=None):
184
 
    """Modify os.environ keeping a copy.
185
 
    
186
 
    :param test: A test instance
187
 
 
188
 
    :param env: A dict containing variable definitions to be installed
189
 
    """
190
 
    if env is None:
191
 
        env = isolated_environ
192
 
    test._original_os_environ = dict([(var, value)
193
 
                                      for var, value in os.environ.iteritems()])
194
 
    for var, value in env.iteritems():
195
 
        osutils.set_or_unset_env(var, value)
196
 
        if var not in test._original_os_environ:
197
 
            # The var is new, add it with a value of None, so
198
 
            # restore_os_environ will delete it
199
 
            test._original_os_environ[var] = None
200
 
 
201
 
 
202
 
def restore_os_environ(test):
203
 
    """Restore os.environ to its original state.
204
 
 
205
 
    :param test: A test instance previously passed to override_os_environ.
206
 
    """
207
 
    for var, value in test._original_os_environ.iteritems():
208
 
        # Restore the original value (or delete it if the value has been set to
209
 
        # None in override_os_environ).
210
 
        osutils.set_or_unset_env(var, value)
211
 
 
212
 
 
213
142
class ExtendedTestResult(testtools.TextTestResult):
214
143
    """Accepts, reports and accumulates the results of running tests.
215
144
 
266
195
        self._strict = strict
267
196
        self._first_thread_leaker_id = None
268
197
        self._tests_leaking_threads_count = 0
269
 
        self._traceback_from_test = None
270
198
 
271
199
    def stopTestRun(self):
272
200
        run = self.testsRun
353
281
        what = re.sub(r'^bzrlib\.tests\.', '', what)
354
282
        return what
355
283
 
356
 
    # GZ 2010-10-04: Cloned tests may end up harmlessly calling this method
357
 
    #                multiple times in a row, because the handler is added for
358
 
    #                each test but the container list is shared between cases.
359
 
    #                See lp:498869 lp:625574 and lp:637725 for background.
360
 
    def _record_traceback_from_test(self, exc_info):
361
 
        """Store the traceback from passed exc_info tuple till"""
362
 
        self._traceback_from_test = exc_info[2]
363
 
 
364
284
    def startTest(self, test):
365
285
        super(ExtendedTestResult, self).startTest(test)
366
286
        if self.count == 0:
369
289
        self.report_test_start(test)
370
290
        test.number = self.count
371
291
        self._recordTestStartTime()
372
 
        # Make testtools cases give us the real traceback on failure
373
 
        addOnException = getattr(test, "addOnException", None)
374
 
        if addOnException is not None:
375
 
            addOnException(self._record_traceback_from_test)
376
 
        # Only check for thread leaks on bzrlib derived test cases
377
 
        if isinstance(test, TestCase):
378
 
            test.addCleanup(self._check_leaked_threads, test)
 
292
        # Only check for thread leaks if the test case supports cleanups
 
293
        addCleanup = getattr(test, "addCleanup", None)
 
294
        if addCleanup is not None:
 
295
            addCleanup(self._check_leaked_threads, test)
379
296
 
380
297
    def startTests(self):
381
298
        self.report_tests_starting()
382
299
        self._active_threads = threading.enumerate()
383
300
 
384
 
    def stopTest(self, test):
385
 
        self._traceback_from_test = None
386
 
 
387
301
    def _check_leaked_threads(self, test):
388
302
        """See if any threads have leaked since last call
389
303
 
410
324
        Called from the TestCase run() method when the test
411
325
        fails with an unexpected error.
412
326
        """
413
 
        self._post_mortem(self._traceback_from_test)
 
327
        self._post_mortem()
414
328
        super(ExtendedTestResult, self).addError(test, err)
415
329
        self.error_count += 1
416
330
        self.report_error(test, err)
423
337
        Called from the TestCase run() method when the test
424
338
        fails because e.g. an assert() method failed.
425
339
        """
426
 
        self._post_mortem(self._traceback_from_test)
 
340
        self._post_mortem()
427
341
        super(ExtendedTestResult, self).addFailure(test, err)
428
342
        self.failure_count += 1
429
343
        self.report_failure(test, err)
471
385
        self.not_applicable_count += 1
472
386
        self.report_not_applicable(test, reason)
473
387
 
474
 
    def _post_mortem(self, tb=None):
 
388
    def _post_mortem(self):
475
389
        """Start a PDB post mortem session."""
476
390
        if os.environ.get('BZR_TEST_PDB', None):
477
 
            import pdb
478
 
            pdb.post_mortem(tb)
 
391
            import pdb;pdb.post_mortem()
479
392
 
480
393
    def progress(self, offset, whence):
481
394
        """The test is adjusting the count of tests to run."""
722
635
            encode = codec[0]
723
636
        else:
724
637
            encode = codec.encode
725
 
        # GZ 2010-09-08: Really we don't want to be writing arbitrary bytes,
726
 
        #                so should swap to the plain codecs.StreamWriter
727
 
        stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream,
728
 
            "backslashreplace")
 
638
        stream = osutils.UnicodeOrBytesToBytesWriter(encode, stream)
729
639
        stream.encoding = new_encoding
730
640
        self.stream = stream
731
641
        self.descriptions = descriptions
881
791
        return NullProgressView()
882
792
 
883
793
 
884
 
def isolated_doctest_setUp(test):
885
 
    override_os_environ(test)
886
 
 
887
 
 
888
 
def isolated_doctest_tearDown(test):
889
 
    restore_os_environ(test)
890
 
 
891
 
 
892
 
def IsolatedDocTestSuite(*args, **kwargs):
893
 
    """Overrides doctest.DocTestSuite to handle isolation.
894
 
 
895
 
    The method is really a factory and users are expected to use it as such.
896
 
    """
897
 
    
898
 
    kwargs['setUp'] = isolated_doctest_setUp
899
 
    kwargs['tearDown'] = isolated_doctest_tearDown
900
 
    return doctest.DocTestSuite(*args, **kwargs)
901
 
 
902
 
 
903
794
class TestCase(testtools.TestCase):
904
795
    """Base class for bzr unit tests.
905
796
 
950
841
        self._track_transports()
951
842
        self._track_locks()
952
843
        self._clear_debug_flags()
953
 
        # Isolate global verbosity level, to make sure it's reproducible
954
 
        # between tests.  We should get rid of this altogether: bug 656694. --
955
 
        # mbp 20101008
956
 
        self.overrideAttr(bzrlib.trace, '_verbosity_level', 0)
957
 
        # Isolate config option expansion until its default value for bzrlib is
958
 
        # settled on or a the FIXME associated with _get_expand_default_value
959
 
        # is addressed -- vila 20110219
960
 
        self.overrideAttr(config, '_expand_default_value', None)
961
844
 
962
845
    def debug(self):
963
846
        # debug a frame up.
995
878
 
996
879
    def _clear_hooks(self):
997
880
        # prevent hooks affecting tests
998
 
        known_hooks = hooks.known_hooks
999
881
        self._preserved_hooks = {}
1000
 
        for key, (parent, name) in known_hooks.iter_parent_objects():
1001
 
            current_hooks = getattr(parent, name)
 
882
        for key, factory in hooks.known_hooks.items():
 
883
            parent, name = hooks.known_hooks_key_to_parent_and_attribute(key)
 
884
            current_hooks = hooks.known_hooks_key_to_object(key)
1002
885
            self._preserved_hooks[parent] = (name, current_hooks)
1003
 
        self._preserved_lazy_hooks = hooks._lazy_hooks
1004
 
        hooks._lazy_hooks = {}
1005
886
        self.addCleanup(self._restoreHooks)
1006
 
        for key, (parent, name) in known_hooks.iter_parent_objects():
1007
 
            factory = known_hooks.get(key)
 
887
        for key, factory in hooks.known_hooks.items():
 
888
            parent, name = hooks.known_hooks_key_to_parent_and_attribute(key)
1008
889
            setattr(parent, name, factory())
1009
890
        # this hook should always be installed
1010
891
        request._install_hook()
1222
1103
        except UnicodeError, e:
1223
1104
            # If we can't compare without getting a UnicodeError, then
1224
1105
            # obviously they are different
1225
 
            trace.mutter('UnicodeError: %s', e)
 
1106
            mutter('UnicodeError: %s', e)
1226
1107
        if message:
1227
1108
            message += '\n'
1228
1109
        raise AssertionError("%snot equal:\na = %s\nb = %s\n"
1267
1148
                         'st_mtime did not match')
1268
1149
        self.assertEqual(expected.st_ctime, actual.st_ctime,
1269
1150
                         'st_ctime did not match')
1270
 
        if sys.platform == 'win32':
 
1151
        if sys.platform != 'win32':
1271
1152
            # On Win32 both 'dev' and 'ino' cannot be trusted. In python2.4 it
1272
1153
            # is 'dev' that varies, in python 2.5 (6?) it is st_ino that is
1273
 
            # odd. We just force it to always be 0 to avoid any problems.
1274
 
            self.assertEqual(0, expected.st_dev)
1275
 
            self.assertEqual(0, actual.st_dev)
1276
 
            self.assertEqual(0, expected.st_ino)
1277
 
            self.assertEqual(0, actual.st_ino)
1278
 
        else:
 
1154
            # odd. Regardless we shouldn't actually try to assert anything
 
1155
            # about their values
1279
1156
            self.assertEqual(expected.st_dev, actual.st_dev,
1280
1157
                             'st_dev did not match')
1281
1158
            self.assertEqual(expected.st_ino, actual.st_ino,
1292
1169
    def assertLogsError(self, exception_class, func, *args, **kwargs):
1293
1170
        """Assert that func(*args, **kwargs) quietly logs a specific exception.
1294
1171
        """
 
1172
        from bzrlib import trace
1295
1173
        captured = []
1296
1174
        orig_log_exception_quietly = trace.log_exception_quietly
1297
1175
        try:
1346
1224
        if haystack.find(needle) == -1:
1347
1225
            self.fail("string %r not found in '''%s'''" % (needle, haystack))
1348
1226
 
1349
 
    def assertNotContainsString(self, haystack, needle):
1350
 
        if haystack.find(needle) != -1:
1351
 
            self.fail("string %r found in '''%s'''" % (needle, haystack))
1352
 
 
1353
1227
    def assertSubset(self, sublist, superlist):
1354
1228
        """Assert that every entry in sublist is present in superlist."""
1355
1229
        missing = set(sublist) - set(superlist)
1444
1318
 
1445
1319
    def assertFileEqual(self, content, path):
1446
1320
        """Fail if path does not contain 'content'."""
1447
 
        self.assertPathExists(path)
 
1321
        self.failUnlessExists(path)
1448
1322
        f = file(path, 'rb')
1449
1323
        try:
1450
1324
            s = f.read()
1460
1334
        else:
1461
1335
            self.assertEqual(expected_docstring, obj.__doc__)
1462
1336
 
1463
 
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4)))
1464
1337
    def failUnlessExists(self, path):
1465
 
        return self.assertPathExists(path)
1466
 
 
1467
 
    def assertPathExists(self, path):
1468
1338
        """Fail unless path or paths, which may be abs or relative, exist."""
1469
1339
        if not isinstance(path, basestring):
1470
1340
            for p in path:
1471
 
                self.assertPathExists(p)
 
1341
                self.failUnlessExists(p)
1472
1342
        else:
1473
 
            self.assertTrue(osutils.lexists(path),
1474
 
                path + " does not exist")
 
1343
            self.failUnless(osutils.lexists(path),path+" does not exist")
1475
1344
 
1476
 
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4)))
1477
1345
    def failIfExists(self, path):
1478
 
        return self.assertPathDoesNotExist(path)
1479
 
 
1480
 
    def assertPathDoesNotExist(self, path):
1481
1346
        """Fail if path or paths, which may be abs or relative, exist."""
1482
1347
        if not isinstance(path, basestring):
1483
1348
            for p in path:
1484
 
                self.assertPathDoesNotExist(p)
 
1349
                self.failIfExists(p)
1485
1350
        else:
1486
 
            self.assertFalse(osutils.lexists(path),
1487
 
                path + " exists")
 
1351
            self.failIf(osutils.lexists(path),path+" exists")
1488
1352
 
1489
1353
    def _capture_deprecation_warnings(self, a_callable, *args, **kwargs):
1490
1354
        """A helper for callDeprecated and applyDeprecated.
1605
1469
        The file is removed as the test is torn down.
1606
1470
        """
1607
1471
        self._log_file = StringIO()
1608
 
        self._log_memento = trace.push_log_file(self._log_file)
 
1472
        self._log_memento = bzrlib.trace.push_log_file(self._log_file)
1609
1473
        self.addCleanup(self._finishLogFile)
1610
1474
 
1611
1475
    def _finishLogFile(self):
1613
1477
 
1614
1478
        Close the file and delete it, unless setKeepLogfile was called.
1615
1479
        """
1616
 
        if trace._trace_file:
 
1480
        if bzrlib.trace._trace_file:
1617
1481
            # flush the log file, to get all content
1618
 
            trace._trace_file.flush()
1619
 
        trace.pop_log_file(self._log_memento)
 
1482
            bzrlib.trace._trace_file.flush()
 
1483
        bzrlib.trace.pop_log_file(self._log_memento)
1620
1484
        # Cache the log result and delete the file on disk
1621
1485
        self._get_log(False)
1622
1486
 
1652
1516
            setattr(obj, attr_name, new)
1653
1517
        return value
1654
1518
 
1655
 
    def overrideEnv(self, name, new):
1656
 
        """Set an environment variable, and reset it after the test.
1657
 
 
1658
 
        :param name: The environment variable name.
1659
 
 
1660
 
        :param new: The value to set the variable to. If None, the 
1661
 
            variable is deleted from the environment.
1662
 
 
1663
 
        :returns: The actual variable value.
1664
 
        """
1665
 
        value = osutils.set_or_unset_env(name, new)
1666
 
        self.addCleanup(osutils.set_or_unset_env, name, value)
1667
 
        return value
1668
 
 
1669
1519
    def _cleanEnvironment(self):
1670
 
        for name, value in isolated_environ.iteritems():
1671
 
            self.overrideEnv(name, value)
 
1520
        new_env = {
 
1521
            'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
 
1522
            'HOME': os.getcwd(),
 
1523
            # bzr now uses the Win32 API and doesn't rely on APPDATA, but the
 
1524
            # tests do check our impls match APPDATA
 
1525
            'BZR_EDITOR': None, # test_msgeditor manipulates this variable
 
1526
            'VISUAL': None,
 
1527
            'EDITOR': None,
 
1528
            'BZR_EMAIL': None,
 
1529
            'BZREMAIL': None, # may still be present in the environment
 
1530
            'EMAIL': 'jrandom@example.com', # set EMAIL as bzr does not guess
 
1531
            'BZR_PROGRESS_BAR': None,
 
1532
            'BZR_LOG': None,
 
1533
            'BZR_PLUGIN_PATH': None,
 
1534
            'BZR_DISABLE_PLUGINS': None,
 
1535
            'BZR_PLUGINS_AT': None,
 
1536
            'BZR_CONCURRENCY': None,
 
1537
            # Make sure that any text ui tests are consistent regardless of
 
1538
            # the environment the test case is run in; you may want tests that
 
1539
            # test other combinations.  'dumb' is a reasonable guess for tests
 
1540
            # going to a pipe or a StringIO.
 
1541
            'TERM': 'dumb',
 
1542
            'LINES': '25',
 
1543
            'COLUMNS': '80',
 
1544
            'BZR_COLUMNS': '80',
 
1545
            # SSH Agent
 
1546
            'SSH_AUTH_SOCK': None,
 
1547
            # Proxies
 
1548
            'http_proxy': None,
 
1549
            'HTTP_PROXY': None,
 
1550
            'https_proxy': None,
 
1551
            'HTTPS_PROXY': None,
 
1552
            'no_proxy': None,
 
1553
            'NO_PROXY': None,
 
1554
            'all_proxy': None,
 
1555
            'ALL_PROXY': None,
 
1556
            # Nobody cares about ftp_proxy, FTP_PROXY AFAIK. So far at
 
1557
            # least. If you do (care), please update this comment
 
1558
            # -- vila 20080401
 
1559
            'ftp_proxy': None,
 
1560
            'FTP_PROXY': None,
 
1561
            'BZR_REMOTE_PATH': None,
 
1562
            # Generally speaking, we don't want apport reporting on crashes in
 
1563
            # the test envirnoment unless we're specifically testing apport,
 
1564
            # so that it doesn't leak into the real system environment.  We
 
1565
            # use an env var so it propagates to subprocesses.
 
1566
            'APPORT_DISABLE': '1',
 
1567
        }
 
1568
        self._old_env = {}
 
1569
        self.addCleanup(self._restoreEnvironment)
 
1570
        for name, value in new_env.iteritems():
 
1571
            self._captureVar(name, value)
 
1572
 
 
1573
    def _captureVar(self, name, newvalue):
 
1574
        """Set an environment variable, and reset it when finished."""
 
1575
        self._old_env[name] = osutils.set_or_unset_env(name, newvalue)
 
1576
 
 
1577
    def _restoreEnvironment(self):
 
1578
        for name, value in self._old_env.iteritems():
 
1579
            osutils.set_or_unset_env(name, value)
1672
1580
 
1673
1581
    def _restoreHooks(self):
1674
1582
        for klass, (name, hooks) in self._preserved_hooks.items():
1675
1583
            setattr(klass, name, hooks)
1676
 
        hooks._lazy_hooks = self._preserved_lazy_hooks
1677
1584
 
1678
1585
    def knownFailure(self, reason):
1679
1586
        """This test has failed for some known reason."""
1769
1676
            self._benchtime += time.time() - start
1770
1677
 
1771
1678
    def log(self, *args):
1772
 
        trace.mutter(*args)
 
1679
        mutter(*args)
1773
1680
 
1774
1681
    def _get_log(self, keep_log_file=False):
1775
1682
        """Internal helper to get the log from bzrlib.trace for this test.
1860
1767
 
1861
1768
        try:
1862
1769
            try:
1863
 
                result = self.apply_redirected(
1864
 
                    ui.ui_factory.stdin,
 
1770
                result = self.apply_redirected(ui.ui_factory.stdin,
1865
1771
                    stdout, stderr,
1866
 
                    _mod_commands.run_bzr_catch_user_errors,
 
1772
                    bzrlib.commands.run_bzr_catch_user_errors,
1867
1773
                    args)
1868
1774
            except KeyboardInterrupt:
1869
1775
                # Reraise KeyboardInterrupt with contents of redirected stdout
2119
2025
        if retcode is not None and retcode != process.returncode:
2120
2026
            if process_args is None:
2121
2027
                process_args = "(unknown args)"
2122
 
            trace.mutter('Output of bzr %s:\n%s', process_args, out)
2123
 
            trace.mutter('Error for bzr %s:\n%s', process_args, err)
 
2028
            mutter('Output of bzr %s:\n%s', process_args, out)
 
2029
            mutter('Error for bzr %s:\n%s', process_args, err)
2124
2030
            self.fail('Command bzr %s failed with retcode %s != %s'
2125
2031
                      % (process_args, retcode, process.returncode))
2126
2032
        return [out, err]
2183
2089
 
2184
2090
        Tests that expect to provoke LockContention errors should call this.
2185
2091
        """
2186
 
        self.overrideAttr(lockdir, '_DEFAULT_TIMEOUT_SECONDS', 0)
 
2092
        self.overrideAttr(bzrlib.lockdir, '_DEFAULT_TIMEOUT_SECONDS', 0)
2187
2093
 
2188
2094
    def make_utf8_encoded_stringio(self, encoding_type=None):
2189
2095
        """Return a StringIOWrapper instance, that will encode Unicode
2513
2419
        test_home_dir = self.test_home_dir
2514
2420
        if isinstance(test_home_dir, unicode):
2515
2421
            test_home_dir = test_home_dir.encode(sys.getfilesystemencoding())
2516
 
        self.overrideEnv('HOME', test_home_dir)
2517
 
        self.overrideEnv('BZR_HOME', test_home_dir)
 
2422
        os.environ['HOME'] = test_home_dir
 
2423
        os.environ['BZR_HOME'] = test_home_dir
2518
2424
 
2519
2425
    def setUp(self):
2520
2426
        super(TestCaseWithMemoryTransport, self).setUp()
3426
3332
    return result
3427
3333
 
3428
3334
 
3429
 
class ProfileResult(testtools.ExtendedToOriginalDecorator):
 
3335
class ForwardingResult(unittest.TestResult):
 
3336
 
 
3337
    def __init__(self, target):
 
3338
        unittest.TestResult.__init__(self)
 
3339
        self.result = target
 
3340
 
 
3341
    def startTest(self, test):
 
3342
        self.result.startTest(test)
 
3343
 
 
3344
    def stopTest(self, test):
 
3345
        self.result.stopTest(test)
 
3346
 
 
3347
    def startTestRun(self):
 
3348
        self.result.startTestRun()
 
3349
 
 
3350
    def stopTestRun(self):
 
3351
        self.result.stopTestRun()
 
3352
 
 
3353
    def addSkip(self, test, reason):
 
3354
        self.result.addSkip(test, reason)
 
3355
 
 
3356
    def addSuccess(self, test):
 
3357
        self.result.addSuccess(test)
 
3358
 
 
3359
    def addError(self, test, err):
 
3360
        self.result.addError(test, err)
 
3361
 
 
3362
    def addFailure(self, test, err):
 
3363
        self.result.addFailure(test, err)
 
3364
ForwardingResult = testtools.ExtendedToOriginalDecorator
 
3365
 
 
3366
 
 
3367
class ProfileResult(ForwardingResult):
3430
3368
    """Generate profiling data for all activity between start and success.
3431
3369
    
3432
3370
    The profile data is appended to the test's _benchcalls attribute and can
3444
3382
        # unavoidably fail.
3445
3383
        bzrlib.lsprof.BzrProfiler.profiler_block = 0
3446
3384
        self.profiler.start()
3447
 
        testtools.ExtendedToOriginalDecorator.startTest(self, test)
 
3385
        ForwardingResult.startTest(self, test)
3448
3386
 
3449
3387
    def addSuccess(self, test):
3450
3388
        stats = self.profiler.stop()
3454
3392
            test._benchcalls = []
3455
3393
            calls = test._benchcalls
3456
3394
        calls.append(((test.id(), "", ""), stats))
3457
 
        testtools.ExtendedToOriginalDecorator.addSuccess(self, test)
 
3395
        ForwardingResult.addSuccess(self, test)
3458
3396
 
3459
3397
    def stopTest(self, test):
3460
 
        testtools.ExtendedToOriginalDecorator.stopTest(self, test)
 
3398
        ForwardingResult.stopTest(self, test)
3461
3399
        self.profiler = None
3462
3400
 
3463
3401
 
3670
3608
                key, obj, help=help, info=info, override_existing=False)
3671
3609
        except KeyError:
3672
3610
            actual = self.get(key)
3673
 
            trace.note(
3674
 
                'Test prefix alias %s is already used for %s, ignoring %s'
3675
 
                % (key, actual, obj))
 
3611
            note('Test prefix alias %s is already used for %s, ignoring %s'
 
3612
                 % (key, actual, obj))
3676
3613
 
3677
3614
    def resolve_alias(self, id_start):
3678
3615
        """Replace the alias by the prefix in the given string.
3728
3665
        'bzrlib.tests.per_repository',
3729
3666
        'bzrlib.tests.per_repository_chk',
3730
3667
        'bzrlib.tests.per_repository_reference',
3731
 
        'bzrlib.tests.per_repository_vf',
3732
3668
        'bzrlib.tests.per_uifactory',
3733
3669
        'bzrlib.tests.per_versionedfile',
3734
3670
        'bzrlib.tests.per_workingtree',
3768
3704
        'bzrlib.tests.test_commit_merge',
3769
3705
        'bzrlib.tests.test_config',
3770
3706
        'bzrlib.tests.test_conflicts',
3771
 
        'bzrlib.tests.test_controldir',
3772
3707
        'bzrlib.tests.test_counted_lock',
3773
3708
        'bzrlib.tests.test_crash',
3774
3709
        'bzrlib.tests.test_decorators',
3825
3760
        'bzrlib.tests.test_merge3',
3826
3761
        'bzrlib.tests.test_merge_core',
3827
3762
        'bzrlib.tests.test_merge_directive',
3828
 
        'bzrlib.tests.test_mergetools',
3829
3763
        'bzrlib.tests.test_missing',
3830
3764
        'bzrlib.tests.test_msgeditor',
3831
3765
        'bzrlib.tests.test_multiparent',
3840
3774
        'bzrlib.tests.test_permissions',
3841
3775
        'bzrlib.tests.test_plugins',
3842
3776
        'bzrlib.tests.test_progress',
3843
 
        'bzrlib.tests.test_pyutils',
3844
3777
        'bzrlib.tests.test_read_bundle',
3845
3778
        'bzrlib.tests.test_reconcile',
3846
3779
        'bzrlib.tests.test_reconfigure',
3855
3788
        'bzrlib.tests.test_rio',
3856
3789
        'bzrlib.tests.test_rules',
3857
3790
        'bzrlib.tests.test_sampler',
3858
 
        'bzrlib.tests.test_scenarios',
3859
3791
        'bzrlib.tests.test_script',
3860
3792
        'bzrlib.tests.test_selftest',
3861
3793
        'bzrlib.tests.test_serializer',
3881
3813
        'bzrlib.tests.test_testament',
3882
3814
        'bzrlib.tests.test_textfile',
3883
3815
        'bzrlib.tests.test_textmerge',
3884
 
        'bzrlib.tests.test_cethread',
3885
3816
        'bzrlib.tests.test_timestamp',
3886
3817
        'bzrlib.tests.test_trace',
3887
3818
        'bzrlib.tests.test_transactions',
3920
3851
        'bzrlib',
3921
3852
        'bzrlib.branchbuilder',
3922
3853
        'bzrlib.decorators',
 
3854
        'bzrlib.export',
3923
3855
        'bzrlib.inventory',
3924
3856
        'bzrlib.iterablefile',
3925
3857
        'bzrlib.lockdir',
3926
3858
        'bzrlib.merge3',
3927
3859
        'bzrlib.option',
3928
 
        'bzrlib.pyutils',
3929
3860
        'bzrlib.symbol_versioning',
3930
3861
        'bzrlib.tests',
3931
3862
        'bzrlib.tests.fixtures',
3932
3863
        'bzrlib.timestamp',
3933
 
        'bzrlib.transport.http',
3934
3864
        'bzrlib.version_info_formats.format_custom',
3935
3865
        ]
3936
3866
 
3989
3919
        try:
3990
3920
            # note that this really does mean "report only" -- doctest
3991
3921
            # still runs the rest of the examples
3992
 
            doc_suite = IsolatedDocTestSuite(
3993
 
                mod, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
 
3922
            doc_suite = doctest.DocTestSuite(mod,
 
3923
                optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
3994
3924
        except ValueError, e:
3995
3925
            print '**failed to get doctest for: %s\n%s' % (mod, e)
3996
3926
            raise
3999
3929
        suite.addTest(doc_suite)
4000
3930
 
4001
3931
    default_encoding = sys.getdefaultencoding()
4002
 
    for name, plugin in _mod_plugin.plugins().items():
 
3932
    for name, plugin in bzrlib.plugin.plugins().items():
4003
3933
        if not interesting_module(plugin.module.__name__):
4004
3934
            continue
4005
3935
        plugin_suite = plugin.test_suite()
4011
3941
        if plugin_suite is not None:
4012
3942
            suite.addTest(plugin_suite)
4013
3943
        if default_encoding != sys.getdefaultencoding():
4014
 
            trace.warning(
 
3944
            bzrlib.trace.warning(
4015
3945
                'Plugin "%s" tried to reset default encoding to: %s', name,
4016
3946
                sys.getdefaultencoding())
4017
3947
            reload(sys)
4032
3962
            # Some tests mentioned in the list are not in the test suite. The
4033
3963
            # list may be out of date, report to the tester.
4034
3964
            for id in not_found:
4035
 
                trace.warning('"%s" not found in the test suite', id)
 
3965
                bzrlib.trace.warning('"%s" not found in the test suite', id)
4036
3966
        for id in duplicates:
4037
 
            trace.warning('"%s" is used as an id by several tests', id)
 
3967
            bzrlib.trace.warning('"%s" is used as an id by several tests', id)
4038
3968
 
4039
3969
    return suite
4040
3970
 
4041
3971
 
4042
 
def multiply_scenarios(*scenarios):
4043
 
    """Multiply two or more iterables of scenarios.
4044
 
 
4045
 
    It is safe to pass scenario generators or iterators.
4046
 
 
4047
 
    :returns: A list of compound scenarios: the cross-product of all 
4048
 
        scenarios, with the names concatenated and the parameters
4049
 
        merged together.
4050
 
    """
4051
 
    return reduce(_multiply_two_scenarios, map(list, scenarios))
4052
 
 
4053
 
 
4054
 
def _multiply_two_scenarios(scenarios_left, scenarios_right):
 
3972
def multiply_scenarios(scenarios_left, scenarios_right):
4055
3973
    """Multiply two sets of scenarios.
4056
3974
 
4057
3975
    :returns: the cartesian product of the two sets of scenarios, that is
4181
4099
        the module is available.
4182
4100
    """
4183
4101
 
4184
 
    py_module = pyutils.get_named_object(py_module_name)
 
4102
    py_module = __import__(py_module_name, {}, {}, ['NO_SUCH_ATTRIB'])
4185
4103
    scenarios = [
4186
4104
        ('python', {'module': py_module}),
4187
4105
    ]
4340
4258
            symbol_versioning.warn(depr_msg + use_msg, DeprecationWarning)
4341
4259
            # Import the new feature and use it as a replacement for the
4342
4260
            # deprecated one.
4343
 
            self._feature = pyutils.get_named_object(
4344
 
                self._replacement_module, self._replacement_name)
 
4261
            mod = __import__(self._replacement_module, {}, {},
 
4262
                             [self._replacement_name])
 
4263
            self._feature = getattr(mod, self._replacement_name)
4345
4264
 
4346
4265
    def _probe(self):
4347
4266
        self._ensure()
4378
4297
        return self.module_name
4379
4298
 
4380
4299
 
 
4300
# This is kept here for compatibility, it is recommended to use
 
4301
# 'bzrlib.tests.feature.paramiko' instead
 
4302
ParamikoFeature = _CompatabilityThunkFeature(
 
4303
    deprecated_in((2,1,0)),
 
4304
    'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
 
4305
 
 
4306
 
4381
4307
def probe_unicode_in_user_encoding():
4382
4308
    """Try to encode several unicode strings to use in unicode-aware tests.
4383
4309
    Return first successfull match.
4570
4496
case_sensitive_filesystem_feature = _CaseSensitiveFilesystemFeature()
4571
4497
 
4572
4498
 
 
4499
# Kept for compatibility, use bzrlib.tests.features.subunit instead
 
4500
SubUnitFeature = _CompatabilityThunkFeature(
 
4501
    deprecated_in((2,1,0)),
 
4502
    'bzrlib.tests.features', 'SubUnitFeature', 'subunit')
4573
4503
# Only define SubUnitBzrRunner if subunit is available.
4574
4504
try:
4575
4505
    from subunit import TestProtocolClient