30
from logging import debug, warning, error
32
31
import bzrlib.commands
32
from bzrlib.errors import BzrError
33
import bzrlib.inventory
36
import bzrlib.osutils as osutils
33
39
import bzrlib.trace
34
import bzrlib.osutils as osutils
35
from bzrlib.tests import TestUtil
40
from bzrlib.trace import mutter
36
41
from bzrlib.tests.TestUtil import TestLoader, TestSuite
37
42
from bzrlib.tests.treeshape import build_tree_contents
38
from bzrlib.errors import BzrError
40
44
MODULES_TO_TEST = []
41
MODULES_TO_DOCTEST = []
45
MODULES_TO_DOCTEST = [
54
def packages_to_test():
55
import bzrlib.tests.blackbox
45
61
class EarlyStoppingTestResultAdapter(object):
68
84
class _MyResult(unittest._TextTestResult):
72
No special behaviour for now.
87
Shows output in a different format, including displaying runtime for tests.
75
90
def _elapsedTime(self):
76
return "(Took %.3fs)" % (time.time() - self._start_time)
91
return "%5dms" % (1000 * (time.time() - self._start_time))
78
93
def startTest(self, test):
79
94
unittest.TestResult.startTest(self, test)
80
95
# In a short description, the important words are in
81
96
# the beginning, but in an id, the important words are
83
what = test.shortDescription()
86
what = what[:67] + '...'
89
if what.startswith('bzrlib.tests.'):
92
what = '...' + what[-67:]
98
SHOW_DESCRIPTIONS = False
95
self.stream.write('%-70.70s' % what)
100
width = osutils.terminal_width()
101
name_width = width - 15
103
if SHOW_DESCRIPTIONS:
104
what = test.shortDescription()
106
if len(what) > name_width:
107
what = what[:name_width-3] + '...'
110
if what.startswith('bzrlib.tests.'):
112
if len(what) > name_width:
113
what = '...' + what[3-name_width:]
114
what = what.ljust(name_width)
115
self.stream.write(what)
96
116
self.stream.flush()
97
117
self._start_time = time.time()
107
127
def addFailure(self, test, err):
108
128
unittest.TestResult.addFailure(self, test, err)
110
self.stream.writeln("FAIL %s" % self._elapsedTime())
130
self.stream.writeln(" FAIL %s" % self._elapsedTime())
112
132
self.stream.write('F')
113
133
self.stream.flush()
115
135
def addSuccess(self, test):
117
self.stream.writeln('OK %s' % self._elapsedTime())
137
self.stream.writeln(' OK %s' % self._elapsedTime())
119
139
self.stream.write('~')
120
140
self.stream.flush()
236
256
fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
237
257
self._log_file = os.fdopen(fileno, 'w+')
238
258
bzrlib.trace.enable_test_log(self._log_file)
239
debug('opened log file %s', name)
240
259
self._log_file_name = name
241
260
self.addCleanup(self._finishLogFile)
318
337
return open(self._log_file_name).read()
320
339
return self._log_contents
340
# TODO: Delete the log after it's been read in
322
342
def capture(self, cmd, retcode=0):
323
343
"""Shortcut that splits cmd into words, runs, and returns stdout"""
346
366
stdout = StringIO()
347
367
stderr = StringIO()
348
368
self.log('run bzr: %s', ' '.join(argv))
369
# FIXME: don't call into logging here
349
370
handler = logging.StreamHandler(stderr)
350
371
handler.setFormatter(bzrlib.trace.QuietFormatter())
351
372
handler.setLevel(logging.INFO)
526
547
def build_tree_contents(self, shape):
527
bzrlib.tests.build_tree_contents(shape)
548
build_tree_contents(shape)
529
550
def failUnlessExists(self, path):
530
551
"""Fail unless path, which may be abs or relative, exists."""
587
609
def test_suite():
588
610
"""Build and return TestSuite for the whole program."""
589
import bzrlib.store, bzrlib.inventory, bzrlib.branch
590
import bzrlib.osutils, bzrlib.merge3, bzrlib.plugin
591
611
from doctest import DocTestSuite
593
global MODULES_TO_TEST, MODULES_TO_DOCTEST
613
global MODULES_TO_DOCTEST
595
615
# FIXME: If these fail to load, e.g. because of a syntax error, the
596
616
# exception is hidden by unittest. Sucks. Should either fix that or
625
645
'bzrlib.tests.test_fetch',
626
646
'bzrlib.tests.test_whitebox',
627
647
'bzrlib.tests.test_store',
628
'bzrlib.tests.blackbox',
629
'bzrlib.tests.blackbox.versioning',
630
648
'bzrlib.tests.test_sampler',
631
649
'bzrlib.tests.test_transactions',
632
650
'bzrlib.tests.test_transport',
645
663
'bzrlib.tests.test_reweave',
646
664
'bzrlib.tests.test_tsort',
647
665
'bzrlib.tests.test_trace',
666
'bzrlib.tests.test_rio',
650
for m in (bzrlib.store, bzrlib.inventory, bzrlib.branch,
651
bzrlib.osutils, bzrlib.commands, bzrlib.merge3,
654
if m not in MODULES_TO_DOCTEST:
655
MODULES_TO_DOCTEST.append(m)
657
669
TestCase.BZRPATH = os.path.join(os.path.realpath(os.path.dirname(bzrlib.__path__[0])), 'bzr')
658
670
print '%-30s %s' % ('bzr binary', TestCase.BZRPATH)
660
672
suite = TestSuite()
661
673
suite.addTest(TestLoader().loadTestsFromNames(testmod_names))
674
for package in packages_to_test():
675
suite.addTest(package.test_suite())
662
676
for m in MODULES_TO_TEST:
663
suite.addTest(TestLoader().loadTestsFromModule(m))
677
suite.addTest(TestLoader().loadTestsFromModule(m))
664
678
for m in (MODULES_TO_DOCTEST):
665
679
suite.addTest(DocTestSuite(m))
666
680
for p in bzrlib.plugin.all_plugins: