~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: Martin Pool
  • Date: 2009-08-28 05:00:33 UTC
  • mfrom: (4659 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4660.
  • Revision ID: mbp@sourcefrog.net-20090828050033-blwvnig3gdzbr1iw
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
 
29
29
import atexit
30
30
import codecs
 
31
from copy import copy
31
32
from cStringIO import StringIO
32
33
import difflib
33
34
import doctest
174
175
        self._overall_start_time = time.time()
175
176
        self._strict = strict
176
177
 
177
 
    def done(self):
178
 
        # nb: called stopTestRun in the version of this that Python merged
179
 
        # upstream, according to lifeless 20090803
 
178
    def stopTestRun(self):
 
179
        run = self.testsRun
 
180
        actionTaken = "Ran"
 
181
        stopTime = time.time()
 
182
        timeTaken = stopTime - self.startTime
 
183
        self.printErrors()
 
184
        self.stream.writeln(self.separator2)
 
185
        self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
 
186
                            run, run != 1 and "s" or "", timeTaken))
 
187
        self.stream.writeln()
 
188
        if not self.wasSuccessful():
 
189
            self.stream.write("FAILED (")
 
190
            failed, errored = map(len, (self.failures, self.errors))
 
191
            if failed:
 
192
                self.stream.write("failures=%d" % failed)
 
193
            if errored:
 
194
                if failed: self.stream.write(", ")
 
195
                self.stream.write("errors=%d" % errored)
 
196
            if self.known_failure_count:
 
197
                if failed or errored: self.stream.write(", ")
 
198
                self.stream.write("known_failure_count=%d" %
 
199
                    self.known_failure_count)
 
200
            self.stream.writeln(")")
 
201
        else:
 
202
            if self.known_failure_count:
 
203
                self.stream.writeln("OK (known_failures=%d)" %
 
204
                    self.known_failure_count)
 
205
            else:
 
206
                self.stream.writeln("OK")
 
207
        if self.skip_count > 0:
 
208
            skipped = self.skip_count
 
209
            self.stream.writeln('%d test%s skipped' %
 
210
                                (skipped, skipped != 1 and "s" or ""))
 
211
        if self.unsupported:
 
212
            for feature, count in sorted(self.unsupported.items()):
 
213
                self.stream.writeln("Missing feature '%s' skipped %d tests." %
 
214
                    (feature, count))
180
215
        if self._strict:
181
216
            ok = self.wasStrictlySuccessful()
182
217
        else:
183
218
            ok = self.wasSuccessful()
184
 
        if ok:
185
 
            self.stream.write('tests passed\n')
186
 
        else:
187
 
            self.stream.write('tests failed\n')
188
219
        if TestCase._first_thread_leaker_id:
