~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: Martin Packman
  • Date: 2012-02-01 13:24:42 UTC
  • mto: (6437.23.4 2.5)
  • mto: This revision was merged to the branch mainline in revision 6462.
  • Revision ID: martin.packman@canonical.com-20120201132442-ela7jc4mxv4b058o
Treat path for .bzr.log as unicode

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2013, 2015, 2016 Canonical Ltd
 
1
# Copyright (C) 2005-2011 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
32
32
import errno
33
33
import itertools
34
34
import logging
35
 
import math
36
35
import os
37
36
import platform
38
37
import pprint
61
60
import bzrlib
62
61
from bzrlib import (
63
62
    branchbuilder,
64
 
    controldir,
 
63
    bzrdir,
65
64
    chk_map,
66
65
    commands as _mod_commands,
67
66
    config,
138
137
isolated_environ = {
139
138
    'BZR_HOME': None,
140
139
    'HOME': None,
141
 
    'XDG_CONFIG_HOME': None,
142
140
    # bzr now uses the Win32 API and doesn't rely on APPDATA, but the
143
141
    # tests do check our impls match APPDATA
144
142
    'BZR_EDITOR': None, # test_msgeditor manipulates this variable
249
247
    different types of display.
250
248
 
251
249
    When a test finishes, in whatever way, it calls one of the addSuccess,
252
 
    addFailure or addError methods.  These in turn may redirect to a more
 
250
    addFailure or addError classes.  These in turn may redirect to a more
253
251
    specific case for the special test results supported by our extended
254
252
    tests.
255
253
 
360
358
            return float(''.join(details['benchtime'].iter_bytes()))
361
359
        return getattr(testCase, "_benchtime", None)
362
360
 
363
 
    def _delta_to_float(self, a_timedelta, precision):
364
 
        # This calls ceiling to ensure that the most pessimistic view of time
365
 
        # taken is shown (rather than leaving it to the Python %f operator
366
 
        # to decide whether to round/floor/ceiling. This was added when we
367
 
        # had pyp3 test failures that suggest a floor was happening.
368
 
        shift = 10 ** precision
369
 
        return math.ceil((a_timedelta.days * 86400.0 + a_timedelta.seconds +
370
 
            a_timedelta.microseconds / 1000000.0) * shift) / shift
371
 
 
372
361
    def _elapsedTestTimeString(self):
373
362
        """Return a time string for the overall time the current test has taken."""
374
363
        return self._formatTime(self._delta_to_float(
375
 
            self._now() - self._start_datetime, 3))
 
364
            self._now() - self._start_datetime))
376
365
 
377
366
    def _testTimeString(self, testCase):
378
367
        benchmark_time = self._extractBenchmarkTime(testCase)
1011
1000
    def setUp(self):
1012
1001
        super(TestCase, self).setUp()
1013
1002
 
1014
 
        # At this point we're still accessing the config files in $BZR_HOME (as
1015
 
        # set by the user running selftest).
1016
1003
        timeout = config.GlobalStack().get('selftest.timeout')
1017
1004
        if timeout:
1018
1005
            timeout_fixture = fixtures.TimeoutFixture(timeout)
1039
1026
        # between tests.  We should get rid of this altogether: bug 656694. --
1040
1027
        # mbp 20101008
1041
1028
        self.overrideAttr(bzrlib.trace, '_verbosity_level', 0)
 
1029
        # Isolate config option expansion until its default value for bzrlib is
 
1030
        # settled on or a the FIXME associated with _get_expand_default_value
 
1031
        # is addressed -- vila 20110219
 
1032
        self.overrideAttr(config, '_expand_default_value', None)
1042
1033
        self._log_files = set()
1043
1034
        # Each key in the ``_counters`` dict holds a value for a different
1044
1035
        # counter. When the test ends, addDetail() should be used to output the
1337
1328
        # hook into bzr dir opening. This leaves a small window of error for
1338
1329
        # transport tests, but they are well known, and we can improve on this
1339
1330
        # step.
1340
 
        controldir.ControlDir.hooks.install_named_hook("pre_open",
 
1331
        bzrdir.BzrDir.hooks.install_named_hook("pre_open",
1341
1332
            self._preopen_isolate_transport, "Check bzr directories are safe.")
1342
1333
 
1343
1334
    def _ndiff_strings(self, a, b):
1369
1360
            % (message,
1370
1361
               pprint.pformat(a), pprint.pformat(b)))
1371
1362
 
1372
 
    # FIXME: This is deprecated in unittest2 but plugins may still use it so we
1373
 
    # need a deprecation period for them -- vila 2016-02-01
1374
1363
    assertEquals = assertEqual
1375
1364
 
1376
1365
    def assertEqualDiff(self, a, b, message=None):
1379
1368
        This is intended for use with multi-line strings where it can
1380
1369
        be hard to find the differences by eye.
1381
1370
        """
1382
 
        # TODO: perhaps override assertEqual to call this for strings?
 
1371
        # TODO: perhaps override assertEquals to call this for strings?
1383
1372
        if a == b:
1384
1373
            return
1385
1374
        if message is None:
1792
1781
 
1793
1782
        :returns: The actual attr value.
1794
1783
        """
 
1784
        value = getattr(obj, attr_name)
1795
1785
        # The actual value is captured by the call below
1796
 
        value = getattr(obj, attr_name, _unitialized_attr)
1797
 
        if value is _unitialized_attr:
1798
 
            # When the test completes, the attribute should not exist, but if
1799
 
            # we aren't setting a value, we don't need to do anything.
1800
 
            if new is not _unitialized_attr:
1801
 
                self.addCleanup(delattr, obj, attr_name)
1802
 
        else:
1803
 
            self.addCleanup(setattr, obj, attr_name, value)
 
1786
        self.addCleanup(setattr, obj, attr_name, value)
1804
1787
        if new is not _unitialized_attr:
1805
1788
            setattr(obj, attr_name, new)
1806
1789
        return value
2052
2035
        if err:
2053
2036
            self.log('errors:\n%r', err)
2054
2037
        if retcode is not None:
2055
 
            self.assertEqual(retcode, result,
 
2038
            self.assertEquals(retcode, result,
2056
2039
                              message='Unexpected return code')
2057
2040
        return result, out, err
2058
2041
 
2467
2450
        self.transport_readonly_server = None
2468
2451
        self.__vfs_server = None
2469
2452
 
2470
 
    def setUp(self):
2471
 
        super(TestCaseWithMemoryTransport, self).setUp()
2472
 
 
2473
 
        def _add_disconnect_cleanup(transport):
2474
 
            """Schedule disconnection of given transport at test cleanup
2475
 
 
2476
 
            This needs to happen for all connected transports or leaks occur.
2477
 
 
2478
 
            Note reconnections may mean we call disconnect multiple times per
2479
 
            transport which is suboptimal but seems harmless.
2480
 
            """
2481
 
            self.addCleanup(transport.disconnect)
2482
 
 
2483
 
        _mod_transport.Transport.hooks.install_named_hook('post_connect',
2484
 
            _add_disconnect_cleanup, None)
2485
 
 
2486
 
        self._make_test_root()
2487
 
        self.addCleanup(os.chdir, os.getcwdu())
2488
 
        self.makeAndChdirToTestDir()
2489
 
        self.overrideEnvironmentForTesting()
2490
 
        self.__readonly_server = None
2491
 
        self.__server = None
2492
 
        self.reduceLockdirTimeout()
2493
 
        # Each test may use its own config files even if the local config files
2494
 
        # don't actually exist. They'll rightly fail if they try to create them
2495
 
        # though.
2496
 
        self.overrideAttr(config, '_shared_stores', {})
2497
 
 
2498
2453
    def get_transport(self, relpath=None):
2499
2454
        """Return a writeable transport.
2500
2455
 
2643
2598
        real branch.
2644
2599
        """
2645
2600
        root = TestCaseWithMemoryTransport.TEST_ROOT
2646
 
        try:
2647
 
            # Make sure we get a readable and accessible home for .bzr.log
2648
 
            # and/or config files, and not fallback to weird defaults (see
2649
 
            # http://pad.lv/825027).
2650
 
            self.assertIs(None, os.environ.get('BZR_HOME', None))
2651
 
            os.environ['BZR_HOME'] = root
2652
 
            wt = controldir.ControlDir.create_standalone_workingtree(root)
2653
 
            del os.environ['BZR_HOME']
2654
 
        except Exception, e:
2655
 
            self.fail("Fail to initialize the safety net: %r\n" % (e,))
 
2601
        # Make sure we get a readable and accessible home for .bzr.log
 
2602
        # and/or config files, and not fallback to weird defaults (see
 
2603
        # http://pad.lv/825027).
 
2604
        self.assertIs(None, os.environ.get('BZR_HOME', None))
 
2605
        os.environ['BZR_HOME'] = root
 
2606
        wt = bzrdir.BzrDir.create_standalone_workingtree(root)
 
2607
        del os.environ['BZR_HOME']
2656
2608
        # Hack for speed: remember the raw bytes of the dirstate file so that
2657
2609
        # we don't need to re-open the wt to check it hasn't changed.
2658
2610
        TestCaseWithMemoryTransport._SAFETY_NET_PRISTINE_DIRSTATE = (
2706
2658
        self.test_home_dir = self.test_dir + "/MemoryTransportMissingHomeDir"
2707
2659
        self.permit_dir(self.test_dir)
2708
2660
 
2709
 
    def make_branch(self, relpath, format=None, name=None):
 
2661
    def make_branch(self, relpath, format=None):
2710
2662
        """Create a branch on the transport at relpath."""
2711
2663
        repo = self.make_repository(relpath, format=format)
2712
 
        return repo.bzrdir.create_branch(append_revisions_only=False,
2713
 
                                         name=name)
 
2664
        return repo.bzrdir.create_branch(append_revisions_only=False)
2714
2665
 
2715
2666
    def get_default_format(self):
2716
2667
        return 'default'
2728
2679
        if format is None:
2729
2680
            format = self.get_default_format()
2730
2681
        if isinstance(format, basestring):
2731
 
            format = controldir.format_registry.make_bzrdir(format)
 
2682
            format = bzrdir.format_registry.make_bzrdir(format)
2732
2683
        return format
2733
2684
 
2734
2685
    def make_bzrdir(self, relpath, format=None):
2781
2732
        self.overrideEnv('HOME', test_home_dir)
2782
2733
        self.overrideEnv('BZR_HOME', test_home_dir)
2783
2734
 
 
2735
    def setUp(self):
 
2736
        super(TestCaseWithMemoryTransport, self).setUp()
 
2737
 
 
2738
        def _add_disconnect_cleanup(transport):
 
2739
            """Schedule disconnection of given transport at test cleanup
 
2740
 
 
2741
            This needs to happen for all connected transports or leaks occur.
 
2742
 
 
2743
            Note reconnections may mean we call disconnect multiple times per
 
2744
            transport which is suboptimal but seems harmless.
 
2745
            """
 
2746
            self.addCleanup(transport.disconnect)
 
2747
 
 
2748
        _mod_transport.Transport.hooks.install_named_hook('post_connect',
 
2749
            _add_disconnect_cleanup, None)
 
2750
 
 
2751
        self._make_test_root()
 
2752
        self.addCleanup(os.chdir, os.getcwdu())
 
2753
        self.makeAndChdirToTestDir()
 
2754
        self.overrideEnvironmentForTesting()
 
2755
        self.__readonly_server = None
 
2756
        self.__server = None
 
2757
        self.reduceLockdirTimeout()
 
2758
 
2784
2759
    def setup_smart_server_with_call_log(self):
2785
2760
        """Sets up a smart server as the transport server with a call log."""
2786
2761
        self.transport_server = test_server.SmartTCPServer_for_testing
2878
2853
        # stacking policy to honour; create a bzr dir with an unshared
2879
2854
        # repository (but not a branch - our code would be trying to escape
2880
2855
        # then!) to stop them, and permit it to be read.
2881
 
        # control = controldir.ControlDir.create(self.test_base_dir)
 
2856
        # control = bzrdir.BzrDir.create(self.test_base_dir)
2882
2857
        # control.create_repository()
2883
2858
        self.test_home_dir = self.test_base_dir + '/home'
2884
2859
        os.mkdir(self.test_home_dir)
2973
2948
    readwrite one must both define get_url() as resolving to os.getcwd().
2974
2949
    """
2975
2950
 
2976
 
    def setUp(self):
2977
 
        super(TestCaseWithTransport, self).setUp()
2978
 
        self.__vfs_server = None
2979
 
 
2980
2951
    def get_vfs_only_server(self):
2981
2952
        """See TestCaseWithMemoryTransport.
2982
2953
 
3028
2999
            if self.vfs_transport_factory is test_server.LocalURLServer:
3029
3000
                # the branch is colocated on disk, we cannot create a checkout.
3030
3001
                # hopefully callers will expect this.
3031
 
                local_controldir = controldir.ControlDir.open(
3032
 
                    self.get_vfs_only_url(relpath))
 
3002
                local_controldir= bzrdir.BzrDir.open(self.get_vfs_only_url(relpath))
3033
3003
                wt = local_controldir.create_workingtree()
3034
3004
                if wt.branch._format != b._format:
3035
3005
                    wt._branch = b
3065
3035
        self.assertFalse(differences.has_changed(),
3066
3036
            "Trees %r and %r are different: %r" % (left, right, differences))
3067
3037
 
 
3038
    def setUp(self):
 
3039
        super(TestCaseWithTransport, self).setUp()
 
3040
        self.__vfs_server = None
 
3041
 
3068
3042
    def disable_missing_extensions_warning(self):
3069
3043
        """Some tests expect a precise stderr content.
3070
3044
 
3071
3045
        There is no point in forcing them to duplicate the extension related
3072
3046
        warning.
3073
3047
        """
3074
 
        config.GlobalStack().set('ignore_missing_extensions', True)
 
3048
        config.GlobalConfig().set_user_option('ignore_missing_extensions', True)
3075
3049
 
3076
3050
 
3077
3051
class ChrootedTestCase(TestCaseWithTransport):
3804
3778
 
3805
3779
    :return: (absents, duplicates) absents is a list containing the test found
3806
3780
        in id_list but not in test_suite, duplicates is a list containing the
3807
 
        tests found multiple times in test_suite.
 
3781
        test found multiple times in test_suite.
3808
3782
 
3809
3783
    When using a prefined test id list, it may occurs that some tests do not
3810
3784
    exist anymore or that some tests use the same id. This function warns the
3934
3908
        'bzrlib.doc',
3935
3909
        'bzrlib.tests.blackbox',
3936
3910
        'bzrlib.tests.commands',
 
3911
        'bzrlib.tests.doc_generate',
3937
3912
        'bzrlib.tests.per_branch',
3938
3913
        'bzrlib.tests.per_bzrdir',
3939
3914
        'bzrlib.tests.per_controldir',
4353
4328
    """Copy test and apply scenario to it.
4354
4329
 
4355
4330
    :param test: A test to adapt.
4356
 
    :param scenario: A tuple describing the scenario.
 
4331
    :param scenario: A tuple describing the scenarion.
4357
4332
        The first element of the tuple is the new test id.
4358
4333
        The second element is a dict containing attributes to set on the
4359
4334
        test.