~bzr-pqm/bzr/bzr.dev

« 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:
27
27
import unittest
28
28
import time
29
29
 
30
 
from logging import debug, warning, error
31
 
 
 
30
import bzrlib.branch
32
31
import bzrlib.commands
 
32
from bzrlib.errors import BzrError
 
33
import bzrlib.inventory
 
34
import bzrlib.merge3
 
35
import bzrlib.osutils
 
36
import bzrlib.osutils as osutils
 
37
import bzrlib.plugin
 
38
import bzrlib.store
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
39
43
 
40
44
MODULES_TO_TEST = []
41
 
MODULES_TO_DOCTEST = []
42
 
 
 
45
MODULES_TO_DOCTEST = [
 
46
                      bzrlib.branch,
 
47
                      bzrlib.commands,
 
48
                      bzrlib.errors,
 
49
                      bzrlib.inventory,
 
50
                      bzrlib.merge3,
 
51
                      bzrlib.osutils,
 
52
                      bzrlib.store,
 
53
                      ]
 
54
def packages_to_test():
 
55
    import bzrlib.tests.blackbox
 
56
    return [
 
57
            bzrlib.tests.blackbox
 
58
            ]
43
59
 
44
60
 
45
61
class EarlyStoppingTestResultAdapter(object):
66
82
 
67
83
 
68
84
class _MyResult(unittest._TextTestResult):
69
 
    """
70
 
    Custom TestResult.
 
85
    """Custom TestResult.
71
86
 
72
 
    No special behaviour for now.
 
87
    Shows output in a different format, including displaying runtime for tests.
73
88
    """
74
89
 
75
90
    def _elapsedTime(self):
76
 
        return "(Took %.3fs)" % (time.time() - self._start_time)
 
91
        return "%5dms" % (1000 * (time.time() - self._start_time))
77
92
 
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
82
97
        # at the end
83
 
        what = test.shortDescription()
84
 
        if what:
85
 
            if len(what) > 70:
86
 
                what = what[:67] + '...'
87
 
        else:
88
 
            what = test.id()
89
 
            if what.startswith('bzrlib.tests.'):
90
 
                what = what[13:]
91
 
            if len(what) > 70:
92
 
                what = '...' + what[-67:]
93
 
            
 
98
        SHOW_DESCRIPTIONS = False
94
99
        if self.showAll:
95
 
            self.stream.write('%-70.70s' % what)
 
100
            width = osutils.terminal_width()
 
101
            name_width = width - 15
 
102
            what = None
 
103
            if SHOW_DESCRIPTIONS:
 
104
                what = test.shortDescription()
 
105
                if what:
 
106
                    if len(what) > name_width:
 
107
                        what = what[:name_width-3] + '...'
 
108
            if what is None:
 
109
                what = test.id()
 
110
                if what.startswith('bzrlib.tests.'):
 
111
                    what = what[13:]
 
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()
98
118
 
107
127
    def addFailure(self, test, err):
108
128
        unittest.TestResult.addFailure(self, test, err)
109
129
        if self.showAll:
110
 
            self.stream.writeln("FAIL %s" % self._elapsedTime())
 
130
            self.stream.writeln(" FAIL %s" % self._elapsedTime())
111
131
        elif self.dots:
112
132
            self.stream.write('F')
113
133
        self.stream.flush()
114
134
 
115
135
    def addSuccess(self, test):
116
136
        if self.showAll:
117
 
            self.stream.writeln('OK %s' % self._elapsedTime())
 
137
            self.stream.writeln('   OK %s' % self._elapsedTime())
118
138
        elif self.dots:
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)
242
261
 
310
329
            callable()
311
330
 
312
331
    def log(self, *args):
313
 
        logging.debug(*args)
 
332
        mutter(*args)
314
333
 
315
334
    def _get_log(self):
316
335
        """Return as a string the log for this test"""
318
337
            return open(self._log_file_name).read()
319
338
        else:
320
339
            return self._log_contents
 
340
        # TODO: Delete the log after it's been read in
321
341
 
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)
524
545
                f.close()
525
546
 
526
547
    def build_tree_contents(self, shape):
527
 
        bzrlib.tests.build_tree_contents(shape)
 
548
        build_tree_contents(shape)
528
549
 
529
550
    def failUnlessExists(self, path):
530
551
        """Fail unless path, which may be abs or relative, exists."""
540
561
    def test_logging(self):
541
562
        """Test logs are captured when a test fails."""
542
563
        self.log('a test message')
 
564
        self._log_file.flush()
543
565
        self.assertContainsRe(self._get_log(), 'a test message\n')
544
566
 
545
567
 
586
608
 
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
592
612
 
593
 
    global MODULES_TO_TEST, MODULES_TO_DOCTEST
 
613
    global MODULES_TO_DOCTEST
594
614
 
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',
648
667
                   ]
649
668
 
650
 
    for m in (bzrlib.store, bzrlib.inventory, bzrlib.branch,
651
 
              bzrlib.osutils, bzrlib.commands, bzrlib.merge3,
652
 
              bzrlib.errors,
653
 
              ):
654
 
        if m not in MODULES_TO_DOCTEST:
655
 
            MODULES_TO_DOCTEST.append(m)
656
 
 
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)
659
671
    print
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: