~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: John Arbash Meinel
  • Date: 2006-07-30 13:54:37 UTC
  • mto: (1946.2.6 reduce-knit-churn)
  • mto: This revision was merged to the branch mainline in revision 1898.
  • Revision ID: john@arbash-meinel.com-20060730135437-1d722abdb14bff76
(jelmer) Install new intertree tests

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
43
43
import time
44
44
 
45
45
 
46
 
from bzrlib import memorytree
47
46
import bzrlib.branch
48
47
import bzrlib.bzrdir as bzrdir
49
48
import bzrlib.commands
50
49
import bzrlib.bundle.serializer
51
50
import bzrlib.errors as errors
52
 
import bzrlib.export
53
51
import bzrlib.inventory
54
52
import bzrlib.iterablefile
55
53
import bzrlib.lockdir
66
64
import bzrlib.progress as progress
67
65
from bzrlib.revision import common_ancestor
68
66
import bzrlib.store
69
 
from bzrlib import symbol_versioning
70
67
import bzrlib.trace
71
68
from bzrlib.transport import get_transport
72
69
import bzrlib.transport
73
 
from bzrlib.transport.local import LocalURLServer
74
 
from bzrlib.transport.memory import MemoryServer
 
70
from bzrlib.transport.local import LocalRelpathServer
75
71
from bzrlib.transport.readonly import ReadonlyServer
76
72
from bzrlib.trace import mutter
77
73
from bzrlib.tests import TestUtil
83
79
import bzrlib.urlutils as urlutils
84
80
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
85
81
 
86
 
default_transport = LocalURLServer
 
82
default_transport = LocalRelpathServer
87
83
 
88
84
MODULES_TO_TEST = []
89
85
MODULES_TO_DOCTEST = [
 
86
                      bzrlib.branch,
90
87
                      bzrlib.bundle.serializer,
 
88
                      bzrlib.commands,
91
89
                      bzrlib.errors,
92
 
                      bzrlib.export,
93
90
                      bzrlib.inventory,
94
91
                      bzrlib.iterablefile,
95
92
                      bzrlib.lockdir,
96
93
                      bzrlib.merge3,
97
94
                      bzrlib.option,
98
 
                      bzrlib.store,
 
95
                      bzrlib.osutils,
 
96
                      bzrlib.store
99
97
                      ]
100
98
 
101
99
 
138
136
    """
139
137
    stop_early = False
140
138
    
141
 
    def __init__(self, stream, descriptions, verbosity, pb=None,
142
 
                 bench_history=None):
143
 
        """Construct new TestResult.
144
 
 
145
 
        :param bench_history: Optionally, a writable file object to accumulate
146
 
            benchmark results.
147
 
        """
 
139
    def __init__(self, stream, descriptions, verbosity, pb=None):
148
140
        unittest._TextTestResult.__init__(self, stream, descriptions, verbosity)
149
141
        self.pb = pb
150
 
        if bench_history is not None:
151
 
            from bzrlib.version import _get_bzr_source_tree
152
 
            src_tree = _get_bzr_source_tree()
153
 
            if src_tree:
154
 
                try:
155
 
                    revision_id = src_tree.get_parent_ids()[0]
156
 
                except IndexError:
157
 
                    # XXX: if this is a brand new tree, do the same as if there
158
 
                    # is no branch.
159
 
                    revision_id = ''
160
 
            else:
161
 
                # XXX: If there's no branch, what should we do?
162
 
                revision_id = ''
163
 
            bench_history.write("--date %s %s\n" % (time.time(), revision_id))
164
 
        self._bench_history = bench_history
165
142
    
166
143
    def extractBenchmarkTime(self, testCase):
167
144
        """Add a benchmark time for the current test case."""
239
216
        if isinstance(err[1], TestSkipped):
240
217
            return self.addSkipped(test, err)    
241
218
        unittest.TestResult.addError(self, test, err)
242
 
        # We can only do this if we have one of our TestCases, not if
243
 
        # we have a doctest.
244
 
        setKeepLogfile = getattr(test, 'setKeepLogfile', None)
245
 
        if setKeepLogfile is not None:
246
 
            setKeepLogfile()
247
219
        self.extractBenchmarkTime(test)
248
220
        if self.showAll:
249
221
            self.stream.writeln("ERROR %s" % self._testTimeString())
260
232
 
261
233
    def addFailure(self, test, err):
262
234
        unittest.TestResult.addFailure(self, test, err)
263
 
        # We can only do this if we have one of our TestCases, not if
264
 
        # we have a doctest.
265
 
        setKeepLogfile = getattr(test, 'setKeepLogfile', None)
266
 
        if setKeepLogfile is not None:
267
 
            setKeepLogfile()
268
235
        self.extractBenchmarkTime(test)
269
236
        if self.showAll:
270
237
            self.stream.writeln(" FAIL %s" % self._testTimeString())
281
248
 
282
249
    def addSuccess(self, test):
283
250
        self.extractBenchmarkTime(test)
284
 
        if self._bench_history is not None:
285
 
            if self._benchmarkTime is not None:
286
 
                self._bench_history.write("%s %s\n" % (
287
 
                    self._formatTime(self._benchmarkTime),
288
 
                    test.id()))
289
251
        if self.showAll:
290
252
            self.stream.writeln('   OK %s' % self._testTimeString())
291
253
            for bench_called, stats in getattr(test, '_benchcalls', []):
342
304
                 descriptions=0,
343
305
                 verbosity=1,
344
306
                 keep_output=False,
345
 
                 pb=None,
346
 
                 bench_history=None):
 
307
                 pb=None):
347
308
        self.stream = unittest._WritelnDecorator(stream)
348
309
        self.descriptions = descriptions
349
310
        self.verbosity = verbosity
350
311
        self.keep_output = keep_output
351
312
        self.pb = pb
352
 
        self._bench_history = bench_history
353
313
 
354
314
    def _makeResult(self):
355
315
        result = _MyResult(self.stream,
356
316
                           self.descriptions,
357
317
                           self.verbosity,
358
 
                           pb=self.pb,
359
 
                           bench_history=self._bench_history)
 
318
                           pb=self.pb)
360
319
        result.stop_early = self.stop_on_failure
361
320
        return result
362
321
 
391
350
        # This is still a little bogus, 
392
351
        # but only a little. Folk not using our testrunner will
393
352
        # have to delete their temp directories themselves.
394
 
        test_root = TestCaseWithMemoryTransport.TEST_ROOT
 
353
        test_root = TestCaseInTempDir.TEST_ROOT
395
354
        if result.wasSuccessful() or not self.keep_output:
396
355
            if test_root is not None:
397
356
                # If LANG=C we probably have created some bogus paths
415
374
                self.stream.writeln(
416
375
                    "Failed tests working directories are in '%s'\n" %
417
376
                    test_root)
418
 
        TestCaseWithMemoryTransport.TEST_ROOT = None
 
377
        TestCaseInTempDir.TEST_ROOT = None
419
378
        if self.pb is not None:
420
379
            self.pb.clear()
421
380
        return result
436
395
 
437
396
class TestSkipped(Exception):
438
397
    """Indicates that a test was intentionally skipped, rather than failing."""
 
398
    # XXX: Not used yet
439
399
 
440
400
 
441
401
class CommandFailed(Exception):
491
451
 
492
452
    _log_file_name = None
493
453
    _log_contents = ''
494
 
    _keep_log_file = False
495
454
    # record lsprof data when performing benchmark calls.
496
455
    _gather_lsprof_in_benchmarks = False
497
456
 
593
552
            self.fail("%r is an instance of %s rather than %s" % (
594
553
                obj, obj.__class__, kls))
595
554
 
596
 
    def _capture_warnings(self, a_callable, *args, **kwargs):
597
 
        """A helper for callDeprecated and applyDeprecated.
