/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006-2012, 2016 Canonical Ltd
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
2
# Authors: Aaron Bentley
3
#
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
17
18
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
19
from ... import (
4464.3.1 by Vincent Ladeuil
Fix more imports.
20
    branch,
2681.1.13 by Aaron Bentley
Add support for submit_to config option
21
    merge_directive,
4464.3.1 by Vincent Ladeuil
Fix more imports.
22
    tests,
2681.1.13 by Aaron Bentley
Add support for submit_to config option
23
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
24
from ...controldir import ControlDir
25
from ...bundle import serializer
26
from ...sixish import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
27
    BytesIO,
28
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
29
from ...transport import memory
30
from .. import (
5861.1.5 by Vincent Ladeuil
Just use scripts, we don't care about the internal trees.
31
    scenarios,
32
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
33
from ..matchers import ContainsNoVfsCalls
5861.1.5 by Vincent Ladeuil
Just use scripts, we don't care about the internal trees.
34
35
36
load_tests = scenarios.load_tests_apply_scenarios
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
37
38
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
39
class TestSendMixin(object):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
40
4464.3.6 by Vincent Ladeuil
bundle-revisions should support --strict too.
41
    _default_command = ['send', '-o-']
42
    _default_wd = 'branch'
43
44
    def run_send(self, args, cmd=None, rc=0, wd=None, err_re=None):
45
        if cmd is None: cmd = self._default_command
46
        if wd is None: wd = self._default_wd
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
47
        if err_re is None: err_re = []
48
        return self.run_bzr(cmd + args, retcode=rc,
49
                            working_dir=wd,
50
                            error_regexes=err_re)
51
52
    def get_MD(self, args, cmd=None, wd='branch'):
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
53
        md = self.run_send(args, cmd=cmd, wd=wd)[0]
54
        out = BytesIO(md.encode('utf-8'))
4792.7.3 by Martin
MergeDirective.from_lines claims to want an iterable but currently requires a list, rewrite so it really wants an iterable
55
        return merge_directive.MergeDirective.from_lines(out)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
56
57
    def assertBundleContains(self, revs, args, cmd=None, wd='branch'):
58
        md = self.get_MD(args, cmd=cmd, wd=wd)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
59
        br = serializer.read_bundle(BytesIO(md.get_raw_bundle()))
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
60
        self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
61
62
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
63
class TestSend(tests.TestCaseWithTransport, TestSendMixin):
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
64
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
65
    def setUp(self):
66
        super(TestSend, self).setUp()
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
67
        grandparent_tree = ControlDir.create_standalone_workingtree(
4464.3.1 by Vincent Ladeuil
Fix more imports.
68
            'grandparent')
6855.4.1 by Jelmer Vernooij
Yet more bees.
69
        self.build_tree_contents([('grandparent/file1', b'grandparent')])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
70
        grandparent_tree.add('file1')
6855.4.1 by Jelmer Vernooij
Yet more bees.
71
        grandparent_tree.commit('initial commit', rev_id=b'rev1')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
72
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
73
        parent_bzrdir = grandparent_tree.controldir.sprout('parent')
1793.2.13 by Aaron Bentley
Use single make function for tests
74
        parent_tree = parent_bzrdir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
75
        parent_tree.commit('next commit', rev_id=b'rev2')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
76
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
77
        branch_tree = parent_tree.controldir.sprout('branch').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
78
        self.build_tree_contents([('branch/file1', b'branch')])
79
        branch_tree.commit('last commit', rev_id=b'rev3')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
80
81
    def assertFormatIs(self, fmt_string, md):
82
        self.assertEqual(fmt_string, md.get_raw_bundle().splitlines()[0])
1793.2.13 by Aaron Bentley
Use single make function for tests
83
1185.84.4 by Aaron Bentley
Use parent branch as default base branch
84
    def test_uses_parent(self):
85
        """Parent location is used as a basis by default"""
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
86
        errmsg = self.run_send([], rc=3, wd='grandparent')[1]
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
87
        self.assertContainsRe(errmsg, 'No submit branch known or specified')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
88
        stdout, stderr = self.run_send([])
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
89
        self.assertEqual(stderr.count('Using saved parent location'), 1)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
90
        self.assertBundleContains([b'rev3'], [])
1793.2.14 by Aaron Bentley
Clean up bundle revision specification
91
2681.1.1 by Aaron Bentley
Split 'send' into 'send' and 'bundle'.
92
    def test_bundle(self):
93
        """Bundle works like send, except -o is not required"""
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
94
        errmsg = self.run_send([], cmd=['bundle'], rc=3, wd='grandparent')[1]
2681.1.1 by Aaron Bentley
Split 'send' into 'send' and 'bundle'.
95
        self.assertContainsRe(errmsg, 'No submit branch known or specified')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
96
        stdout, stderr = self.run_send([], cmd=['bundle'])
3596.3.1 by James Westby
Give the user a bit more information about which saved location is being used.
97
        self.assertEqual(stderr.count('Using saved parent location'), 1)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
98
        self.assertBundleContains([b'rev3'], [], cmd=['bundle'])
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
99
100
    def test_uses_submit(self):
101
        """Submit location can be used and set"""
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
102
        self.assertBundleContains([b'rev3'], [])
103
        self.assertBundleContains([b'rev3', b'rev2'], ['../grandparent'])
1804.1.1 by Aaron Bentley
Add support for submit location to bundles
104
        # submit location should be auto-remembered
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
105
        self.assertBundleContains([b'rev3', b'rev2'], [])
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
106
107
        self.run_send(['../parent'])
108
        # We still point to ../grandparent
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
109
        self.assertBundleContains([b'rev3', b'rev2'], [])
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
110
        # Remember parent now
111
        self.run_send(['../parent', '--remember'])
112
        # Now we point to parent
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
113
        self.assertBundleContains([b'rev3'], [])
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
114
115
        err = self.run_send(['--remember'], rc=3)[1]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
116
        self.assertContainsRe(err,
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
117
                              '--remember requires a branch to be specified.')
1793.2.14 by Aaron Bentley
Clean up bundle revision specification
118
119
    def test_revision_branch_interaction(self):
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
120
        self.assertBundleContains([b'rev3', b'rev2'], ['../grandparent'])
121
        self.assertBundleContains([b'rev2'], ['../grandparent', '-r-2'])
122
        self.assertBundleContains([b'rev3', b'rev2'],
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
123
                                  ['../grandparent', '-r-2..-1'])
124
        md = self.get_MD(['-r-2..-1'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
125
        self.assertEqual(b'rev2', md.base_revision_id)
126
        self.assertEqual(b'rev3', md.revision_id)
2178.4.1 by Alexander Belchenko
Provide tests to illustrate bug #55276 on win32.
127
128
    def test_output(self):
129
        # check output for consistency
2178.4.5 by Alexander Belchenko
Spell-checking (thanks to Aaron)
130
        # win32 stdout converts LF to CRLF,
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
131
        # which would break patch-based bundles
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
132
        self.assertBundleContains([b'rev3'], [])
2490.2.28 by Aaron Bentley
Fix handling of null revision
133
134
    def test_no_common_ancestor(self):
135
        foo = self.make_branch_and_tree('foo')
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
136
        foo.commit('rev a')
2490.2.28 by Aaron Bentley
Fix handling of null revision
137
        bar = self.make_branch_and_tree('bar')
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
138
        bar.commit('rev b')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
139
        self.run_send(['--from', 'foo', '../bar'], wd='foo')
2520.4.121 by Aaron Bentley
Polish up submit command
140
141
    def test_content_options(self):
142
        """--no-patch and --no-bundle should work and be independant"""
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
143
        md = self.get_MD([])
144
        self.assertIsNot(None, md.bundle)
145
        self.assertIsNot(None, md.patch)
146
147
        md = self.get_MD(['--format=0.9'])
148
        self.assertIsNot(None, md.bundle)
149
        self.assertIsNot(None, md.patch)
150
151
        md = self.get_MD(['--no-patch'])
2520.4.121 by Aaron Bentley
Polish up submit command
152
        self.assertIsNot(None, md.bundle)
153
        self.assertIs(None, md.patch)
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
154
        self.run_bzr_error(['Format 0.9 does not permit bundle with no patch'],
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
155
                           ['send', '--no-patch', '--format=0.9', '-o-'],
156
                           working_dir='branch')
157
        md = self.get_MD(['--no-bundle', '.', '.'])
2520.4.121 by Aaron Bentley
Polish up submit command
158
        self.assertIs(None, md.bundle)
159
        self.assertIsNot(None, md.patch)
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
160
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
161
        md = self.get_MD(['--no-bundle', '--format=0.9', '../parent',
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
162
                                  '.'])
163
        self.assertIs(None, md.bundle)
164
        self.assertIsNot(None, md.patch)
165
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
166
        md = self.get_MD(['--no-bundle', '--no-patch', '.', '.'])
2520.4.121 by Aaron Bentley
Polish up submit command
167
        self.assertIs(None, md.bundle)
168
        self.assertIs(None, md.patch)
169
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
170
        md = self.get_MD(['--no-bundle', '--no-patch', '--format=0.9',
171
                          '../parent', '.'])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
172
        self.assertIs(None, md.bundle)
173
        self.assertIs(None, md.patch)
174
2520.4.121 by Aaron Bentley
Polish up submit command
175
    def test_from_option(self):
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
176
        self.run_bzr('send', retcode=3)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
177
        md = self.get_MD(['--from', 'branch'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
178
        self.assertEqual(b'rev3', md.revision_id)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
179
        md = self.get_MD(['-f', 'branch'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
180
        self.assertEqual(b'rev3', md.revision_id)
2520.4.121 by Aaron Bentley
Polish up submit command
181
182
    def test_output_option(self):
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
183
        stdout = self.run_bzr('send -f branch --output file1')[0]
2520.4.121 by Aaron Bentley
Polish up submit command
184
        self.assertEqual('', stdout)
185
        md_file = open('file1', 'rb')
186
        self.addCleanup(md_file.close)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
187
        self.assertContainsRe(md_file.read(), b'rev3')
2654.3.1 by Aaron Bentley
Rename submit to send, make -o required, support -o- for stdout
188
        stdout = self.run_bzr('send -f branch --output -')[0]
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
189
        self.assertContainsRe(stdout, 'rev3')
2520.4.132 by Aaron Bentley
Merge from bzr.dev
190
3794.4.3 by Aaron Bentley
Switch to blackbox testing.
191
    def test_note_revisions(self):
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
192
        stderr = self.run_send([])[1]
6143.1.4 by Jonathan Riddell
update tests
193
        self.assertEndsWith(stderr, '\nBundling 1 revision.\n')
3794.4.3 by Aaron Bentley
Switch to blackbox testing.
194
2681.1.13 by Aaron Bentley
Add support for submit_to config option
195
    def test_mailto_option(self):
4464.3.1 by Vincent Ladeuil
Fix more imports.
196
        b = branch.Branch.open('branch')
6449.5.2 by Jelmer Vernooij
Use config stacks in tests, too.
197
        b.get_config_stack().set('mail_client', 'editor')
3984.2.1 by Daniel Watkins
Fixed #198418
198
        self.run_bzr_error(
3986.1.2 by Ian Clatworthy
tweak regex pattern in send test
199
            ('No mail-to address \\(--mail-to\\) or output \\(-o\\) specified',
200
            ), 'send -f branch')
6449.5.2 by Jelmer Vernooij
Use config stacks in tests, too.
201
        b.get_config_stack().set('mail_client', 'bogus')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
202
        self.run_send([])
6449.5.5 by Jelmer Vernooij
Consider invalid mail clients an error rather than just a warning.
203
        self.run_bzr_error(('Bad value "bogus" for option "mail_client"',),
2681.1.13 by Aaron Bentley
Add support for submit_to config option
204
                           'send -f branch --mail-to jrandom@example.org')
6421.3.1 by Vincent Ladeuil
Migrate more branch options to config stacks.
205
        b.get_config_stack().set('submit_to', 'jrandom@example.org')
6449.5.5 by Jelmer Vernooij
Consider invalid mail clients an error rather than just a warning.
206
        self.run_bzr_error(('Bad value "bogus" for option "mail_client"',),
2681.1.13 by Aaron Bentley
Add support for submit_to config option
207
                           'send -f branch')
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
208
3251.1.2 by Jelmer Vernooij
``bzr send`` now supports new ``child_submit_to`` option in the submit branch
209
    def test_mailto_child_option(self):
210
        """Make sure that child_submit_to is used."""
4464.3.1 by Vincent Ladeuil
Fix more imports.
211
        b = branch.Branch.open('branch')
6449.5.2 by Jelmer Vernooij
Use config stacks in tests, too.
212
        b.get_config_stack().set('mail_client', 'bogus')
4464.3.1 by Vincent Ladeuil
Fix more imports.
213
        parent = branch.Branch.open('parent')
6421.3.1 by Vincent Ladeuil
Migrate more branch options to config stacks.
214
        parent.get_config_stack().set('child_submit_to', 'somebody@example.org')
6449.5.5 by Jelmer Vernooij
Consider invalid mail clients an error rather than just a warning.
215
        self.run_bzr_error(('Bad value "bogus" for option "mail_client"',),
216
                'send -f branch')
3251.1.2 by Jelmer Vernooij
``bzr send`` now supports new ``child_submit_to`` option in the submit branch
217
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
218
    def test_format(self):
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
219
        md = self.get_MD(['--format=4'])
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
220
        self.assertIs(merge_directive.MergeDirective2, md.__class__)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
221
        self.assertFormatIs(b'# Bazaar revision bundle v4', md)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
222
223
        md = self.get_MD(['--format=0.9'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
224
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
225
226
        md = self.get_MD(['--format=0.9'], cmd=['bundle'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
227
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
228
        self.assertIs(merge_directive.MergeDirective, md.__class__)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
229
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
230
        self.run_bzr_error(['Bad value .* for option .format.'],
2681.1.2 by Aaron Bentley
Add support for selecting bundle format
231
                            'send -f branch -o- --format=0.999')[0]
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
232
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
233
    def test_format_child_option(self):
6404.6.2 by Vincent Ladeuil
Merge trunk resolving conflicts and fixing more test failures related to
234
        br = branch.Branch.open('parent')
235
        conf = br.get_config_stack()
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
236
        conf.set('child_submit_format', '4')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
237
        md = self.get_MD([])
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
238
        self.assertIs(merge_directive.MergeDirective2, md.__class__)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
239
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
240
        conf.set('child_submit_format', '0.9')
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
241
        md = self.get_MD([])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
242
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
243
244
        md = self.get_MD([], cmd=['bundle'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
245
        self.assertFormatIs(b'# Bazaar revision bundle v0.9', md)
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
246
        self.assertIs(merge_directive.MergeDirective, md.__class__)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
247
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
248
        conf.set('child_submit_format', '0.999')
7027.4.1 by Jelmer Vernooij
Use StringIOWithEncoding on Python3.
249
        self.run_bzr_error(["No such send format '0.999'"],
4370.2.1 by Jelmer Vernooij
Support ``child_submit_format`` option set in the submit branch in "bzr send".
250
                            'send -f branch -o-')[0]
251
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
252
    def test_message_option(self):
253
        self.run_bzr('send', retcode=3)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
254
        md = self.get_MD([])
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
255
        self.assertIs(None, md.message)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
256
        md = self.get_MD(['-m', 'my message'])
2681.1.9 by Aaron Bentley
Add support for mail-from-editor
257
        self.assertEqual('my message', md.message)
2747.3.1 by Aaron Bentley
'send' and 'bundle' now handle partial ranges correctly (#61685)
258
259
    def test_omitted_revision(self):
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
260
        md = self.get_MD(['-r-2..'])
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
261
        self.assertEqual(b'rev2', md.base_revision_id)
262
        self.assertEqual(b'rev3', md.revision_id)
4464.3.2 by Vincent Ladeuil
Cleanup send tests.
263
        md = self.get_MD(['-r..3', '--from', 'branch', 'grandparent'], wd='.')
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
264
        self.assertEqual(b'rev1', md.base_revision_id)
265
        self.assertEqual(b'rev3', md.revision_id)
3060.2.1 by Lukáš Lalinský
Fix misplaced branch lock in cmd_send.
266
267
    def test_nonexistant_branch(self):
5017.3.45 by Vincent Ladeuil
Move MemoryServer back into bzrlib.transport.memory as it's needed as soon as a MemoryTransport is used. Add a NEWS entry.
268
        self.vfs_transport_factory = memory.MemoryServer
4691.2.1 by Robert Collins
Add stronger test isolation by interception BzrDir.open and checking the thing being opened is known to the test suite.
269
        location = self.get_url('absentdir/')
3060.2.1 by Lukáš Lalinský
Fix misplaced branch lock in cmd_send.
270
        out, err = self.run_bzr(["send", "--from", location], retcode=3)
271
        self.assertEqual(out, '')
6622.1.29 by Jelmer Vernooij
Fix some more tests.
272
        self.assertEqual(err, 'brz: ERROR: Not a branch: "%s".\n' % location)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
273
274
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
275
class TestSendStrictMixin(TestSendMixin):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
276
277
    def make_parent_and_local_branches(self):
278
        # Create a 'parent' branch as the base
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
279
        self.parent_tree = ControlDir.create_standalone_workingtree('parent')
6855.4.1 by Jelmer Vernooij
Yet more bees.
280
        self.build_tree_contents([('parent/file', b'parent')])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
281
        self.parent_tree.add('file')
6855.4.1 by Jelmer Vernooij
Yet more bees.
282
        self.parent_tree.commit('first commit', rev_id=b'parent')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
283
        # Branch 'local' from parent and do a change
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
284
        local_bzrdir = self.parent_tree.controldir.sprout('local')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
285
        self.local_tree = local_bzrdir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
286
        self.build_tree_contents([('local/file', b'local')])
287
        self.local_tree.commit('second commit', rev_id=b'local')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
288
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
289
    _default_command = ['send', '-o-', '../parent']
290
    _default_wd = 'local'
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
291
    _default_sent_revs = [b'local']
292
    _default_errors = ['Working tree ".*/local/" has uncommitted '
293
                       'changes \\(See brz status\\)\\.',]
294
    _default_additional_error = 'Use --no-strict to force the send.\n'
295
    _default_additional_warning = 'Uncommitted changes will not be sent.'
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
296
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
297
    def set_config_send_strict(self, value):
6404.6.1 by Vincent Ladeuil
Tests passing for a first rough version of a cached branch config store. The changes here are too invasive and several parallel proposals have been made.
298
        br = branch.Branch.open('local')
6404.6.7 by Vincent Ladeuil
Change set/remove to require a lock for the branch config files.
299
        br.get_config_stack().set('send_strict', value)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
300
301
    def assertSendFails(self, args):
5171.2.3 by Vincent Ladeuil
Fixed as per Andrew's review.
302
        out, err = self.run_send(args, rc=3, err_re=self._default_errors)
303
        self.assertContainsRe(err, self._default_additional_error)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
304
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
305
    def assertSendSucceeds(self, args, revs=None, with_warning=False):
306
        if with_warning:
307
            err_re = self._default_errors
308
        else:
309
            err_re = []
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
310
        if revs is None:
311
            revs = self._default_sent_revs
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
312
        out, err = self.run_send(args, err_re=err_re)
6143.1.4 by Jonathan Riddell
update tests
313
        if len(revs) == 1:
314
            bundling_revs = 'Bundling %d revision.\n'% len(revs)
315
        else:
316
            bundling_revs = 'Bundling %d revisions.\n' % len(revs)
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
317
        if with_warning:
5171.2.3 by Vincent Ladeuil
Fixed as per Andrew's review.
318
            self.assertContainsRe(err, self._default_additional_warning)
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
319
            self.assertEndsWith(err, bundling_revs)
320
        else:
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
321
            self.assertEqual(bundling_revs, err)
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
322
        md = merge_directive.MergeDirective.from_lines(BytesIO(out.encode('utf-8')))
323
        self.assertEqual(b'parent', md.base_revision_id)
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
324
        br = serializer.read_bundle(BytesIO(md.get_raw_bundle()))
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
325
        self.assertEqual(set(revs), set(r.revision_id for r in br.revisions))
326
327
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
328
class TestSendStrictWithoutChanges(tests.TestCaseWithTransport,
329
                                   TestSendStrictMixin):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
330
331
    def setUp(self):
332
        super(TestSendStrictWithoutChanges, self).setUp()
333
        self.make_parent_and_local_branches()
334
6437.16.1 by Jelmer Vernooij
Fix 'bzr send' in treeless branches.
335
    def test_send_without_workingtree(self):
336
        ControlDir.open("local").destroy_workingtree()
337
        self.assertSendSucceeds([])
338
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
339
    def test_send_default(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
340
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
341
342
    def test_send_strict(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
343
        self.assertSendSucceeds(['--strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
344
345
    def test_send_no_strict(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
346
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
347
348
    def test_send_config_var_strict(self):
349
        self.set_config_send_strict('true')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
350
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
351
352
    def test_send_config_var_no_strict(self):
353
        self.set_config_send_strict('false')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
354
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
355
356
4464.3.7 by Vincent Ladeuil
Use mixins as suggested by Martin on IRC.
357
class TestSendStrictWithChanges(tests.TestCaseWithTransport,
5861.1.4 by Vincent Ladeuil
Fix send --no-remember when no location is set.
358
                                TestSendStrictMixin):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
359
5559.2.2 by Martin Pool
Change to using standard load_tests_apply_scenarios.
360
    # These are textually the same as test_push.strict_push_change_scenarios,
361
    # but since the functions are reimplemented here, the definitions are left
362
    # here too.
363
    scenarios = [
364
        ('uncommitted',
365
         dict(_changes_type='_uncommitted_changes')),
366
        ('pending_merges',
367
         dict(_changes_type='_pending_merges')),
368
        ('out-of-sync-trees',
369
         dict(_changes_type='_out_of_sync_trees')),
370
        ]
371
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
372
    _changes_type = None # Set by load_tests
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
373
374
    def setUp(self):
375
        super(TestSendStrictWithChanges, self).setUp()
4464.3.14 by Vincent Ladeuil
Fixed as per John's review.
376
        # load tests set _changes_types to the name of the method we want to
377
        # call now
378
        do_changes_func = getattr(self, self._changes_type)
379
        do_changes_func()
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
380
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
381
    def _uncommitted_changes(self):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
382
        self.make_parent_and_local_branches()
383
        # Make a change without committing it
6855.4.1 by Jelmer Vernooij
Yet more bees.
384
        self.build_tree_contents([('local/file', b'modified')])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
385
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
386
    def _pending_merges(self):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
387
        self.make_parent_and_local_branches()
388
        # Create 'other' branch containing a new file
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
389
        other_bzrdir = self.parent_tree.controldir.sprout('other')
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
390
        other_tree = other_bzrdir.open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
391
        self.build_tree_contents([('other/other-file', b'other')])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
392
        other_tree.add('other-file')
6855.4.1 by Jelmer Vernooij
Yet more bees.
393
        other_tree.commit('other commit', rev_id=b'other')
4464.3.5 by Vincent Ladeuil
Fix test parametrization based on IRC feedback.
394
        # Merge and revert, leaving a pending merge
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
395
        self.local_tree.merge_from_branch(other_tree.branch)
396
        self.local_tree.revert(filenames=['other-file'], backups=False)
397
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
398
    def _out_of_sync_trees(self):
399
        self.make_parent_and_local_branches()
400
        self.run_bzr(['checkout', '--lightweight', 'local', 'checkout'])
401
        # Make a change and commit it
6855.4.1 by Jelmer Vernooij
Yet more bees.
402
        self.build_tree_contents([('local/file', b'modified in local')])
403
        self.local_tree.commit('modify file', rev_id=b'modified-in-local')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
404
        # Exercise commands from the checkout directory
405
        self._default_wd = 'checkout'
406
        self._default_errors = ["Working tree is out of date, please run"
6963.1.1 by Jelmer Vernooij
Fix a bunch of tests on python3.
407
                                " 'brz update'\\.",]
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
408
        self._default_sent_revs = [b'modified-in-local', b'local']
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
409
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
410
    def test_send_default(self):
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
411
        self.assertSendSucceeds([], with_warning=True)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
412
413
    def test_send_with_revision(self):
7045.1.13 by Jelmer Vernooij
Fix a few more tests.
414
        self.assertSendSucceeds(['-r', 'revid:local'], revs=[b'local'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
415
416
    def test_send_no_strict(self):
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
417
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
418
419
    def test_send_strict_with_changes(self):
420
        self.assertSendFails(['--strict'])
421
422
    def test_send_respect_config_var_strict(self):
423
        self.set_config_send_strict('true')
424
        self.assertSendFails([])
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
425
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
426
427
    def test_send_bogus_config_var_ignored(self):
428
        self.set_config_send_strict("I'm unsure")
5147.2.1 by Vincent Ladeuil
Failing tests for bug #519319.
429
        self.assertSendSucceeds([], with_warning=True)
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
430
431
    def test_send_no_strict_command_line_override_config(self):
432
        self.set_config_send_strict('true')
433
        self.assertSendFails([])
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
434
        self.assertSendSucceeds(['--no-strict'])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
435
4721.2.1 by Vincent Ladeuil
Some test cleamup.
436
    def test_send_strict_command_line_override_config(self):
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
437
        self.set_config_send_strict('false')
4464.3.11 by Vincent Ladeuil
Add a check for tree/branch sync and tweak help.
438
        self.assertSendSucceeds([])
4464.3.4 by Vincent Ladeuil
Fix bug #206577 by adding a --strict option to send.
439
        self.assertSendFails(['--strict'])
4464.3.6 by Vincent Ladeuil
bundle-revisions should support --strict too.
440
441
442
class TestBundleStrictWithoutChanges(TestSendStrictWithoutChanges):
443
444
    _default_command = ['bundle-revisions', '../parent']
6365.1.1 by Jelmer Vernooij
Add blackbox test for hpss use in 'bzr send'.
445
446
447
class TestSmartServerSend(tests.TestCaseWithTransport):
448
449
    def test_send(self):
450
        self.setup_smart_server_with_call_log()
451
        t = self.make_branch_and_tree('branch')
6855.4.1 by Jelmer Vernooij
Yet more bees.
452
        self.build_tree_contents([('branch/foo', b'thecontents')])
6365.1.1 by Jelmer Vernooij
Add blackbox test for hpss use in 'bzr send'.
453
        t.add("foo")
454
        t.commit("message")
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
455
        local = t.controldir.sprout('local-branch').open_workingtree()
6855.4.1 by Jelmer Vernooij
Yet more bees.
456
        self.build_tree_contents([('branch/foo', b'thenewcontents')])
6365.1.1 by Jelmer Vernooij
Add blackbox test for hpss use in 'bzr send'.
457
        local.commit("anothermessage")
458
        self.reset_smart_call_log()
459
        out, err = self.run_bzr(
460
            ['send', '-o', 'x.diff', self.get_url('branch')], working_dir='local-branch')
461
        # This figure represent the amount of work to perform this use case. It
462
        # is entirely ok to reduce this number if a test fails due to rpc_count
463
        # being too low. If rpc_count increases, more network roundtrips have
464
        # become necessary for this use case. Please do not adjust this number
465
        # upwards without agreement from bzr's network support maintainers.
6404.6.2 by Vincent Ladeuil
Merge trunk resolving conflicts and fixing more test failures related to
466
        self.assertLength(7, self.hpss_calls)
6366.1.4 by Jelmer Vernooij
Test connection count calls for most blackbox commands.
467
        self.assertLength(1, self.hpss_connections)
6365.1.1 by Jelmer Vernooij
Add blackbox test for hpss use in 'bzr send'.
468
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)