189
220
            self.stream.write(
190
221
                '%s is leaking threads among %d leaking tests.\n' % (
382
413
        else:
383
414
            raise errors.BzrError("Unknown whence %r" % whence)
384
415
 
385
 
    def finished(self):
386
 
        pass
387
 
 
388
416
    def report_cleaning_up(self):
389
417
        pass
390
418
 
 
419
    def startTestRun(self):
 
420
        self.startTime = time.time()
 
421
 
391
422
    def report_success(self, test):
392
423
        pass
393
424
 
420
451
        self.pb.update_latency = 0
421
452
        self.pb.show_transport_activity = False
422
453
 
423
 
    def done(self):
 
454
    def stopTestRun(self):
424
455
        # called when the tests that are going to run have run
425
456
        self.pb.clear()
426
 
        super(TextTestResult, self).done()
427
 
 
428
 
    def finished(self):
429
457
        self.pb.finished()
 
458
        super(TextTestResult, self).stopTestRun()
430
459
 
431
 
    def report_starting(self):
 
460
    def startTestRun(self):
 
461
        super(TextTestResult, self).startTestRun()
432
462
        self.pb.update('[test 0/%d] Starting' % (self.num_tests))
433
463
 
434
464
    def printErrors(self):
513
543
            result = a_string
514
544
        return result.ljust(final_width)
515
545
 
516
 
    def report_starting(self):
 
546
    def startTestRun(self):
 
547
        super(VerboseTestResult, self).startTestRun()
517
548
        self.stream.write('running %d tests...\n' % self.num_tests)
518
549
 
519
550
    def report_test_start(self, test):
577
608
                 descriptions=0,
578
609
                 verbosity=1,
579
610
                 bench_history=None,
580
 
                 list_only=False,
581
611
                 strict=False,
 
612
                 result_decorators=None,
582
613
                 ):
 
614
        """Create a TextTestRunner.
 
615
 
 
616
        :param result_decorators: An optional list of decorators to apply
 
617
            to the result object being used by the runner. Decorators are
 
618
            applied left to right - the first element in the list is the 
 
619
            innermost decorator.
 
620
        """
583
621
        self.stream = unittest._WritelnDecorator(stream)
584
622
        self.descriptions = descriptions
585
623
        self.verbosity = verbosity
586
624
        self._bench_history = bench_history
587
 
        self.list_only = list_only
588
625
        self._strict = strict
 
626
        self._result_decorators = result_decorators or []
589
627
 
590
628
    def run(self, test):
591
629
        "Run the given test case or test suite."
592
 
        startTime = time.time()
593
630
        if self.verbosity == 1:
594
631
            result_class = TextTestResult
595
632
        elif self.verbosity >= 2:
596
633
            result_class = VerboseTestResult
597
 
        result = result_class(self.stream,
 
634
        original_result = result_class(self.stream,
598
635
                              self.descriptions,
599
636
                              self.verbosity,
600
637
                              bench_history=self._bench_history,
601
638
                              strict=self._strict,
602
639
                              )
603
 
        result.stop_early = self.stop_on_failure
604
 
        result.report_starting()
605
 
        if self.list_only:
606
 
            if self.verbosity >= 2:
607
 
                self.stream.writeln("Listing tests only ...\n")
608
 
            run = 0
609
 
            for t in iter_suite_tests(test):
610
 
                self.stream.writeln("%s" % (t.id()))
611
 
                run += 1
612
 
            return None
613
 
        else:
614
 
            try:
615
 
                import testtools
616
 
            except ImportError:
617
 
                test.run(result)
618
 
            else:
619
 
                if isinstance(test, testtools.ConcurrentTestSuite):
620
 
                    # We need to catch bzr specific behaviors
621
 
                    test.run(BZRTransformingResult(result))
622
 
                else:
623
 
                    test.run(result)
624
 
            run = result.testsRun
625
 
            actionTaken = "Ran"
626
 
        stopTime = time.time()
627
 
        timeTaken = stopTime - startTime
628
 
        result.printErrors()
629
 
        self.stream.writeln(result.separator2)
630
 
        self.stream.writeln("%s %d test%s in %.3fs" % (actionTaken,
631
 
                            run, run != 1 and "s" or "", timeTaken))
632
 
        self.stream.writeln()
633
 
        if not result.wasSuccessful():
634
 
            self.stream.write("FAILED (")
635
 
            failed, errored = map(len, (result.failures, result.errors))
636
 
            if failed:
637
 
                self.stream.write("failures=%d" % failed)
638
 
            if errored:
639
 
                if failed: self.stream.write(", ")
640
 
                self.stream.write("errors=%d" % errored)
641
 
            if result.known_failure_count:
642
 
                if failed or errored: self.stream.write(", ")
643
 
                self.stream.write("known_failure_count=%d" %
644
 
                    result.known_failure_count)
645
 
            self.stream.writeln(")")
646
 
        else:
647
 
            if result.known_failure_count:
648
 
                self.stream.writeln("OK (known_failures=%d)" %
649
 
                    result.known_failure_count)
650
 
            else:
651
 
                self.stream.writeln("OK")
652
 
        if result.skip_count > 0:
653
 
            skipped = result.skip_count
654
 
            self.stream.writeln('%d test%s skipped' %
655
 
                                (skipped, skipped != 1 and "s" or ""))
656
 
        if result.unsupported:
657
 
            for feature, count in sorted(result.unsupported.items()):
658
 
                self.stream.writeln("Missing feature '%s' skipped %d tests." %
659
 
                    (feature, count))
660
 
        result.finished()
661
 
        return result
 
640
        # Signal to result objects that look at stop early policy to stop,
 
641
        original_result.stop_early = self.stop_on_failure
 
642
        result = original_result
 
643
        for decorator in self._result_decorators:
 
644
            result = decorator(result)
 
645
            result.stop_early = self.stop_on_failure
 
646
        try:
 
647
            import testtools
 
648
        except ImportError:
 
649
            pass
 
650
        else:
 
651
            if isinstance(test, testtools.ConcurrentTestSuite):
 
652
                # We need to catch bzr specific behaviors
 
653
                result = BZRTransformingResult(result)
 
654
        result.startTestRun()
 
655
        try:
 
656
            test.run(result)
 
657
        finally:
 
658
            result.stopTestRun()
 
659
        # higher level code uses our extended protocol to determine
 
660
        # what exit code to give.
 
661
        return original_result
662
662
 
663
663
 
664
664
def iter_suite_tests(suite):
2486
2486
        repository will also be accessed locally. Otherwise a lightweight
2487
2487
        checkout is created and returned.
2488
2488
 
 
2489
        We do this because we can't physically create a tree in the local
 
2490
        path, with a branch reference to the transport_factory url, and
 
2491
        a branch + repository in the vfs_transport, unless the vfs_transport
 
2492
        namespace is distinct from the local disk - the two branch objects
 
2493
        would collide. While we could construct a tree with its branch object
 
2494
        pointing at the transport_factory transport in memory, reopening it
 
2495
        would behaving unexpectedly, and has in the past caused testing bugs
 
2496
        when we tried to do it that way.
 
2497
 
2489
2498
        :param format: The BzrDirFormat.
2490
2499
        :returns: the WorkingTree.
2491
2500
        """
2762
2771
              strict=False,
2763
2772
              runner_class=None,
2764
2773
              suite_decorators=None,
2765
 
              stream=None):
 
2774
              stream=None,
 
2775
              result_decorators=None,
 
2776
              ):
2766
2777
    """Run a test suite for bzr selftest.
2767
2778
 
2768
2779
    :param runner_class: The class of runner to use. Must support the
2783
2794
                            descriptions=0,
2784
2795
                            verbosity=verbosity,
2785
2796
                            bench_history=bench_history,
2786
 
                            list_only=list_only,
2787
2797
                            strict=strict,
 
2798
                            result_decorators=result_decorators,
2788
2799
                            )
2789
2800
    runner.stop_on_failure=stop_on_failure
2790
2801
    # built in decorator factories:
2805
2816
        decorators.append(CountingDecorator)
2806
2817
    for decorator in decorators:
2807
2818
        suite = decorator(suite)
2808
 
    result = runner.run(suite)
2809
2819
    if list_only:
 
2820
        # Done after test suite decoration to allow randomisation etc
 
2821
        # to take effect, though that is of marginal benefit.
 
2822
        if verbosity >= 2:
 
2823
            stream.write("Listing tests only ...\n")
 
2824
        for t in iter_suite_tests(suite):
 
2825
            stream.write("%s\n" % (t.id()))
2810
2826
        return True
2811
 
    result.done()
 
2827
    result = runner.run(suite)
2812
2828
    if strict:
2813
2829
        return result.wasStrictlySuccessful()
2814
2830
    else:
3131
3147
    return result
3132
3148
 
3133
3149
 
3134
 
class BZRTransformingResult(unittest.TestResult):
 
3150
class ForwardingResult(unittest.TestResult):
3135
3151
 
3136
3152
    def __init__(self, target):
3137
3153
        unittest.TestResult.__init__(self)
3143
3159
    def stopTest(self, test):
3144
3160
        self.result.stopTest(test)
3145
3161
 
 
3162
    def startTestRun(self):
 
3163
        self.result.startTestRun()
 
3164
 
 
3165
    def stopTestRun(self):
 
3166
        self.result.stopTestRun()
 
3167
 
 
3168
    def addSkip(self, test, reason):
 
3169
        self.result.addSkip(test, reason)
 
3170
 
 
3171
    def addSuccess(self, test):
 
3172
        self.result.addSuccess(test)
 
3173
 
 
3174
    def addError(self, test, err):
 
3175
        self.result.addError(test, err)
 
3176
 
 
3177
    def addFailure(self, test, err):
 
3178
        self.result.addFailure(test, err)
 
3179
 
 
3180
 
 
3181
class BZRTransformingResult(ForwardingResult):
 
3182
 
3146
3183
    def addError(self, test, err):
3147
3184
        feature = self._error_looks_like('UnavailableFeature: ', err)
3148
3185
        if feature is not None:
3158
3195
        else:
3159
3196
            self.result.addFailure(test, err)
3160
3197
 
3161
 
    def addSkip(self, test, reason):
3162
 
        self.result.addSkip(test, reason)
3163
 
 
3164
 
    def addSuccess(self, test):
3165
 
        self.result.addSuccess(test)
3166
 
 
3167
3198
    def _error_looks_like(self, prefix, err):
3168
3199
        """Deserialize exception and returns the stringify value."""
3169
3200
        import subunit
3181
3212
        return value
3182
3213
 
3183
3214
 
 
3215
class ProfileResult(ForwardingResult):
 
3216
    """Generate profiling data for all activity between start and success.
 
3217
    
 
3218
    The profile data is appended to the test's _benchcalls attribute and can
 
3219
    be accessed by the forwarded-to TestResult.
 
3220
 
 
3221
    While it might be cleaner do accumulate this in stopTest, addSuccess is
 
3222
    where our existing output support for lsprof is, and this class aims to
 
3223
    fit in with that: while it could be moved it's not necessary to accomplish
 
3224
    test profiling, nor would it be dramatically cleaner.
 
3225
    """
 
3226
 
 
3227
    def startTest(self, test):
 
3228
        self.profiler = bzrlib.lsprof.BzrProfiler()
 
3229
        self.profiler.start()
 
3230
        ForwardingResult.startTest(self, test)
 
3231
 
 
3232
    def addSuccess(self, test):
 
3233
        stats = self.profiler.stop()
 
3234
        try:
 
3235
            calls = test._benchcalls
 
3236
        except AttributeError:
 
3237
            test._benchcalls = []
 
3238
            calls = test._benchcalls
 
3239
        calls.append(((test.id(), "", ""), stats))
 
3240
        ForwardingResult.addSuccess(self, test)
 
3241
 
 
3242
    def stopTest(self, test):
 
3243
        ForwardingResult.stopTest(self, test)
 
3244
        self.profiler = None
 
3245
 
 
3246
 
3184
3247
# Controlled by "bzr selftest -E=..." option
3185
3248
# Currently supported:
3186
3249
#   -Eallow_debug           Will no longer clear debug.debug_flags() so it
3208
3271
             runner_class=None,
3209
3272
             suite_decorators=None,
3210
3273
             stream=None,
 
3274
             lsprof_tests=False,
3211
3275
             ):
