/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

  • Committer: Jelmer Vernooij
  • Date: 2009-02-25 14:36:59 UTC
  • mfrom: (4048 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4049.
  • Revision ID: jelmer@samba.org-20090225143659-vx6cbqtmyicuzfyf
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
76
76
from bzrlib.merge import merge_inner
77
77
import bzrlib.merge3
78
78
import bzrlib.plugin
 
79
from bzrlib.smart import client, server
79
80
import bzrlib.store
80
81
from bzrlib import symbol_versioning
81
82
from bzrlib.symbol_versioning import (
126
127
    """
127
128
 
128
129
    stop_early = False
129
 
    
 
130
 
130
131
    def __init__(self, stream, descriptions, verbosity,
131
132
                 bench_history=None,
132
133
                 num_tests=None,
162
163
        self.unsupported = {}
163
164
        self.count = 0
164
165
        self._overall_start_time = time.time()
165
 
    
 
166
 
166
167
    def _extractBenchmarkTime(self, testCase):
167
168
        """Add a benchmark time for the current test case."""
168
169
        return getattr(testCase, "_benchtime", None)
169
 
    
 
170
 
170
171
    def _elapsedTestTimeString(self):
171
172
        """Return a time string for the overall time the current test has taken."""
172
173
        return self._formatTime(time.time() - self._start_time)
276
277
        """The test will not be run because of a missing feature.
277
278
        """
278
279
        # this can be called in two different ways: it may be that the
279
 
        # test started running, and then raised (through addError) 
 
280
        # test started running, and then raised (through addError)
280
281
        # UnavailableFeature.  Alternatively this method can be called
281
282
        # while probing for features before running the tests; in that
282
283
        # case we will see startTest and stopTest, but the test will never
393
394
        self.count += 1
394
395
        self.pb.update(
395
396
                self._progress_prefix_text()
396
 
                + ' ' 
 
397
                + ' '
397
398
                + self._shortened_test_description(test))
398
399
 
399
400
    def _test_description(self, test):
400
401
        return self._shortened_test_description(test)
401
402
 
402
403
    def report_error(self, test, err):
403
 
        self.pb.note('ERROR: %s\n    %s\n', 
 
404
        self.pb.note('ERROR: %s\n    %s\n',
404
405
            self._test_description(test),
405
406
            err[1],
406
407
            )
407
408
 
408
409
    def report_failure(self, test, err):
409
 
        self.pb.note('FAIL: %s\n    %s\n', 
 
410
        self.pb.note('FAIL: %s\n    %s\n',
410
411
            self._test_description(test),
411
412
            err[1],
412
413
            )
423
424
 
424
425
    def report_unsupported(self, test, feature):
425
426
        """test cannot be run because feature is missing."""
426
 
                  
 
427
 
427
428
    def report_cleaning_up(self):
428
429
        self.pb.update('cleaning up...')
429
430
 
539
540
                self.stream.writeln("%s" % (t.id()))
540
541
                run += 1
541
542
            actionTaken = "Listed"
542
 
        else: 
 
543
        else:
543
544
            test.run(result)
544
545
            run = result.testsRun
545
546
            actionTaken = "Ran"
601
602
class TestNotApplicable(TestSkipped):
602
603
    """A test is not applicable to the situation where it was run.
603
604
 
604
 
    This is only normally raised by parameterized tests, if they find that 
605
 
    the instance they're constructed upon does not support one aspect 
 
605
    This is only normally raised by parameterized tests, if they find that
 
606
    the instance they're constructed upon does not support one aspect
606
607
    of its interface.
607
608
    """
608
609
 
630
631
 
631
632
class StringIOWrapper(object):
632
633
    """A wrapper around cStringIO which just adds an encoding attribute.
633
 
    
 
634
 
634
635
    Internally we can check sys.stdout to see what the output encoding
635
636
    should be. However, cStringIO has no encoding attribute that we can
636
637
    set. So we wrap it instead.
727
728
 
728
729
class TestCase(unittest.TestCase):
729
730
    """Base class for bzr unit tests.
730
 
    
731
 
    Tests that need access to disk resources should subclass 
 
731
 
 
732
    Tests that need access to disk resources should subclass
732
733
    TestCaseInTempDir not TestCase.
733
734
 
734
735
    Error and debug log messages are redirected from their usual
736
737
    retrieved by _get_log().  We use a real OS file, not an in-memory object,
737
738
    so that it can also capture file IO.  When the test completes this file
738
739
    is read into memory and removed from disk.
739
 
       
 
740
 
740
741
    There are also convenience functions to invoke bzr's command-line
741
742
    routine, and to build and check bzr trees.
742
 
   
 
743
 
743
744
    In addition to the usual method of overriding tearDown(), this class also
744
745
    allows subclasses to register functions into the _cleanups list, which is
745
746
    run in order as the object is torn down.  It's less likely this will be
828
829
 
829
830
    def _ndiff_strings(self, a, b):
830
831
        """Return ndiff between two strings containing lines.
831
 
        
 
832
 
832
833
        A trailing newline is added if missing to make the strings
833
834
        print properly."""
834
835
        if b and b[-1] != '\n':
859
860
 
860
861
    def assertEqualDiff(self, a, b, message=None):
861
862
        """Assert two texts are equal, if not raise an exception.
862
 
        
863
 
        This is intended for use with multi-line strings where it can 
 
863
 
 
864
        This is intended for use with multi-line strings where it can
864
865
        be hard to find the differences by eye.
865
866
        """
866
867
        # TODO: perhaps override assertEquals to call this for strings?
874
875
            message = 'second string is missing a final newline.\n'
875
876
        raise AssertionError(message +
876
877
                             self._ndiff_strings(a, b))
877
 
        
 
878
 
878
879
    def assertEqualMode(self, mode, mode_test):
879
880
        self.assertEqual(mode, mode_test,
880
881
                         'mode mismatch %o != %o' % (mode, mode_test))
938
939
 
939
940
    def assertListRaises(self, excClass, func, *args, **kwargs):
940
941
        """Fail unless excClass is raised when the iterator from func is used.
941
 
        
 
942
 
942
943
        Many functions can return generators this makes sure
943
944
        to wrap them in a list() call to make sure the whole generator
944
945
        is run, and that the proper exception is raised.
992
993
 
993
994
    def assertTransportMode(self, transport, path, mode):
994
995
        """Fail if a path does not have mode mode.
995
 
        
 
996
 
996
997
        If modes are not supported on this transport, the assertion is ignored.
997
998
        """
998
999
        if not transport._can_roundtrip_unix_modebits():
1169
1170
    def callDeprecated(self, expected, callable, *args, **kwargs):
1170
1171
        """Assert that a callable is deprecated in a particular way.
1171
1172
 
1172
 
        This is a very precise test for unusual requirements. The 
 
1173
        This is a very precise test for unusual requirements. The
1173
1174
        applyDeprecated helper function is probably more suited for most tests
1174
1175
        as it allows you to simply specify the deprecation format being used
1175
1176
        and will ensure that that is issued for the function being called.
1220
1221
    def addCleanup(self, callable, *args, **kwargs):
1221
1222
        """Arrange to run a callable when this case is torn down.
1222
1223
 
1223
 
        Callables are run in the reverse of the order they are registered, 
 
1224
        Callables are run in the reverse of the order they are registered,
1224
1225
        ie last-in first-out.
1225
1226
        """
1226
1227
        self._cleanups.append((callable, args, kwargs))
1309
1310
 
1310
1311
    def time(self, callable, *args, **kwargs):
1311
1312
        """Run callable and accrue the time it takes to the benchmark time.
1312
 
        
 
1313
 
1313
1314
        If lsprofiling is enabled (i.e. by --lsprof-time to bzr selftest) then
1314
1315
        this will cause lsprofile statistics to be gathered and stored in
1315
1316
        self._benchcalls.
1330
1331
            self._benchtime += time.time() - start
1331
1332
 
1332
1333
    def _runCleanups(self):
1333
 
        """Run registered cleanup functions. 
 
1334
        """Run registered cleanup functions.
1334
1335
 
1335
1336
        This should only be called from TestCase.tearDown.
1336
1337
        """
1337
 
        # TODO: Perhaps this should keep running cleanups even if 
 
1338
        # TODO: Perhaps this should keep running cleanups even if
1338
1339
        # one of them fails?
1339
1340
 
1340
1341
        # Actually pop the cleanups from the list so tearDown running
1456
1457
        passed in three ways:
1457
1458
 
1458
1459
        1- A list of strings, eg ["commit", "a"].  This is recommended
1459
 
        when the command contains whitespace or metacharacters, or 
 
1460
        when the command contains whitespace or metacharacters, or
1460
1461
        is built up at run time.
1461
1462
 
1462
 
        2- A single string, eg "add a".  This is the most convenient 
 
1463
        2- A single string, eg "add a".  This is the most convenient
1463
1464
        for hardcoded commands.
1464
1465
 
1465
1466
        This runs bzr through the interface that catches and reports
1524
1525
    def run_bzr_subprocess(self, *args, **kwargs):
1525
1526
        """Run bzr in a subprocess for testing.
1526
1527
 
1527
 
        This starts a new Python interpreter and runs bzr in there. 
 
1528
        This starts a new Python interpreter and runs bzr in there.
1528
1529
        This should only be used for tests that have a justifiable need for
1529
1530
        this isolation: e.g. they are testing startup time, or signal
1530
 
        handling, or early startup code, etc.  Subprocess code can't be 
 
1531
        handling, or early startup code, etc.  Subprocess code can't be
1531
1532
        profiled or debugged so easily.
1532
1533
 
1533
1534
        :keyword retcode: The status code that is expected.  Defaults to 0.  If
1773
1774
 
1774
1775
    def __init__(self, methodName='runTest'):
1775
1776
        # allow test parameterization after test construction and before test
1776
 
        # execution. Variables that the parameterizer sets need to be 
 
1777
        # execution. Variables that the parameterizer sets need to be
1777
1778
        # ones that are not set by setUp, or setUp will trash them.
1778
1779
        super(TestCaseWithMemoryTransport, self).__init__(methodName)
1779
1780
        self.vfs_transport_factory = default_transport
1786
1787
 
1787
1788
        This transport is for the test scratch space relative to
1788
1789
        "self._test_root"
1789
 
        
 
1790
 
1790
1791
        :param relpath: a path relative to the base url.
1791
1792
        """
1792
1793
        t = get_transport(self.get_url(relpath))
1795
1796
 
1796
1797
    def get_readonly_transport(self, relpath=None):
1797
1798
        """Return a readonly transport for the test scratch space
1798
 
        
 
1799
 
1799
1800
        This can be used to test that operations which should only need
1800
1801
        readonly access in fact do not try to write.
1801
1802
 
1832
1833
    def get_readonly_url(self, relpath=None):
1833
1834
        """Get a URL for the readonly transport.
1834
1835
 
1835
 
        This will either be backed by '.' or a decorator to the transport 
 
1836
        This will either be backed by '.' or a decorator to the transport
1836
1837
        used by self.get_url()
1837
1838
        relpath provides for clients to get a path relative to the base url.
1838
1839
        These should only be downwards relative, not upwards.
1971
1972
 
1972
1973
    def makeAndChdirToTestDir(self):
1973
1974
        """Create a temporary directories for this one test.
1974
 
        
 
1975
 
1975
1976
        This must set self.test_home_dir and self.test_dir and chdir to
1976
1977
        self.test_dir.
1977
 
        
 
1978
 
1978
1979
        For TestCaseWithMemoryTransport we chdir to the TEST_ROOT for this test.
1979
1980
        """
1980
1981
        os.chdir(TestCaseWithMemoryTransport.TEST_ROOT)
1981
1982
        self.test_dir = TestCaseWithMemoryTransport.TEST_ROOT
1982
1983
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
1983
 
        
 
1984
 
1984
1985
    def make_branch(self, relpath, format=None):
1985
1986
        """Create a branch on the transport at relpath."""
1986
1987
        repo = self.make_repository(relpath, format=format)
2004
2005
 
2005
2006
    def make_repository(self, relpath, shared=False, format=None):
2006
2007
        """Create a repository on our default transport at relpath.
2007
 
        
 
2008
 
2008
2009
        Note that relpath must be a relative path, not a full url.
2009
2010
        """
2010
2011
        # FIXME: If you create a remoterepository this returns the underlying
2011
 
        # real format, which is incorrect.  Actually we should make sure that 
 
2012
        # real format, which is incorrect.  Actually we should make sure that
2012
2013
        # RemoteBzrDir returns a RemoteRepository.
2013
2014
        # maybe  mbp 20070410
2014
2015
        made_control = self.make_bzrdir(relpath, format=format)
2027
2028
    def overrideEnvironmentForTesting(self):
2028
2029
        os.environ['HOME'] = self.test_home_dir
2029
2030
        os.environ['BZR_HOME'] = self.test_home_dir
2030
 
        
 
2031
 
2031
2032
    def setUp(self):
2032
2033
        super(TestCaseWithMemoryTransport, self).setUp()
2033
2034
        self._make_test_root()
2041
2042
        self.__server = None
2042
2043
        self.reduceLockdirTimeout()
2043
2044
 
2044
 
     
 
2045
    def setup_smart_server_with_call_log(self):
 
2046
        """Sets up a smart server as the transport server with a call log."""
 
2047
        self.transport_server = server.SmartTCPServer_for_testing
 
2048
        self.hpss_calls = []
 
2049
        def capture_hpss_call(params):
 
2050
            import traceback
 
2051
            self.hpss_calls.append((params, traceback.format_stack()))
 
2052
        client._SmartClient.hooks.install_named_hook(
 
2053
            'call', capture_hpss_call, None)
 
2054
 
 
2055
    def reset_smart_call_log(self):
 
2056
        self.hpss_calls = []
 
2057
 
 
2058
 
2045
2059
class TestCaseInTempDir(TestCaseWithMemoryTransport):
2046
2060
    """Derived class that runs a test within a temporary directory.
2047
2061
 
2052
2066
    All test cases create their own directory within that.  If the
2053
2067
    tests complete successfully, the directory is removed.
2054
2068
 
2055
 
    :ivar test_base_dir: The path of the top-level directory for this 
 
2069
    :ivar test_base_dir: The path of the top-level directory for this
2056
2070
    test, which contains a home directory and a work directory.
2057
2071
 
2058
2072
    :ivar test_home_dir: An initially empty directory under test_base_dir
2084
2098
 
2085
2099
    def makeAndChdirToTestDir(self):
2086
2100
        """See TestCaseWithMemoryTransport.makeAndChdirToTestDir().
2087
 
        
 
2101
 
2088
2102
        For TestCaseInTempDir we create a temporary directory based on the test
2089
2103
        name and then create two subdirs - test and home under it.
2090
2104
        """
2189
2203
    ReadonlyTransportDecorator is used instead which allows the use of non disk
2190
2204
    based read write transports.
2191
2205
 
2192
 
    If an explicit class is provided for readonly access, that server and the 
 
2206
    If an explicit class is provided for readonly access, that server and the
2193
2207
    readwrite one must both define get_url() as resolving to os.getcwd().
2194
2208
    """
2195
2209
 
2281
2295
    for readonly urls.
2282
2296
 
2283
2297
    TODO RBC 20060127: make this an option to TestCaseWithTransport so it can
2284
 
                       be used without needed to redo it when a different 
 
2298
                       be used without needed to redo it when a different
2285
2299
                       subclass is in use ?
2286
2300
    """
2287
2301
 
2293
2307
 
2294
2308
def condition_id_re(pattern):
2295
2309
    """Create a condition filter which performs a re check on a test's id.
2296
 
    
 
2310
 
2297
2311
    :param pattern: A regular expression string.
2298
2312
    :return: A callable that returns True if the re matches.
2299
2313
    """
2306
2320
 
2307
2321
def condition_isinstance(klass_or_klass_list):
2308
2322
    """Create a condition filter which returns isinstance(param, klass).
2309
 
    
 
2323
 
2310
2324
    :return: A callable which when called with one parameter obj return the
2311
2325
        result of isinstance(obj, klass_or_klass_list).
2312
2326
    """
2317
2331
 
2318
2332
def condition_id_in_list(id_list):
2319
2333
    """Create a condition filter which verify that test's id in a list.
2320
 
    
 
2334
 
2321
2335
    :param id_list: A TestIdList object.
2322
2336
    :return: A callable that returns True if the test's id appears in the list.
2323
2337
    """
2328
2342
 
2329
2343
def condition_id_startswith(starts):
2330
2344
    """Create a condition filter verifying that test's id starts with a string.
2331
 
    
 
2345
 
2332
2346
    :param starts: A list of string.
2333
 
    :return: A callable that returns True if the test's id starts with one of 
 
2347
    :return: A callable that returns True if the test's id starts with one of
2334
2348
        the given strings.
2335
2349
    """
2336
2350
    def condition(test):
2359
2373
 
2360
2374
def filter_suite_by_condition(suite, condition):
2361
2375
    """Create a test suite by filtering another one.
2362
 
    
 
2376
 
2363
2377
    :param suite: The source suite.
2364
2378
    :param condition: A callable whose result evaluates True when called with a
2365
2379
        test case which should be included in the result.
2375
2389
 
2376
2390
def filter_suite_by_re(suite, pattern):
2377
2391
    """Create a test suite by filtering another one.
2378
 
    
 
2392
 
2379
2393
    :param suite:           the source suite
2380
2394
    :param pattern:         pattern that names must match
2381
2395
    :returns: the newly created suite
2433
2447
 
2434
2448
def randomize_suite(suite):
2435
2449
    """Return a new TestSuite with suite's tests in random order.
2436
 
    
 
2450
 
2437
2451
    The tests in the input suite are flattened into a single suite in order to
2438
2452
    accomplish this. Any nested TestSuites are removed to provide global
2439
2453
    randomness.
2445
2459
 
2446
2460
def split_suite_by_condition(suite, condition):
2447
2461
    """Split a test suite into two by a condition.
2448
 
    
 
2462
 
2449
2463
    :param suite: The suite to split.
2450
2464
    :param condition: The condition to match on. Tests that match this
2451
2465
        condition are returned in the first test suite, ones that do not match
2467
2481
 
2468
2482
def split_suite_by_re(suite, pattern):
2469
2483
    """Split a test suite into two by a regular expression.
2470
 
    
 
2484
 
2471
2485
    :param suite: The suite to split.
2472
2486
    :param pattern: A regular expression string. Test ids that match this
2473
2487
        pattern will be in the first test suite returned, and the others in the
2636
2650
    """Warns about tests not appearing or appearing more than once.
2637
2651
 
2638
2652
    :param test_suite: A TestSuite object.
2639
 
    :param test_id_list: The list of test ids that should be found in 
 
2653
    :param test_id_list: The list of test ids that should be found in
2640
2654
         test_suite.
2641
2655
 
2642
2656
    :return: (absents, duplicates) absents is a list containing the test found
2992
3006
            # No tests to keep here, move along
2993
3007
            continue
2994
3008
        try:
2995
 
            # note that this really does mean "report only" -- doctest 
 
3009
            # note that this really does mean "report only" -- doctest
2996
3010
            # still runs the rest of the examples
2997
3011
            doc_suite = doctest.DocTestSuite(mod,
2998
3012
                optionflags=doctest.REPORT_ONLY_FIRST_FAILURE)
3052
3066
 
3053
3067
    This is the recommended public interface for test parameterization.
3054
3068
    Typically the test_suite() method for a per-implementation test
3055
 
    suite will call multiply_tests_from_modules and return the 
 
3069
    suite will call multiply_tests_from_modules and return the
3056
3070
    result.
3057
3071
 
3058
3072
    :param module_name_list: List of fully-qualified names of test
3059
3073
        modules.
3060
 
    :param scenario_iter: Iterable of pairs of (scenario_name, 
 
3074
    :param scenario_iter: Iterable of pairs of (scenario_name,
3061
3075
        scenario_param_dict).
3062
 
    :param loader: If provided, will be used instead of a new 
 
3076
    :param loader: If provided, will be used instead of a new
3063
3077
        bzrlib.tests.TestLoader() instance.
3064
3078
 
3065
3079
    This returns a new TestSuite containing the cross product of
3066
3080
    all the tests in all the modules, each repeated for each scenario.
3067
 
    Each test is adapted by adding the scenario name at the end 
 
3081
    Each test is adapted by adding the scenario name at the end
3068
3082
    of its name, and updating the test object's __dict__ with the
3069
3083
    scenario_param_dict.
3070
3084
 
3071
3085
    >>> r = multiply_tests_from_modules(
3072
3086
    ...     ['bzrlib.tests.test_sampler'],
3073
 
    ...     [('one', dict(param=1)), 
 
3087
    ...     [('one', dict(param=1)),
3074
3088
    ...      ('two', dict(param=2))])
3075
3089
    >>> tests = list(iter_suite_tests(r))
3076
3090
    >>> len(tests)