325
329
+ self._shortened_test_description(test))
331
def _test_description(self, test):
333
return '#%d %s' % (self.count,
334
self._shortened_test_description(test))
336
return self._shortened_test_description(test)
327
338
def report_error(self, test, err):
328
339
self.error_count += 1
329
340
self.pb.note('ERROR: %s\n %s\n',
330
self._shortened_test_description(test),
341
self._test_description(test),
334
345
def report_failure(self, test, err):
335
346
self.failure_count += 1
336
347
self.pb.note('FAIL: %s\n %s\n',
337
self._shortened_test_description(test),
348
self._test_description(test),
380
391
name = self._shortened_test_description(test)
381
392
# width needs space for 6 char status, plus 1 for slash, plus 2 10-char
382
393
# numbers, plus a trailing blank
383
self.stream.write(self._ellipsize_to_right(name,
384
osutils.terminal_width()-30))
394
# when NUMBERED_DIRS: plus 5 chars on test number, plus 1 char on space
396
self.stream.write('%5d ' % self.count)
397
self.stream.write(self._ellipsize_to_right(name,
398
osutils.terminal_width()-36))
400
self.stream.write(self._ellipsize_to_right(name,
401
osutils.terminal_width()-30))
385
402
self.stream.flush()
404
def _error_summary(self, err):
408
return '%s%s' % (indent, err[1])
387
410
def report_error(self, test, err):
388
411
self.error_count += 1
389
self.stream.writeln('ERROR %s\n %s'
390
% (self._testTimeString(), err[1]))
412
self.stream.writeln('ERROR %s\n%s'
413
% (self._testTimeString(),
414
self._error_summary(err)))
392
416
def report_failure(self, test, err):
393
417
self.failure_count += 1
394
self.stream.writeln(' FAIL %s\n %s'
395
% (self._testTimeString(), err[1]))
418
self.stream.writeln(' FAIL %s\n%s'
419
% (self._testTimeString(),
420
self._error_summary(err)))
397
422
def report_success(self, test):
398
423
self.stream.writeln(' OK %s' % self._testTimeString())
399
424
for bench_called, stats in getattr(test, '_benchcalls', []):
426
self.stream.write(' ' * 6)
400
427
self.stream.writeln('LSProf output for %s(%s, %s)' % bench_called)
401
428
stats.pprint(file=self.stream)
402
429
self.stream.flush()
404
431
def report_skip(self, test, skip_excinfo):
405
print >>self.stream, ' SKIP %s' % self._testTimeString()
406
print >>self.stream, ' %s' % skip_excinfo[1]
433
self.stream.writeln(' SKIP %s\n%s'
434
% (self._testTimeString(),
435
self._error_summary(skip_excinfo)))
409
438
class TextTestRunner(object):
456
485
self.stream.writeln(")")
458
487
self.stream.writeln("OK")
488
if result.skip_count > 0:
489
skipped = result.skip_count
490
self.stream.writeln('%d test%s skipped' %
491
(skipped, skipped != 1 and "s" or ""))
459
492
result.report_cleaning_up()
460
493
# This is still a little bogus,
461
494
# but only a little. Folk not using our testrunner will
476
509
test_root = test_root.encode(
477
510
sys.getfilesystemencoding())
478
osutils.rmtree(test_root)
512
osutils.rmtree(test_root)
514
if sys.platform == 'win32' and e.errno == errno.EACCES:
515
print >>sys.stderr, ('Permission denied: '
516
'unable to remove testing dir '
517
'%s' % os.path.basename(test_root))
480
521
note("Failed tests working directories are in '%s'\n", test_root)
481
522
TestCaseWithMemoryTransport.TEST_ROOT = None
600
641
charjunk=lambda x: False)
601
642
return ''.join(difflines)
644
def assertEqual(self, a, b, message=''):
649
raise AssertionError("%snot equal:\na = %s\nb = %s\n"
651
pformat(a, indent=4), pformat(b, indent=4)))
653
assertEquals = assertEqual
603
655
def assertEqualDiff(self, a, b, message=None):
604
656
"""Assert two texts are equal, if not raise an exception.
630
682
def assertContainsRe(self, haystack, needle_re):
631
683
"""Assert that a contains something matching a regular expression."""
632
684
if not re.search(needle_re, haystack):
633
raise AssertionError('pattern "%s" not found in "%s"'
685
raise AssertionError('pattern "%r" not found in "%r"'
634
686
% (needle_re, haystack))
636
688
def assertNotContainsRe(self, haystack, needle_re):
741
793
expected_first_warning = symbol_versioning.deprecation_string(
742
794
a_callable, deprecation_format)
743
795
if len(call_warnings) == 0:
744
self.fail("No assertion generated by call to %s" %
796
self.fail("No deprecation warning generated by call to %s" %
746
798
self.assertEqual(expected_first_warning, call_warnings[0])
901
953
if not keep_log_file:
902
954
self._log_contents = log_contents
903
os.remove(self._log_file_name)
956
os.remove(self._log_file_name)
958
if sys.platform == 'win32' and e.errno == errno.EACCES:
959
print >>sys.stderr, ('Unable to delete log file '
960
' %r' % self._log_file_name)
904
963
return log_contents
906
965
return "DELETED log file to reduce memory footprint"
995
1054
where it may be useful for debugging. See also run_captured.
997
1056
:param stdin: A string to be used as stdin for the command.
1057
:param retcode: The status code the command should return
1058
:param working_dir: The directory to run the command in
999
1060
retcode = kwargs.pop('retcode', 0)
1000
1061
encoding = kwargs.pop('encoding', None)
1488
1549
For TestCaseInTempDir we create a temporary directory based on the test
1489
1550
name and then create two subdirs - test and home under it.
1552
if NUMBERED_DIRS: # strongly recommended on Windows
1553
# due the path length limitation (260 chars)
1554
candidate_dir = '%s/%dK/%05d' % (self.TEST_ROOT,
1555
int(self.number/1000),
1557
os.makedirs(candidate_dir)
1558
self.test_home_dir = candidate_dir + '/home'
1559
os.mkdir(self.test_home_dir)
1560
self.test_dir = candidate_dir + '/work'
1561
os.mkdir(self.test_dir)
1562
os.chdir(self.test_dir)
1563
# put name of test inside
1564
f = file(candidate_dir + '/name', 'w')
1491
1569
# shorten the name, to avoid test failures due to path length
1492
1570
short_id = self.id().replace('bzrlib.tests.', '') \
1493
1571
.replace('__main__.', '')[-100:]
1645
1723
self.fail("path %s is not a directory; has mode %#o"
1646
1724
% (relpath, mode))
1726
def assertTreesEqual(self, left, right):
1727
"""Check that left and right have the same content and properties."""
1728
# we use a tree delta to check for equality of the content, and we
1729
# manually check for equality of other things such as the parents list.
1730
self.assertEqual(left.get_parent_ids(), right.get_parent_ids())
1731
differences = left.changes_from(right)
1732
self.assertFalse(differences.has_changed(),
1733
"Trees %r and %r are different: %r" % (left, right, differences))
1648
1735
def setUp(self):
1649
1736
super(TestCaseWithTransport, self).setUp()
1650
1737
self.__server = None
1692
1779
def run_suite(suite, name='test', verbose=False, pattern=".*",
1693
1780
stop_on_failure=False, keep_output=False,
1694
1781
transport=None, lsprof_timed=None, bench_history=None,
1695
matching_tests_first=None):
1782
matching_tests_first=None,
1783
numbered_dirs=False):
1784
global NUMBERED_DIRS
1785
NUMBERED_DIRS = bool(numbered_dirs)
1696
1787
TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1742
1834
transport=transport,
1743
1835
lsprof_timed=lsprof_timed,
1744
1836
bench_history=bench_history,
1745
matching_tests_first=matching_tests_first)
1837
matching_tests_first=matching_tests_first,
1838
numbered_dirs=numbered_dirs)
1747
1840
default_transport = old_transport
1771
1864
'bzrlib.tests.test_decorators',
1772
1865
'bzrlib.tests.test_delta',
1773
1866
'bzrlib.tests.test_diff',
1867
'bzrlib.tests.test_dirstate',
1774
1868
'bzrlib.tests.test_doc_generate',
1775
1869
'bzrlib.tests.test_errors',
1776
1870
'bzrlib.tests.test_escaped_store',
1871
'bzrlib.tests.test_extract',
1777
1872
'bzrlib.tests.test_fetch',
1778
1873
'bzrlib.tests.test_ftp_transport',
1779
1874
'bzrlib.tests.test_generate_docs',
1827
1922
'bzrlib.tests.test_source',
1828
1923
'bzrlib.tests.test_status',
1829
1924
'bzrlib.tests.test_store',
1925
'bzrlib.tests.test_subsume',
1830
1926
'bzrlib.tests.test_symbol_versioning',
1831
1927
'bzrlib.tests.test_tag',
1832
1928
'bzrlib.tests.test_testament',
1850
1946
'bzrlib.tests.test_weave',
1851
1947
'bzrlib.tests.test_whitebox',
1852
1948
'bzrlib.tests.test_workingtree',
1949
'bzrlib.tests.test_workingtree_4',
1853
1950
'bzrlib.tests.test_wsgi',
1854
1951
'bzrlib.tests.test_xml',