/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 cleanup into description

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):
928
928
    def _lock_broken(self, result):
929
929
        self._lock_actions.append(('broken', result))
930
930
 
 
931
    def start_server(self, transport_server, backing_server=None):
 
932
        """Start transport_server for this test.
 
933
 
 
934
        This starts the server, registers a cleanup for it and permits the
 
935
        server's urls to be used.
 
936
        """
 
937
        if backing_server is None:
 
938
            transport_server.setUp()
 
939
        else:
 
940
            transport_server.setUp(backing_server)
 
941
        self.addCleanup(transport_server.tearDown)
 
942
 
931
943
    def _ndiff_strings(self, a, b):
932
944
        """Return ndiff between two strings containing lines.
933
945
 
2067
2079
        if self.__readonly_server is None:
2068
2080
            if self.transport_readonly_server is None:
2069
2081
                # readonly decorator requested
2070
 
                # bring up the server
2071
2082
                self.__readonly_server = ReadonlyServer()
2072
 
                self.__readonly_server.setUp(self.get_vfs_only_server())
2073
2083
            else:
 
2084
                # explicit readonly transport.
2074
2085
                self.__readonly_server = self.create_transport_readonly_server()
2075
 
                self.__readonly_server.setUp(self.get_vfs_only_server())
2076
 
            self.addCleanup(self.__readonly_server.tearDown)
 
2086
            self.start_server(self.__readonly_server,
 
2087
                self.get_vfs_only_server())
2077
2088
        return self.__readonly_server
2078
2089
 
2079
2090
    def get_readonly_url(self, relpath=None):
2098
2109
        """
2099
2110
        if self.__vfs_server is None:
2100
2111
            self.__vfs_server = MemoryServer()
2101
 
            self.__vfs_server.setUp()
2102
 
            self.addCleanup(self.__vfs_server.tearDown)
 
2112
            self.start_server(self.__vfs_server)
2103
2113
        return self.__vfs_server
2104
2114
 
2105
2115
    def get_server(self):
2112
2122
        then the self.get_vfs_server is returned.
2113
2123
        """
2114
2124
        if self.__server is None:
2115
 
            if self.transport_server is None or self.transport_server is self.vfs_transport_factory:
2116
 
                return self.get_vfs_only_server()
 
2125
            if (self.transport_server is None or self.transport_server is
 
2126
                self.vfs_transport_factory):
 
2127
                self.__server = self.get_vfs_only_server()
2117
2128
            else:
2118
2129
                # bring up a decorated means of access to the vfs only server.
2119
2130
                self.__server = self.transport_server()
2120
 
                try:
2121
 
                    self.__server.setUp(self.get_vfs_only_server())
2122
 
                except TypeError, e:
2123
 
                    # This should never happen; the try:Except here is to assist
2124
 
                    # developers having to update code rather than seeing an
2125
 
                    # uninformative TypeError.
2126
 
                    raise Exception, "Old server API in use: %s, %s" % (self.__server, e)
2127
 
            self.addCleanup(self.__server.tearDown)
 
2131
                self.start_server(self.__server, self.get_vfs_only_server())
2128
2132
        return self.__server
2129
2133
 
2130
2134
    def _adjust_url(self, base, relpath):
2263
2267
 
2264
2268
    def make_smart_server(self, path):
2265
2269
        smart_server = server.SmartTCPServer_for_testing()
2266
 
        smart_server.setUp(self.get_server())
 
2270
        self.start_server(smart_server, self.get_server())
2267
2271
        remote_transport = get_transport(smart_server.get_url()).clone(path)
2268
 
        self.addCleanup(smart_server.tearDown)
2269
2272
        return remote_transport
2270
2273
 
2271
2274
    def make_branch_and_memory_tree(self, relpath, format=None):
2472
2475
        """
2473
2476
        if self.__vfs_server is None:
2474
2477
            self.__vfs_server = self.vfs_transport_factory()
2475
 
            self.__vfs_server.setUp()
2476
 
            self.addCleanup(self.__vfs_server.tearDown)
 
2478
            self.start_server(self.__vfs_server)
2477
2479
        return self.__vfs_server
2478
2480
 
2479
2481
    def make_branch_and_tree(self, relpath, format=None):
2486
2488
        repository will also be accessed locally. Otherwise a lightweight
2487
2489
        checkout is created and returned.
2488
2490
 
 
2491
        We do this because we can't physically create a tree in the local
 
2492
        path, with a branch reference to the transport_factory url, and
 
2493
        a branch + repository in the vfs_transport, unless the vfs_transport
 
2494
        namespace is distinct from the local disk - the two branch objects
 
