/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/branch_implementations/__init__.py

  • Committer: Robert Collins
  • Date: 2008-08-20 02:07:36 UTC
  • mfrom: (3640 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3682.
  • Revision ID: robertc@robertcollins.net-20080820020736-g2xe4921zzxtymle
Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 by Canonical Ltd
 
1
# Copyright (C) 2006, 2007 Canonical Ltd
2
2
# Authors: Robert Collins <robert.collins@canonical.com>
3
 
# -*- coding: utf-8 -*-
4
 
 
 
3
#          and others
 
4
#
5
5
# This program is free software; you can redistribute it and/or modify
6
6
# it under the terms of the GNU General Public License as published by
7
7
# the Free Software Foundation; either version 2 of the License, or
8
8
# (at your option) any later version.
9
 
 
 
9
#
10
10
# This program is distributed in the hope that it will be useful,
11
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
13
# GNU General Public License for more details.
14
 
 
 
14
#
15
15
# You should have received a copy of the GNU General Public License
16
16
# along with this program; if not, write to the Free Software
17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
24
rather than in tests/branch_implementations/*.py.
25
25
"""
26
26
 
 
27
from bzrlib import (
 
28
    errors,
 
29
    tests,
 
30
    )
27
31
from bzrlib.branch import (BranchFormat,
28
 
                           BranchTestProviderAdapter,
29
32
                           _legacy_formats,
30
33
                           )
31
 
from bzrlib.tests import (
32
 
                          adapt_modules,
33
 
                          default_transport,
34
 
                          TestLoader,
35
 
                          TestSuite,
36
 
                          )
37
 
 
38
 
 
39
 
def test_suite():
40
 
    result = TestSuite()
 
34
from bzrlib.remote import RemoteBranchFormat, RemoteBzrDirFormat
 
35
from bzrlib.smart.server import (
 
36
    ReadonlySmartTCPServer_for_testing,
 
37
    ReadonlySmartTCPServer_for_testing_v2_only,
 
38
    SmartTCPServer_for_testing,
 
39
    SmartTCPServer_for_testing_v2_only,
 
40
    )
 
41
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
 
42
from bzrlib.transport.memory import MemoryServer
 
43
 
 
44
 
 
45
class BranchTestProviderAdapter(tests.TestScenarioApplier):
 
46
    """A tool to generate a suite testing multiple branch formats at once.
 
47
 
 
48
    This is done by copying the test once for each transport and injecting
 
49
    the transport_server, transport_readonly_server, and branch_format
 
50
    classes into each copy. Each copy is also given a new id() to make it
 
51
    easy to identify.
 
52
    """
 
53
 
 
54
    def __init__(self, transport_server, transport_readonly_server, formats,
 
55
        vfs_transport_factory=None, name_suffix=''):
 
56
        self._transport_server = transport_server
 
57
        self._transport_readonly_server = transport_readonly_server
 
58
        self._name_suffix = name_suffix
 
59
        self.scenarios = self.formats_to_scenarios(formats)
 
60
    
 
61
    def formats_to_scenarios(self, formats):
 
62
        """Transform the input formats to a list of scenarios.
 
63
 
 
64
        :param formats: A list of (branch_format, bzrdir_format).
 
65
        """
 
66
        result = []
 
67
        for branch_format, bzrdir_format in formats:
 
68
            # some branches don't have separate format objects.
 
69
            # so we have a conditional here to handle them.
 
70
            scenario_name = getattr(branch_format, '__name__',
 
71
                branch_format.__class__.__name__)
 
72
            scenario_name += self._name_suffix
 
73
            scenario = (scenario_name, {
 
74
                "transport_server":self._transport_server,
 
75
                "transport_readonly_server":self._transport_readonly_server,
 
76
                "bzrdir_format":bzrdir_format,
 
77
                "branch_format":branch_format,
 
78
                    })
 
79
            result.append(scenario)
 
80
        return result
 
81
 
 
82
 
 
83
class TestCaseWithBranch(TestCaseWithBzrDir):
 
84
    """This helper will be adapted for each branch_implementation test."""
 
85
 
 
86
    def setUp(self):
 
87
        super(TestCaseWithBranch, self).setUp()
 
88
        self.branch = None
 
89
 
 
90
    def get_branch(self):
 
91
        if self.branch is None:
 
92
            self.branch = self.make_branch('')
 
93
        return self.branch
 
94
 
 
95
    def make_branch(self, relpath, format=None):
 
96
        repo = self.make_repository(relpath, format=format)
 
97
        # fixme RBC 20060210 this isnt necessarily a fixable thing,
 
98
        # Skipped is the wrong exception to raise.
 
99
        try:
 
100
            return self.branch_format.initialize(repo.bzrdir)
 
101
        except errors.UninitializableFormat:
 
102
            raise tests.TestSkipped('Uninitializable branch format')
 
103
 
 
104
    def make_repository(self, relpath, shared=False, format=None):
 
105
        made_control = self.make_bzrdir(relpath, format=format)
 
106
        return made_control.create_repository(shared=shared)
 
107
 
 
108
    def create_tree_with_merge(self):
 
109
        """Create a branch with a simple ancestry.
 
110
 
 
111
        The graph should look like:
 
112
            digraph H {
 
113
                "rev-1" -> "rev-2" -> "rev-3";
 
114
                "rev-1" -> "rev-1.1.1" -> "rev-3";
 
115
            }
 
116
 
 
117
        Or in ASCII:
 
118
            1
 
119
            |\
 
120
            2 1.1.1
 
121
            |/
 
122
            3
 
123
        """
 
124
        tree = self.make_branch_and_memory_tree('tree')
 
125
        tree.lock_write()
 
126
        try:
 
127
            tree.add('')
 
128
            tree.commit('first', rev_id='rev-1')
 
129
            tree.commit('second', rev_id='rev-1.1.1')
 
130
            # Uncommit that last commit and switch to the other line
 
131
            tree.branch.set_last_revision_info(1, 'rev-1')
 
132
            tree.set_parent_ids(['rev-1'])
 
133
            tree.commit('alt-second', rev_id='rev-2')
 
134
            tree.set_parent_ids(['rev-2', 'rev-1.1.1'])
 
135
            tree.commit('third', rev_id='rev-3')
 
136
        finally:
 
137
            tree.unlock()
 
138
 
 
139
        return tree
 
140
 
 
141
 
 
142
def load_tests(basic_tests, module, loader):
 
143
    result = loader.suiteClass()
 
144
    # add the tests for this module
 
145
    result.addTests(basic_tests)
 
146
 
41
147
    test_branch_implementations = [
42
148
        'bzrlib.tests.branch_implementations.test_bound_sftp',
43
149
        'bzrlib.tests.branch_implementations.test_branch',
44
150
        'bzrlib.tests.branch_implementations.test_break_lock',
 
151
        'bzrlib.tests.branch_implementations.test_check',
 
152
        'bzrlib.tests.branch_implementations.test_create_checkout',
 
153
        'bzrlib.tests.branch_implementations.test_commit',
 
154
        'bzrlib.tests.branch_implementations.test_get_revision_id_to_revno_map',
 
155
        'bzrlib.tests.branch_implementations.test_hooks',
 
156
        'bzrlib.tests.branch_implementations.test_http',
 
157
        'bzrlib.tests.branch_implementations.test_last_revision_info',
 
158
        'bzrlib.tests.branch_implementations.test_locking',
45
159
        'bzrlib.tests.branch_implementations.test_parent',
46
160
        'bzrlib.tests.branch_implementations.test_permissions',
47
161
        'bzrlib.tests.branch_implementations.test_pull',
 
162
        'bzrlib.tests.branch_implementations.test_push',
 
163
        'bzrlib.tests.branch_implementations.test_reconcile',
 
164
        'bzrlib.tests.branch_implementations.test_revision_history',
 
165
        'bzrlib.tests.branch_implementations.test_revision_id_to_revno',
 
166
        'bzrlib.tests.branch_implementations.test_sprout',
 
167
        'bzrlib.tests.branch_implementations.test_stacking',
 
168
        'bzrlib.tests.branch_implementations.test_tags',
 
169
        'bzrlib.tests.branch_implementations.test_uncommit',
48
170
        'bzrlib.tests.branch_implementations.test_update',
49
171
        ]
 
172
    # Generate a list of branch formats and their associated bzrdir formats to
 
173
    # use.
 
174
    combinations = [(format, format._matchingbzrdir) for format in 
 
175
         BranchFormat._formats.values() + _legacy_formats]
50
176
    adapter = BranchTestProviderAdapter(
51
 
        default_transport,
 
177
        # None here will cause the default vfs transport server to be used.
 
178
        None,
52
179
        # None here will cause a readonly decorator to be created
53
180
        # by the TestCaseWithTransport.get_readonly_transport method.
54
181
        None,
55
 
        [(format, format._matchingbzrdir) for format in 
56
 
         BranchFormat._formats.values() + _legacy_formats])
57
 
    loader = TestLoader()
58
 
    adapt_modules(test_branch_implementations, adapter, loader, result)
 
182
        combinations)
 
183
    # add the tests for the sub modules
 
184
    tests.adapt_modules(test_branch_implementations, adapter, loader, result)
 
185
 
 
186
    # Add RemoteBranch tests, which need a special server.
 
187
    adapt_to_smart_server = BranchTestProviderAdapter(
 
188
        SmartTCPServer_for_testing,
 
189
        ReadonlySmartTCPServer_for_testing,
 
190
        [(RemoteBranchFormat(), RemoteBzrDirFormat())],
 
191
        MemoryServer,
 
192
        name_suffix='-default')
 
193
    tests.adapt_modules(test_branch_implementations,
 
194
                        adapt_to_smart_server,
 
195
                        loader,
 
196
                        result)
 
197
 
 
198
    # Also add tests for RemoteBranch with HPSS protocol v2 (i.e. bzr <1.6)
 
199
    # server.
 
200
    adapt_to_smart_server = BranchTestProviderAdapter(
 
201
        SmartTCPServer_for_testing_v2_only,
 
202
        ReadonlySmartTCPServer_for_testing_v2_only,
 
203
        [(RemoteBranchFormat(), RemoteBzrDirFormat())],
 
204
        MemoryServer,
 
205
        name_suffix='-v2')
 
206
    tests.adapt_modules(test_branch_implementations,
 
207
                        adapt_to_smart_server,
 
208
                        loader,
 
209
                        result)
 
210
 
59
211
    return result