~bzr-pqm/bzr/bzr.dev

5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2008-2011 Canonical Ltd
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
16
17
18
"""Tests for foreign VCS utility code."""
19
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
20
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
21
from bzrlib import (
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
22
    branch,
4721.2.4 by Vincent Ladeuil
More test cleanup.
23
    bzrdir,
5363.2.4 by Jelmer Vernooij
Introduce probers, use controldir in a couple more places.
24
    controldir,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
25
    errors,
26
    foreign,
27
    lockable_files,
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
28
    lockdir,
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
29
    repository,
4721.2.4 by Vincent Ladeuil
More test cleanup.
30
    revision,
31
    tests,
3920.2.33 by Jelmer Vernooij
Use branch_builder to create revisions in testsuite.
32
    trace,
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
33
    )
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
34
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
35
from bzrlib.repofmt import groupcompress_repo
36
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
37
# This is the dummy foreign revision control system, used 
38
# mainly here in the testsuite to test the foreign VCS infrastructure.
39
# It is basically standard Bazaar with some minor modifications to 
40
# make it "foreign". 
41
# 
42
# It has the following differences to "regular" Bazaar:
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
43
# - The control directory is named ".dummy", not ".bzr".
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
44
# - The revision ids are tuples, not strings.
3920.2.20 by Jelmer Vernooij
Fix dpush tests.
45
# - Doesn't support more than one parent natively
3920.2.7 by Jelmer Vernooij
Add comments about dummy vcs.
46
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
47
48
class DummyForeignVcsMapping(foreign.VcsMapping):
49
    """A simple mapping for the dummy Foreign VCS, for use with testing."""
50
51
    def __eq__(self, other):
52
        return type(self) == type(other)
53
54
    def revision_id_bzr_to_foreign(self, bzr_revid):
55
        return tuple(bzr_revid[len("dummy-v1:"):].split("-")), self
56
57
    def revision_id_foreign_to_bzr(self, foreign_revid):
58
        return "dummy-v1:%s-%s-%s" % foreign_revid
59
60
61
class DummyForeignVcsMappingRegistry(foreign.VcsMappingRegistry):
62
63
    def revision_id_bzr_to_foreign(self, revid):
64
        if not revid.startswith("dummy-"):
65
            raise errors.InvalidRevisionId(revid, None)
66
        mapping_version = revid[len("dummy-"):len("dummy-vx")]
67
        mapping = self.get(mapping_version)
68
        return mapping.revision_id_bzr_to_foreign(revid)
69
70
71
class DummyForeignVcs(foreign.ForeignVcs):
72
    """A dummy Foreign VCS, for use with testing.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
73
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
74
    It has revision ids that are a tuple with three strings.
75
    """
76
77
    def __init__(self):
78
        self.mapping_registry = DummyForeignVcsMappingRegistry()
4032.1.1 by John Arbash Meinel
Merge the removal of all trailing whitespace, and resolve conflicts.
79
        self.mapping_registry.register("v1", DummyForeignVcsMapping(self),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
80
                                       "Version 1")
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
81
        self.abbreviation = "dummy"
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
82
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
83
    def show_foreign_revid(self, foreign_revid):
84
        return { "dummy ding": "%s/%s\\%s" % foreign_revid }
85
4747.2.1 by Jelmer Vernooij
Allow specifying an abbreviation for foreign vcs'es and an optional function to serialize foreign revision ids.
86
    def serialize_foreign_revid(self, foreign_revid):
87
        return "%s|%s|%s" % foreign_revid
88
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
89
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
90
class DummyForeignVcsBranch(branch.BzrBranch6,foreign.ForeignBranch):
91
    """A Dummy VCS Branch."""
92
93
    def __init__(self, _format, _control_files, a_bzrdir, *args, **kwargs):
94
        self._format = _format
95
        self._base = a_bzrdir.transport.base
3920.2.29 by Jelmer Vernooij
Fix dpush tests.
96
        self._ignore_fallbacks = False
5158.6.10 by Martin Pool
Update more code to use user_transport when it should
97
        self.bzrdir = a_bzrdir
5777.6.6 by Jelmer Vernooij
Add lossy tests.
98
        foreign.ForeignBranch.__init__(self,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
99
            DummyForeignVcsMapping(DummyForeignVcs()))
5777.6.6 by Jelmer Vernooij
Add lossy tests.
100
        branch.BzrBranch6.__init__(self, _format, _control_files, a_bzrdir,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
101
            *args, **kwargs)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
102
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
103
    def _get_checkout_format(self):
104
        """Return the most suitable metadir for a checkout of this branch.
105
        Weaves are used if this branch's repository uses weaves.
106
        """
107
        return self.bzrdir.checkout_metadir()
108
109
    def import_last_revision_info_and_tags(self, source, revno, revid,
110
                                           lossy=False):
111
        interbranch = InterToDummyVcsBranch(source, self)
112
        if lossy:
113
            result = interbranch.lossy_push(revid)
114
            revid = result.revidmap[revid]
115
        else:
116
            interbranch.push(revid)
117
        return (revno, revid)
118
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
119
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
120
class DummyForeignCommitBuilder(repository.RootCommitBuilder):
121
122
    def _generate_revision_if_needed(self):
5777.6.6 by Jelmer Vernooij
Add lossy tests.
123
        mapping = DummyForeignVcsMapping(DummyForeignVcs())
124
        if self._lossy:
125
            self._new_revision_id = mapping.revision_id_foreign_to_bzr(
126
                (str(self._timestamp), str(self._timezone), "UNKNOWN"))
127
            self.random_revid = False
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
128
        elif self._new_revision_id is not None:
129
            self.random_revid = False
5777.6.6 by Jelmer Vernooij
Add lossy tests.
130
        else:
5777.6.11 by Jelmer Vernooij
Fix revision id generation.
131
            self._new_revision_id = self._gen_revision_id()
5777.6.6 by Jelmer Vernooij
Add lossy tests.
132
            self.random_revid = True
133
134
135
class DummyForeignVcsRepository(groupcompress_repo.CHKInventoryRepository,
136
    foreign.ForeignRepository):
137
    """Dummy foreign vcs repository."""
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
138
139
140
class DummyForeignVcsRepositoryFormat(groupcompress_repo.RepositoryFormat2a):
141
5777.6.6 by Jelmer Vernooij
Add lossy tests.
142
    repository_class = DummyForeignVcsRepository
143
    _commit_builder_class = DummyForeignCommitBuilder
144
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
145
    def get_format_string(self):
146
        return "Dummy Foreign Vcs Repository"
147
148
    def get_format_description(self):
149
        return "Dummy Foreign Vcs Repository"
150
151
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
152
class InterToDummyVcsBranch(branch.GenericInterBranch,
153
                            foreign.InterToForeignBranch):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
154
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
155
    @staticmethod
156
    def is_compatible(source, target):
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
157
        return isinstance(target, DummyForeignVcsBranch)
158
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
159
    def push(self, overwrite=False, stop_revision=None):
160
        raise errors.NoRoundtrippingSupport(self.source, self.target)
161
4347.2.2 by Jelmer Vernooij
Rename dpush to lossy_push.
162
    def lossy_push(self, stop_revision=None):
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
163
        result = branch.BranchPushResult()
164
        result.source_branch = self.source
165
        result.target_branch = self.target
166
        result.old_revno, result.old_revid = self.target.last_revision_info()
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
167
        self.source.lock_read()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
168
        try:
169
            # This just handles simple cases, but that's good enough for tests
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
170
            my_history = self.target.revision_history()
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
171
            if stop_revision is None:
172
                stop_revision = self.source.last_revision()
173
            their_history = list(self.source.repository.iter_reverse_revision_history(stop_revision))
174
            their_history.reverse()
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
175
            if their_history[:min(len(my_history), len(their_history))] != my_history:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
176
                raise errors.DivergedBranches(self.target, self.source)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
177
            todo = their_history[len(my_history):]
178
            revidmap = {}
179
            for revid in todo:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
180
                rev = self.source.repository.get_revision(revid)
181
                tree = self.source.repository.revision_tree(revid)
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
182
                def get_file_with_stat(file_id, path=None):
183
                    return (tree.get_file(file_id), None)
184
                tree.get_file_with_stat = get_file_with_stat
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
185
                new_revid = self.target.mapping.revision_id_foreign_to_bzr(
186
                    (str(rev.timestamp), str(rev.timezone), 
187
                        str(self.target.revno())))
188
                parent_revno, parent_revid= self.target.last_revision_info()
4721.2.4 by Vincent Ladeuil
More test cleanup.
189
                if parent_revid == revision.NULL_REVISION:
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
190
                    parent_revids = []
191
                else:
192
                    parent_revids = [parent_revid]
193
                builder = self.target.get_commit_builder(parent_revids, 
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
194
                        self.target.get_config(), rev.timestamp,
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
195
                        rev.timezone, rev.committer, rev.properties,
196
                        new_revid)
197
                try:
198
                    for path, ie in tree.inventory.iter_entries():
199
                        new_ie = ie.copy()
200
                        new_ie.revision = None
201
                        builder.record_entry_contents(new_ie, 
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
202
                            [self.target.repository.revision_tree(parent_revid).inventory],
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
203
                            path, tree, 
204
                            (ie.kind, ie.text_size, ie.executable, ie.text_sha1))
205
                    builder.finish_inventory()
206
                except:
207
                    builder.abort()
208
                    raise
209
                revidmap[revid] = builder.commit(rev.message)
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
210
                self.target.set_last_revision_info(parent_revno+1, 
211
                    revidmap[revid])
3920.2.36 by Jelmer Vernooij
Fix tests after CommitBuilder changes.
212
                trace.mutter('lossily pushed revision %s -> %s', 
213
                    revid, revidmap[revid])
214
        finally:
4347.2.1 by Jelmer Vernooij
Move dpush onto an InterBranch object.
215
            self.source.unlock()
4347.3.1 by Jelmer Vernooij
Return BranchPushResult instance from lossy_push() and make dpush print
216
        result.new_revno, result.new_revid = self.target.last_revision_info()
217
        result.revidmap = revidmap
218
        return result
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
219
220
221
class DummyForeignVcsBranchFormat(branch.BzrBranchFormat6):
222
223
    def get_format_string(self):
224
        return "Branch for Testing"
225
226
    def __init__(self):
227
        super(DummyForeignVcsBranchFormat, self).__init__()
228
        self._matchingbzrdir = DummyForeignVcsDirFormat()
229
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
230
    def open(self, a_bzrdir, name=None, _found=False, ignore_fallbacks=False,
231
            found_repository=None):
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
232
        if not _found:
233
            raise NotImplementedError
234
        try:
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
235
            transport = a_bzrdir.get_branch_transport(None, name=name)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
236
            control_files = lockable_files.LockableFiles(transport, 'lock',
237
                                                         lockdir.LockDir)
5535.3.9 by Andrew Bennetts
Fix test failures.
238
            if found_repository is None:
239
                found_repository = a_bzrdir.find_repository()
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
240
            return DummyForeignVcsBranch(_format=self,
241
                              _control_files=control_files,
242
                              a_bzrdir=a_bzrdir,
5535.3.9 by Andrew Bennetts
Fix test failures.
243
                              _repository=found_repository)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
244
        except errors.NoSuchFile:
245
            raise errors.NotBranchError(path=transport.base)
246
247
4721.2.4 by Vincent Ladeuil
More test cleanup.
248
class DummyForeignVcsDirFormat(bzrdir.BzrDirMetaFormat1):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
249
    """BzrDirFormat for the dummy foreign VCS."""
250
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
251
    @classmethod
5363.2.9 by Jelmer Vernooij
Fix some tests.
252
    def get_format_string(cls):
253
        return "A Dummy VCS Dir"
254
255
    @classmethod
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
256
    def get_format_description(cls):
257
        return "A Dummy VCS Dir"
258
259
    @classmethod
260
    def is_supported(cls):
261
        return True
262
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
263
    def get_branch_format(self):
264
        return DummyForeignVcsBranchFormat()