2495
        would collide. While we could construct a tree with its branch object
 
2496
        pointing at the transport_factory transport in memory, reopening it
 
2497
        would behaving unexpectedly, and has in the past caused testing bugs
 
2498
        when we tried to do it that way.
 
2499
 
2489
2500
        :param format: The BzrDirFormat.
2490
2501
        :returns: the WorkingTree.
2491
2502
        """
2762
2773
              strict=False,
2763
2774
              runner_class=None,
2764
2775
              suite_decorators=None,
2765
 
              stream=None):
 
2776
              stream=None,
 
2777
              result_decorators=None,
 
2778
              ):
2766
2779
    """Run a test suite for bzr selftest.
2767
2780
 
2768
2781
    :param runner_class: The class of runner to use. Must support the
2783
2796
                            descriptions=0,
2784
2797
                            verbosity=verbosity,
2785
2798
                            bench_history=bench_history,
2786
 
                            list_only=list_only,
2787
2799
                            strict=strict,
 
2800
                            result_decorators=result_decorators,
2788
2801
                            )
2789
2802
    runner.stop_on_failure=stop_on_failure
2790
2803
    # built in decorator factories:
2805
2818
        decorators.append(CountingDecorator)
2806
2819
    for decorator in decorators:
2807
2820
        suite = decorator(suite)
2808
 
    result = runner.run(suite)
2809
2821
    if list_only:
 
2822
        # Done after test suite decoration to allow randomisation etc
 
2823
        # to take effect, though that is of marginal benefit.
 
2824
        if verbosity >= 2:
 
2825
            stream.write("Listing tests only ...\n")
 
2826
        for t in iter_suite_tests(suite):
 
2827
            stream.write("%s\n" % (t.id()))
2810
2828
        return True
2811
 
    result.done()
 
2829
    result = runner.run(suite)
2812
2830
    if strict:
2813
2831
        return result.wasStrictlySuccessful()
2814
2832
    else:
3131
3149
    return result
3132
3150
 
3133
3151
 
3134
 
class BZRTransformingResult(unittest.TestResult):
 
3152
class ForwardingResult(unittest.TestResult):
3135
3153
 
3136
3154
    def __init__(self, target):
3137
3155
        unittest.TestResult.__init__(self)
3143
3161
    def stopTest(self, test):
3144
3162
        self.result.stopTest(test)
3145
3163
 
 
3164
    def startTestRun(self):
 
3165
        self.result.startTestRun()
 
3166
 
 
3167
    def stopTestRun(self):
 
3168
        self.result.stopTestRun()
 
3169
 
 
3170
    def addSkip(self, test, reason):
 
3171
        self.result.addSkip(test, reason)
 
3172
 
 
3173
    def addSuccess(self, test):
 
3174
        self.result.addSuccess(test)
 
3175
 
 
3176
    def addError(self, test, err):
 
3177
        self.result.addError(test, err)
 
3178
 
 
3179
    def addFailure(self, test, err):
 
3180
        self.result.addFailure(test, err)
 
3181
 
 
3182
 
 
3183
class BZRTransformingResult(ForwardingResult):
 
3184
 
3146
3185
    def addError(self, test, err):
3147
3186
        feature = self._error_looks_like('UnavailableFeature: ', err)
3148
3187
        if feature is not None:
3158
3197
        else:
3159
3198
            self.result.addFailure(test, err)
3160
3199
 
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
3200
    def _error_looks_like(self, prefix, err):
3168
3201
        """Deserialize exception and returns the stringify value."""
3169
3202
        import subunit
3181
3214
        return value
3182
3215
 
3183
3216
 
 
3217
class ProfileResult(ForwardingResult):
 
3218
    """Generate profiling data for all activity between start and success.
 
3219
    
 
3220
    The profile data is appended to the test's _benchcalls attribute and can
 
3221
    be accessed by the forwarded-to TestResult.
 
3222
 
 
3223
    While it might be cleaner do accumulate this in stopTest, addSuccess is
 
3224
    where our existing output support for lsprof is, and this class aims to
 
3225
    fit in with that: while it could be moved it's not necessary to accomplish
 
3226
    test profiling, nor would it be dramatically cleaner.
 
3227
    """
 
3228
 
 
3229
    def startTest(self, test):
 
3230
        self.profiler = bzrlib.lsprof.BzrProfiler()
 
3231
        self.profiler.start()
 
3232
        ForwardingResult.startTest(self, test)
 
3233
 
 
3234
    def addSuccess(self, test):
 
3235
        stats = self.profiler.stop()
 
3236
        try:
 
3237
            calls = test._benchcalls
 
3238
        except AttributeError:
 
3239
            test._benchcalls = []
 
3240
            calls = test._benchcalls
 
3241
        calls.append(((test.id(), "", ""), stats))
 
3242
        ForwardingResult.addSuccess(self, test)
 
3243
 
 
3244
    def stopTest(self, test):
 
3245
        ForwardingResult.stopTest(self, test)
 
3246
        self.profiler = None
 
3247
 
 
3248
 
3184
3249
# Controlled by "bzr selftest -E=..." option
3185
3250
# Currently supported:
3186
3251
#   -Eallow_debug           Will no longer clear debug.debug_flags() so it
3207
3272
             starting_with=None,
3208
3273
             runner_class=None,
3209
3274
             suite_decorators=None,
 
3275
             stream=None,
 
3276
             lsprof_tests=False,
3210
3277
             ):
3211
3278
    """Run the whole test suite under the enhanced runner"""
3212
3279
    # XXX: Very ugly way to do this...
3229
3296
            keep_only = None
3230
3297
        else:
3231
3298
            keep_only = load_test_id_list(load_list)
 
3299
        if starting_with:
 
3300
            starting_with = [test_prefix_alias_registry.resolve_alias(start)
 
3301
                             for start in starting_with]
3232
3302
        if test_suite_factory is None:
 
3303
            # Reduce loading time by loading modules based on the starting_with
 
3304
            # patterns.
3233
3305
            suite = test_suite(keep_only, starting_with)
3234
3306
        else:
3235
3307
            suite = test_suite_factory()
 
3308
        if starting_with:
 
3309
            # But always filter as requested.
 
3310
            suite = filter_suite_by_id_startswith(suite, starting_with)
 
3311
        result_decorators = []
 
3312
        if lsprof_tests:
 
3313
            result_decorators.append(ProfileResult)
3236
3314
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
3237
3315
                     stop_on_failure=stop_on_failure,
3238
3316
                     transport=transport,
3245
3323
                     strict=strict,
3246
3324
                     runner_class=runner_class,
3247
3325
                     suite_decorators=suite_decorators,
 
3326
                     stream=stream,
 
3327
                     result_decorators=result_decorators,
3248
3328
                     )
3249
3329
    finally:
3250
3330
        default_transport = old_transport
3406
3486
test_prefix_alias_registry.register('bp', 'bzrlib.plugins')
3407
3487
 
3408
3488
 
 
3489
def _test_suite_testmod_names():
 
3490
    """Return the standard list of test module names to test."""
 
3491
    return [
 
3492
        'bzrlib.doc',
 
3493
        'bzrlib.tests.blackbox',
 
3494
        'bzrlib.tests.commands',
 
3495
        'bzrlib.tests.per_branch',
 
3496
        'bzrlib.tests.per_bzrdir',
 
3497
        'bzrlib.tests.per_interrepository',
 
3498
        'bzrlib.tests.per_intertree',
 
3499
        'bzrlib.tests.per_inventory',
 
3500
        'bzrlib.tests.per_interbranch',
 
3501
        'bzrlib.tests.per_lock',
 
3502
        'bzrlib.tests.per_transport',
 
3503
        'bzrlib.tests.per_tree',
 
3504
        'bzrlib.tests.per_pack_repository',
 
3505
        'bzrlib.tests.per_repository',
 
3506
        'bzrlib.tests.per_repository_chk',
 
3507
        'bzrlib.tests.per_repository_reference',
 
3508
        'bzrlib.tests.per_versionedfile',
 
3509
        'bzrlib.tests.per_workingtree',
 
3510
        'bzrlib.tests.test__annotator',
 
3511
        'bzrlib.tests.test__chk_map',
 
3512
        'bzrlib.tests.test__dirstate_helpers',
 
3513
        'bzrlib.tests.test__groupcompress',
 
3514
        'bzrlib.tests.test__known_graph',
 
3515
        'bzrlib.tests.test__rio',
 
3516
        'bzrlib.tests.test__walkdirs_win32',
 
3517
        'bzrlib.tests.test_ancestry',
 
3518
        'bzrlib.tests.test_annotate',
 
3519
        'bzrlib.tests.test_api',
 
3520
        'bzrlib.tests.test_atomicfile',
 
3521
        'bzrlib.tests.test_bad_files',
 
3522
        'bzrlib.tests.test_bencode',
 
3523
        'bzrlib.tests.test_bisect_multi',
 
3524
        'bzrlib.tests.test_branch',
 
3525
        'bzrlib.tests.test_branchbuilder',
 
3526
        'bzrlib.tests.test_btree_index',
 
3527
        'bzrlib.tests.test_bugtracker',
 
3528
        'bzrlib.tests.test_bundle',
 
3529
        'bzrlib.tests.test_bzrdir',
 
3530
        'bzrlib.tests.test__chunks_to_lines',
 
3531
        'bzrlib.tests.test_cache_utf8',
 
3532
        'bzrlib.tests.test_chk_map',
 
3533
        'bzrlib.tests.test_chk_serializer',
 
3534
        'bzrlib.tests.test_chunk_writer',
 
3535
        'bzrlib.tests.test_clean_tree',
 
3536
        'bzrlib.tests.test_commands',
 
3537
        'bzrlib.tests.test_commit',
 
3538
        'bzrlib.tests.test_commit_merge',
 
3539
        'bzrlib.tests.test_config',
 
3540
        'bzrlib.tests.test_conflicts',
 
3541
        'bzrlib.tests.test_counted_lock',
 
3542
        'bzrlib.tests.test_crash',
 
3543
        'bzrlib.tests.test_decorators',
 
3544
        'bzrlib.tests.test_delta',
 
3545
        'bzrlib.tests.test_debug',
 
3546
        'bzrlib.tests.test_deprecated_graph',
 
3547
        'bzrlib.tests.test_diff',
 
3548
        'bzrlib.tests.test_directory_service',
 
3549
        'bzrlib.tests.test_dirstate',
 
3550
        'bzrlib.tests.test_email_message',
 
3551
        'bzrlib.tests.test_eol_filters',
 
3552
        'bzrlib.tests.test_errors',
 
3553
        'bzrlib.tests.test_export',
 
3554
        'bzrlib.tests.test_extract',
 
3555
        'bzrlib.tests.test_fetch',
 
3556
        'bzrlib.tests.test_fifo_cache',
 
3557
        'bzrlib.tests.test_filters',
 
3558
        'bzrlib.tests.test_ftp_transport',
 
3559
        'bzrlib.tests.test_foreign',
 
3560
        'bzrlib.tests.test_generate_docs',
 
3561
        'bzrlib.tests.test_generate_ids',
 
3562
        'bzrlib.tests.test_globbing',
 
3563
        'bzrlib.tests.test_gpg',
 
3564
        'bzrlib.tests.test_graph',
 
3565
        'bzrlib.tests.test_groupcompress',
 
3566
        'bzrlib.tests.test_hashcache',
 
3567
        'bzrlib.tests.test_help',
 
3568
        'bzrlib.tests.test_hooks',
 
3569
        'bzrlib.tests.test_http',
 
3570
        'bzrlib.tests.test_http_response',
 
3571
        'bzrlib.tests.test_https_ca_bundle',
 
3572
        'bzrlib.tests.test_identitymap',
 
3573
        'bzrlib.tests.test_ignores',
 
3574
        'bzrlib.tests.test_index',
 
3575
        'bzrlib.tests.test_info',
 
3576
        'bzrlib.tests.test_inv',
 
3577
        'bzrlib.tests.test_inventory_delta',
 
3578
        'bzrlib.tests.test_knit',
 
3579
        'bzrlib.tests.test_lazy_import',
 
3580
        'bzrlib.tests.test_lazy_regex',
 
3581
        'bzrlib.tests.test_lock',
 
3582
        'bzrlib.tests.test_lockable_files',
 
3583
        'bzrlib.tests.test_lockdir',
 
3584
        'bzrlib.tests.test_log',
 
3585
        'bzrlib.tests.test_lru_cache',
 
3586
        'bzrlib.tests.test_lsprof',
 
3587
        'bzrlib.tests.test_mail_client',
 
3588
        'bzrlib.tests.test_memorytree',
 
3589
        'bzrlib.tests.test_merge',
 
3590
        'bzrlib.tests.test_merge3',
 
3591
        'bzrlib.tests.test_merge_core',
 
3592
        'bzrlib.tests.test_merge_directive',
 
3593
        'bzrlib.tests.test_missing',
 
3594
        'bzrlib.tests.test_msgeditor',
 
3595
        'bzrlib.tests.test_multiparent',
 
3596
        'bzrlib.tests.test_mutabletree',
 
3597
        'bzrlib.tests.test_nonascii',
 
3598
        'bzrlib.tests.test_options',
 
3599
        'bzrlib.tests.test_osutils',
 
3600
        'bzrlib.tests.test_osutils_encodings',
 
3601
        'bzrlib.tests.test_pack',
 
3602
        'bzrlib.tests.test_patch',
 
3603
        'bzrlib.tests.test_patches',
 
3604
        'bzrlib.tests.test_permissions',
 
3605
        'bzrlib.tests.test_plugins',
 
3606
        'bzrlib.tests.test_progress',
 
3607
        'bzrlib.tests.test_read_bundle',
 
3608
        'bzrlib.tests.test_reconcile',
 
3609
        'bzrlib.tests.test_reconfigure',
 
3610
        'bzrlib.tests.test_registry',
 
3611
        'bzrlib.tests.test_remote',
 
3612
        'bzrlib.tests.test_rename_map',
 
3613
        'bzrlib.tests.test_repository',
 
3614
        'bzrlib.tests.test_revert',
 
3615
        'bzrlib.tests.test_revision',
 
3616
        'bzrlib.tests.test_revisionspec',
 
3617
        'bzrlib.tests.test_revisiontree',
 
3618
        'bzrlib.tests.test_rio',
 
3619
        'bzrlib.tests.test_rules',
 
3620
        'bzrlib.tests.test_sampler',
 
3621
        'bzrlib.tests.test_selftest',
 
3622
        'bzrlib.tests.test_serializer',
 
3623
        'bzrlib.tests.test_setup',
 
3624
        'bzrlib.tests.test_sftp_transport',
 
3625
        'bzrlib.tests.test_shelf',
 
3626
        'bzrlib.tests.test_shelf_ui',
 
3627
        'bzrlib.tests.test_smart',
 
3628
        'bzrlib.tests.test_smart_add',
 
3629
        'bzrlib.tests.test_smart_request',
 
3630
        'bzrlib.tests.test_smart_transport',
 
3631
        'bzrlib.tests.test_smtp_connection',
 
3632
        'bzrlib.tests.test_source',
 
3633
        'bzrlib.tests.test_ssh_transport',
 
3634
        'bzrlib.tests.test_status',
 
3635
        'bzrlib.tests.test_store',
 
3636
        'bzrlib.tests.test_strace',
 
3637
        'bzrlib.tests.test_subsume',
 
3638
        'bzrlib.tests.test_switch',
 
3639
        'bzrlib.tests.test_symbol_versioning',
 
3640
        'bzrlib.tests.test_tag',
 
3641
        'bzrlib.tests.test_testament',
 
3642
        'bzrlib.tests.test_textfile',
 
3643
        'bzrlib.tests.test_textmerge',
 
3644
        'bzrlib.tests.test_timestamp',
 
3645
        'bzrlib.tests.test_trace',
 
3646
        'bzrlib.tests.test_transactions',
 
3647
        'bzrlib.tests.test_transform',
 
3648
        'bzrlib.tests.test_transport',
 
3649
        'bzrlib.tests.test_transport_log',
 
3650
        'bzrlib.tests.test_tree',
 
3651
        'bzrlib.tests.test_treebuilder',
 
3652
        'bzrlib.tests.test_tsort',
 
3653
        'bzrlib.tests.test_tuned_gzip',
 
3654
        'bzrlib.tests.test_ui',
 
3655
        'bzrlib.tests.test_uncommit',
 
3656
        'bzrlib.tests.test_upgrade',
 
3657
        'bzrlib.tests.test_upgrade_stacked',
 
3658
        'bzrlib.tests.test_urlutils',
 
3659
        'bzrlib.tests.test_version',
 
3660
        'bzrlib.tests.test_version_info',
 
3661
        'bzrlib.tests.test_weave',
 
3662
        'bzrlib.tests.test_whitebox',
 
3663
        'bzrlib.tests.test_win32utils',
 
3664
        'bzrlib.tests.test_workingtree',
 
3665
        'bzrlib.tests.test_workingtree_4',
 
3666
        'bzrlib.tests.test_wsgi',
 
3667
        'bzrlib.tests.test_xml',
 
3668
        ]
 