598
 
 
599
 
        :param a_callable: A callable to call.
600
 
        :param args: The positional arguments for the callable
601
 
        :param kwargs: The keyword arguments for the callable
602
 
        :return: A tuple (warnings, result). result is the result of calling
603
 
            a_callable(*args, **kwargs).
604
 
        """
605
 
        local_warnings = []
606
 
        def capture_warnings(msg, cls, stacklevel=None):
607
 
            # we've hooked into a deprecation specific callpath,
608
 
            # only deprecations should getting sent via it.
609
 
            self.assertEqual(cls, DeprecationWarning)
610
 
            local_warnings.append(msg)
611
 
        original_warning_method = symbol_versioning.warn
612
 
        symbol_versioning.set_warning_method(capture_warnings)
613
 
        try:
614
 
            result = a_callable(*args, **kwargs)
615
 
        finally:
616
 
            symbol_versioning.set_warning_method(original_warning_method)
617
 
        return (local_warnings, result)
618
 
 
619
 
    def applyDeprecated(self, deprecation_format, a_callable, *args, **kwargs):
620
 
        """Call a deprecated callable without warning the user.
621
 
 
622
 
        :param deprecation_format: The deprecation format that the callable
623
 
            should have been deprecated with. This is the same type as the 
624
 
            parameter to deprecated_method/deprecated_function. If the 
625
 
            callable is not deprecated with this format, an assertion error
626
 
            will be raised.
627
 
        :param a_callable: A callable to call. This may be a bound method or
628
 
            a regular function. It will be called with *args and **kwargs.
629
 
        :param args: The positional arguments for the callable
630
 
        :param kwargs: The keyword arguments for the callable
631
 
        :return: The result of a_callable(*args, **kwargs)
632
 
        """
633
 
        call_warnings, result = self._capture_warnings(a_callable,
634
 
            *args, **kwargs)
635
 
        expected_first_warning = symbol_versioning.deprecation_string(
636
 
            a_callable, deprecation_format)
637
 
        if len(call_warnings) == 0:
638
 
            self.fail("No assertion generated by call to %s" %
639
 
                a_callable)
640
 
        self.assertEqual(expected_first_warning, call_warnings[0])
641
 
        return result
642
 
 
643
 
    def callDeprecated(self, expected, callable, *args, **kwargs):
644
 
        """Assert that a callable is deprecated in a particular way.
645
 
 
646
 
        This is a very precise test for unusual requirements. The 
647
 
        applyDeprecated helper function is probably more suited for most tests
648
 
        as it allows you to simply specify the deprecation format being used
649
 
        and will ensure that that is issued for the function being called.
650
 
 
651
 
        :param expected: a list of the deprecation warnings expected, in order
652
 
        :param callable: The callable to call
653
 
        :param args: The positional arguments for the callable
654
 
        :param kwargs: The keyword arguments for the callable
655
 
        """
656
 
        call_warnings, result = self._capture_warnings(callable,
657
 
            *args, **kwargs)
658
 
        self.assertEqual(expected, call_warnings)
659
 
        return result
660
 
 
661
555
    def _startLogFile(self):
662
556
        """Send bzr and test log messages to a temporary file.
663
557
 
664
558
        The file is removed as the test is torn down.
665
559
        """
666
560
        fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
667
 
        self._log_file = os.fdopen(fileno, 'w+')
 
561
        encoder, decoder, stream_reader, stream_writer = codecs.lookup('UTF-8')
 
562
        self._log_file = stream_writer(os.fdopen(fileno, 'w+'))
668
563
        self._log_nonce = bzrlib.trace.enable_test_log(self._log_file)
669
564
        self._log_file_name = name
670
565
        self.addCleanup(self._finishLogFile)
672
567
    def _finishLogFile(self):
673
568
        """Finished with the log file.
674
569
 
675
 
        Close the file and delete it, unless setKeepLogfile was called.
 
570
        Read contents into memory, close, and delete.
676
571
        """
677
572
        if self._log_file is None:
678
573
            return
679
574
        bzrlib.trace.disable_test_log(self._log_nonce)
 
575
        self._log_file.seek(0)
 
576
        self._log_contents = self._log_file.read()
680
577
        self._log_file.close()
681
 
        self._log_file = None
682
 
        if not self._keep_log_file:
683
 
            os.remove(self._log_file_name)
684
 
            self._log_file_name = None
685
 
 
686
 
    def setKeepLogfile(self):
687
 
        """Make the logfile not be deleted when _finishLogFile is called."""
688
 
        self._keep_log_file = True
 
578
        os.remove(self._log_file_name)
 
579
        self._log_file = self._log_file_name = None
689
580
 
690
581
    def addCleanup(self, callable):
691
582
        """Arrange to run a callable when this case is torn down.
700
591
 
701
592
    def _cleanEnvironment(self):
702
593
        new_env = {
703
 
            'BZR_HOME': None, # Don't inherit BZR_HOME to all the tests.
704
594
            'HOME': os.getcwd(),
705
595
            'APPDATA': os.getcwd(),
706
 
            'BZR_EMAIL': None,
707
 
            'BZREMAIL': None, # may still be present in the environment
 
596
            'BZREMAIL': None,
708
597
            'EMAIL': None,
709
 
            'BZR_PROGRESS_BAR': None,
710
598
        }
711
599
        self.__old_env = {}
712
600
        self.addCleanup(self._restoreEnvironment)
713
601
        for name, value in new_env.iteritems():
714
602
            self._captureVar(name, value)
715
603
 
 
604
 
716
605
    def _captureVar(self, name, newvalue):
717
 
        """Set an environment variable, and reset it when finished."""
718
 
        self.__old_env[name] = osutils.set_or_unset_env(name, newvalue)
 
606
        """Set an environment variable, preparing it to be reset when finished."""
 
607
        self.__old_env[name] = os.environ.get(name, None)
 
608
        if newvalue is None:
 