3212
3276
    """Run the whole test suite under the enhanced runner"""
3213
3277
    # XXX: Very ugly way to do this...
3242
3306
        if starting_with:
3243
3307
            # But always filter as requested.
3244
3308
            suite = filter_suite_by_id_startswith(suite, starting_with)
 
3309
        result_decorators = []
 
3310
        if lsprof_tests:
 
3311
            result_decorators.append(ProfileResult)
3245
3312
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
3246
3313
                     stop_on_failure=stop_on_failure,
3247
3314
                     transport=transport,
3255
3322
                     runner_class=runner_class,
3256
3323
                     suite_decorators=suite_decorators,
3257
3324
                     stream=stream,
 
3325
                     result_decorators=result_decorators,
3258
3326
                     )
3259
3327
    finally:
3260
3328
        default_transport = old_transport
3416
3484
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3417
3485
 
3418
3486
 
 
3487
def _test_suite_testmod_names():
 
3488
    """Return the standard list of test module names to test."""
 
3489
    return [
 
3490
        'bzrlib.doc',
 
3491
        'bzrlib.tests.blackbox',
 
3492
        'bzrlib.tests.commands',
 
3493
        'bzrlib.tests.per_branch',
 
3494
        'bzrlib.tests.per_bzrdir',
 
3495
        'bzrlib.tests.per_interrepository',
 
3496
        'bzrlib.tests.per_intertree',
 
3497
        'bzrlib.tests.per_inventory',
 
3498
        'bzrlib.tests.per_interbranch',
 
3499
        'bzrlib.tests.per_lock',
 
3500
        'bzrlib.tests.per_transport',
 
3501
        'bzrlib.tests.per_tree',
 
3502
        'bzrlib.tests.per_pack_repository',
 
3503
        'bzrlib.tests.per_repository',
 
3504
        'bzrlib.tests.per_repository_chk',
 
3505
        'bzrlib.tests.per_repository_reference',
 
3506
        'bzrlib.tests.per_versionedfile',
 
3507
        'bzrlib.tests.per_workingtree',
 
3508
        'bzrlib.tests.test__annotator',
 
3509
        'bzrlib.tests.test__chk_map',
 
3510
        'bzrlib.tests.test__dirstate_helpers',
 
3511
        'bzrlib.tests.test__groupcompress',
 
3512
        'bzrlib.tests.test__known_graph',
 
3513
        'bzrlib.tests.test__rio',
 
3514
        'bzrlib.tests.test__walkdirs_win32',
 
3515
        'bzrlib.tests.test_ancestry',
 
3516
        'bzrlib.tests.test_annotate',
 
3517
        'bzrlib.tests.test_api',
 
3518
        'bzrlib.tests.test_atomicfile',
 
3519
        'bzrlib.tests.test_bad_files',
 
3520
        'bzrlib.tests.test_bencode',
 
3521
        'bzrlib.tests.test_bisect_multi',
 
3522
        'bzrlib.tests.test_branch',
 
3523
        'bzrlib.tests.test_branchbuilder',
 
3524
        'bzrlib.tests.test_btree_index',
 
3525
        'bzrlib.tests.test_bugtracker',
 
3526
        'bzrlib.tests.test_bundle',
 
3527
        'bzrlib.tests.test_bzrdir',
 
3528
        'bzrlib.tests.test__chunks_to_lines',
 
3529
        'bzrlib.tests.test_cache_utf8',
 
3530
        'bzrlib.tests.test_chk_map',
 
3531
        'bzrlib.tests.test_chk_serializer',
 
3532
        'bzrlib.tests.test_chunk_writer',
 
3533
        'bzrlib.tests.test_clean_tree',
 
3534
        'bzrlib.tests.test_commands',
 
3535
        'bzrlib.tests.test_commit',
 
3536
        'bzrlib.tests.test_commit_merge',
 
3537
        'bzrlib.tests.test_config',
 
3538
        'bzrlib.tests.test_conflicts',
 
3539
        'bzrlib.tests.test_counted_lock',
 
3540
        'bzrlib.tests.test_crash',
 
3541
        'bzrlib.tests.test_decorators',
 
3542
        'bzrlib.tests.test_delta',
 
3543
        'bzrlib.tests.test_debug',
 
3544
        'bzrlib.tests.test_deprecated_graph',
 
3545
        'bzrlib.tests.test_diff',
 
3546
        'bzrlib.tests.test_directory_service',
 
3547
        'bzrlib.tests.test_dirstate',
 
3548
        'bzrlib.tests.test_email_message',
 
3549
        'bzrlib.tests.test_eol_filters',
 
3550
        'bzrlib.tests.test_errors',
 
3551
        'bzrlib.tests.test_export',
 
3552
        'bzrlib.tests.test_extract',
 
3553
        'bzrlib.tests.test_fetch',
 
3554
        'bzrlib.tests.test_fifo_cache',
 
3555
        'bzrlib.tests.test_filters',
 
3556
        'bzrlib.tests.test_ftp_transport',
 
3557
        'bzrlib.tests.test_foreign',
 
3558
        'bzrlib.tests.test_generate_docs',
 
3559
        'bzrlib.tests.test_generate_ids',
 
3560
        'bzrlib.tests.test_globbing',
 
3561
        'bzrlib.tests.test_gpg',
 
3562
        'bzrlib.tests.test_graph',
 
3563
        'bzrlib.tests.test_groupcompress',
 
3564
        'bzrlib.tests.test_hashcache',
 
3565
        'bzrlib.tests.test_help',
 
3566
        'bzrlib.tests.test_hooks',
 
3567
        'bzrlib.tests.test_http',
 
3568
        'bzrlib.tests.test_http_response',
 
3569
        'bzrlib.tests.test_https_ca_bundle',
 
3570
        'bzrlib.tests.test_identitymap',
 
3571
        'bzrlib.tests.test_ignores',
 
3572
        'bzrlib.tests.test_index',
 
3573
        'bzrlib.tests.test_info',
 
3574
        'bzrlib.tests.test_inv',
 
3575
        'bzrlib.tests.test_inventory_delta',
 
3576
        'bzrlib.tests.test_knit',
 
3577
        'bzrlib.tests.test_lazy_import',
 
3578
        'bzrlib.tests.test_lazy_regex',
 
3579
        'bzrlib.tests.test_lock',
 
3580
        'bzrlib.tests.test_lockable_files',
 
3581
        'bzrlib.tests.test_lockdir',
 
3582
        'bzrlib.tests.test_log',
 
3583
        'bzrlib.tests.test_lru_cache',
 
3584
        'bzrlib.tests.test_lsprof',
 
3585
        'bzrlib.tests.test_mail_client',
 
3586
        'bzrlib.tests.test_memorytree',
 
3587
        'bzrlib.tests.test_merge',
 
3588
        'bzrlib.tests.test_merge3',
 
3589
        'bzrlib.tests.test_merge_core',
 
3590
        'bzrlib.tests.test_merge_directive',
 
3591
        'bzrlib.tests.test_missing',
 
3592
        'bzrlib.tests.test_msgeditor',
 
3593
        'bzrlib.tests.test_multiparent',
 
3594
        'bzrlib.tests.test_mutabletree',
 
3595
        'bzrlib.tests.test_nonascii',
 
3596
        'bzrlib.tests.test_options',
 
3597
        'bzrlib.tests.test_osutils',
 
3598
        'bzrlib.tests.test_osutils_encodings',
 
3599
        'bzrlib.tests.test_pack',
 
3600
        'bzrlib.tests.test_patch',
 
3601
        'bzrlib.tests.test_patches',
 
3602
        'bzrlib.tests.test_permissions',
 
3603
        'bzrlib.tests.test_plugins',
 
3604
        'bzrlib.tests.test_progress',
 
3605
        'bzrlib.tests.test_read_bundle',
 
3606
        'bzrlib.tests.test_reconcile',
 
3607
        'bzrlib.tests.test_reconfigure',
 
3608
        'bzrlib.tests.test_registry',
 
3609
        'bzrlib.tests.test_remote',
 
3610
        'bzrlib.tests.test_rename_map',
 
3611
        'bzrlib.tests.test_repository',
 
3612
        'bzrlib.tests.test_revert',
 
3613
        'bzrlib.tests.test_revision',
 
3614
        'bzrlib.tests.test_revisionspec',
 
3615
        'bzrlib.tests.test_revisiontree',
 
3616
        'bzrlib.tests.test_rio',
 
3617
        'bzrlib.tests.test_rules',
 
3618
        'bzrlib.tests.test_sampler',
 
3619
        'bzrlib.tests.test_selftest',
 
3620
        'bzrlib.tests.test_serializer',
 
3621
        'bzrlib.tests.test_setup',
 
3622
        'bzrlib.tests.test_sftp_transport',
 
3623
        'bzrlib.tests.test_shelf',
 
3624
        'bzrlib.tests.test_shelf_ui',
 
3625
        'bzrlib.tests.test_smart',
 
3626
        'bzrlib.tests.test_smart_add',
 
3627
        'bzrlib.tests.test_smart_request',
 
3628
        'bzrlib.tests.test_smart_transport',
 
3629
        'bzrlib.tests.test_smtp_connection',
 
3630
        'bzrlib.tests.test_source',
 
3631
        'bzrlib.tests.test_ssh_transport',
 
3632
        'bzrlib.tests.test_status',
 
3633
        'bzrlib.tests.test_store',
 
3634
        'bzrlib.tests.test_strace',
 
3635
        'bzrlib.tests.test_subsume',
 
3636
        'bzrlib.tests.test_switch',
 
3637
        'bzrlib.tests.test_symbol_versioning',
 
3638
        'bzrlib.tests.test_tag',
 
3639
        'bzrlib.tests.test_testament',
 
3640
        'bzrlib.tests.test_textfile',
 
3641
        'bzrlib.tests.test_textmerge',
 
3642
        'bzrlib.tests.test_timestamp',
 
3643
        'bzrlib.tests.test_trace',
 
3644
        'bzrlib.tests.test_transactions',
 
3645
        'bzrlib.tests.test_transform',
 
3646
        'bzrlib.tests.test_transport',
 
3647
        'bzrlib.tests.test_transport_log',
 
3648
        'bzrlib.tests.test_tree',
 
3649
        'bzrlib.tests.test_treebuilder',
 
3650
        'bzrlib.tests.test_tsort',
 
3651
        'bzrlib.tests.test_tuned_gzip',
 
3652
        'bzrlib.tests.test_ui',
 
3653
        'bzrlib.tests.test_uncommit',
 
3654
        'bzrlib.tests.test_upgrade',
 
3655
        'bzrlib.tests.test_upgrade_stacked',
 
3656
        'bzrlib.tests.test_urlutils',
 
3657
        'bzrlib.tests.test_version',
 
3658
        'bzrlib.tests.test_version_info',
 
3659
        'bzrlib.tests.test_weave',
 
3660
        'bzrlib.tests.test_whitebox',
 
3661
        'bzrlib.tests.test_win32utils',
 
3662
        'bzrlib.tests.test_workingtree',
 
3663
        'bzrlib.tests.test_workingtree_4',
 
3664
        'bzrlib.tests.test_wsgi',
 
3665
        'bzrlib.tests.test_xml',
 
3666
        ]
 