3669
 
 
3670
 
 
3671
def _test_suite_modules_to_doctest():
 
3672
    """Return the list of modules to doctest."""   
 
3673
    return [
 
3674
        'bzrlib',
 
3675
        'bzrlib.branchbuilder',
 
3676
        'bzrlib.export',
 
3677
        'bzrlib.inventory',
 
3678
        'bzrlib.iterablefile',
 
3679
        'bzrlib.lockdir',
 
3680
        'bzrlib.merge3',
 
3681
        'bzrlib.option',
 
3682
        'bzrlib.symbol_versioning',
 
3683
        'bzrlib.tests',
 
3684
        'bzrlib.timestamp',
 
3685
        'bzrlib.version_info_formats.format_custom',
 
3686
        ]
 
3687
 
 
3688
 
3409
3689
def test_suite(keep_only=None, starting_with=None):
3410
3690
    """Build and return TestSuite for the whole of bzrlib.
3411
3691
 
3417
3697
    This function can be replaced if you need to change the default test
3418
3698
    suite on a global basis, but it is not encouraged.
3419
3699
    """
3420
 
    testmod_names = [
3421
 
                   'bzrlib.doc',
3422
 
                   'bzrlib.tests.blackbox',
3423
 
                   'bzrlib.tests.commands',
3424
 
                   'bzrlib.tests.per_branch',
3425
 
                   'bzrlib.tests.per_bzrdir',
3426
 
                   'bzrlib.tests.per_interrepository',
3427
 
                   'bzrlib.tests.per_intertree',
3428
 
                   'bzrlib.tests.per_inventory',
3429
 
                   'bzrlib.tests.per_interbranch',
3430
 
                   'bzrlib.tests.per_lock',
3431
 
                   'bzrlib.tests.per_transport',
3432
 
                   'bzrlib.tests.per_tree',
3433
 
                   'bzrlib.tests.per_pack_repository',
3434
 
                   'bzrlib.tests.per_repository',
3435
 
                   'bzrlib.tests.per_repository_chk',
3436
 
                   'bzrlib.tests.per_repository_reference',
3437
 
                   'bzrlib.tests.per_versionedfile',
3438
 
                   'bzrlib.tests.per_workingtree',
3439
 
                   'bzrlib.tests.test__annotator',
3440
 
                   'bzrlib.tests.test__chk_map',
3441
 
                   'bzrlib.tests.test__dirstate_helpers',
3442
 
                   'bzrlib.tests.test__groupcompress',
3443
 
                   'bzrlib.tests.test__known_graph',
3444
 
                   'bzrlib.tests.test__rio',
3445
 
                   'bzrlib.tests.test__walkdirs_win32',
3446
 
                   'bzrlib.tests.test_ancestry',
3447
 
                   'bzrlib.tests.test_annotate',
3448
 
                   'bzrlib.tests.test_api',
3449
 
                   'bzrlib.tests.test_atomicfile',
3450
 
                   'bzrlib.tests.test_bad_files',
3451
 
                   'bzrlib.tests.test_bencode',
3452
 
                   'bzrlib.tests.test_bisect_multi',
3453
 
                   'bzrlib.tests.test_branch',
3454
 
                   'bzrlib.tests.test_branchbuilder',
3455
 
                   'bzrlib.tests.test_btree_index',
3456
 
                   'bzrlib.tests.test_bugtracker',
3457
 
                   'bzrlib.tests.test_bundle',
3458
 
                   'bzrlib.tests.test_bzrdir',
3459
 
                   'bzrlib.tests.test__chunks_to_lines',
3460
 
                   'bzrlib.tests.test_cache_utf8',
3461
 
                   'bzrlib.tests.test_chk_map',
3462
 
                   'bzrlib.tests.test_chk_serializer',
3463
 
                   'bzrlib.tests.test_chunk_writer',
3464
 
                   'bzrlib.tests.test_clean_tree',
3465
 
                   'bzrlib.tests.test_commands',
3466
 
                   'bzrlib.tests.test_commit',
3467
 
                   'bzrlib.tests.test_commit_merge',
3468
 
                   'bzrlib.tests.test_config',
3469
 
                   'bzrlib.tests.test_conflicts',
3470
 
                   'bzrlib.tests.test_counted_lock',
3471
 
                   'bzrlib.tests.test_crash',
3472
 
                   'bzrlib.tests.test_decorators',
3473
 
                   'bzrlib.tests.test_delta',
3474
 
                   'bzrlib.tests.test_debug',
3475
 
                   'bzrlib.tests.test_deprecated_graph',
3476
 
                   'bzrlib.tests.test_diff',
3477
 
                   'bzrlib.tests.test_directory_service',
3478
 
                   'bzrlib.tests.test_dirstate',
3479
 
                   'bzrlib.tests.test_email_message',
3480
 
                   'bzrlib.tests.test_eol_filters',
3481
 
                   'bzrlib.tests.test_errors',
3482
 
                   'bzrlib.tests.test_export',
3483
 
                   'bzrlib.tests.test_extract',
3484
 
                   'bzrlib.tests.test_fetch',
3485
 
                   'bzrlib.tests.test_fifo_cache',
3486
 
                   'bzrlib.tests.test_filters',
3487
 
                   'bzrlib.tests.test_ftp_transport',
3488
 
                   'bzrlib.tests.test_foreign',
3489
 
                   'bzrlib.tests.test_generate_docs',
3490
 
                   'bzrlib.tests.test_generate_ids',
3491
 
                   'bzrlib.tests.test_globbing',
3492
 
                   'bzrlib.tests.test_gpg',
3493
 
                   'bzrlib.tests.test_graph',
3494
 
                   'bzrlib.tests.test_groupcompress',
3495
 
                   'bzrlib.tests.test_hashcache',
3496
 
                   'bzrlib.tests.test_help',
3497
 
                   'bzrlib.tests.test_hooks',
3498
 
                   'bzrlib.tests.test_http',
3499
 
                   'bzrlib.tests.test_http_response',
3500
 
                   'bzrlib.tests.test_https_ca_bundle',
3501
 
                   'bzrlib.tests.test_identitymap',
3502
 
                   'bzrlib.tests.test_ignores',
3503
 
                   'bzrlib.tests.test_index',
3504
 
                   'bzrlib.tests.test_info',
3505
 
                   'bzrlib.tests.test_inv',
3506
 
                   'bzrlib.tests.test_inventory_delta',
3507
 
                   'bzrlib.tests.test_knit',
3508
 
                   'bzrlib.tests.test_lazy_import',
3509
 
                   'bzrlib.tests.test_lazy_regex',
3510
 
                   'bzrlib.tests.test_lock',
3511
 
                   'bzrlib.tests.test_lockable_files',
3512
 
                   'bzrlib.tests.test_lockdir',
3513
 
                   'bzrlib.tests.test_log',
3514
 
                   'bzrlib.tests.test_lru_cache',
3515
 
                   'bzrlib.tests.test_lsprof',
3516
 
                   'bzrlib.tests.test_mail_client',
3517
 
                   'bzrlib.tests.test_memorytree',
3518
 
                   'bzrlib.tests.test_merge',
3519
 
                   'bzrlib.tests.test_merge3',
3520
 
                   'bzrlib.tests.test_merge_core',
3521
 
                   'bzrlib.tests.test_merge_directive',
3522
 
                   'bzrlib.tests.test_missing',
3523
 
                   'bzrlib.tests.test_msgeditor',
3524
 
                   'bzrlib.tests.test_multiparent',
3525
 
                   'bzrlib.tests.test_mutabletree',
3526
 
                   'bzrlib.tests.test_nonascii',
3527
 
                   'bzrlib.tests.test_options',
3528
 
                   'bzrlib.tests.test_osutils',
3529
 
                   'bzrlib.tests.test_osutils_encodings',
3530
 
                   'bzrlib.tests.test_pack',
3531
 
                   'bzrlib.tests.test_patch',
3532
 
                   'bzrlib.tests.test_patches',
3533
 
                   'bzrlib.tests.test_permissions',
3534
 
                   'bzrlib.tests.test_plugins',
3535
 
                   'bzrlib.tests.test_progress',
3536
 
                   'bzrlib.tests.test_read_bundle',
3537
 
                   'bzrlib.tests.test_reconcile',
3538
 
                   'bzrlib.tests.test_reconfigure',
3539
 
                   'bzrlib.tests.test_registry',
3540
 
                   'bzrlib.tests.test_remote',
3541
 
                   'bzrlib.tests.test_rename_map',
3542
 
                   'bzrlib.tests.test_repository',
3543
 
                   'bzrlib.tests.test_revert',
3544
 
                   'bzrlib.tests.test_revision',
3545
 
                   'bzrlib.tests.test_revisionspec',
3546
 
                   'bzrlib.tests.test_revisiontree',
3547
 
                   'bzrlib.tests.test_rio',
3548
 
                   'bzrlib.tests.test_rules',
3549
 
                   'bzrlib.tests.test_sampler',
3550
 
                   'bzrlib.tests.test_selftest',
3551
 
                   'bzrlib.tests.test_serializer',
3552
 
                   'bzrlib.tests.test_setup',
3553
 
                   'bzrlib.tests.test_sftp_transport',
3554
 
                   'bzrlib.tests.test_shelf',
3555
 
                   'bzrlib.tests.test_shelf_ui',
3556
 
                   'bzrlib.tests.test_smart',
3557
 
                   'bzrlib.tests.test_smart_add',
3558
 
                   'bzrlib.tests.test_smart_request',
3559
 
                   'bzrlib.tests.test_smart_transport',
3560
 
                   'bzrlib.tests.test_smtp_connection',
3561
 
                   'bzrlib.tests.test_source',
3562
 
                   'bzrlib.tests.test_ssh_transport',
3563
 
                   'bzrlib.tests.test_status',
3564
 
                   'bzrlib.tests.test_store',
3565
 
                   'bzrlib.tests.test_strace',
3566
 
                   'bzrlib.tests.test_subsume',
3567
 
                   'bzrlib.tests.test_switch',
3568
 
                   'bzrlib.tests.test_symbol_versioning',
3569
 
                   'bzrlib.tests.test_tag',
3570
 
                   'bzrlib.tests.test_testament',
3571
 
                   'bzrlib.tests.test_textfile',
3572
 
                   'bzrlib.tests.test_textmerge',
3573
 
                   'bzrlib.tests.test_timestamp',
3574
 
                   'bzrlib.tests.test_trace',
3575
 
                   'bzrlib.tests.test_transactions',
3576
 
                   'bzrlib.tests.test_transform',
3577
 
                   'bzrlib.tests.test_transport',
3578
 
                   'bzrlib.tests.test_transport_log',
3579
 
                   'bzrlib.tests.test_tree',
3580
 
                   'bzrlib.tests.test_treebuilder',
3581
 
                   'bzrlib.tests.test_tsort',
3582
 
                   'bzrlib.tests.test_tuned_gzip',
3583
 
                   'bzrlib.tests.test_ui',
3584
 
                   'bzrlib.tests.test_uncommit',
3585
 
                   'bzrlib.tests.test_upgrade',
3586
 
                   'bzrlib.tests.test_upgrade_stacked',
3587
 
                   'bzrlib.tests.test_urlutils',
3588
 
                   'bzrlib.tests.test_version',
3589
 
                   'bzrlib.tests.test_version_info',
3590
 
                   'bzrlib.tests.test_weave',
3591
 
                   'bzrlib.tests.test_whitebox',
3592
 
                   'bzrlib.tests.test_win32utils',
3593
 
                   'bzrlib.tests.test_workingtree',
3594
 
                   'bzrlib.tests.test_workingtree_4',
3595
 
                   'bzrlib.tests.test_wsgi',
3596
 
                   'bzrlib.tests.test_xml',
3597
 
                   ]