609
            if name in os.environ:
 
610
                del os.environ[name]
 
611
        else:
 
612
            os.environ[name] = newvalue
 
613
 
 
614
    @staticmethod
 
615
    def _restoreVar(name, value):
 
616
        if value is None:
 
617
            if name in os.environ:
 
618
                del os.environ[name]
 
619
        else:
 
620
            os.environ[name] = value
719
621
 
720
622
    def _restoreEnvironment(self):
721
623
        for name, value in self.__old_env.iteritems():
722
 
            osutils.set_or_unset_env(name, value)
 
624
            self._restoreVar(name, value)
723
625
 
724
626
    def tearDown(self):
725
627
        self._runCleanups()
760
662
    def log(self, *args):
761
663
        mutter(*args)
762
664
 
763
 
    def _get_log(self, keep_log_file=False):
764
 
        """Return as a string the log for this test. If the file is still
765
 
        on disk and keep_log_file=False, delete the log file and store the
766
 
        content in self._log_contents."""
767
 
        # flush the log file, to get all content
768
 
        import bzrlib.trace
769
 
        bzrlib.trace._trace_file.flush()
770
 
        if self._log_contents:
 
665
    def _get_log(self):
 
666
        """Return as a string the log for this test"""
 
667
        if self._log_file_name:
 
668
            return open(self._log_file_name).read()
 
669
        else:
771
670
            return self._log_contents
772
 
        if self._log_file_name is not None:
773
 
            logfile = open(self._log_file_name)
774
 
            try:
775
 
                log_contents = logfile.read()
776
 
            finally:
777
 
                logfile.close()
778
 
            if not keep_log_file:
779
 
                self._log_contents = log_contents
780
 
                os.remove(self._log_file_name)
781
 
            return log_contents
782
 
        else:
783
 
            return "DELETED log file to reduce memory footprint"
 
671
        # TODO: Delete the log after it's been read in
784
672
 
785
673
    def capture(self, cmd, retcode=0):
786
674
        """Shortcut that splits cmd into words, runs, and returns stdout"""
787
675
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
788
676
 
789
 
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None,
790
 
                         working_dir=None):
 
677
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
791
678
        """Invoke bzr and return (stdout, stderr).
792
679
 
793
680
        Useful for code that wants to check the contents of the
808
695
        :param retcode: expected return code, or None for don't-care.
809
696
        :param encoding: encoding for sys.stdout and sys.stderr
810
697
        :param stdin: A string to be used as stdin for the command.
811
 
        :param working_dir: Change to this directory before running
812
698
        """
813
699
        if encoding is None:
814
700
            encoding = bzrlib.user_encoding
830
716
            stdout=stdout,
831
717
            stderr=stderr)
832
718
        bzrlib.ui.ui_factory.stdin = stdin
833
 
 
834
 
        cwd = None
835
 
        if working_dir is not None:
836
 
            cwd = osutils.getcwd()
837
 
            os.chdir(working_dir)
838
 
 
839
719
        try:
840
720
            result = self.apply_redirected(stdin, stdout, stderr,
841
721
                                           bzrlib.commands.run_bzr_catch_errors,
843
723
        finally:
844
724
            logger.removeHandler(handler)
845
725
            bzrlib.ui.ui_factory = old_ui_factory
846
 
            if cwd is not None:
847
 
                os.chdir(cwd)
848
726
 
849
727
        out = stdout.getvalue()
850
728
        err = stderr.getvalue()
871
749
        retcode = kwargs.pop('retcode', 0)
872
750
        encoding = kwargs.pop('encoding', None)
873
751
        stdin = kwargs.pop('stdin', None)
874
 
        working_dir = kwargs.pop('working_dir', None)
875
 
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding,
876
 
                                     stdin=stdin, working_dir=working_dir)
 
752
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding, stdin=stdin)
877
753
 
878
754
    def run_bzr_decode(self, *args, **kwargs):
879
 
        if 'encoding' in kwargs:
 
755
        if kwargs.has_key('encoding'):
880
756
            encoding = kwargs['encoding']
881
757
        else:
882
758
            encoding = bzrlib.user_encoding
921
797
        profiled or debugged so easily.
922
798
 
923
799
        :param retcode: The status code that is expected.  Defaults to 0.  If
924
 
            None is supplied, the status code is not checked.
925
 
        :param env_changes: A dictionary which lists changes to environment
926
 
            variables. A value of None will unset the env variable.
927
 
            The values must be strings. The change will only occur in the
928
 
            child, so you don't need to fix the environment after running.
929
 
        :param universal_newlines: Convert CRLF => LF
930
 
        :param allow_plugins: By default the subprocess is run with
931
 
            --no-plugins to ensure test reproducibility. Also, it is possible
932
 
            for system-wide plugins to create unexpected output on stderr,
933
 
            which can cause unnecessary test failures.
 
800
        None is supplied, the status code is not checked.
934
801
        """
935
 
        env_changes = kwargs.get('env_changes', {})
936
 
        working_dir = kwargs.get('working_dir', None)
937
 
        allow_plugins = kwargs.get('allow_plugins', False)
938
 
        process = self.start_bzr_subprocess(args, env_changes=env_changes,
939
 
                                            working_dir=working_dir,
940
 
                                            allow_plugins=allow_plugins)
941
 
        # We distinguish between retcode=None and retcode not passed.
 
802
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
 
803
        args = list(args)
 
804
        process = Popen([sys.executable, bzr_path]+args, stdout=PIPE, 
 
805
                         stderr=PIPE)
 
806
        out = process.stdout.read()
 
807
        err = process.stderr.read()
 
808
        retcode = process.wait()
942
809
        supplied_retcode = kwargs.get('retcode', 0)
943
 
        return self.finish_bzr_subprocess(process, retcode=supplied_retcode,
944
 
            universal_newlines=kwargs.get('universal_newlines', False),
945
 
            process_args=args)
946
 
 
947
 
    def start_bzr_subprocess(self, process_args, env_changes=None,
948
 
                             skip_if_plan_to_signal=False,
949
 
                             working_dir=None,
950
 
                             allow_plugins=False):
951
 
        """Start bzr in a subprocess for testing.
952
 
 
953
 
        This starts a new Python interpreter and runs bzr in there.
954
 
        This should only be used for tests that have a justifiable need for
955
 
        this isolation: e.g. they are testing startup time, or signal
956
 
        handling, or early startup code, etc.  Subprocess code can't be
957
 
        profiled or debugged so easily.
958
 
 
959
 
        :param process_args: a list of arguments to pass to the bzr executable,
960
 
            for example `['--version']`.
961
 
        :param env_changes: A dictionary which lists changes to environment
962
 
            variables. A value of None will unset the env variable.
963
 
            The values must be strings. The change will only occur in the
964
 
            child, so you don't need to fix the environment after running.
965
 
        :param skip_if_plan_to_signal: raise TestSkipped when true and os.kill
