~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/branch_implementations/__init__.py

  • Committer: Aaron Bentley
  • Date: 2008-10-16 21:37:21 UTC
  • mfrom: (0.12.63 shelf-manager)
  • mto: This revision was merged to the branch mainline in revision 3823.
  • Revision ID: aaron@aaronbentley.com-20081016213721-4evccj16q9mb05uf
Merge with shelf-manager

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006, 2007 Canonical Ltd
 
2
# Authors: Robert Collins <robert.collins@canonical.com>
 
3
#          and others
 
4
#
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
#
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
#
 
15
# You should have received a copy of the GNU General Public License
 
16
# along with this program; if not, write to the Free Software
 
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 
 
19
 
 
20
"""Branch implementation tests for bzr.
 
21
 
 
22
These test the conformance of all the branch variations to the expected API.
 
23
Specific tests for individual formats are in the tests/test_branch file 
 
24
rather than in tests/branch_implementations/*.py.
 
25
"""
 
26
 
 
27
from bzrlib import (
 
28
    errors,
 
29
    tests,
 
30
    )
 
31
from bzrlib.branch import (BranchFormat,
 
32
                           _legacy_formats,
 
33
                           )
 
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
 
 
147
    test_branch_implementations = [
 
148
        'bzrlib.tests.branch_implementations.test_bound_sftp',
 
149
        'bzrlib.tests.branch_implementations.test_branch',
 
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',
 
159
        'bzrlib.tests.branch_implementations.test_parent',
 
160
        'bzrlib.tests.branch_implementations.test_permissions',
 
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',
 
170
        'bzrlib.tests.branch_implementations.test_update',
 
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]
 
176
    adapter = BranchTestProviderAdapter(
 
177
        # None here will cause the default vfs transport server to be used.
 
178
        None,
 
179
        # None here will cause a readonly decorator to be created
 
180
        # by the TestCaseWithTransport.get_readonly_transport method.
 
181
        None,
 
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
 
 
211
    return result