265
5777.6.5 by Jelmer Vernooij
Add tests for lossy commit.
266
    @property
267
    def repository_format(self):
268
        return DummyForeignVcsRepositoryFormat()
269
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
270
    def initialize_on_transport(self, transport):
271
        """Initialize a new bzrdir in the base directory of a Transport."""
272
        # Since we don't have a .bzr directory, inherit the
273
        # mode from the root directory
274
        temp_control = lockable_files.LockableFiles(transport,
275
                            '', lockable_files.TransportLock)
276
        temp_control._transport.mkdir('.dummy',
277
                                      # FIXME: RBC 20060121 don't peek under
278
                                      # the covers
279
                                      mode=temp_control._dir_mode)
280
        del temp_control
281
        bzrdir_transport = transport.clone('.dummy')
282
        # NB: no need to escape relative paths that are url safe.
283
        control_files = lockable_files.LockableFiles(bzrdir_transport,
284
            self._lock_file_name, self._lock_class)
285
        control_files.create_lock()
286
        return self.open(transport, _found=True)
287
288
    def _open(self, transport):
289
        return DummyForeignVcsDir(transport, self)
290
291
4721.2.4 by Vincent Ladeuil
More test cleanup.
292
class DummyForeignVcsDir(bzrdir.BzrDirMeta1):
3920.2.15 by Jelmer Vernooij
Add a DummyForeignVcsDir class.
293
294
    def __init__(self, _transport, _format):
295
        self._format = _format
296
        self.transport = _transport.clone('.dummy')
297
        self.root_transport = _transport
298
        self._mode_check_done = False
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
299
        self._control_files = lockable_files.LockableFiles(self.transport,
300
            "lock", lockable_files.TransportLock)
301
5777.6.9 by Jelmer Vernooij
Fix tests with dirstate.
302
    def create_workingtree(self):
303
        # dirstate requires a ".bzr" entry to exist
304
        self.root_transport.put_bytes(".bzr", "foo")
305
        return super(DummyForeignVcsDir, self).create_workingtree()
306
5051.3.6 by Jelmer Vernooij
Cope with API changes in BzrDir API.
307
    def open_branch(self, name=None, unsupported=False, ignore_fallbacks=True):
308
        if name is not None:
309
            raise errors.NoColocatedBranchSupport(self)
3920.2.19 by Jelmer Vernooij
Get everything except dpull itself working.
310
        return self._format.get_branch_format().open(self, _found=True)
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
311
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
312
    def cloning_metadir(self, stacked=False):
313
        """Produce a metadir suitable for cloning with."""
4721.2.4 by Vincent Ladeuil
More test cleanup.
314
        return bzrdir.format_registry.make_bzrdir("default")
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
315
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
316
    def checkout_metadir(self):
317
        return self.cloning_metadir()
318
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
319
    def sprout(self, url, revision_id=None, force_new_repo=False,
320
               recurse='down', possible_transports=None,
321
               accelerator_tree=None, hardlink=False, stacked=False,
322
               source_branch=None):
323
        # dirstate doesn't cope with accelerator_trees well 
324
        # that have a different control dir
325
        return super(DummyForeignVcsDir, self).sprout(url=url, 
326
                revision_id=revision_id, force_new_repo=force_new_repo, 
327
                recurse=recurse, possible_transports=possible_transports, 
328
                hardlink=hardlink, stacked=stacked, source_branch=source_branch)
329
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
330
4721.2.5 by Vincent Ladeuil
Some refactoring.
331
def register_dummy_foreign_for_test(testcase):
5363.2.6 by Jelmer Vernooij
Add ControlDirFormat.{un,}register_{server_,}prober.
332
    controldir.ControlDirFormat.register_prober(DummyForeignProber)
333
    testcase.addCleanup(controldir.ControlDirFormat.unregister_prober,
334
        DummyForeignProber)
5777.6.6 by Jelmer Vernooij
Add lossy tests.
335
    repository.format_registry.register(DummyForeignVcsRepositoryFormat())
336
    testcase.addCleanup(repository.format_registry.remove,
337
            DummyForeignVcsRepositoryFormat())
