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
64
63
from bzrlib import (
68
commands as _mod_commands,
77
plugin as _mod_plugin,
84
78
transport as _mod_transport,
82
import bzrlib.commands
83
import bzrlib.timestamp
85
import bzrlib.inventory
86
import bzrlib.iterablefile
88
89
import bzrlib.lsprof
89
90
except ImportError:
90
91
# lsprof not available
92
95
from bzrlib.smart import client, request
97
from bzrlib import symbol_versioning
98
from bzrlib.symbol_versioning import (
93
106
from bzrlib.transport import (
110
from bzrlib.trace import mutter, note
97
111
from bzrlib.tests import (
123
138
TestSuite = TestUtil.TestSuite
124
139
TestLoader = TestUtil.TestLoader
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.
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
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,
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.
159
'SSH_AUTH_SOCK': None,
169
# Nobody cares about ftp_proxy, FTP_PROXY AFAIK. So far at
170
# least. If you do (care), please update this comment
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',
183
def override_os_environ(test, env=None):
184
"""Modify os.environ keeping a copy.
186
:param test: A test instance
188
:param env: A dict containing variable definitions to be installed
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
202
def restore_os_environ(test):
203
"""Restore os.environ to its original state.
205
:param test: A test instance previously passed to override_os_environ.
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)
213
141
class ExtendedTestResult(testtools.TextTestResult):
214
142
"""Accepts, reports and accumulates the results of running tests.
373
301
addOnException = getattr(test, "addOnException", None)
374
302
if addOnException is not None:
375
303
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)
304
# Only check for thread leaks if the test case supports cleanups
305
addCleanup = getattr(test, "addCleanup", None)
306
if addCleanup is not None:
307
addCleanup(self._check_leaked_threads, test)
380
309
def startTests(self):
381
310
self.report_tests_starting()
881
807
return NullProgressView()
884
def isolated_doctest_setUp(test):
885
override_os_environ(test)
888
def isolated_doctest_tearDown(test):
889
restore_os_environ(test)
892
def IsolatedDocTestSuite(*args, **kwargs):
893
"""Overrides doctest.DocTestSuite to handle isolation.
895
The method is really a factory and users are expected to use it as such.
898
kwargs['setUp'] = isolated_doctest_setUp
899
kwargs['tearDown'] = isolated_doctest_tearDown
900
return doctest.DocTestSuite(*args, **kwargs)
903
810
class TestCase(testtools.TestCase):
904
811
"""Base class for bzr unit tests.
1336
1244
if haystack.find(needle) == -1:
1337
1245
self.fail("string %r not found in '''%s'''" % (needle, haystack))
1339
def assertNotContainsString(self, haystack, needle):
1340
if haystack.find(needle) != -1:
1341
self.fail("string %r found in '''%s'''" % (needle, haystack))
1343
1247
def assertSubset(self, sublist, superlist):
1344
1248
"""Assert that every entry in sublist is present in superlist."""
1345
1249
missing = set(sublist) - set(superlist)
1594
1498
Close the file and delete it, unless setKeepLogfile was called.
1596
if trace._trace_file:
1500
if bzrlib.trace._trace_file:
1597
1501
# flush the log file, to get all content
1598
trace._trace_file.flush()
1599
trace.pop_log_file(self._log_memento)
1502
bzrlib.trace._trace_file.flush()
1503
bzrlib.trace.pop_log_file(self._log_memento)
1600
1504
# Cache the log result and delete the file on disk
1601
1505
self._get_log(False)
1632
1536
setattr(obj, attr_name, new)
1635
def overrideEnv(self, name, new):
1636
"""Set an environment variable, and reset it after the test.
1638
:param name: The environment variable name.
1640
:param new: The value to set the variable to. If None, the
1641
variable is deleted from the environment.
1643
:returns: The actual variable value.
1645
value = osutils.set_or_unset_env(name, new)
1646
self.addCleanup(osutils.set_or_unset_env, name, value)
1649
1539
def _cleanEnvironment(self):
1650
for name, value in isolated_environ.iteritems():
1651
self.overrideEnv(name, value)
1541
'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
1542
'HOME': os.getcwd(),
1543
# bzr now uses the Win32 API and doesn't rely on APPDATA, but the
1544
# tests do check our impls match APPDATA
1545
'BZR_EDITOR': None, # test_msgeditor manipulates this variable
1549
'BZREMAIL': None, # may still be present in the environment
1550
'EMAIL': 'jrandom@example.com', # set EMAIL as bzr does not guess
1551
'BZR_PROGRESS_BAR': None,
1553
'BZR_PLUGIN_PATH': None,
1554
'BZR_DISABLE_PLUGINS': None,
1555
'BZR_PLUGINS_AT': None,
1556
'BZR_CONCURRENCY': None,
1557
# Make sure that any text ui tests are consistent regardless of
1558
# the environment the test case is run in; you may want tests that
1559
# test other combinations. 'dumb' is a reasonable guess for tests
1560
# going to a pipe or a StringIO.
1564
'BZR_COLUMNS': '80',
1566
'SSH_AUTH_SOCK': None,
1570
'https_proxy': None,
1571
'HTTPS_PROXY': None,
1576
# Nobody cares about ftp_proxy, FTP_PROXY AFAIK. So far at
1577
# least. If you do (care), please update this comment
1581
'BZR_REMOTE_PATH': None,
1582
# Generally speaking, we don't want apport reporting on crashes in
1583
# the test envirnoment unless we're specifically testing apport,
1584
# so that it doesn't leak into the real system environment. We
1585
# use an env var so it propagates to subprocesses.
1586
'APPORT_DISABLE': '1',
1589
self.addCleanup(self._restoreEnvironment)
1590
for name, value in new_env.iteritems():
1591
self._captureVar(name, value)
1593
def _captureVar(self, name, newvalue):
1594
"""Set an environment variable, and reset it when finished."""
1595
self._old_env[name] = osutils.set_or_unset_env(name, newvalue)
1597
def _restoreEnvironment(self):
1598
for name, value in self._old_env.iteritems():
1599
osutils.set_or_unset_env(name, value)
1653
1601
def _restoreHooks(self):
1654
1602
for klass, (name, hooks) in self._preserved_hooks.items():
2098
2045
if retcode is not None and retcode != process.returncode:
2099
2046
if process_args is None:
2100
2047
process_args = "(unknown args)"
2101
trace.mutter('Output of bzr %s:\n%s', process_args, out)
2102
trace.mutter('Error for bzr %s:\n%s', process_args, err)
2048
mutter('Output of bzr %s:\n%s', process_args, out)
2049
mutter('Error for bzr %s:\n%s', process_args, err)
2103
2050
self.fail('Command bzr %s failed with retcode %s != %s'
2104
2051
% (process_args, retcode, process.returncode))
2105
2052
return [out, err]
2492
2439
test_home_dir = self.test_home_dir
2493
2440
if isinstance(test_home_dir, unicode):
2494
2441
test_home_dir = test_home_dir.encode(sys.getfilesystemencoding())
2495
self.overrideEnv('HOME', test_home_dir)
2496
self.overrideEnv('BZR_HOME', test_home_dir)
2442
os.environ['HOME'] = test_home_dir
2443
os.environ['BZR_HOME'] = test_home_dir
2498
2445
def setUp(self):
2499
2446
super(TestCaseWithMemoryTransport, self).setUp()
3802
3748
'bzrlib.tests.test_merge3',
3803
3749
'bzrlib.tests.test_merge_core',
3804
3750
'bzrlib.tests.test_merge_directive',
3805
'bzrlib.tests.test_mergetools',
3806
3751
'bzrlib.tests.test_missing',
3807
3752
'bzrlib.tests.test_msgeditor',
3808
3753
'bzrlib.tests.test_multiparent',
3858
3803
'bzrlib.tests.test_testament',
3859
3804
'bzrlib.tests.test_textfile',
3860
3805
'bzrlib.tests.test_textmerge',
3861
'bzrlib.tests.test_cethread',
3862
3806
'bzrlib.tests.test_timestamp',
3863
3807
'bzrlib.tests.test_trace',
3864
3808
'bzrlib.tests.test_transactions',
3968
3912
# note that this really does mean "report only" -- doctest
3969
3913
# still runs the rest of the examples
3970
doc_suite = IsolatedDocTestSuite(
3971
mod, optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
3914
doc_suite = doctest.DocTestSuite(mod,
3915
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
3972
3916
except ValueError, e:
3973
3917
print '**failed to get doctest for: %s\n%s' % (mod, e)
4010
3954
# Some tests mentioned in the list are not in the test suite. The
4011
3955
# list may be out of date, report to the tester.
4012
3956
for id in not_found:
4013
trace.warning('"%s" not found in the test suite', id)
3957
bzrlib.trace.warning('"%s" not found in the test suite', id)
4014
3958
for id in duplicates:
4015
trace.warning('"%s" is used as an id by several tests', id)
3959
bzrlib.trace.warning('"%s" is used as an id by several tests', id)
4356
4300
return self.module_name
4303
# This is kept here for compatibility, it is recommended to use
4304
# 'bzrlib.tests.feature.paramiko' instead
4305
ParamikoFeature = _CompatabilityThunkFeature(
4306
deprecated_in((2,1,0)),
4307
'bzrlib.tests.features', 'ParamikoFeature', 'paramiko')
4359
4310
def probe_unicode_in_user_encoding():
4360
4311
"""Try to encode several unicode strings to use in unicode-aware tests.
4361
4312
Return first successfull match.