15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
# TODO: Perhaps there should be an API to find out if bzr running under the
19
# test suite -- some plugins might want to avoid making intrusive changes if
20
# this is the case. However, we want behaviour under to test to diverge as
21
# little as possible, so this should be used rarely if it's added at all.
22
# (Suggestion from j-a-meinel, 2005-11-24)
24
# NOTE: Some classes in here use camelCaseNaming() rather than
25
# underscore_naming(). That's for consistency with unittest; it's not the
26
# general style of bzrlib. Please continue that consistency when adding e.g.
27
# new assertFoo() methods.
18
30
from cStringIO import StringIO
44
import bzrlib.bzrdir as bzrdir
30
45
import bzrlib.commands
46
import bzrlib.errors as errors
47
import bzrlib.inventory
48
import bzrlib.iterablefile
53
# lsprof not available
55
from bzrlib.merge import merge_inner
58
import bzrlib.osutils as osutils
60
import bzrlib.progress as progress
61
from bzrlib.revision import common_ancestor
31
63
import bzrlib.trace
33
import bzrlib.osutils as osutils
34
from bzrlib.selftest import TestUtil
35
from bzrlib.selftest.TestUtil import TestLoader, TestSuite
36
from bzrlib.selftest.treeshape import build_tree_contents
64
from bzrlib.transport import urlescape, get_transport
65
import bzrlib.transport
66
from bzrlib.transport.local import LocalRelpathServer
67
from bzrlib.transport.readonly import ReadonlyServer
68
from bzrlib.trace import mutter
69
from bzrlib.tests.TestUtil import TestLoader, TestSuite
70
from bzrlib.tests.treeshape import build_tree_contents
71
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
73
default_transport = LocalRelpathServer
38
75
MODULES_TO_TEST = []
39
MODULES_TO_DOCTEST = []
41
from logging import debug, warning, error
45
class EarlyStoppingTestResultAdapter(object):
46
"""An adapter for TestResult to stop at the first first failure or error"""
48
def __init__(self, result):
51
def addError(self, test, err):
52
self._result.addError(test, err)
55
def addFailure(self, test, err):
56
self._result.addFailure(test, err)
59
def __getattr__(self, name):
60
return getattr(self._result, name)
62
def __setattr__(self, name, value):
64
object.__setattr__(self, name, value)
65
return setattr(self._result, name, value)
76
MODULES_TO_DOCTEST = [
88
def packages_to_test():
89
"""Return a list of packages to test.
91
The packages are not globally imported so that import failures are
92
triggered when running selftest, not when importing the command.
95
import bzrlib.tests.blackbox
96
import bzrlib.tests.branch_implementations
97
import bzrlib.tests.bzrdir_implementations
98
import bzrlib.tests.interrepository_implementations
99
import bzrlib.tests.interversionedfile_implementations
100
import bzrlib.tests.repository_implementations
101
import bzrlib.tests.revisionstore_implementations
102
import bzrlib.tests.workingtree_implementations
105
bzrlib.tests.blackbox,
106
bzrlib.tests.branch_implementations,
107
bzrlib.tests.bzrdir_implementations,
108
bzrlib.tests.interrepository_implementations,
109
bzrlib.tests.interversionedfile_implementations,
110
bzrlib.tests.repository_implementations,
111
bzrlib.tests.revisionstore_implementations,
112
bzrlib.tests.workingtree_implementations,
68
116
class _MyResult(unittest._TextTestResult):
72
No special behaviour for now.
75
def _elapsedTime(self):
76
return "(Took %.3fs)" % (time.time() - self._start_time)
117
"""Custom TestResult.
119
Shows output in a different format, including displaying runtime for tests.
123
def __init__(self, stream, descriptions, verbosity, pb=None):
124
unittest._TextTestResult.__init__(self, stream, descriptions, verbosity)
127
def extractBenchmarkTime(self, testCase):
128
"""Add a benchmark time for the current test case."""
129
self._benchmarkTime = getattr(testCase, "_benchtime", None)
131
def _elapsedTestTimeString(self):
132
"""Return a time string for the overall time the current test has taken."""
133
return self._formatTime(time.time() - self._start_time)
135
def _testTimeString(self):
136
if self._benchmarkTime is not None:
138
self._formatTime(self._benchmarkTime),
139
self._elapsedTestTimeString())
141
return " %s" % self._elapsedTestTimeString()
143
def _formatTime(self, seconds):
144
"""Format seconds as milliseconds with leading spaces."""
145
return "%5dms" % (1000 * seconds)
147
def _ellipsise_unimportant_words(self, a_string, final_width,
149
"""Add ellipses (sp?) for overly long strings.
151
:param keep_start: If true preserve the start of a_string rather
155
if len(a_string) > final_width:
156
result = a_string[:final_width-3] + '...'
160
if len(a_string) > final_width:
161
result = '...' + a_string[3-final_width:]
164
return result.ljust(final_width)
78
166
def startTest(self, test):
79
167
unittest.TestResult.startTest(self, test)
80
# TODO: Maybe show test.shortDescription somewhere?
81
what = test.shortDescription() or test.id()
168
# In a short description, the important words are in
169
# the beginning, but in an id, the important words are
171
SHOW_DESCRIPTIONS = False
173
if not self.showAll and self.dots and self.pb is not None:
176
final_width = osutils.terminal_width()
177
final_width = final_width - 15 - 8
179
if SHOW_DESCRIPTIONS:
180
what = test.shortDescription()
182
what = self._ellipsise_unimportant_words(what, final_width, keep_start=True)
185
if what.startswith('bzrlib.tests.'):
187
what = self._ellipsise_unimportant_words(what, final_width)
83
self.stream.write('%-70.70s' % what)
189
self.stream.write(what)
190
elif self.dots and self.pb is not None:
191
self.pb.update(what, self.testsRun - 1, None)
84
192
self.stream.flush()
193
self._recordTestStartTime()
195
def _recordTestStartTime(self):
196
"""Record that a test has started."""
85
197
self._start_time = time.time()
87
199
def addError(self, test, err):
200
if isinstance(err[1], TestSkipped):
201
return self.addSkipped(test, err)
88
202
unittest.TestResult.addError(self, test, err)
203
self.extractBenchmarkTime(test)
90
self.stream.writeln("ERROR %s" % self._elapsedTime())
205
self.stream.writeln("ERROR %s" % self._testTimeString())
206
elif self.dots and self.pb is None:
92
207
self.stream.write('E')
209
self.pb.update(self._ellipsise_unimportant_words('ERROR', 13), self.testsRun, None)
93
210
self.stream.flush()
95
214
def addFailure(self, test, err):
96
215
unittest.TestResult.addFailure(self, test, err)
216
self.extractBenchmarkTime(test)
98
self.stream.writeln("FAIL %s" % self._elapsedTime())
218
self.stream.writeln(" FAIL %s" % self._testTimeString())
219
elif self.dots and self.pb is None:
100
220
self.stream.write('F')
222
self.pb.update(self._ellipsise_unimportant_words('FAIL', 13), self.testsRun, None)
101
223
self.stream.flush()
103
227
def addSuccess(self, test):
228
self.extractBenchmarkTime(test)
105
self.stream.writeln('OK %s' % self._elapsedTime())
230
self.stream.writeln(' OK %s' % self._testTimeString())
231
for bench_called, stats in getattr(test, '_benchcalls', []):
232
self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
233
stats.pprint(file=self.stream)
234
elif self.dots and self.pb is None:
107
235
self.stream.write('~')
237
self.pb.update(self._ellipsise_unimportant_words('OK', 13), self.testsRun, None)
239
unittest.TestResult.addSuccess(self, test)
241
def addSkipped(self, test, skip_excinfo):
242
self.extractBenchmarkTime(test)
244
print >>self.stream, ' SKIP %s' % self._testTimeString()
245
print >>self.stream, ' %s' % skip_excinfo[1]
246
elif self.dots and self.pb is None:
247
self.stream.write('S')
249
self.pb.update(self._ellipsise_unimportant_words('SKIP', 13), self.testsRun, None)
251
# seems best to treat this as success from point-of-view of unittest
252
# -- it actually does nothing so it barely matters :)
109
253
unittest.TestResult.addSuccess(self, test)
111
255
def printErrorList(self, flavour, errors):
112
256
for test, err in errors:
113
257
self.stream.writeln(self.separator1)
114
self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
115
if hasattr(test, '_get_log'):
116
self.stream.writeln()
117
self.stream.writeln('log from this test:')
258
self.stream.writeln("%s: %s" % (flavour, self.getDescription(test)))
259
if getattr(test, '_get_log', None) is not None:
261
print >>self.stream, \
262
('vvvv[log from %s]' % test.id()).ljust(78,'-')
118
263
print >>self.stream, test._get_log()
264
print >>self.stream, \
265
('^^^^[log from %s]' % test.id()).ljust(78,'-')
119
266
self.stream.writeln(self.separator2)
120
267
self.stream.writeln("%s" % err)
123
class TextTestRunner(unittest.TextTestRunner):
270
class TextTestRunner(object):
124
271
stop_on_failure = False
279
self.stream = unittest._WritelnDecorator(stream)
280
self.descriptions = descriptions
281
self.verbosity = verbosity
282
self.keep_output = keep_output
126
285
def _makeResult(self):
127
result = _MyResult(self.stream, self.descriptions, self.verbosity)
128
if self.stop_on_failure:
129
result = EarlyStoppingTestResultAdapter(result)
286
result = _MyResult(self.stream,
290
result.stop_early = self.stop_on_failure
294
"Run the given test case or test suite."
295
result = self._makeResult()
296
startTime = time.time()
297
if self.pb is not None:
298
self.pb.update('Running tests', 0, test.countTestCases())
300
stopTime = time.time()
301
timeTaken = stopTime - startTime
303
self.stream.writeln(result.separator2)
304
run = result.testsRun
305
self.stream.writeln("Ran %d test%s in %.3fs" %
306
(run, run != 1 and "s" or "", timeTaken))
307
self.stream.writeln()
308
if not result.wasSuccessful():
309
self.stream.write("FAILED (")
310
failed, errored = map(len, (result.failures, result.errors))
312
self.stream.write("failures=%d" % failed)
314
if failed: self.stream.write(", ")
315
self.stream.write("errors=%d" % errored)
316
self.stream.writeln(")")
318
self.stream.writeln("OK")
319
if self.pb is not None:
320
self.pb.update('Cleaning up', 0, 1)
321
# This is still a little bogus,
322
# but only a little. Folk not using our testrunner will
323
# have to delete their temp directories themselves.
324
test_root = TestCaseInTempDir.TEST_ROOT
325
if result.wasSuccessful() or not self.keep_output:
326
if test_root is not None:
327
osutils.rmtree(test_root)
329
if self.pb is not None:
330
self.pb.note("Failed tests working directories are in '%s'\n",
334
"Failed tests working directories are in '%s'\n" %
336
TestCaseInTempDir.TEST_ROOT = None
337
if self.pb is not None:
213
446
raise AssertionError('pattern "%s" not found in "%s"'
214
447
% (needle_re, haystack))
216
def _enable_file_logging(self):
449
def assertSubset(self, sublist, superlist):
450
"""Assert that every entry in sublist is present in superlist."""
452
for entry in sublist:
453
if entry not in superlist:
454
missing.append(entry)
456
raise AssertionError("value(s) %r not present in container %r" %
457
(missing, superlist))
459
def assertIs(self, left, right):
460
if not (left is right):
461
raise AssertionError("%r is not %r." % (left, right))
463
def assertTransportMode(self, transport, path, mode):
464
"""Fail if a path does not have mode mode.
466
If modes are not supported on this transport, the assertion is ignored.
468
if not transport._can_roundtrip_unix_modebits():
470
path_stat = transport.stat(path)
471
actual_mode = stat.S_IMODE(path_stat.st_mode)
472
self.assertEqual(mode, actual_mode,
473
'mode of %r incorrect (%o != %o)' % (path, mode, actual_mode))
475
def assertIsInstance(self, obj, kls):
476
"""Fail if obj is not an instance of kls"""
477
if not isinstance(obj, kls):
478
self.fail("%r is an instance of %s rather than %s" % (
479
obj, obj.__class__, kls))
481
def _startLogFile(self):
482
"""Send bzr and test log messages to a temporary file.
484
The file is removed as the test is torn down.
217
486
fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
219
self._log_file = os.fdopen(fileno, 'w+')
221
hdlr = logging.StreamHandler(self._log_file)
222
hdlr.setLevel(logging.DEBUG)
223
hdlr.setFormatter(logging.Formatter('%(levelname)8s %(message)s'))
224
logging.getLogger('').addHandler(hdlr)
225
logging.getLogger('').setLevel(logging.DEBUG)
226
self._log_hdlr = hdlr
227
debug('opened log file %s', name)
487
encoder, decoder, stream_reader, stream_writer = codecs.lookup('UTF-8')
488
self._log_file = stream_writer(os.fdopen(fileno, 'w+'))
489
self._log_nonce = bzrlib.trace.enable_test_log(self._log_file)
229
490
self._log_file_name = name
232
os.environ['HOME'] = self.oldenv
233
if os.environ.get('BZREMAIL') is not None:
234
del os.environ['BZREMAIL']
235
if self.bzr_email is not None:
236
os.environ['BZREMAIL'] = self.bzr_email
237
if os.environ.get('EMAIL') is not None:
238
del os.environ['EMAIL']
239
if self.email is not None:
240
os.environ['EMAIL'] = self.email
241
logging.getLogger('').removeHandler(self._log_hdlr)
242
bzrlib.trace.enable_default_logging()
243
logging.debug('%s teardown', self.id())
491
self.addCleanup(self._finishLogFile)
493
def _finishLogFile(self):
494
"""Finished with the log file.
496
Read contents into memory, close, and delete.
498
bzrlib.trace.disable_test_log(self._log_nonce)
499
self._log_file.seek(0)
500
self._log_contents = self._log_file.read()
244
501
self._log_file.close()
502
os.remove(self._log_file_name)
503
self._log_file = self._log_file_name = None
505
def addCleanup(self, callable):
506
"""Arrange to run a callable when this case is torn down.
508
Callables are run in the reverse of the order they are registered,
509
ie last-in first-out.
511
if callable in self._cleanups:
512
raise ValueError("cleanup function %r already registered on %s"
514
self._cleanups.append(callable)
516
def _cleanEnvironment(self):
519
'APPDATA': os.getcwd(),
524
self.addCleanup(self._restoreEnvironment)
525
for name, value in new_env.iteritems():
526
self._captureVar(name, value)
529
def _captureVar(self, name, newvalue):
530
"""Set an environment variable, preparing it to be reset when finished."""
531
self.__old_env[name] = os.environ.get(name, None)
533
if name in os.environ:
536
os.environ[name] = newvalue
539
def _restoreVar(name, value):
541
if name in os.environ:
544
os.environ[name] = value
546
def _restoreEnvironment(self):
547
for name, value in self.__old_env.iteritems():
548
self._restoreVar(name, value)
245
552
unittest.TestCase.tearDown(self)
554
def time(self, callable, *args, **kwargs):
555
"""Run callable and accrue the time it takes to the benchmark time.
557
If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
558
this will cause lsprofile statistics to be gathered and stored in
561
if self._benchtime is None:
565
if not self._gather_lsprof_in_benchmarks:
566
return callable(*args, **kwargs)
568
# record this benchmark
569
ret, stats = bzrlib.lsprof.profile(callable, *args, **kwargs)
571
self._benchcalls.append(((callable, args, kwargs), stats))
574
self._benchtime += time.time() - start
576
def _runCleanups(self):
577
"""Run registered cleanup functions.
579
This should only be called from TestCase.tearDown.
581
# TODO: Perhaps this should keep running cleanups even if
583
for cleanup_fn in reversed(self._cleanups):
247
586
def log(self, *args):
250
589
def _get_log(self):
251
590
"""Return as a string the log for this test"""
252
591
if self._log_file_name:
253
592
return open(self._log_file_name).read()
594
return self._log_contents
595
# TODO: Delete the log after it's been read in
257
def capture(self, cmd):
597
def capture(self, cmd, retcode=0):
258
598
"""Shortcut that splits cmd into words, runs, and returns stdout"""
259
return self.run_bzr_captured(cmd.split())[0]
599
return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
261
def run_bzr_captured(self, argv, retcode=0):
262
"""Invoke bzr and return (result, stdout, stderr).
601
def run_bzr_captured(self, argv, retcode=0, stdin=None):
602
"""Invoke bzr and return (stdout, stderr).
264
604
Useful for code that wants to check the contents of the
265
605
output, the way error messages are presented, etc.
413
782
# successfully created
414
TestCaseInTempDir.TEST_ROOT = os.path.abspath(root)
783
TestCaseInTempDir.TEST_ROOT = osutils.abspath(root)
416
785
# make a fake bzr directory there to prevent any tests propagating
417
786
# up onto the source directory's real branch
418
os.mkdir(os.path.join(TestCaseInTempDir.TEST_ROOT, '.bzr'))
787
bzrdir.BzrDir.create_standalone_workingtree(TestCaseInTempDir.TEST_ROOT)
790
super(TestCaseInTempDir, self).setUp()
421
791
self._make_test_root()
422
self._currentdir = os.getcwdu()
423
short_id = self.id().replace('bzrlib.selftest.', '') \
424
.replace('__main__.', '')
425
self.test_dir = os.path.join(self.TEST_ROOT, short_id)
426
os.mkdir(self.test_dir)
427
os.chdir(self.test_dir)
428
super(TestCaseInTempDir, self).setUp()
792
_currentdir = os.getcwdu()
793
# shorten the name, to avoid test failures due to path length
794
short_id = self.id().replace('bzrlib.tests.', '') \
795
.replace('__main__.', '')[-100:]
796
# it's possible the same test class is run several times for
797
# parameterized tests, so make sure the names don't collide.
801
candidate_dir = '%s/%s.%d' % (self.TEST_ROOT, short_id, i)
803
candidate_dir = '%s/%s' % (self.TEST_ROOT, short_id)
804
if os.path.exists(candidate_dir):
808
self.test_dir = candidate_dir
809
os.mkdir(self.test_dir)
810
os.chdir(self.test_dir)
812
os.environ['HOME'] = self.test_dir
813
os.environ['APPDATA'] = self.test_dir
814
def _leaveDirectory():
815
os.chdir(_currentdir)
816
self.addCleanup(_leaveDirectory)
431
os.chdir(self._currentdir)
432
super(TestCaseInTempDir, self).tearDown()
434
def build_tree(self, shape):
818
def build_tree(self, shape, line_endings='native', transport=None):
435
819
"""Build a test tree according to a pattern.
437
821
shape is a sequence of file specifications. If the final
438
822
character is '/', a directory is created.
440
824
This doesn't add anything to a branch.
825
:param line_endings: Either 'binary' or 'native'
826
in binary mode, exact contents are written
827
in native mode, the line endings match the
828
default platform endings.
830
:param transport: A transport to write to, for building trees on
831
VFS's. If the transport is readonly or None,
832
"." is opened automatically.
442
834
# XXX: It's OK to just create them using forward slashes on windows?
835
if transport is None or transport.is_readonly():
836
transport = get_transport(".")
443
837
for name in shape:
444
assert isinstance(name, basestring)
838
self.assert_(isinstance(name, basestring))
445
839
if name[-1] == '/':
840
transport.mkdir(urlescape(name[:-1]))
449
print >>f, "contents of", name
842
if line_endings == 'binary':
844
elif line_endings == 'native':
847
raise errors.BzrError('Invalid line ending request %r' % (line_endings,))
848
content = "contents of %s%s" % (name, end)
849
transport.put(urlescape(name), StringIO(content))
452
851
def build_tree_contents(self, shape):
453
bzrlib.selftest.build_tree_contents(shape)
852
build_tree_contents(shape)
455
854
def failUnlessExists(self, path):
456
855
"""Fail unless path, which may be abs or relative, exists."""
457
856
self.failUnless(osutils.lexists(path))
858
def failIfExists(self, path):
859
"""Fail if path, which may be abs or relative, exists."""
860
self.failIf(osutils.lexists(path))
459
862
def assertFileEqual(self, content, path):
460
863
"""Fail if path does not contain 'content'."""
461
864
self.failUnless(osutils.lexists(path))
462
865
self.assertEqualDiff(content, open(path, 'r').read())
868
class TestCaseWithTransport(TestCaseInTempDir):
869
"""A test case that provides get_url and get_readonly_url facilities.
871
These back onto two transport servers, one for readonly access and one for
874
If no explicit class is provided for readonly access, a
875
ReadonlyTransportDecorator is used instead which allows the use of non disk
876
based read write transports.
878
If an explicit class is provided for readonly access, that server and the
879
readwrite one must both define get_url() as resolving to os.getcwd().
882
def __init__(self, methodName='testMethod'):
883
super(TestCaseWithTransport, self).__init__(methodName)
884
self.__readonly_server = None
886
self.transport_server = default_transport
887
self.transport_readonly_server = None
889
def get_readonly_url(self, relpath=None):
890
"""Get a URL for the readonly transport.
892
This will either be backed by '.' or a decorator to the transport
893
used by self.get_url()
894
relpath provides for clients to get a path relative to the base url.
895
These should only be downwards relative, not upwards.
897
base = self.get_readonly_server().get_url()
898
if relpath is not None:
899
if not base.endswith('/'):
901
base = base + relpath
904
def get_readonly_server(self):
905
"""Get the server instance for the readonly transport
907
This is useful for some tests with specific servers to do diagnostics.
909
if self.__readonly_server is None:
910
if self.transport_readonly_server is None:
911
# readonly decorator requested
912
# bring up the server
914
self.__readonly_server = ReadonlyServer()
915
self.__readonly_server.setUp(self.__server)
917
self.__readonly_server = self.transport_readonly_server()
918
self.__readonly_server.setUp()
919
self.addCleanup(self.__readonly_server.tearDown)
920
return self.__readonly_server
922
def get_server(self):
923
"""Get the read/write server instance.
925
This is useful for some tests with specific servers that need
928
if self.__server is None:
929
self.__server = self.transport_server()
930
self.__server.setUp()
931
self.addCleanup(self.__server.tearDown)
934
def get_url(self, relpath=None):
935
"""Get a URL for the readwrite transport.
937
This will either be backed by '.' or to an equivalent non-file based
939
relpath provides for clients to get a path relative to the base url.
940
These should only be downwards relative, not upwards.
942
base = self.get_server().get_url()
943
if relpath is not None and relpath != '.':
944
if not base.endswith('/'):
946
base = base + relpath
949
def get_transport(self):
950
"""Return a writeable transport for the test scratch space"""
951
t = get_transport(self.get_url())
952
self.assertFalse(t.is_readonly())
955
def get_readonly_transport(self):
956
"""Return a readonly transport for the test scratch space
465
class MetaTestLog(TestCase):
466
def test_logging(self):
467
"""Test logs are captured when a test fails."""
468
logging.info('an info message')
469
warning('something looks dodgy...')
470
logging.debug('hello, test is running')
958
This can be used to test that operations which should only need
959
readonly access in fact do not try to write.
961
t = get_transport(self.get_readonly_url())
962
self.assertTrue(t.is_readonly())
965
def make_branch(self, relpath, format=None):
966
"""Create a branch on the transport at relpath."""
967
repo = self.make_repository(relpath, format=format)
968
return repo.bzrdir.create_branch()
970
def make_bzrdir(self, relpath, format=None):
972
url = self.get_url(relpath)
973
segments = relpath.split('/')
974
if segments and segments[-1] not in ('', '.'):
975
parent = self.get_url('/'.join(segments[:-1]))
976
t = get_transport(parent)
978
t.mkdir(segments[-1])
979
except errors.FileExists:
982
format=bzrlib.bzrdir.BzrDirFormat.get_default_format()
983
# FIXME: make this use a single transport someday. RBC 20060418
984
return format.initialize_on_transport(get_transport(relpath))
985
except errors.UninitializableFormat:
986
raise TestSkipped("Format %s is not initializable." % format)
988
def make_repository(self, relpath, shared=False, format=None):
989
"""Create a repository on our default transport at relpath."""
990
made_control = self.make_bzrdir(relpath, format=format)
991
return made_control.create_repository(shared=shared)
993
def make_branch_and_tree(self, relpath, format=None):
994
"""Create a branch on the transport and a tree locally.
998
# TODO: always use the local disk path for the working tree,
999
# this obviously requires a format that supports branch references
1000
# so check for that by checking bzrdir.BzrDirFormat.get_default_format()
1002
b = self.make_branch(relpath, format=format)
1004
return b.bzrdir.create_workingtree()
1005
except errors.NotLocalUrl:
1006
# new formats - catch No tree error and create
1007
# a branch reference and a checkout.
1008
# old formats at that point - raise TestSkipped.
1009
# TODO: rbc 20060208
1010
return WorkingTreeFormat2().initialize(bzrdir.BzrDir.open(relpath))
1012
def assertIsDirectory(self, relpath, transport):
1013
"""Assert that relpath within transport is a directory.
1015
This may not be possible on all transports; in that case it propagates
1016
a TransportNotPossible.
1019
mode = transport.stat(relpath).st_mode
1020
except errors.NoSuchFile:
1021
self.fail("path %s is not a directory; no such file"
1023
if not stat.S_ISDIR(mode):
1024
self.fail("path %s is not a directory; has mode %#o"
1028
class ChrootedTestCase(TestCaseWithTransport):
1029
"""A support class that provides readonly urls outside the local namespace.
1031
This is done by checking if self.transport_server is a MemoryServer. if it
1032
is then we are chrooted already, if it is not then an HttpServer is used
1035
TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
1036
be used without needed to redo it when a different
1037
subclass is in use ?
1041
super(ChrootedTestCase, self).setUp()
1042
if not self.transport_server == bzrlib.transport.memory.MemoryServer:
1043
self.transport_readonly_server = bzrlib.transport.http.HttpServer
474
1046
def filter_suite_by_re(suite, pattern):
475
result = TestUtil.TestSuite()
1047
result = TestSuite()
476
1048
filter_re = re.compile(pattern)
477
1049
for test in iter_suite_tests(suite):
478
1050
if filter_re.search(test.id()):
483
1055
def run_suite(suite, name='test', verbose=False, pattern=".*",
484
stop_on_failure=False):
1056
stop_on_failure=False, keep_output=False,
1057
transport=None, lsprof_timed=None):
485
1058
TestCaseInTempDir._TEST_NAME = name
1059
TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1065
pb = progress.ProgressBar()
490
1066
runner = TextTestRunner(stream=sys.stdout,
1068
verbosity=verbosity,
1069
keep_output=keep_output,
493
1071
runner.stop_on_failure=stop_on_failure
494
1072
if pattern != '.*':
495
1073
suite = filter_suite_by_re(suite, pattern)
496
1074
result = runner.run(suite)
497
# This is still a little bogus,
498
# but only a little. Folk not using our testrunner will
499
# have to delete their temp directories themselves.
500
if result.wasSuccessful():
501
if TestCaseInTempDir.TEST_ROOT is not None:
502
shutil.rmtree(TestCaseInTempDir.TEST_ROOT)
504
print "Failed tests working directories are in '%s'\n" % TestCaseInTempDir.TEST_ROOT
505
1075
return result.wasSuccessful()
508
def selftest(verbose=False, pattern=".*", stop_on_failure=True):
1078
def selftest(verbose=False, pattern=".*", stop_on_failure=True,
1081
test_suite_factory=None,
509
1083
"""Run the whole test suite under the enhanced runner"""
510
return run_suite(test_suite(), 'testbzr', verbose=verbose, pattern=pattern,
511
stop_on_failure=stop_on_failure)
1084
global default_transport
1085
if transport is None:
1086
transport = default_transport
1087
old_transport = default_transport
1088
default_transport = transport
1090
if test_suite_factory is None:
1091
suite = test_suite()
1093
suite = test_suite_factory()
1094
return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
1095
stop_on_failure=stop_on_failure, keep_output=keep_output,
1096
transport=transport,
1097
lsprof_timed=lsprof_timed)
1099
default_transport = old_transport
514
1102
def test_suite():
515
"""Build and return TestSuite for the whole program."""
516
import bzrlib.store, bzrlib.inventory, bzrlib.branch
517
import bzrlib.osutils, bzrlib.merge3, bzrlib.plugin
1103
"""Build and return TestSuite for the whole of bzrlib.
1105
This function can be replaced if you need to change the default test
1106
suite on a global basis, but it is not encouraged.
518
1108
from doctest import DocTestSuite
520
global MODULES_TO_TEST, MODULES_TO_DOCTEST
1110
global MODULES_TO_DOCTEST
523
['bzrlib.selftest.MetaTestLog',
524
'bzrlib.selftest.testgpg',
525
'bzrlib.selftest.testidentitymap',
526
'bzrlib.selftest.testinv',
527
'bzrlib.selftest.test_ancestry',
528
'bzrlib.selftest.test_commit',
529
'bzrlib.selftest.test_command',
530
'bzrlib.selftest.test_commit_merge',
531
'bzrlib.selftest.testconfig',
532
'bzrlib.selftest.versioning',
533
'bzrlib.selftest.testmerge3',
534
'bzrlib.selftest.testmerge',
535
'bzrlib.selftest.testhashcache',
536
'bzrlib.selftest.teststatus',
537
'bzrlib.selftest.testlog',
538
'bzrlib.selftest.testrevisionnamespaces',
539
'bzrlib.selftest.testbranch',
540
'bzrlib.selftest.testrevision',
541
'bzrlib.selftest.test_revision_info',
542
'bzrlib.selftest.test_merge_core',
543
'bzrlib.selftest.test_smart_add',
544
'bzrlib.selftest.test_bad_files',
545
'bzrlib.selftest.testdiff',
546
'bzrlib.selftest.test_parent',
547
'bzrlib.selftest.test_xml',
548
'bzrlib.selftest.test_weave',
549
'bzrlib.selftest.testfetch',
550
'bzrlib.selftest.whitebox',
551
'bzrlib.selftest.teststore',
552
'bzrlib.selftest.blackbox',
553
'bzrlib.selftest.testsampler',
554
'bzrlib.selftest.testtransactions',
555
'bzrlib.selftest.testtransport',
556
'bzrlib.selftest.testgraph',
557
'bzrlib.selftest.testworkingtree',
558
'bzrlib.selftest.test_upgrade',
559
'bzrlib.selftest.test_conflicts',
560
'bzrlib.selftest.testtestament',
561
'bzrlib.selftest.testannotate',
562
'bzrlib.selftest.testrevprops',
563
'bzrlib.selftest.testoptions',
564
'bzrlib.selftest.testhttp',
565
'bzrlib.selftest.testnonascii',
1113
'bzrlib.tests.test_ancestry',
1114
'bzrlib.tests.test_api',
1115
'bzrlib.tests.test_bad_files',
1116
'bzrlib.tests.test_branch',
1117
'bzrlib.tests.test_bzrdir',
1118
'bzrlib.tests.test_command',
1119
'bzrlib.tests.test_commit',
1120
'bzrlib.tests.test_commit_merge',
1121
'bzrlib.tests.test_config',
1122
'bzrlib.tests.test_conflicts',
1123
'bzrlib.tests.test_decorators',
1124
'bzrlib.tests.test_diff',
1125
'bzrlib.tests.test_doc_generate',
1126
'bzrlib.tests.test_errors',
1127
'bzrlib.tests.test_escaped_store',
1128
'bzrlib.tests.test_fetch',
1129
'bzrlib.tests.test_gpg',
1130
'bzrlib.tests.test_graph',
1131
'bzrlib.tests.test_hashcache',
1132
'bzrlib.tests.test_http',
1133
'bzrlib.tests.test_identitymap',
1134
'bzrlib.tests.test_inv',
1135
'bzrlib.tests.test_knit',
1136
'bzrlib.tests.test_lockdir',
1137
'bzrlib.tests.test_lockable_files',
1138
'bzrlib.tests.test_log',
1139
'bzrlib.tests.test_merge',
1140
'bzrlib.tests.test_merge3',
1141
'bzrlib.tests.test_merge_core',
1142
'bzrlib.tests.test_missing',
1143
'bzrlib.tests.test_msgeditor',
1144
'bzrlib.tests.test_nonascii',
1145
'bzrlib.tests.test_options',
1146
'bzrlib.tests.test_osutils',
1147
'bzrlib.tests.test_patch',
1148
'bzrlib.tests.test_permissions',
1149
'bzrlib.tests.test_plugins',
1150
'bzrlib.tests.test_progress',
1151
'bzrlib.tests.test_reconcile',
1152
'bzrlib.tests.test_repository',
1153
'bzrlib.tests.test_revision',
1154
'bzrlib.tests.test_revisionnamespaces',
1155
'bzrlib.tests.test_revprops',
1156
'bzrlib.tests.test_rio',
1157
'bzrlib.tests.test_sampler',
1158
'bzrlib.tests.test_selftest',
1159
'bzrlib.tests.test_setup',
1160
'bzrlib.tests.test_sftp_transport',
1161
'bzrlib.tests.test_smart_add',
1162
'bzrlib.tests.test_source',
1163
'bzrlib.tests.test_status',
1164
'bzrlib.tests.test_store',
1165
'bzrlib.tests.test_symbol_versioning',
1166
'bzrlib.tests.test_testament',
1167
'bzrlib.tests.test_textfile',
1168
'bzrlib.tests.test_textmerge',
1169
'bzrlib.tests.test_trace',
1170
'bzrlib.tests.test_transactions',
1171
'bzrlib.tests.test_transform',
1172
'bzrlib.tests.test_transport',
1173
'bzrlib.tests.test_tsort',
1174
'bzrlib.tests.test_tuned_gzip',
1175
'bzrlib.tests.test_ui',
1176
'bzrlib.tests.test_upgrade',
1177
'bzrlib.tests.test_versionedfile',
1178
'bzrlib.tests.test_weave',
1179
'bzrlib.tests.test_whitebox',
1180
'bzrlib.tests.test_workingtree',
1181
'bzrlib.tests.test_xml',
568
for m in (bzrlib.store, bzrlib.inventory, bzrlib.branch,
569
bzrlib.osutils, bzrlib.commands, bzrlib.merge3,
572
if m not in MODULES_TO_DOCTEST:
573
MODULES_TO_DOCTEST.append(m)
575
TestCase.BZRPATH = os.path.join(os.path.realpath(os.path.dirname(bzrlib.__path__[0])), 'bzr')
576
print '%-30s %s' % ('bzr binary', TestCase.BZRPATH)
1183
test_transport_implementations = [
1184
'bzrlib.tests.test_transport_implementations']
578
1186
suite = TestSuite()
579
suite.addTest(TestLoader().loadTestsFromNames(testmod_names))
1187
loader = TestUtil.TestLoader()
1188
from bzrlib.transport import TransportTestProviderAdapter
1189
adapter = TransportTestProviderAdapter()
1190
adapt_modules(test_transport_implementations, adapter, loader, suite)
1191
suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
1192
for package in packages_to_test():
1193
suite.addTest(package.test_suite())
580
1194
for m in MODULES_TO_TEST:
581
suite.addTest(TestLoader().loadTestsFromModule(m))
1195
suite.addTest(loader.loadTestsFromModule(m))
582
1196
for m in (MODULES_TO_DOCTEST):
583
1197
suite.addTest(DocTestSuite(m))
584
for p in bzrlib.plugin.all_plugins:
585
if hasattr(p, 'test_suite'):
586
suite.addTest(p.test_suite())
1198
for name, plugin in bzrlib.plugin.all_plugins().items():
1199
if getattr(plugin, 'test_suite', None) is not None:
1200
suite.addTest(plugin.test_suite())
1204
def adapt_modules(mods_list, adapter, loader, suite):
1205
"""Adapt the modules in mods_list using adapter and add to suite."""
1206
for test in iter_suite_tests(loader.loadTestsFromModuleNames(mods_list)):
1207
suite.addTests(adapter.adapt(test))