966
 
            is not available.
967
 
        :param allow_plugins: If False (default) pass --no-plugins to bzr.
968
 
 
969
 
        :returns: Popen object for the started process.
970
 
        """
971
 
        if skip_if_plan_to_signal:
972
 
            if not getattr(os, 'kill', None):
973
 
                raise TestSkipped("os.kill not available.")
974
 
 
975
 
        if env_changes is None:
976
 
            env_changes = {}
977
 
        old_env = {}
978
 
 
979
 
        def cleanup_environment():
980
 
            for env_var, value in env_changes.iteritems():
981
 
                old_env[env_var] = osutils.set_or_unset_env(env_var, value)
982
 
 
983
 
        def restore_environment():
984
 
            for env_var, value in old_env.iteritems():
985
 
                osutils.set_or_unset_env(env_var, value)
986
 
 
987
 
        bzr_path = self.get_bzr_path()
988
 
 
989
 
        cwd = None
990
 
        if working_dir is not None:
991
 
            cwd = osutils.getcwd()
992
 
            os.chdir(working_dir)
993
 
 
994
 
        try:
995
 
            # win32 subprocess doesn't support preexec_fn
996
 
            # so we will avoid using it on all platforms, just to
997
 
            # make sure the code path is used, and we don't break on win32
998
 
            cleanup_environment()
999
 
            command = [sys.executable, bzr_path]
1000
 
            if not allow_plugins:
1001
 
                command.append('--no-plugins')
1002
 
            command.extend(process_args)
1003
 
            process = self._popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
1004
 
        finally:
1005
 
            restore_environment()
1006
 
            if cwd is not None:
1007
 
                os.chdir(cwd)
1008
 
 
1009
 
        return process
1010
 
 
1011
 
    def _popen(self, *args, **kwargs):
1012
 
        """Place a call to Popen.
1013
 
 
1014
 
        Allows tests to override this method to intercept the calls made to
1015
 
        Popen for introspection.
1016
 
        """
1017
 
        return Popen(*args, **kwargs)
1018
 
 
1019
 
    def get_bzr_path(self):
1020
 
        """Return the path of the 'bzr' executable for this test suite."""
1021
 
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
1022
 
        if not os.path.isfile(bzr_path):
1023
 
            # We are probably installed. Assume sys.argv is the right file
1024
 
            bzr_path = sys.argv[0]
1025
 
        return bzr_path
1026
 
 
1027
 
    def finish_bzr_subprocess(self, process, retcode=0, send_signal=None,
1028
 
                              universal_newlines=False, process_args=None):
1029
 
        """Finish the execution of process.
1030
 
 
1031
 
        :param process: the Popen object returned from start_bzr_subprocess.
1032
 
        :param retcode: The status code that is expected.  Defaults to 0.  If
1033
 
            None is supplied, the status code is not checked.
1034
 
        :param send_signal: an optional signal to send to the process.
1035
 
        :param universal_newlines: Convert CRLF => LF
1036
 
        :returns: (stdout, stderr)
1037
 
        """
1038
 
        if send_signal is not None:
1039
 
            os.kill(process.pid, send_signal)
1040
 
        out, err = process.communicate()
1041
 
 
1042
 
        if universal_newlines:
1043
 
            out = out.replace('\r\n', '\n')
1044
 
            err = err.replace('\r\n', '\n')
1045
 
 
1046
 
        if retcode is not None and retcode != process.returncode:
1047
 
            if process_args is None:
1048
 
                process_args = "(unknown args)"
1049
 
            mutter('Output of bzr %s:\n%s', process_args, out)
1050
 
            mutter('Error for bzr %s:\n%s', process_args, err)
1051
 
            self.fail('Command bzr %s failed with retcode %s != %s'
1052
 
                      % (process_args, retcode, process.returncode))
 
810
        if supplied_retcode is not None:
 
811
            assert supplied_retcode == retcode
1053
812
        return [out, err]
1054
813
 
1055
814
    def check_inventory_shape(self, inv, shape):
1104
863
            sys.stderr = real_stderr
1105
864
            sys.stdin = real_stdin
1106
865
 
1107
 
    @symbol_versioning.deprecated_method(symbol_versioning.zero_eleven)
1108
866
    def merge(self, branch_from, wt_to):
1109
867
        """A helper for tests to do a ui-less merge.
1110
868
 
1116
874
        base_rev = common_ancestor(branch_from.last_revision(),
1117
875
                                   wt_to.branch.last_revision(),
1118
876
                                   wt_to.branch.repository)
