/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
import errno
34
34
import logging
35
35
import os
 
36
from pprint import pformat
36
37
import re
37
38
import shlex
38
39
import stat
102
103
                      bzrlib.store,
103
104
                      ]
104
105
 
 
106
NUMBERED_DIRS = False   # dirs kind for TestCaseInTempDir (numbered or named)
 
107
 
105
108
 
106
109
def packages_to_test():
107
110
    """Return a list of packages to test.
208
211
    def startTest(self, test):
209
212
        unittest.TestResult.startTest(self, test)
210
213
        self.report_test_start(test)
 
214
        test.number = self.count
211
215
        self._recordTestStartTime()
212
216
 
213
217
    def _recordTestStartTime(self):
324
328
                + ' ' 
325
329
                + self._shortened_test_description(test))
326
330
 
 
331
    def _test_description(self, test):
 
332
        if NUMBERED_DIRS:
 
333
            return '#%d %s' % (self.count,
 
334
                               self._shortened_test_description(test))
 
335
        else:
 
336
            return self._shortened_test_description(test)
 
337
 
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),
331
342
            err[1],
332
343
            )
333
344
 
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),
338
349
            err[1],
339
350
            )
340
351
 
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
 
395
        if NUMBERED_DIRS:
 
396
            self.stream.write('%5d ' % self.count)
 
397
            self.stream.write(self._ellipsize_to_right(name,
 
398
                                osutils.terminal_width()-36))
 
399
        else:
 
400
            self.stream.write(self._ellipsize_to_right(name,
 
401
                                osutils.terminal_width()-30))
385
402
        self.stream.flush()
386
403
 
 
404
    def _error_summary(self, err):
 
405
        indent = ' ' * 4
 
406
        if NUMBERED_DIRS:
 
407
            indent += ' ' * 6
 
408
        return '%s%s' % (indent, err[1])
 
409
 
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)))
391
415
 
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)))
396
421
 
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', []):
 
425
            if NUMBERED_DIRS:
 
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()
403
430
 
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]
 
432
        self.skip_count += 1
 
433
        self.stream.writeln(' SKIP %s\n%s'
 
434
                % (self._testTimeString(),
 
435
                   self._error_summary(skip_excinfo)))
407
436
 
408
437
 
409
438
class TextTestRunner(object):
456
485
            self.stream.writeln(")")
457
486
        else:
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
475
508
                else:
476
509
                    test_root = test_root.encode(
477
510
                        sys.getfilesystemencoding())
478
 
                osutils.rmtree(test_root)
 
511
                try:
 
512
                    osutils.rmtree(test_root)
 
513
                except OSError, e:
 
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))
 
518
                    else:
 
519
                        raise
479
520
        else:
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)
602
643
 
 
644
    def assertEqual(self, a, b, message=''):
 
645
        if a == b:
 
646
            return
 
647
        if message:
 
648
            message += '\n'
 
649
        raise AssertionError("%snot equal:\na = %s\nb = %s\n"
 
650
            % (message,
 
651
               pformat(a, indent=4), pformat(b, indent=4)))
 
652
 
 
653
    assertEquals = assertEqual
 
654
 
603
655
    def assertEqualDiff(self, a, b, message=None):
604
656
        """Assert two texts are equal, if not raise an exception.
605
657
        
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))
635
687
 
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" %
745
797
                a_callable)
746
798
        self.assertEqual(expected_first_warning, call_warnings[0])
747
799
        return result
808
860
        new_env = {
809
861
            'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
810
862
            'HOME': os.getcwd(),
811
 
            'APPDATA': os.getcwd(),
 
863
            'APPDATA': None,  # bzr now use Win32 API and don't rely on APPDATA
812
864
            'BZR_EMAIL': None,
813
865
            'BZREMAIL': None, # may still be present in the environment
814
866
            'EMAIL': None,
900
952
                logfile.close()
901
953
            if not keep_log_file:
902
954
                self._log_contents = log_contents
903
 
                os.remove(self._log_file_name)
 
955
                try:
 
956
                    os.remove(self._log_file_name)
 
957
                except OSError, e:
 
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)
 
961
                    else:
 
962
                        raise
904
963
            return log_contents
905
964
        else:
906
965
            return "DELETED log file to reduce memory footprint"
995
1054
        where it may be useful for debugging.  See also run_captured.
996
1055
 
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
998
1059
        """
999
1060
        retcode = kwargs.pop('retcode', 0)
1000
1061
        encoding = kwargs.pop('encoding', None)
1444
1505
 
1445
1506
    def overrideEnvironmentForTesting(self):
1446
1507
        os.environ['HOME'] = self.test_home_dir
1447
 
        os.environ['APPDATA'] = self.test_home_dir
 
1508
        os.environ['BZR_HOME'] = self.test_home_dir
1448
1509
        
1449
1510
    def setUp(self):
1450
1511
        super(TestCaseWithMemoryTransport, self).setUp()
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.
1490
1551
        """
 
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),
 
1556
                                             self.number)
 
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')
 
1565
            f.write(self.id())
 
1566
            f.close()
 
1567
            return
 
1568
        # Else NAMED DIRS
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))
1647
1725
 
 
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))
 
1734
 
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)
 
1786
 
1696
1787
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1697
1788
    if verbose:
1698
1789
        verbosity = 2
1719
1810
             test_suite_factory=None,
1720
1811
             lsprof_timed=None,
1721
1812
             bench_history=None,
1722
 
             matching_tests_first=None):
 
1813
             matching_tests_first=None,
 
1814
             numbered_dirs=False):
1723
1815
    """Run the whole test suite under the enhanced runner"""
1724
1816
    # XXX: Very ugly way to do this...
1725
1817
    # Disable warning about old formats because we don't want it to disturb
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)
1746
1839
    finally:
1747
1840
        default_transport = old_transport
1748
1841
 
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',
1855
1952
                   ]