5777.7.5 by Jelmer Vernooij
Add tests for committing to a branch bound to a foreign branch.
338
    branch.format_registry.register(DummyForeignVcsBranchFormat())
339
    testcase.addCleanup(branch.format_registry.remove,
340
            DummyForeignVcsBranchFormat())
4721.2.5 by Vincent Ladeuil
Some refactoring.
341
    # We need to register the optimiser to make the dummy appears really
342
    # different from a regular bzr repository.
343
    branch.InterBranch.register_optimiser(InterToDummyVcsBranch)
344
    testcase.addCleanup(branch.InterBranch.unregister_optimiser,
345
                        InterToDummyVcsBranch)
346
347
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
348
class DummyForeignProber(controldir.Prober):
349
350
    @classmethod
351
    def probe_transport(klass, transport):
352
        """Return the .bzrdir style format present in a directory."""
353
        if not transport.has('.dummy'):
354
            raise errors.NotBranchError(path=transport.base)
355
        return DummyForeignVcsDirFormat()
356
5712.3.16 by Jelmer Vernooij
Fix bt.test_foreign.
357
    @classmethod
358
    def known_formats(cls):
359
        return set([DummyForeignVcsDirFormat()])
360
5363.2.5 by Jelmer Vernooij
Add dummy foreign prober.
361
4721.2.4 by Vincent Ladeuil
More test cleanup.
362
class ForeignVcsRegistryTests(tests.TestCase):
3920.2.10 by Jelmer Vernooij
More work trying to implement a dummy version control system.
363
    """Tests for the ForeignVcsRegistry class."""
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
364
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
365
    def test_parse_revision_id_no_dash(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
366
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
367
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
368
                          reg.parse_revision_id, "invalid")
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
369
370
    def test_parse_revision_id_unknown_mapping(self):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
371
        reg = foreign.ForeignVcsRegistry()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
372
        self.assertRaises(errors.InvalidRevisionId,
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
373
                          reg.parse_revision_id, "unknown-foreignrevid")
374
375
    def test_parse_revision_id(self):
376
        reg = foreign.ForeignVcsRegistry()
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
377
        vcs = DummyForeignVcs()
378
        reg.register("dummy", vcs, "Dummy VCS")
5777.6.6 by Jelmer Vernooij
Add lossy tests.
379
        self.assertEquals((
380
            ("some", "foreign", "revid"), DummyForeignVcsMapping(vcs)),
381
            reg.parse_revision_id("dummy-v1:some-foreign-revid"))
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
382
383
4721.2.4 by Vincent Ladeuil
More test cleanup.
384
class ForeignRevisionTests(tests.TestCase):
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
385
    """Tests for the ForeignRevision class."""
386
387
    def test_create(self):
3949.5.1 by Jelmer Vernooij
Move ForeignVcsMapping.show_foreign_revid to ForeignVcs.
388
        mapp = DummyForeignVcsMapping(DummyForeignVcs())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
389
        rev = foreign.ForeignRevision(("a", "foreign", "revid"),
3830.4.5 by Jelmer Vernooij
add tests for VCS infrastructure classes.
390
                                      mapp, "roundtripped-revid")
391
        self.assertEquals("", rev.inventory_sha1)
392
        self.assertEquals(("a", "foreign", "revid"), rev.foreign_revid)
393
        self.assertEquals(mapp, rev.mapping)