3667
 
 
3668
 
 
3669
def _test_suite_modules_to_doctest():
 
3670
    """Return the list of modules to doctest."""   
 
3671
    return [
 
3672
        'bzrlib',
 
3673
        'bzrlib.branchbuilder',
 
3674
        'bzrlib.export',
 
3675
        'bzrlib.inventory',
 
3676
        'bzrlib.iterablefile',
 
3677
        'bzrlib.lockdir',
 
3678
        'bzrlib.merge3',
 
3679
        'bzrlib.option',
 
3680
        'bzrlib.symbol_versioning',
 
3681
        'bzrlib.tests',
 
3682
        'bzrlib.timestamp',
 
3683
        'bzrlib.version_info_formats.format_custom',
 
3684
        ]
 
3685
 
 
3686
 
3419
3687
def test_suite(keep_only=None, starting_with=None):
3420
3688
    """Build and return TestSuite for the whole of bzrlib.
3421
3689
 
3427
3695
    This function can be replaced if you need to change the default test
3428
3696
    suite on a global basis, but it is not encouraged.
3429
3697
    """
3430
 
    testmod_names = [
3431
 
                   'bzrlib.doc',
3432
 
                   'bzrlib.tests.blackbox',
3433
 
                   'bzrlib.tests.commands',
3434
 
                   'bzrlib.tests.per_branch',
3435
 
                   'bzrlib.tests.per_bzrdir',
3436
 
                   'bzrlib.tests.per_interrepository',
3437
 
                   'bzrlib.tests.per_intertree',
3438
 
                   'bzrlib.tests.per_inventory',
3439
 
                   'bzrlib.tests.per_interbranch',
3440
 
                   'bzrlib.tests.per_lock',
3441
 
                   'bzrlib.tests.per_transport',
3442
 
                   'bzrlib.tests.per_tree',
3443
 
                   'bzrlib.tests.per_pack_repository',
3444
 
                   'bzrlib.tests.per_repository',
3445
 
                   'bzrlib.tests.per_repository_chk',
3446
 
                   'bzrlib.tests.per_repository_reference',
3447
 
                   'bzrlib.tests.per_versionedfile',
3448
 
                   'bzrlib.tests.per_workingtree',
3449
 
                   'bzrlib.tests.test__annotator',
3450
 
                   'bzrlib.tests.test__chk_map',
3451
 
                   'bzrlib.tests.test__dirstate_helpers',
3452
 
                   'bzrlib.tests.test__groupcompress',
3453
 
                   'bzrlib.tests.test__known_graph',
3454
 
                   'bzrlib.tests.test__rio',
3455
 
                   'bzrlib.tests.test__walkdirs_win32',
3456
 
                   'bzrlib.tests.test_ancestry',
3457
 
                   'bzrlib.tests.test_annotate',
3458
 
                   'bzrlib.tests.test_api',
3459
 
                   'bzrlib.tests.test_atomicfile',
3460
 
                   'bzrlib.tests.test_bad_files',
3461
 
                   'bzrlib.tests.test_bencode',
3462
 
                   'bzrlib.tests.test_bisect_multi',
3463
 
                   'bzrlib.tests.test_branch',
3464
 
                   'bzrlib.tests.test_branchbuilder',
3465
 
                   'bzrlib.tests.test_btree_index',
3466
 
                   'bzrlib.tests.test_bugtracker',
3467
 
                   'bzrlib.tests.test_bundle',
3468
 
                   'bzrlib.tests.test_bzrdir',
3469
 
                   'bzrlib.tests.test__chunks_to_lines',
3470
 
                   'bzrlib.tests.test_cache_utf8',
3471
 
                   'bzrlib.tests.test_chk_map',
3472
 
                   'bzrlib.tests.test_chk_serializer',
3473
 
                   'bzrlib.tests.test_chunk_writer',
3474
 
                   'bzrlib.tests.test_clean_tree',
3475
 
                   'bzrlib.tests.test_commands',
3476
 
                   'bzrlib.tests.test_commit',
3477
 
                   'bzrlib.tests.test_commit_merge',
3478
 
                   'bzrlib.tests.test_config',
3479
 
                   'bzrlib.tests.test_conflicts',
3480
 
                   'bzrlib.tests.test_counted_lock',
3481
 
                   'bzrlib.tests.test_crash',
3482
 
                   'bzrlib.tests.test_decorators',
3483
 
                   'bzrlib.tests.test_delta',
3484
 
                   'bzrlib.tests.test_debug',
3485
 
                   'bzrlib.tests.test_deprecated_graph',
3486
 
                   'bzrlib.tests.test_diff',
3487
 
                   'bzrlib.tests.test_directory_service',
3488
 
                   'bzrlib.tests.test_dirstate',
3489
 
                   'bzrlib.tests.test_email_message',
3490
 
                   'bzrlib.tests.test_eol_filters',
3491
 
                   'bzrlib.tests.test_errors',
3492
 
                   'bzrlib.tests.test_export',
3493
 
                   'bzrlib.tests.test_extract',
3494
 
                   'bzrlib.tests.test_fetch',
3495
 
                   'bzrlib.tests.test_fifo_cache',
3496
 
                   'bzrlib.tests.test_filters',
3497
 
                   'bzrlib.tests.test_ftp_transport',
3498
 
                   'bzrlib.tests.test_foreign',
3499
 
                   'bzrlib.tests.test_generate_docs',
3500
 
                   'bzrlib.tests.test_generate_ids',
3501
 
                   'bzrlib.tests.test_globbing',
3502
 
                   'bzrlib.tests.test_gpg',
3503
 
                   'bzrlib.tests.test_graph',
3504
 
                   'bzrlib.tests.test_groupcompress',
3505
 
                   'bzrlib.tests.test_hashcache',
3506
 
                   'bzrlib.tests.test_help',
3507
 
                   'bzrlib.tests.test_hooks',
3508
 
                   'bzrlib.tests.test_http',
3509
 
                   'bzrlib.tests.test_http_response',
3510
 
                   'bzrlib.tests.test_https_ca_bundle',
3511
 
                   'bzrlib.tests.test_identitymap',
3512
 
                   'bzrlib.tests.test_ignores',
3513
 
                   'bzrlib.tests.test_index',
3514
 
                   'bzrlib.tests.test_info',
3515
 
                   'bzrlib.tests.test_inv',
3516
 
                   'bzrlib.tests.test_inventory_delta',
3517
 
                   'bzrlib.tests.test_knit',
3518
 
                   'bzrlib.tests.test_lazy_import',
3519
 
                   'bzrlib.tests.test_lazy_regex',
3520
 
                   'bzrlib.tests.test_lock',
3521
 
                   'bzrlib.tests.test_lockable_files',
3522
 
                   'bzrlib.tests.test_lockdir',
3523
 
                   'bzrlib.tests.test_log',
3524
 
                   'bzrlib.tests.test_lru_cache',
3525
 
                   'bzrlib.tests.test_lsprof',
3526
 
                   'bzrlib.tests.test_mail_client',
3527
 
                   'bzrlib.tests.test_memorytree',
3528
 
                   'bzrlib.tests.test_merge',
3529
 
                   'bzrlib.tests.test_merge3',
3530
 
                   'bzrlib.tests.test_merge_core',
3531
 
                   'bzrlib.tests.test_merge_directive',
3532
 
                   'bzrlib.tests.test_missing',
3533
 
                   'bzrlib.tests.test_msgeditor',
3534
 
                   'bzrlib.tests.test_multiparent',
3535
 
                   'bzrlib.tests.test_mutabletree',
3536
 
                   'bzrlib.tests.test_nonascii',
3537
 
                   'bzrlib.tests.test_options',
3538
 
                   'bzrlib.tests.test_osutils',
3539
 
                   'bzrlib.tests.test_osutils_encodings',
3540
 
                   'bzrlib.tests.test_pack',
3541
 
                   'bzrlib.tests.test_patch',
3542
 
                   'bzrlib.tests.test_patches',
3543
 
                   'bzrlib.tests.test_permissions',
3544
 
                   'bzrlib.tests.test_plugins',
3545
 
                   'bzrlib.tests.test_progress',
3546
 
                   'bzrlib.tests.test_read_bundle',
3547
 
                   'bzrlib.tests.test_reconcile',
3548
 
                   'bzrlib.tests.test_reconfigure',
3549
 
                   'bzrlib.tests.test_registry',
3550
 
                   'bzrlib.tests.test_remote',
3551
 
                   'bzrlib.tests.test_rename_map',
3552
 
                   'bzrlib.tests.test_repository',
3553
 
                   'bzrlib.tests.test_revert',
3554
 
                   'bzrlib.tests.test_revision',
3555
 
                   'bzrlib.tests.test_revisionspec',
3556
 
                   'bzrlib.tests.test_revisiontree',
3557
 
                   'bzrlib.tests.test_rio',
3558
 
                   'bzrlib.tests.test_rules',
3559
 
                   'bzrlib.tests.test_sampler',
3560
 
                   'bzrlib.tests.test_selftest',
3561
 
                   'bzrlib.tests.test_serializer',
3562
 
                   'bzrlib.tests.test_setup',
3563
 
                   'bzrlib.tests.test_sftp_transport',
3564
 
                   'bzrlib.tests.test_shelf',
3565
 
                   'bzrlib.tests.test_shelf_ui',
3566
 
                   'bzrlib.tests.test_smart',
3567
 
                   'bzrlib.tests.test_smart_add',
3568
 
                   'bzrlib.tests.test_smart_request',
3569
 
                   'bzrlib.tests.test_smart_transport',
3570
 
                   'bzrlib.tests.test_smtp_connection',
3571
 
                   'bzrlib.tests.test_source',
3572
 
                   'bzrlib.tests.test_ssh_transport',
3573
 
                   'bzrlib.tests.test_status',
3574
 
                   'bzrlib.tests.test_store',
3575
 
                   'bzrlib.tests.test_strace',
3576
 
                   'bzrlib.tests.test_subsume',
3577
 
                   'bzrlib.tests.test_switch',
3578
 
                   'bzrlib.tests.test_symbol_versioning',
3579
 
                   'bzrlib.tests.test_tag',
3580
 
                   'bzrlib.tests.test_testament',
3581
 
                   'bzrlib.tests.test_textfile',
3582
 
                   'bzrlib.tests.test_textmerge',
3583
 
                   'bzrlib.tests.test_timestamp',
3584
 
                   'bzrlib.tests.test_trace',
3585
 
                   'bzrlib.tests.test_transactions',
3586
 
                   'bzrlib.tests.test_transform',
3587
 
                   'bzrlib.tests.test_transport',
3588
 
                   'bzrlib.tests.test_transport_log',
3589
 
                   'bzrlib.tests.test_tree',
3590
 
                   'bzrlib.tests.test_treebuilder',
3591
 
                   'bzrlib.tests.test_tsort',
3592
 
                   'bzrlib.tests.test_tuned_gzip',
3593
 
                   'bzrlib.tests.test_ui',
3594
 
                   'bzrlib.tests.test_uncommit',
3595
 
                   'bzrlib.tests.test_upgrade',
3596
 
                   'bzrlib.tests.test_upgrade_stacked',
3597
 
                   'bzrlib.tests.test_urlutils',
3598
 
                   'bzrlib.tests.test_version',
3599
 
                   'bzrlib.tests.test_version_info',
3600
 
                   'bzrlib.tests.test_weave',
3601
 
                   'bzrlib.tests.test_whitebox',
3602
 
                   'bzrlib.tests.test_win32utils',
3603
 
                   'bzrlib.tests.test_workingtree',
3604
 
                   'bzrlib.tests.test_workingtree_4',
3605
 
                   'bzrlib.tests.test_wsgi',
3606
 
                   'bzrlib.tests.test_xml',
3607
 
                   ]