1119
 
        merge_inner(wt_to.branch, branch_from.basis_tree(),
 
877
        merge_inner(wt_to.branch, branch_from.basis_tree(), 
1120
878
                    wt_to.branch.repository.revision_tree(base_rev),
1121
879
                    this_tree=wt_to)
1122
 
        wt_to.add_parent_tree_id(branch_from.last_revision())
 
880
        wt_to.add_pending_merge(branch_from.last_revision())
1123
881
 
1124
882
 
1125
883
BzrTestBase = TestCase
1126
884
 
1127
 
 
1128
 
class TestCaseWithMemoryTransport(TestCase):
1129
 
    """Common test class for tests that do not need disk resources.
1130
 
 
1131
 
    Tests that need disk resources should derive from TestCaseWithTransport.
1132
 
 
1133
 
    TestCaseWithMemoryTransport sets the TEST_ROOT variable for all bzr tests.
1134
 
 
1135
 
    For TestCaseWithMemoryTransport the test_home_dir is set to the name of
1136
 
    a directory which does not exist. This serves to help ensure test isolation
1137
 
    is preserved. test_dir is set to the TEST_ROOT, as is cwd, because they
1138
 
    must exist. However, TestCaseWithMemoryTransport does not offer local
1139
 
    file defaults for the transport in tests, nor does it obey the command line
1140
 
    override, so tests that accidentally write to the common directory should
1141
 
    be rare.
 
885
     
 
886
class TestCaseInTempDir(TestCase):
 
887
    """Derived class that runs a test within a temporary directory.
 
888
 
 
889
    This is useful for tests that need to create a branch, etc.
 
890
 
 
891
    The directory is created in a slightly complex way: for each
 
892
    Python invocation, a new temporary top-level directory is created.
 
893
    All test cases create their own directory within that.  If the
 
894
    tests complete successfully, the directory is removed.
 
895
 
 
896
    InTempDir is an old alias for FunctionalTestCase.
1142
897
    """
1143
898
 
1144
899
    TEST_ROOT = None
1145
900
    _TEST_NAME = 'test'
1146
 
 
1147
 
 
1148
 
    def __init__(self, methodName='runTest'):
1149
 
        # allow test parameterisation after test construction and before test
1150
 
        # execution. Variables that the parameteriser sets need to be 
1151
 
        # ones that are not set by setUp, or setUp will trash them.
1152
 
        super(TestCaseWithMemoryTransport, self).__init__(methodName)
1153
 
        self.transport_server = default_transport
1154
 
        self.transport_readonly_server = None
1155
 
 
1156
 
    def failUnlessExists(self, path):
1157
 
        """Fail unless path, which may be abs or relative, exists."""
1158
 
        self.failUnless(osutils.lexists(path))
1159
 
 
1160
 
    def failIfExists(self, path):
1161
 
        """Fail if path, which may be abs or relative, exists."""
1162
 
        self.failIf(osutils.lexists(path))
1163
 
        
1164
 
    def get_transport(self):
1165
 
        """Return a writeable transport for the test scratch space"""
1166
 
        t = get_transport(self.get_url())
1167
 
        self.assertFalse(t.is_readonly())
1168
 
        return t
1169
 
 
1170
 
    def get_readonly_transport(self):
1171
 
        """Return a readonly transport for the test scratch space
1172
 
        
1173
 
        This can be used to test that operations which should only need
1174
 
        readonly access in fact do not try to write.
1175
 
        """
1176
 
        t = get_transport(self.get_readonly_url())
1177
 
        self.assertTrue(t.is_readonly())
1178
 
        return t
1179
 
 
1180
 
    def get_readonly_server(self):
1181
 
        """Get the server instance for the readonly transport
1182
 
 
1183
 
        This is useful for some tests with specific servers to do diagnostics.
1184
 
        """
1185
 
        if self.__readonly_server is None:
1186
 
            if self.transport_readonly_server is None:
1187
 
                # readonly decorator requested
1188
 
                # bring up the server
1189
 
                self.get_url()
1190
 
                self.__readonly_server = ReadonlyServer()
1191
 
                self.__readonly_server.setUp(self.__server)
1192
 
            else:
1193
 
                self.__readonly_server = self.transport_readonly_server()
1194
 
                self.__readonly_server.setUp()
1195
 
            self.addCleanup(self.__readonly_server.tearDown)
1196
 
        return self.__readonly_server
1197
 
 
1198
 
    def get_readonly_url(self, relpath=None):
1199
 
        """Get a URL for the readonly transport.
1200
 
 
1201
 
        This will either be backed by '.' or a decorator to the transport 
1202
 
        used by self.get_url()
1203
 
        relpath provides for clients to get a path relative to the base url.
1204
 
        These should only be downwards relative, not upwards.
1205
 
        """
1206
 
        base = self.get_readonly_server().get_url()
1207
 
        if relpath is not None:
1208
 
            if not base.endswith('/'):
1209
 
                base = base + '/'
1210
 
            base = base + relpath
1211
 
        return base
1212
 
 
1213
 
    def get_server(self):
1214
 
        """Get the read/write server instance.
1215
 
 
1216
 
        This is useful for some tests with specific servers that need
1217
 
        diagnostics.
1218
 
 
1219
 
        For TestCaseWithMemoryTransport this is always a MemoryServer, and there
1220
 
        is no means to override it.
1221
 
        """
1222
 
        if self.__server is None:
1223
 
            self.__server = MemoryServer()
1224
 
            self.__server.setUp()
1225
 
            self.addCleanup(self.__server.tearDown)
1226
 
        return self.__server
1227
 
 
1228
 
    def get_url(self, relpath=None):
1229
 
        """Get a URL (or maybe a path) for the readwrite transport.
1230
 
 
1231
 
        This will either be backed by '.' or to an equivalent non-file based
1232
 
        facility.
1233
 
        relpath provides for clients to get a path relative to the base url.
1234
 
        These should only be downwards relative, not upwards.
1235
 
        """
1236
 
        base = self.get_server().get_url()
1237
 
        if relpath is not None and relpath != '.':
1238
 
            if not base.endswith('/'):
1239
 
                base = base + '/'
1240
 
            # XXX: Really base should be a url; we did after all call
1241
 
            # get_url()!  But sometimes it's just a path (from
1242
 
            # LocalAbspathServer), and it'd be wrong to append urlescaped data
1243
 
            # to a non-escaped local path.
1244
 
            if base.startswith('./') or base.startswith('/'):
1245
 
                base += relpath
1246
 
            else:
1247
 
                base += urlutils.escape(relpath)
1248
 
        return base
 
901
    OVERRIDE_PYTHON = 'python'
 
902
 
 
903
    def check_file_contents(self, filename, expect):
 
904
        self.log("check contents of file %s" % filename)
 
905
        contents = file(filename, 'r').read()
 
906
        if contents != expect:
 
907
            self.log("expected: %r" % expect)
 
908
            self.log("actually: %r" % contents)
 
909
            self.fail("contents of %s not as expected" % filename)
1249
910
 
1250
911
    def _make_test_root(self):
1251
 
        if TestCaseWithMemoryTransport.TEST_ROOT is not None:
 
912
        if TestCaseInTempDir.TEST_ROOT is not None:
1252
913
            return
1253
914
        i = 0
1254
915
        while True:
1262
923
                else:
1263
924
                    raise
1264
925
            # successfully created
1265
 
            TestCaseWithMemoryTransport.TEST_ROOT = osutils.abspath(root)
 
926
            TestCaseInTempDir.TEST_ROOT = osutils.abspath(root)
1266
927
            break
1267
928
        # make a fake bzr directory there to prevent any tests propagating
1268
929
        # up onto the source directory's real branch
1269
 
        bzrdir.BzrDir.create_standalone_workingtree(
1270
 
            TestCaseWithMemoryTransport.TEST_ROOT)
1271
 
 
1272
 
    def makeAndChdirToTestDir(self):
1273
 
        """Create a temporary directories for this one test.
1274
 
        
1275
 
        This must set self.test_home_dir and self.test_dir and chdir to
1276
 
        self.test_dir.
1277
 
        
1278
 
        For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
1279
 
        """
1280
 
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
1281
 
        self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
1282
 
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
1283
 
        
1284
 
    def make_branch(self, relpath, format=None):
1285
 
        """Create a branch on the transport at relpath."""
1286
 
        repo = self.make_repository(relpath, format=format)
1287
 
        return repo.bzrdir.create_branch()
1288
 
 
1289
 
    def make_bzrdir(self, relpath, format=None):
1290
 
        try:
1291
 
            # might be a relative or absolute path
1292
 
            maybe_a_url = self.get_url(relpath)
1293
 
            segments = maybe_a_url.rsplit('/', 1)
1294
 
            t = get_transport(maybe_a_url)
1295
 
            if len(segments) > 1 and segments[-1] not in ('', '.'):
1296
 
                try:
1297
 
                    t.mkdir('.')
1298
 
                except errors.FileExists:
1299
 
                    pass
1300
 
            if format is None:
1301
 
                format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
1302
 
            return format.initialize_on_transport(t)
1303
 
        except errors.UninitializableFormat:
1304
 
            raise TestSkipped("Format %s is not initializable." % format)
1305
 
 
1306
 
    def make_repository(self, relpath, shared=False, format=None):
1307
 
        """Create a repository on our default transport at relpath."""
1308
 
        made_control = self.make_bzrdir(relpath, format=format)
1309
 
        return made_control.create_repository(shared=shared)
1310
 
 
1311
 
    def make_branch_and_memory_tree(self, relpath, format=None):
1312
 
        """Create a branch on the default transport and a MemoryTree for it."""
1313
 
        b = self.make_branch(relpath, format=format)
1314
 
        return memorytree.MemoryTree.create_on_branch(b)
1315
 
 
1316
 
    def overrideEnvironmentForTesting(self):
1317
 
        os.environ['HOME'] = self.test_home_dir
1318
 
        os.environ['APPDATA'] = self.test_home_dir
1319
 
        
 
930
        bzrdir.BzrDir.create_standalone_workingtree(TestCaseInTempDir.TEST_ROOT)
 
931
 
1320
932
    def setUp(self):
1321
 
        super(TestCaseWithMemoryTransport, self).setUp()
 
933
        super(TestCaseInTempDir, self).setUp()
1322
934
        self._make_test_root()
1323
935
        _currentdir = os.getcwdu()
1324
 
        def _leaveDirectory():
1325
 
            os.chdir(_currentdir)
1326
 
        self.addCleanup(_leaveDirectory)
1327
 
        self.makeAndChdirToTestDir()
1328
 
        self.overrideEnvironmentForTesting()
1329
 
        self.__readonly_server = None
1330
 
        self.__server = None
1331
 
 
1332
 
     
1333
 
class TestCaseInTempDir(TestCaseWithMemoryTransport):
1334
 
    """Derived class that runs a test within a temporary directory.
1335
 
 
1336
 
    This is useful for tests that need to create a branch, etc.
1337
 
 
1338
 
    The directory is created in a slightly complex way: for each
1339
 
    Python invocation, a new temporary top-level directory is created.
1340
 
    All test cases create their own directory within that.  If the
1341
 
    tests complete successfully, the directory is removed.
1342
 
 
1343
 
    InTempDir is an old alias for FunctionalTestCase.
1344
 
    """
1345
 
 
1346
 
    OVERRIDE_PYTHON = 'python'
1347
 
 
1348
 
    def check_file_contents(self, filename, expect):
1349
 
        self.log("check contents of file %s" % filename)
1350
 
        contents = file(filename, 'r').read()
1351
 
        if contents != expect:
1352
 
            self.log("expected: %r" % expect)
1353
 
            self.log("actually: %r" % contents)
1354
 
            self.fail("contents of %s not as expected" % filename)
1355
 
 
1356
 
    def makeAndChdirToTestDir(self):
1357
 
        """See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
1358
 
        
1359
 
        For TestCaseInTempDir we create a temporary directory based on the test
1360
 
        name and then create two subdirs - test and home under it.
1361
 
        """
1362
936
        # shorten the name, to avoid test failures due to path length
1363
937
        short_id = self.id().replace('bzrlib.tests.', '') \
1364
938
                   .replace('__main__.', '')[-100:]
1374
948
                i = i + 1
1375
949
                continue
1376
950
            else:
1377
 
                os.mkdir(candidate_dir)
1378
 
                self.test_home_dir = candidate_dir + '/home'
1379
 
                os.mkdir(self.test_home_dir)
1380
 
                self.test_dir = candidate_dir + '/work'
 
951
                self.test_dir = candidate_dir
1381
952
                os.mkdir(self.test_dir)
1382
953
                os.chdir(self.test_dir)
1383
954
                break
1384
 
 
 
955
        os.environ['HOME'] = self.test_dir
 
956
        os.environ['APPDATA'] = self.test_dir
 
957
        def _leaveDirectory():
 
958
            os.chdir(_currentdir)
 
959
        self.addCleanup(_leaveDirectory)
 
960
        
1385
961
    def build_tree(self, shape, line_endings='native', transport=None):
1386
962
        """Build a test tree according to a pattern.
1387
963
 
1388
964
        shape is a sequence of file specifications.  If the final
1389
965
        character is '/', a directory is created.
1390
966
 
1391
 
        This assumes that all the elements in the tree being built are new.
1392
 
 
1393
967
        This doesn't add anything to a branch.
1394
968
        :param line_endings: Either 'binary' or 'native'
1395
969
                             in binary mode, exact contents are written
1400
974
                          VFS's. If the transport is readonly or None,
1401
975
                          "." is opened automatically.
1402
976
        """
1403
 
        # It's OK to just create them using forward slashes on windows.
 
977
        # XXX: It's OK to just create them using forward slashes on windows?
1404
978
        if transport is None or transport.is_readonly():
1405
979
            transport = get_transport(".")
1406
980
        for name in shape:
1415
989
                else:
1416
990
                    raise errors.BzrError('Invalid line ending request %r' % (line_endings,))
1417
991
                content = "contents of %s%s" % (name.encode('utf-8'), end)
1418
 
                # Technically 'put()' is the right command. However, put
1419
 
                # uses an AtomicFile, which requires an extra rename into place
1420
 
                # As long as the files didn't exist in the past, append() will
1421
 
                # do the same thing as put()
1422
 
                # On jam's machine, make_kernel_like_tree is:
1423
 
                #   put:    4.5-7.5s (averaging 6s)
1424
 
                #   append: 2.9-4.5s
1425
 
                #   put_non_atomic: 2.9-4.5s
1426
 
                transport.put_bytes_non_atomic(urlutils.escape(name), content)
 
992
                transport.put(urlutils.escape(name), StringIO(content))
1427
993
 
1428
994
    def build_tree_contents(self, shape):
1429
995
        build_tree_contents(shape)
1430
996
 
 
997
    def failUnlessExists(self, path):
 
998
        """Fail unless path, which may be abs or relative, exists."""
 
999
        self.failUnless(osutils.lexists(path))
 
1000
 
 
1001
    def failIfExists(self, path):
 
1002
        """Fail if path, which may be abs or relative, exists."""
 
1003
        self.failIf(osutils.lexists(path))
 
1004
        
1431
1005
    def assertFileEqual(self, content, path):
1432
1006
        """Fail if path does not contain 'content'."""
1433
1007
        self.failUnless(osutils.lexists(path))
1449
1023
    readwrite one must both define get_url() as resolving to os.getcwd().
1450
1024
    """
1451
1025
 
 
1026
    def __init__(self, methodName='testMethod'):
 
1027
        super(TestCaseWithTransport, self).__init__(methodName)
 
1028
        self.__readonly_server = None
 
1029
        self.__server = None
 
1030
        self.transport_server = default_transport
 
1031
        self.transport_readonly_server = None
 
1032
 
 
1033
    def get_readonly_url(self, relpath=None):
 
1034
        """Get a URL for the readonly transport.
 
1035
 
 
1036
        This will either be backed by '.' or a decorator to the transport 
 
1037
        used by self.get_url()
 
1038
        relpath provides for clients to get a path relative to the base url.
 
1039
        These should only be downwards relative, not upwards.
 
1040
        """
 
1041
        base = self.get_readonly_server().get_url()
 
1042
        if relpath is not None:
 
1043
            if not base.endswith('/'):
 
1044
                base = base + '/'
 
1045
            base = base + relpath
 
1046
        return base
 
1047
 
 
1048
    def get_readonly_server(self):
 
1049
        """Get the server instance for the readonly transport
 
1050
 
 
1051
        This is useful for some tests with specific servers to do diagnostics.
 
1052
        """
 
1053
        if self.__readonly_server is None:
 
1054
            if self.transport_readonly_server is None:
 
1055
                # readonly decorator requested
 
1056
                # bring up the server
 
1057
                self.get_url()
 
1058
                self.__readonly_server = ReadonlyServer()
 
1059
                self.__readonly_server.setUp(self.__server)
 
1060
            else:
 
1061
                self.__readonly_server = self.transport_readonly_server()
 
1062
                self.__readonly_server.setUp()
 
1063
            self.addCleanup(self.__readonly_server.tearDown)
 
1064
        return self.__readonly_server
 
1065
 
1452
1066
    def get_server(self):
1453
 
        """See TestCaseWithMemoryTransport.
 
1067
        """Get the read/write server instance.
1454
1068
 
1455
1069
        This is useful for some tests with specific servers that need
1456
1070
        diagnostics.
1461
1075
            self.addCleanup(self.__server.tearDown)
1462
1076
        return self.__server
1463
1077
 
 
1078
    def get_url(self, relpath=None):
 
1079
        """Get a URL for the readwrite transport.
 
1080
 
 
1081
        This will either be backed by '.' or to an equivalent non-file based
 
1082
        facility.
 
1083
        relpath provides for clients to get a path relative to the base url.
 
1084
        These should only be downwards relative, not upwards.
 
1085
        """
 
1086
        base = self.get_server().get_url()
 
1087
        if relpath is not None and relpath != '.':
 
1088
            if not base.endswith('/'):
 
1089
                base = base + '/'
 
1090
            base = base + urlutils.escape(relpath)
 
1091
        return base
 
1092
 
 
1093
    def get_transport(self):
 
1094
        """Return a writeable transport for the test scratch space"""
 
1095
        t = get_transport(self.get_url())
 
1096
        self.assertFalse(t.is_readonly())
 
1097
        return t
 
1098
 
 
1099
    def get_readonly_transport(self):
 
1100
        """Return a readonly transport for the test scratch space
 
1101
        
 
1102
        This can be used to test that operations which should only need
 
1103
        readonly access in fact do not try to write.
 
1104
        """
 
1105
        t = get_transport(self.get_readonly_url())
 
1106
        self.assertTrue(t.is_readonly())
 
1107
        return t
 
1108
 
 
1109
    def make_branch(self, relpath, format=None):
 
1110
        """Create a branch on the transport at relpath."""
 
1111
        repo = self.make_repository(relpath, format=format)
 
1112
        return repo.bzrdir.create_branch()
 
1113
 
 
1114
    def make_bzrdir(self, relpath, format=None):
 
1115
        try:
 
1116
            url = self.get_url(relpath)
 
1117
            mutter('relpath %r => url %r', relpath, url)
 
1118
            segments = url.split('/')
 
1119
            if segments and segments[-1] not in ('', '.'):
 
1120
                parent = '/'.join(segments[:-1])
 
1121
                t = get_transport(parent)
 
1122
                try:
 
1123
                    t.mkdir(segments[-1])
 
1124
                except errors.FileExists:
 
1125
                    pass
 
1126
            if format is None:
 
1127
                format=bzrlib.bzrdir.BzrDirFormat.get_default_format()
 
1128
            # FIXME: make this use a single transport someday. RBC 20060418
 
1129
            return format.initialize_on_transport(get_transport(relpath))
 
1130
        except errors.UninitializableFormat:
 
1131
            raise TestSkipped("Format %s is not initializable." % format)
 
1132
 
 
1133
    def make_repository(self, relpath, shared=False, format=None):
 
1134
        """Create a repository on our default transport at relpath."""
 
1135
        made_control = self.make_bzrdir(relpath, format=format)
 
1136
        return made_control.create_repository(shared=shared)
 
1137
 
1464
1138
    def make_branch_and_tree(self, relpath, format=None):
1465
1139
        """Create a branch on the transport and a tree locally.
1466
1140
 
1467
 
        If the transport is not a LocalTransport, the Tree can't be created on
1468
 
        the transport.  In that case the working tree is created in the local
1469
 
        directory, and the returned tree's branch and repository will also be
1470
 
        accessed locally.
1471
 
 
1472
 
        This will fail if the original default transport for this test
1473
 
        case wasn't backed by the working directory, as the branch won't
1474
 
        be on disk for us to open it.  
1475
 
 
1476
 
        :param format: The BzrDirFormat.
1477
 
        :returns: the WorkingTree.
 
1141
        Returns the tree.
1478
1142
        """
1479
1143
        # TODO: always use the local disk path for the working tree,
1480
1144
        # this obviously requires a format that supports branch references
1484
1148
        try:
1485
1149
            return b.bzrdir.create_workingtree()
1486
1150
        except errors.NotLocalUrl:
1487
 
            # We can only make working trees locally at the moment.  If the
1488
 
            # transport can't support them, then reopen the branch on a local
1489
 
            # transport, and create the working tree there.  
1490
 
            #
1491
 
            # Possibly we should instead keep
1492
 
            # the non-disk-backed branch and create a local checkout?
1493
 
            bd = bzrdir.BzrDir.open(relpath)
1494
 
            return bd.create_workingtree()
 
1151
            # new formats - catch No tree error and create
 
1152
            # a branch reference and a checkout.
 
1153
            # old formats at that point - raise TestSkipped.
 
1154
            # TODO: rbc 20060208
 
1155
            return WorkingTreeFormat2().initialize(bzrdir.BzrDir.open(relpath))
1495
1156
 
1496
1157
    def assertIsDirectory(self, relpath, transport):
1497
1158
        """Assert that relpath within transport is a directory.
1508
1169
            self.fail("path %s is not a directory; has mode %#o"
1509
1170
                      % (relpath, mode))
1510
1171
 
1511
 
    def setUp(self):
1512
 
        super(TestCaseWithTransport, self).setUp()
1513
 
        self.__server = None
1514
 
 
1515
1172
 
1516
1173
class ChrootedTestCase(TestCaseWithTransport):
1517
1174
    """A support class that provides readonly urls outside the local namespace.
1542
1199
 
1543
1200
def run_suite(suite, name='test', verbose=False, pattern=".*",
1544
1201
              stop_on_failure=False, keep_output=False,
1545
 
              transport=None, lsprof_timed=None, bench_history=None):
 
1202
              transport=None, lsprof_timed=None):
 