394
395
4721.2.4 by Vincent Ladeuil
More test cleanup.
396
class WorkingTreeFileUpdateTests(tests.TestCaseWithTransport):
4285.3.2 by Jelmer Vernooij
Remove unused functions for updating the file ids of a tree.
397
    """Tests for update_workingtree_fileids()."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
398
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
399
    def test_update_workingtree(self):
400
        wt = self.make_branch_and_tree('br1')
401
        self.build_tree_contents([('br1/bla', 'original contents\n')])
402
        wt.add('bla', 'bla-a')
403
        wt.commit('bla-a')
4606.2.1 by Robert Collins
Fix test_foreign for 2a as default.
404
        root_id = wt.get_root_id()
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
405
        target = wt.bzrdir.sprout('br2').open_workingtree()
406
        target.unversion(['bla-a'])
407
        target.add('bla', 'bla-b')
408
        target.commit('bla-b')
409
        target_basis = target.basis_tree()
410
        target_basis.lock_read()
411
        self.addCleanup(target_basis.unlock)
412
        foreign.update_workingtree_fileids(wt, target_basis)
413
        wt.lock_read()
414
        try:
4599.4.36 by Robert Collins
Fix an overly sensitive test.
415
            self.assertEquals(set([root_id, "bla-b"]), set(wt.inventory))
4285.3.1 by Aaron Bentley
Implement dpush via sexy APIs
416
        finally:
417
            wt.unlock()
418
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
419
4721.2.4 by Vincent Ladeuil
More test cleanup.
420
class DummyForeignVcsTests(tests.TestCaseWithTransport):
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
421
    """Very basic test for DummyForeignVcs."""
422
423
    def setUp(self):
424
        super(DummyForeignVcsTests, self).setUp()
4721.2.5 by Vincent Ladeuil
Some refactoring.
425
        register_dummy_foreign_for_test(self)
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
426
427
    def test_create(self):
428
        """Test we can create dummies."""
429
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
430
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
431
        self.assertEquals("A Dummy VCS Dir", dir._format.get_format_string())
432
        dir.open_repository()
433
        dir.open_branch()
434
        dir.open_workingtree()
435
436
    def test_sprout(self):
3920.2.17 by Jelmer Vernooij
Override BzrDir.sprout() to avoid accelerator_tree's from being used.
437
        """Test we can clone dummies and that the format is not preserved."""
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
438
        self.make_branch_and_tree("d", format=DummyForeignVcsDirFormat())
4721.2.4 by Vincent Ladeuil
More test cleanup.
439
        dir = bzrdir.BzrDir.open("d")
3920.2.16 by Jelmer Vernooij
Add tests for DummyForeignVcs.
440
        newdir = dir.sprout("e")
4721.2.4 by Vincent Ladeuil
More test cleanup.
441
        self.assertNotEquals("A Dummy VCS Dir",
442
                             newdir._format.get_format_string())
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
443
4925.1.1 by Jelmer Vernooij
Print a proper error when attempting to push to a foreign VCS for which
444
    def test_push_not_supported(self):
445
        source_tree = self.make_branch_and_tree("source")
446
        target_tree = self.make_branch_and_tree("target", 
447
            format=DummyForeignVcsDirFormat())
448
        self.assertRaises(errors.NoRoundtrippingSupport, 
449
            source_tree.branch.push, target_tree.branch)
450
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
451
    def test_lossy_push_empty(self):
452
        source_tree = self.make_branch_and_tree("source")
453
        target_tree = self.make_branch_and_tree("target", 
454
            format=DummyForeignVcsDirFormat())
455
        pushresult = source_tree.branch.lossy_push(target_tree.branch)
4721.2.4 by Vincent Ladeuil
More test cleanup.
456
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
457
        self.assertEquals(revision.NULL_REVISION, pushresult.new_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
458
        self.assertEquals({}, pushresult.revidmap)
459
460
    def test_lossy_push_simple(self):
461
        source_tree = self.make_branch_and_tree("source")
462
        self.build_tree(['source/a', 'source/b'])
463
        source_tree.add(['a', 'b'])
464
        revid1 = source_tree.commit("msg")
465
        target_tree = self.make_branch_and_tree("target", 
466
            format=DummyForeignVcsDirFormat())
467
        target_tree.branch.lock_write()
468
        try:
469
            pushresult = source_tree.branch.lossy_push(target_tree.branch)
470
        finally:
471
            target_tree.branch.unlock()
4721.2.4 by Vincent Ladeuil
More test cleanup.
472
        self.assertEquals(revision.NULL_REVISION, pushresult.old_revid)
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
473
        self.assertEquals({revid1:target_tree.branch.last_revision()}, 
474
                           pushresult.revidmap)
475
        self.assertEquals(pushresult.revidmap[revid1], pushresult.new_revid)