/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4988.10.5 by John Arbash Meinel
Merge bzr.dev 5021 to resolve NEWS
1
# Copyright (C) 2007-2010 Canonical Ltd
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
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
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
16
17
"""Tests for branch.push behaviour."""
18
3904.3.5 by Andrew Bennetts
Improve the test; now 4/7 passing.
19
from cStringIO import StringIO
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
20
import os
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
21
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
22
from bzrlib import (
23
    branch,
24
    builtins,
25
    bzrdir,
4332.3.35 by Robert Collins
Fix failing tests.
26
    check,
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
27
    errors,
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
28
    memorytree,
3904.3.5 by Andrew Bennetts
Improve the test; now 4/7 passing.
29
    push,
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
30
    revision,
5348.1.2 by Martin Pool
Deprecate casting PushResult and PullResult to int to get the relative revno change
31
    symbol_versioning,
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
32
    tests,
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
33
    transport,
34
    )
35
from bzrlib.smart import (
36
    client,
37
    )
5017.3.29 by Vincent Ladeuil
-s bt.per_branch.test_push passing
38
from bzrlib.tests import (
39
    per_branch,
40
    test_server,
41
    )
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
42
43
44
class TestPush(per_branch.TestCaseWithBranch):
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
45
46
    def test_push_convergence_simple(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
47
        # when revisions are pushed, the left-most accessible parents must
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
48
        # become the revision-history.
49
        mine = self.make_branch_and_tree('mine')
50
        mine.commit('1st post', rev_id='P1', allow_pointless=True)
51
        other = mine.bzrdir.sprout('other').open_workingtree()
52
        other.commit('my change', rev_id='M1', allow_pointless=True)
53
        mine.merge_from_branch(other.branch)
54
        mine.commit('merge my change', rev_id='P2')
2297.1.4 by Martin Pool
Push now returns a PushResult rather than just an integer.
55
        result = mine.branch.push(other.branch)
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
56
        self.assertEqual(['P1', 'P2'], other.branch.revision_history())
2297.1.4 by Martin Pool
Push now returns a PushResult rather than just an integer.
57
        # result object contains some structured data
58
        self.assertEqual(result.old_revid, 'M1')
59
        self.assertEqual(result.new_revid, 'P2')
60
        # and it can be treated as an integer for compatibility
5348.1.2 by Martin Pool
Deprecate casting PushResult and PullResult to int to get the relative revno change
61
        self.assertEqual(self.applyDeprecated(
62
            symbol_versioning.deprecated_in((2, 3, 0)),
63
            result.__int__),
64
            0)
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
65
66
    def test_push_merged_indirect(self):
67
        # it should be possible to do a push from one branch into another
68
        # when the tip of the target was merged into the source branch
69
        # via a third branch - so its buried in the ancestry and is not
70
        # directly accessible.
71
        mine = self.make_branch_and_tree('mine')
72
        mine.commit('1st post', rev_id='P1', allow_pointless=True)
73
        target = mine.bzrdir.sprout('target').open_workingtree()
74
        target.commit('my change', rev_id='M1', allow_pointless=True)
75
        other = mine.bzrdir.sprout('other').open_workingtree()
76
        other.merge_from_branch(target.branch)
77
        other.commit('merge my change', rev_id='O2')
78
        mine.merge_from_branch(other.branch)
79
        mine.commit('merge other', rev_id='P2')
80
        mine.branch.push(target.branch)
81
        self.assertEqual(['P1', 'P2'], target.branch.revision_history())
82
83
    def test_push_to_checkout_updates_master(self):
84
        """Pushing into a checkout updates the checkout and the master branch"""
85
        master_tree = self.make_branch_and_tree('master')
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
86
        checkout = self.make_branch_and_tree('checkout')
87
        try:
88
            checkout.branch.bind(master_tree.branch)
89
        except errors.UpgradeRequired:
90
            # cant bind this format, the test is irrelevant.
91
            return
92
        rev1 = checkout.commit('master')
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
93
94
        other = master_tree.branch.bzrdir.sprout('other').open_workingtree()
95
        rev2 = other.commit('other commit')
96
        # now push, which should update both checkout and master.
97
        other.branch.push(checkout.branch)
98
        self.assertEqual([rev1, rev2], checkout.branch.revision_history())
99
        self.assertEqual([rev1, rev2], master_tree.branch.revision_history())
100
101
    def test_push_raises_specific_error_on_master_connection_error(self):
102
        master_tree = self.make_branch_and_tree('master')
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
103
        checkout = self.make_branch_and_tree('checkout')
104
        try:
105
            checkout.branch.bind(master_tree.branch)
106
        except errors.UpgradeRequired:
107
            # cant bind this format, the test is irrelevant.
108
            return
2245.2.1 by Robert Collins
Split branch pushing out of branch pulling.
109
        other = master_tree.branch.bzrdir.sprout('other').open_workingtree()
110
        # move the branch out of the way on disk to cause a connection
111
        # error.
112
        os.rename('master', 'master_gone')
113
        # try to push, which should raise a BoundBranchConnectionFailure.
114
        self.assertRaises(errors.BoundBranchConnectionFailure,
115
                other.branch.push, checkout.branch)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
116
2279.1.1 by John Arbash Meinel
Branch.push() only needs a read lock.
117
    def test_push_uses_read_lock(self):
118
        """Push should only need a read lock on the source side."""
119
        source = self.make_branch_and_tree('source')
120
        target = self.make_branch('target')
121
2381.1.3 by Robert Collins
Review feedback.
122
        self.build_tree(['source/a'])
2279.1.1 by John Arbash Meinel
Branch.push() only needs a read lock.
123
        source.add(['a'])
124
        source.commit('a')
125
126
        source.branch.lock_read()
127
        try:
128
            target.lock_write()
129
            try:
130
                source.branch.push(target, stop_revision=source.last_revision())
131
            finally:
132
                target.unlock()
133
        finally:
134
            source.branch.unlock()
135
2279.1.3 by John Arbash Meinel
Switch the test to being a branch_implementation test.
136
    def test_push_within_repository(self):
137
        """Push from one branch to another inside the same repository."""
138
        try:
139
            repo = self.make_repository('repo', shared=True)
140
        except (errors.IncompatibleFormat, errors.UninitializableFormat):
141
            # This Branch format cannot create shared repositories
142
            return
143
        # This is a little bit trickier because make_branch_and_tree will not
144
        # re-use a shared repository.
145
        a_bzrdir = self.make_bzrdir('repo/tree')
146
        try:
147
            a_branch = self.branch_format.initialize(a_bzrdir)
148
        except (errors.UninitializableFormat):
149
            # Cannot create these branches
150
            return
2018.5.97 by Andrew Bennetts
Fix more tests.
151
        try:
152
            tree = a_branch.bzrdir.create_workingtree()
153
        except errors.NotLocalUrl:
5017.3.29 by Vincent Ladeuil
-s bt.per_branch.test_push passing
154
            if self.vfs_transport_factory is test_server.LocalURLServer:
2018.5.130 by Robert Collins
Make all branch_implementations tests pass.
155
                # the branch is colocated on disk, we cannot create a checkout.
156
                # hopefully callers will expect this.
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
157
                local_controldir= bzrdir.BzrDir.open(
158
                    self.get_vfs_only_url('repo/tree'))
2018.5.130 by Robert Collins
Make all branch_implementations tests pass.
159
                tree = local_controldir.create_workingtree()
160
            else:
161
                tree = a_branch.create_checkout('repo/tree', lightweight=True)
2381.1.3 by Robert Collins
Review feedback.
162
        self.build_tree(['repo/tree/a'])
2279.1.3 by John Arbash Meinel
Switch the test to being a branch_implementation test.
163
        tree.add(['a'])
164
        tree.commit('a')
165
166
        to_bzrdir = self.make_bzrdir('repo/branch')
167
        to_branch = self.branch_format.initialize(to_bzrdir)
168
        tree.branch.push(to_branch)
169
170
        self.assertEqual(tree.branch.last_revision(),
171
                         to_branch.last_revision())
172
5611.2.1 by Jelmer Vernooij
Fix 'bzr push --overwrite -rOLD_MAINLINE_REV'.
173
    def test_push_overwrite_with_older_mainline_rev(self):
174
        """Pushing an older mainline revision with overwrite.
175
176
        This was <https://bugs.launchpad.net/bzr/+bug/386576>.
177
        """
178
        source = self.make_branch_and_tree('source')
179
        target = self.make_branch('target')
180
181
        source.commit('1st commit')
182
        source.commit('2nd commit', rev_id='rev-2')
183
        source.commit('3rd commit')
184
        source.branch.push(target)
185
        source.branch.push(target, stop_revision='rev-2', overwrite=True)
186
        self.assertEqual('rev-2', target.last_revision())
187
3449.1.2 by Andrew Bennetts
Add test and NEWS entry.
188
    def test_push_overwrite_of_non_tip_with_stop_revision(self):
189
        """Combining the stop_revision and overwrite options works.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
190
3449.1.2 by Andrew Bennetts
Add test and NEWS entry.
191
        This was <https://bugs.launchpad.net/bzr/+bug/234229>.
192
        """
193
        source = self.make_branch_and_tree('source')
194
        target = self.make_branch('target')
195
196
        source.commit('1st commit')
197
        source.branch.push(target)
198
        source.commit('2nd commit', rev_id='rev-2')
199
        source.commit('3rd commit')
200
201
        source.branch.push(target, stop_revision='rev-2', overwrite=True)
202
        self.assertEqual('rev-2', target.last_revision())
203
3904.3.5 by Andrew Bennetts
Improve the test; now 4/7 passing.
204
    def test_push_with_default_stacking_does_not_create_broken_branch(self):
3904.3.7 by Andrew Bennetts
Comment the new tests.
205
        """Pushing a new standalone branch works even when there's a default
206
        stacking policy at the destination.
207
208
        The new branch will preserve the repo format (even if it isn't the
209
        default for the branch), and will be stacked when the repo format
210
        allows (which means that the branch format isn't necessarly preserved).
211
        """
5673.1.3 by Jelmer Vernooij
Change flexible_components to fixed_components.
212
        if self.bzrdir_format.fixed_components:
3904.3.6 by Andrew Bennetts
Skip test for two formats, and fix format 5 by avoiding a full history sync with non-format5 branches.
213
            raise tests.TestNotApplicable('Not a metadir format.')
214
        if isinstance(self.branch_format, branch.BranchReferenceFormat):
3904.3.7 by Andrew Bennetts
Comment the new tests.
215
            # This test could in principle apply to BranchReferenceFormat, but
216
            # make_branch_builder doesn't support it.
3904.3.6 by Andrew Bennetts
Skip test for two formats, and fix format 5 by avoiding a full history sync with non-format5 branches.
217
            raise tests.TestSkipped(
218
                "BranchBuilder can't make reference branches.")
3904.3.7 by Andrew Bennetts
Comment the new tests.
219
        # Make a branch called "local" in a stackable repository
220
        # The branch has 3 revisions:
221
        #   - rev-1, adds a file
222
        #   - rev-2, no changes
223
        #   - rev-3, modifies the file.
3904.3.5 by Andrew Bennetts
Improve the test; now 4/7 passing.
224
        repo = self.make_repository('repo', shared=True, format='1.6')
225
        builder = self.make_branch_builder('repo/local')
3904.3.4 by Andrew Bennetts
First cut of a branch_implementations test. It fails.
226
        builder.start_series()
227
        builder.build_snapshot('rev-1', None, [
228
            ('add', ('', 'root-id', 'directory', '')),
229
            ('add', ('filename', 'f-id', 'file', 'content\n'))])
230
        builder.build_snapshot('rev-2', ['rev-1'], [])
231
        builder.build_snapshot('rev-3', ['rev-2'],
232
            [('modify', ('f-id', 'new-content\n'))])
233
        builder.finish_series()
3904.3.6 by Andrew Bennetts
Skip test for two formats, and fix format 5 by avoiding a full history sync with non-format5 branches.
234
        trunk = builder.get_branch()
3904.3.7 by Andrew Bennetts
Comment the new tests.
235
        # Sprout rev-1 to "trunk", so that we can stack on it.
3904.3.6 by Andrew Bennetts
Skip test for two formats, and fix format 5 by avoiding a full history sync with non-format5 branches.
236
        trunk.bzrdir.sprout(self.get_url('trunk'), revision_id='rev-1')
3904.3.7 by Andrew Bennetts
Comment the new tests.
237
        # Set a default stacking policy so that new branches will automatically
238
        # stack on trunk.
3904.3.4 by Andrew Bennetts
First cut of a branch_implementations test. It fails.
239
        self.make_bzrdir('.').get_config().set_default_stack_on('trunk')
3904.3.7 by Andrew Bennetts
Comment the new tests.
240
        # Push rev-2 to a new branch "remote".  It will be stacked on "trunk".
3904.3.5 by Andrew Bennetts
Improve the test; now 4/7 passing.
241
        output = StringIO()
3904.3.6 by Andrew Bennetts
Skip test for two formats, and fix format 5 by avoiding a full history sync with non-format5 branches.
242
        push._show_push_branch(trunk, 'rev-2', self.get_url('remote'), output)
3904.3.7 by Andrew Bennetts
Comment the new tests.
243
        # Push rev-3 onto "remote".  If "remote" not stacked and is missing the
244
        # fulltext record for f-id @ rev-1, then this will fail.
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
245
        remote_branch = branch.Branch.open(self.get_url('remote'))
3904.3.6 by Andrew Bennetts
Skip test for two formats, and fix format 5 by avoiding a full history sync with non-format5 branches.
246
        trunk.push(remote_branch)
4332.3.35 by Robert Collins
Fix failing tests.
247
        check.check_dwim(remote_branch.base, False, True, True)
3904.3.4 by Andrew Bennetts
First cut of a branch_implementations test. It fails.
248
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
249
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
250
class TestPushHook(per_branch.TestCaseWithBranch):
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
251
252
    def setUp(self):
253
        self.hook_calls = []
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
254
        super(TestPushHook, self).setUp()
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
255
2297.1.4 by Martin Pool
Push now returns a PushResult rather than just an integer.
256
    def capture_post_push_hook(self, result):
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
257
        """Capture post push hook calls to self.hook_calls.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
258
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
259
        The call is logged, as is some state of the two branches.
260
        """
2297.1.6 by Martin Pool
Add docs for Results, give some members cleaner names
261
        if result.local_branch:
262
            local_locked = result.local_branch.is_locked()
263
            local_base = result.local_branch.base
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
264
        else:
265
            local_locked = None
266
            local_base = None
267
        self.hook_calls.append(
2297.1.6 by Martin Pool
Add docs for Results, give some members cleaner names
268
            ('post_push', result.source_branch, local_base,
269
             result.master_branch.base,
2297.1.4 by Martin Pool
Push now returns a PushResult rather than just an integer.
270
             result.old_revno, result.old_revid,
2297.1.6 by Martin Pool
Add docs for Results, give some members cleaner names
271
             result.new_revno, result.new_revid,
272
             result.source_branch.is_locked(), local_locked,
273
             result.master_branch.is_locked()))
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
274
275
    def test_post_push_empty_history(self):
276
        target = self.make_branch('target')
277
        source = self.make_branch('source')
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
278
        branch.Branch.hooks.install_named_hook(
279
            'post_push', self.capture_post_push_hook, None)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
280
        source.push(target)
281
        # with nothing there we should still get a notification, and
282
        # have both branches locked at the notification time.
283
        self.assertEqual([
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
284
            ('post_push', source, None, target.base, 0, revision.NULL_REVISION,
285
             0, revision.NULL_REVISION, True, None, True)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
286
            ],
287
            self.hook_calls)
288
289
    def test_post_push_bound_branch(self):
290
        # pushing to a bound branch should pass in the master branch to the
291
        # hook, allowing the correct number of emails to be sent, while still
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
292
        # allowing hooks that want to modify the target to do so to both
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
293
        # instances.
294
        target = self.make_branch('target')
295
        local = self.make_branch('local')
296
        try:
297
            local.bind(target)
298
        except errors.UpgradeRequired:
2477.1.2 by Martin Pool
Rename push/pull back to 'run_hooks' (jameinel)
299
            # We can't bind this format to itself- typically it is the local
300
            # branch that doesn't support binding.  As of May 2007
301
            # remotebranches can't be bound.  Let's instead make a new local
302
            # branch of the default type, which does allow binding.
303
            # See https://bugs.launchpad.net/bzr/+bug/112020
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
304
            local = bzrdir.BzrDir.create_branch_convenience('local2')
2477.1.9 by Martin Pool
Review cleanups from John, mostly docs
305
            local.bind(target)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
306
        source = self.make_branch('source')
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
307
        branch.Branch.hooks.install_named_hook(
308
            'post_push', self.capture_post_push_hook, None)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
309
        source.push(local)
310
        # with nothing there we should still get a notification, and
311
        # have both branches locked at the notification time.
312
        self.assertEqual([
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
313
            ('post_push', source, local.base, target.base, 0,
314
             revision.NULL_REVISION, 0, revision.NULL_REVISION,
315
             True, True, True)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
316
            ],
317
            self.hook_calls)
318
319
    def test_post_push_nonempty_history(self):
320
        target = self.make_branch_and_memory_tree('target')
321
        target.lock_write()
322
        target.add('')
323
        rev1 = target.commit('rev 1')
324
        target.unlock()
325
        sourcedir = target.bzrdir.clone(self.get_url('source'))
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
326
        source = memorytree.MemoryTree.create_on_branch(sourcedir.open_branch())
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
327
        rev2 = source.commit('rev 2')
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
328
        branch.Branch.hooks.install_named_hook(
329
            'post_push', self.capture_post_push_hook, None)
2246.1.3 by Robert Collins
New branch hooks: post_push, post_pull, post_commit, post_uncommit. These
330
        source.branch.push(target.branch)
331
        # with nothing there we should still get a notification, and
332
        # have both branches locked at the notification time.
333
        self.assertEqual([
334
            ('post_push', source.branch, None, target.branch.base, 1, rev1,
335
             2, rev2, True, None, True)
336
            ],
337
            self.hook_calls)
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
338
339
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
340
class EmptyPushSmartEffortTests(per_branch.TestCaseWithBranch):
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
341
    """Tests that a push of 0 revisions should make a limited number of smart
342
    protocol RPCs.
343
    """
344
345
    def setUp(self):
346
        # Skip some scenarios that don't apply to these tests.
5247.3.38 by Vincent Ladeuil
Fix the last remaining failures.
347
        if (self.transport_server is not None
348
            and issubclass(self.transport_server,
349
                           test_server.SmartTCPServer_for_testing)):
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
350
            raise tests.TestNotApplicable(
351
                'Does not apply when remote backing branch is also '
352
                'a smart branch')
5674.1.1 by Jelmer Vernooij
Add supports_leave_lock flag to BranchFormat and RepositoryFormat.
353
        if not self.branch_format.supports_leaving_lock():
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
354
            raise tests.TestNotApplicable(
5674.1.1 by Jelmer Vernooij
Add supports_leave_lock flag to BranchFormat and RepositoryFormat.
355
                'Branch format is not usable via HPSS.')
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
356
        super(EmptyPushSmartEffortTests, self).setUp()
357
        # Create a smart server that publishes whatever the backing VFS server
358
        # does.
5017.3.29 by Vincent Ladeuil
-s bt.per_branch.test_push passing
359
        self.smart_server = test_server.SmartTCPServer_for_testing()
4659.1.2 by Robert Collins
Refactor creation and shutdown of test servers to use a common helper,
360
        self.start_server(self.smart_server, self.get_server())
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
361
        # Make two empty branches, 'empty' and 'target'.
362
        self.empty_branch = self.make_branch('empty')
363
        self.make_branch('target')
364
        # Log all HPSS calls into self.hpss_calls.
365
        client._SmartClient.hooks.install_named_hook(
366
            'call', self.capture_hpss_call, None)
367
        self.hpss_calls = []
368
369
    def capture_hpss_call(self, params):
370
        self.hpss_calls.append(params.method)
371
372
    def test_empty_branch_api(self):
373
        """The branch_obj.push API should make a limited number of HPSS calls.
374
        """
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
375
        t = transport.get_transport(self.smart_server.get_url()).clone('target')
376
        target = branch.Branch.open_from_transport(t)
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
377
        self.empty_branch.push(target)
378
        self.assertEqual(
4634.47.8 by Andrew Bennetts
Fix per_branch.test_push effort test to expect new verb.
379
            ['BzrDir.open_2.1',
4734.4.13 by Andrew Bennetts
Fix trivial test failure.
380
             'BzrDir.open_branchV3',
4053.1.4 by Robert Collins
Move the fetch control attributes from Repository to RepositoryFormat.
381
             'BzrDir.find_repositoryV3',
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
382
             'Branch.get_stacked_on_url',
383
             'Branch.lock_write',
384
             'Branch.last_revision_info',
385
             'Branch.unlock'],
386
            self.hpss_calls)
387
388
    def test_empty_branch_command(self):
389
        """The 'bzr push' command should make a limited number of HPSS calls.
390
        """
391
        cmd = builtins.cmd_push()
392
        cmd.outf = tests.StringIOWrapper()
393
        cmd.run(
4420.1.2 by Vincent Ladeuil
Fix bug #284038 by adding a --strict option to push.
394
            directory=self.get_url('empty'),
4420.1.4 by Vincent Ladeuil
Cleanup.
395
            location=self.smart_server.get_url() + 'target')
3703.3.7 by Andrew Bennetts
Move empty push effort tests to branch_implementations.
396
        # HPSS calls as of 2008/09/22:
397
        # [BzrDir.open, BzrDir.open_branch, BzrDir.find_repositoryV2,
398
        # Branch.get_stacked_on_url, get, get, Branch.lock_write,
399
        # Branch.last_revision_info, Branch.unlock]
400
        self.assertTrue(len(self.hpss_calls) <= 9, self.hpss_calls)
401
402
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
403
class TestLossyPush(per_branch.TestCaseWithBranch):
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
404
405
    def setUp(self):
406
        self.hook_calls = []
5010.2.18 by Vincent Ladeuil
Fix imports in per_branch/test_push.py.
407
        super(TestLossyPush, self).setUp()
4347.3.2 by Jelmer Vernooij
Add some basic tests for lossy_push.
408
409
    def test_lossy_push_raises_same_vcs(self):
410
        target = self.make_branch('target')
411
        source = self.make_branch('source')
412
        self.assertRaises(errors.LossyPushToSameVCS, source.lossy_push, target)