1203
    TestCaseInTempDir._TEST_NAME = name
1546
1204
    TestCase._gather_lsprof_in_benchmarks = lsprof_timed
1547
1205
    if verbose:
1548
1206
        verbosity = 2
1554
1212
                            descriptions=0,
1555
1213
                            verbosity=verbosity,
1556
1214
                            keep_output=keep_output,
1557
 
                            pb=pb,
1558
 
                            bench_history=bench_history)
 
1215
                            pb=pb)
1559
1216
    runner.stop_on_failure=stop_on_failure
1560
1217
    if pattern != '.*':
1561
1218
        suite = filter_suite_by_re(suite, pattern)
1567
1224
             keep_output=False,
1568
1225
             transport=None,
1569
1226
             test_suite_factory=None,
1570
 
             lsprof_timed=None,
1571
 
             bench_history=None):
 
1227
             lsprof_timed=None):
1572
1228
    """Run the whole test suite under the enhanced runner"""
1573
 
    # XXX: Very ugly way to do this...
1574
 
    # Disable warning about old formats because we don't want it to disturb
1575
 
    # any blackbox tests.
1576
 
    from bzrlib import repository
1577
 
    repository._deprecation_warning_done = True
1578
 
 
1579
1229
    global default_transport
1580
1230
    if transport is None:
1581
1231
        transport = default_transport
1589
1239
        return run_suite(suite, 'testbzr', verbose=verbose, pattern=pattern,
1590
1240
                     stop_on_failure=stop_on_failure, keep_output=keep_output,
1591
1241
                     transport=transport,
1592
 
                     lsprof_timed=lsprof_timed,
1593
 
                     bench_history=bench_history)
 
1242
                     lsprof_timed=lsprof_timed)
1594
1243
    finally:
1595
1244
        default_transport = old_transport
1596
1245
 
1604
1253
    testmod_names = [
1605
1254
                   'bzrlib.tests.test_ancestry',
1606
1255
                   'bzrlib.tests.test_api',
1607
 
                   'bzrlib.tests.test_atomicfile',
1608
1256
                   'bzrlib.tests.test_bad_files',
1609
1257
                   'bzrlib.tests.test_branch',
1610
1258
                   'bzrlib.tests.test_bundle',
1611
1259
                   'bzrlib.tests.test_bzrdir',
1612
 
                   'bzrlib.tests.test_cache_utf8',
1613
1260
                   'bzrlib.tests.test_command',
1614
1261
                   'bzrlib.tests.test_commit',
1615
1262
                   'bzrlib.tests.test_commit_merge',
1621
1268
                   'bzrlib.tests.test_errors',
1622
1269
                   'bzrlib.tests.test_escaped_store',
1623
1270
                   'bzrlib.tests.test_fetch',
1624
 
                   'bzrlib.tests.test_ftp_transport',
1625
1271
                   'bzrlib.tests.test_gpg',
1626
1272
                   'bzrlib.tests.test_graph',
1627
1273
                   'bzrlib.tests.test_hashcache',
1631
1277
                   'bzrlib.tests.test_ignores',
1632
1278
                   'bzrlib.tests.test_inv',
1633
1279
                   'bzrlib.tests.test_knit',
1634
 
                   'bzrlib.tests.test_lazy_import',
1635
 
                   'bzrlib.tests.test_lazy_regex',
1636
1280
                   'bzrlib.tests.test_lockdir',
1637
1281
                   'bzrlib.tests.test_lockable_files',
1638
1282
                   'bzrlib.tests.test_log',
1639
 
                   'bzrlib.tests.test_memorytree',
1640
1283
                   'bzrlib.tests.test_merge',
1641
1284
                   'bzrlib.tests.test_merge3',
1642
1285
                   'bzrlib.tests.test_merge_core',
1651
1294
                   'bzrlib.tests.test_plugins',
1652
1295
                   'bzrlib.tests.test_progress',
1653
1296
                   'bzrlib.tests.test_reconcile',
1654
 
                   'bzrlib.tests.test_registry',
1655
1297
                   'bzrlib.tests.test_repository',
1656
 
                   'bzrlib.tests.test_revert',
1657
1298
                   'bzrlib.tests.test_revision',
1658
1299
                   'bzrlib.tests.test_revisionnamespaces',
 
1300
                   'bzrlib.tests.test_revprops',
1659
1301
                   'bzrlib.tests.test_revisiontree',
1660
1302
                   'bzrlib.tests.test_rio',
1661
1303
                   'bzrlib.tests.test_sampler',
1663
1305
                   'bzrlib.tests.test_setup',
1664
1306
                   'bzrlib.tests.test_sftp_transport',
1665
1307
                   'bzrlib.tests.test_smart_add',
1666
 
                   'bzrlib.tests.test_smart_transport',
1667
1308
                   'bzrlib.tests.test_source',
1668
1309
                   'bzrlib.tests.test_status',
1669
1310
                   'bzrlib.tests.test_store',
1676
1317
                   'bzrlib.tests.test_transform',
1677
1318
                   'bzrlib.tests.test_transport',
1678
1319
                   'bzrlib.tests.test_tree',
1679
 
                   'bzrlib.tests.test_treebuilder',
1680
1320
                   'bzrlib.tests.test_tsort',
1681
1321
                   'bzrlib.tests.test_tuned_gzip',
1682
1322
                   'bzrlib.tests.test_ui',
1683
1323
                   'bzrlib.tests.test_upgrade',
1684
1324
                   'bzrlib.tests.test_urlutils',
1685
1325
                   'bzrlib.tests.test_versionedfile',
1686
 
                   'bzrlib.tests.test_version',
1687
 
                   'bzrlib.tests.test_version_info',
1688
1326
                   'bzrlib.tests.test_weave',
1689
1327
                   'bzrlib.tests.test_whitebox',
1690
1328
                   'bzrlib.tests.test_workingtree',
1705
1343
    for m in MODULES_TO_TEST:
1706
1344
        suite.addTest(loader.loadTestsFromModule(m))
1707
1345
    for m in MODULES_TO_DOCTEST:
1708
 
        try:
1709
 
            suite.addTest(doctest.DocTestSuite(m))
1710
 
        except ValueError, e:
1711
 
            print '**failed to get doctest for: %s\n%s' %(m,e)
1712
 
            raise
 
1346
        suite.addTest(doctest.DocTestSuite(m))
1713
1347
    for name, plugin in bzrlib.plugin.all_plugins().items():
1714
1348
        if getattr(plugin, 'test_suite', None) is not None:
1715
1349
            suite.addTest(plugin.test_suite())