3608
3698
 
3609
3699
    loader = TestUtil.TestLoader()
3610
3700
 
3639
3729
    suite = loader.suiteClass()
3640
3730
 
3641
3731
    # modules building their suite with loadTestsFromModuleNames
3642
 
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
3643
 
 
3644
 
    modules_to_doctest = [
3645
 
        'bzrlib',
3646
 
        'bzrlib.branchbuilder',
3647
 
        'bzrlib.export',
3648
 
        'bzrlib.inventory',
3649
 
        'bzrlib.iterablefile',
3650
 
        'bzrlib.lockdir',
3651
 
        'bzrlib.merge3',
3652
 
        'bzrlib.option',
3653
 
        'bzrlib.symbol_versioning',
3654
 
        'bzrlib.tests',
3655
 
        'bzrlib.timestamp',
3656
 
        'bzrlib.version_info_formats.format_custom',
3657
 
        ]
3658
 
 
3659
 
    for mod in modules_to_doctest:
 
3732
    suite.addTest(loader.loadTestsFromModuleNames(_test_suite_testmod_names()))
 
3733
 
 
3734
    for mod in _test_suite_modules_to_doctest():
3660
3735
        if not interesting_module(mod):
3661
3736
            # No tests to keep here, move along
3662
3737
            continue
3803
3878
    :param new_id: The id to assign to it.
3804
3879
    :return: The new test.
3805
3880
    """
3806
 
    from copy import deepcopy
3807
 
    new_test = deepcopy(test)
 
3881
    new_test = copy(test)
3808
3882
    new_test.id = lambda: new_id
3809
3883
    return new_test
3810
3884