3598
3700
 
3599
3701
    loader = TestUtil.TestLoader()
3600
3702
 
3601
3703
    if keep_only is not None:
3602
3704
        id_filter = TestIdList(keep_only)
3603
3705
    if starting_with:
3604
 
        starting_with = [test_prefix_alias_registry.resolve_alias(start)
3605
 
                         for start in starting_with]
3606
3706
        # We take precedence over keep_only because *at loading time* using
3607
3707
        # both options means we will load less tests for the same final result.
3608
3708
        def interesting_module(name):
3631
3731
    suite = loader.suiteClass()
3632
3732
 
3633
3733
    # modules building their suite with loadTestsFromModuleNames
3634
 
    suite.addTest(loader.loadTestsFromModuleNames(testmod_names))
3635
 
 
3636
 
    modules_to_doctest = [
3637
 
        'bzrlib',
3638
 
        'bzrlib.branchbuilder',
3639
 
        'bzrlib.export',
3640
 
        'bzrlib.inventory',
3641
 
        'bzrlib.iterablefile',
3642
 
        'bzrlib.lockdir',
3643
 
        'bzrlib.merge3',
3644
 
        'bzrlib.option',
3645
 
        'bzrlib.symbol_versioning',
3646
 
        'bzrlib.tests',
3647
 
        'bzrlib.timestamp',
3648
 
        'bzrlib.version_info_formats.format_custom',
3649
 
        ]
3650
 
 
3651
 
    for mod in modules_to_doctest:
 
3734
    suite.addTest(loader.loadTestsFromModuleNames(_test_suite_testmod_names()))
 
3735
 
 
3736
    for mod in _test_suite_modules_to_doctest():
3652
3737
        if not interesting_module(mod):
3653
3738
            # No tests to keep here, move along
3654
3739
            continue
3683
3768
            reload(sys)
3684
3769
            sys.setdefaultencoding(default_encoding)
3685
3770
 
3686
 
    if starting_with:
3687
 
        suite = filter_suite_by_id_startswith(suite, starting_with)
3688
 
 
3689
3771
    if keep_only is not None:
3690
3772
        # Now that the referred modules have loaded their tests, keep only the
3691
3773
        # requested ones.
3798
3880
    :param new_id: The id to assign to it.
3799
3881
    :return: The new test.
3800
3882
    """
3801
 
    from copy import deepcopy
3802
 
    new_test = deepcopy(test)
 
3883
    new_test = copy(test)
3803
3884
    new_test.id = lambda: new_id
3804
3885
    return new_test
3805
3886