/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) 2011, 2012, 2016 Canonical Ltd
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
17
"""Tests for the branch open with specific URL policy code."""
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
18
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
19
from .. import urlutils
20
from ..branch import (
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
21
    Branch,
6653.1.1 by Jelmer Vernooij
Split bzr branch code out into breezy.bzrbranch.
22
    )
6670.4.1 by Jelmer Vernooij
Update imports.
23
from ..bzr.branch import (
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
24
    BranchReferenceFormat,
25
    )
6695.5.1 by Jelmer Vernooij
Move bzr format registration to breezy.bzr.
26
from ..bzr import (
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
27
    BzrProber,
28
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
29
from ..controldir import (
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
30
    ControlDir,
31
    ControlDirFormat,
32
    )
7290.23.1 by Jelmer Vernooij
Support redirects in url policy opener.
33
from ..errors import (
34
    NotBranchError,
35
    RedirectRequested,
36
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
37
from ..url_policy_open import (
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
38
    BadUrl,
6402.3.8 by Jelmer Vernooij
make BlacklistPolicy private
39
    _BlacklistPolicy,
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
40
    BranchLoopError,
41
    BranchReferenceForbidden,
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
42
    open_only_scheme,
43
    BranchOpener,
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
44
    WhitelistPolicy,
45
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
46
from . import (
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
47
    TestCase,
48
    TestCaseWithTransport,
49
    )
7290.23.1 by Jelmer Vernooij
Support redirects in url policy opener.
50
from ..transport import (
51
    chroot,
52
    get_transport,
53
    register_transport_proto,
54
    register_transport,
55
    unregister_transport,
56
    transport_list_registry,
57
    Transport,
58
    )
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
59
60
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
61
class TestBranchOpenerCheckAndFollowBranchReference(TestCase):
62
    """Unit tests for `BranchOpener.check_and_follow_branch_reference`."""
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
63
64
    def setUp(self):
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
65
        super(TestBranchOpenerCheckAndFollowBranchReference, self).setUp()
66
        BranchOpener.install_hook()
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
67
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
68
    class StubbedBranchOpener(BranchOpener):
69
        """BranchOpener that provides canned answers.
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
70
71
        We implement the methods we need to to be able to control all the
72
        inputs to the `follow_reference` method, which is what is
73
        being tested in this class.
74
        """
75
76
        def __init__(self, references, policy):
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
77
            parent_cls = TestBranchOpenerCheckAndFollowBranchReference
78
            super(parent_cls.StubbedBranchOpener, self).__init__(policy)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
79
            self._reference_values = {}
80
            for i in range(len(references) - 1):
81
                self._reference_values[references[i]] = references[i + 1]
82
            self.follow_reference_calls = []
83
84
        def follow_reference(self, url):
85
            self.follow_reference_calls.append(url)
86
            return self._reference_values[url]
87
88
    def make_branch_opener(self, should_follow_references, references,
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
89
                           unsafe_urls=None):
6402.3.8 by Jelmer Vernooij
make BlacklistPolicy private
90
        policy = _BlacklistPolicy(should_follow_references, unsafe_urls)
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
91
        opener = self.StubbedBranchOpener(references, policy)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
92
        return opener
93
94
    def test_check_initial_url(self):
6402.3.8 by Jelmer Vernooij
make BlacklistPolicy private
95
        # check_and_follow_branch_reference rejects all URLs that are not
96
        # allowed.
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
97
        opener = self.make_branch_opener(None, [], {'a'})
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
98
        self.assertRaises(
99
            BadUrl, opener.check_and_follow_branch_reference, 'a')
100
101
    def test_not_reference(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
102
        # When branch references are forbidden,
103
        # check_and_follow_branch_reference does not raise on non-references.
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
104
        opener = self.make_branch_opener(False, ['a', None])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
105
        self.assertEqual(
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
106
            'a', opener.check_and_follow_branch_reference('a'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
107
        self.assertEqual(['a'], opener.follow_reference_calls)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
108
109
    def test_branch_reference_forbidden(self):
110
        # check_and_follow_branch_reference raises BranchReferenceForbidden if
111
        # branch references are forbidden and the source URL points to a
112
        # branch reference.
113
        opener = self.make_branch_opener(False, ['a', 'b'])
114
        self.assertRaises(
115
            BranchReferenceForbidden,
116
            opener.check_and_follow_branch_reference, 'a')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
117
        self.assertEqual(['a'], opener.follow_reference_calls)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
118
119
    def test_allowed_reference(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
120
        # check_and_follow_branch_reference does not raise if following
121
        # references is allowed and the source URL points to a branch reference
122
        # to a permitted location.
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
123
        opener = self.make_branch_opener(True, ['a', 'b', None])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
124
        self.assertEqual(
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
125
            'b', opener.check_and_follow_branch_reference('a'))
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
126
        self.assertEqual(['a', 'b'], opener.follow_reference_calls)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
127
128
    def test_check_referenced_urls(self):
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
129
        # check_and_follow_branch_reference checks if the URL a reference
130
        # points to is safe.
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
131
        opener = self.make_branch_opener(
132
            True, ['a', 'b', None], unsafe_urls=set('b'))
133
        self.assertRaises(
134
            BadUrl, opener.check_and_follow_branch_reference, 'a')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
135
        self.assertEqual(['a'], opener.follow_reference_calls)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
136
137
    def test_self_referencing_branch(self):
138
        # check_and_follow_branch_reference raises BranchReferenceLoopError if
139
        # following references is allowed and the source url points to a
140
        # self-referencing branch reference.
141
        opener = self.make_branch_opener(True, ['a', 'a'])
142
        self.assertRaises(
143
            BranchLoopError, opener.check_and_follow_branch_reference, 'a')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
144
        self.assertEqual(['a'], opener.follow_reference_calls)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
145
146
    def test_branch_reference_loop(self):
147
        # check_and_follow_branch_reference raises BranchReferenceLoopError if
148
        # following references is allowed and the source url points to a loop
149
        # of branch references.
150
        references = ['a', 'b', 'a']
151
        opener = self.make_branch_opener(True, references)
152
        self.assertRaises(
153
            BranchLoopError, opener.check_and_follow_branch_reference, 'a')
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
154
        self.assertEqual(['a', 'b'], opener.follow_reference_calls)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
155
156
157
class TrackingProber(BzrProber):
158
    """Subclass of BzrProber which tracks URLs it has been asked to open."""
159
160
    seen_urls = []
161
162
    @classmethod
163
    def probe_transport(klass, transport):
164
        klass.seen_urls.append(transport.base)
165
        return BzrProber.probe_transport(transport)
166
167
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
168
class TestBranchOpenerStacking(TestCaseWithTransport):
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
169
170
    def setUp(self):
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
171
        super(TestBranchOpenerStacking, self).setUp()
172
        BranchOpener.install_hook()
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
173
174
    def make_branch_opener(self, allowed_urls, probers=None):
175
        policy = WhitelistPolicy(True, allowed_urls, True)
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
176
        return BranchOpener(policy, probers)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
177
178
    def test_probers(self):
179
        # Only the specified probers should be used
180
        b = self.make_branch('branch')
181
        opener = self.make_branch_opener([b.base], probers=[])
182
        self.assertRaises(NotBranchError, opener.open, b.base)
183
        opener = self.make_branch_opener([b.base], probers=[BzrProber])
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
184
        self.assertEqual(b.base, opener.open(b.base).base)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
185
186
    def test_default_probers(self):
187
        # If no probers are specified to the constructor
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
188
        # of BranchOpener, then a safe set will be used,
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
189
        # rather than all probers registered in bzr.
190
        self.addCleanup(ControlDirFormat.unregister_prober, TrackingProber)
191
        ControlDirFormat.register_prober(TrackingProber)
192
        # Open a location without any branches, so that all probers are
193
        # tried.
194
        # First, check that the TrackingProber tracks correctly.
195
        TrackingProber.seen_urls = []
196
        opener = self.make_branch_opener(["."], probers=[TrackingProber])
197
        self.assertRaises(NotBranchError, opener.open, ".")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
198
        self.assertEqual(1, len(TrackingProber.seen_urls))
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
199
        TrackingProber.seen_urls = []
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
200
        # And make sure it's registered in such a way that ControlDir.open
201
        # would use it.
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
202
        self.assertRaises(NotBranchError, ControlDir.open, ".")
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
203
        self.assertEqual(1, len(TrackingProber.seen_urls))
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
204
205
    def test_allowed_url(self):
206
        # the opener does not raise an exception for branches stacked on
207
        # branches with allowed URLs.
208
        stacked_on_branch = self.make_branch('base-branch', format='1.6')
209
        stacked_branch = self.make_branch('stacked-branch', format='1.6')
210
        stacked_branch.set_stacked_on_url(stacked_on_branch.base)
211
        opener = self.make_branch_opener(
212
            [stacked_branch.base, stacked_on_branch.base])
213
        # This doesn't raise an exception.
214
        opener.open(stacked_branch.base)
215
216
    def test_nstackable_repository(self):
217
        # treats branches with UnstackableRepositoryFormats as
218
        # being not stacked.
219
        branch = self.make_branch('unstacked', format='knit')
220
        opener = self.make_branch_opener([branch.base])
221
        # This doesn't raise an exception.
222
        opener.open(branch.base)
223
224
    def test_allowed_relative_url(self):
225
        # passes on absolute urls to check_one_url, even if the
226
        # value of stacked_on_location in the config is set to a relative URL.
227
        stacked_on_branch = self.make_branch('base-branch', format='1.6')
228
        stacked_branch = self.make_branch('stacked-branch', format='1.6')
229
        stacked_branch.set_stacked_on_url('../base-branch')
230
        opener = self.make_branch_opener(
231
            [stacked_branch.base, stacked_on_branch.base])
232
        # Note that stacked_on_branch.base is not '../base-branch', it's an
233
        # absolute URL.
234
        self.assertNotEqual('../base-branch', stacked_on_branch.base)
235
        # This doesn't raise an exception.
236
        opener.open(stacked_branch.base)
237
238
    def test_allowed_relative_nested(self):
239
        # Relative URLs are resolved relative to the stacked branch.
240
        self.get_transport().mkdir('subdir')
241
        a = self.make_branch('subdir/a', format='1.6')
242
        b = self.make_branch('b', format='1.6')
243
        b.set_stacked_on_url('../subdir/a')
244
        c = self.make_branch('subdir/c', format='1.6')
245
        c.set_stacked_on_url('../../b')
246
        opener = self.make_branch_opener([c.base, b.base, a.base])
247
        # This doesn't raise an exception.
248
        opener.open(c.base)
249
250
    def test_forbidden_url(self):
251
        # raises a BadUrl exception if a branch is stacked on a
252
        # branch with a forbidden URL.
253
        stacked_on_branch = self.make_branch('base-branch', format='1.6')
254
        stacked_branch = self.make_branch('stacked-branch', format='1.6')
255
        stacked_branch.set_stacked_on_url(stacked_on_branch.base)
256
        opener = self.make_branch_opener([stacked_branch.base])
257
        self.assertRaises(BadUrl, opener.open, stacked_branch.base)
258
259
    def test_forbidden_url_nested(self):
260
        # raises a BadUrl exception if a branch is stacked on a
261
        # branch that is in turn stacked on a branch with a forbidden URL.
262
        a = self.make_branch('a', format='1.6')
263
        b = self.make_branch('b', format='1.6')
264
        b.set_stacked_on_url(a.base)
265
        c = self.make_branch('c', format='1.6')
266
        c.set_stacked_on_url(b.base)
267
        opener = self.make_branch_opener([c.base, b.base])
268
        self.assertRaises(BadUrl, opener.open, c.base)
269
270
    def test_self_stacked_branch(self):
271
        # raises StackingLoopError if a branch is stacked on
272
        # itself. This avoids infinite recursion errors.
273
        a = self.make_branch('a', format='1.6')
274
        # Bazaar 1.17 and up make it harder to create branches like this.
275
        # It's still worth testing that we don't blow up in the face of them,
276
        # so we grovel around a bit to create one anyway.
277
        a.get_config().set_user_option('stacked_on_location', a.base)
278
        opener = self.make_branch_opener([a.base])
279
        self.assertRaises(BranchLoopError, opener.open, a.base)
280
281
    def test_loop_stacked_branch(self):
282
        # raises StackingLoopError if a branch is stacked in such
283
        # a way so that it is ultimately stacked on itself. e.g. a stacked on
284
        # b stacked on a.
285
        a = self.make_branch('a', format='1.6')
286
        b = self.make_branch('b', format='1.6')
287
        a.set_stacked_on_url(b.base)
288
        b.set_stacked_on_url(a.base)
289
        opener = self.make_branch_opener([a.base, b.base])
290
        self.assertRaises(BranchLoopError, opener.open, a.base)
291
        self.assertRaises(BranchLoopError, opener.open, b.base)
292
293
    def test_custom_opener(self):
294
        # A custom function for opening a control dir can be specified.
295
        a = self.make_branch('a', format='2a')
296
        b = self.make_branch('b', format='2a')
297
        b.set_stacked_on_url(a.base)
298
299
        TrackingProber.seen_urls = []
300
        opener = self.make_branch_opener(
301
            [a.base, b.base], probers=[TrackingProber])
302
        opener.open(b.base)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
303
        self.assertEqual(
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
304
            set(TrackingProber.seen_urls), {b.base, a.base})
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
305
306
    def test_custom_opener_with_branch_reference(self):
307
        # A custom function for opening a control dir can be specified.
308
        a = self.make_branch('a', format='2a')
6653.6.5 by Jelmer Vernooij
Rename make_bzrdir to make_controldir.
309
        b_dir = self.make_controldir('b')
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
310
        b = BranchReferenceFormat().initialize(b_dir, target_branch=a)
311
        TrackingProber.seen_urls = []
312
        opener = self.make_branch_opener(
313
            [a.base, b.base], probers=[TrackingProber])
314
        opener.open(b.base)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
315
        self.assertEqual(
6619.3.12 by Jelmer Vernooij
Use 2to3 set_literal fixer.
316
            set(TrackingProber.seen_urls), {b.base, a.base})
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
317
318
7290.23.1 by Jelmer Vernooij
Support redirects in url policy opener.
319
class TestRedirects(TestCaseWithTransport):
320
321
    def setUp(self):
322
        super(TestRedirects, self).setUp()
323
        BranchOpener.install_hook()
324
325
    def setup_redirect(self, target_url):
326
        class RedirectingTransport(Transport):
327
328
            def get(self, name):
329
                raise RedirectRequested(self.base, target_url)
330
331
            def _redirected_to(self, source, target):
332
                return get_transport(target)
333
334
        register_transport_proto(
335
            'redirecting://', help="Test transport that redirects.")
336
        register_transport('redirecting://', RedirectingTransport)
337
        self.addCleanup(unregister_transport, 'redirecting://', RedirectingTransport)
338
339
    def make_branch_opener(self, allowed_urls, probers=None):
340
        policy = WhitelistPolicy(True, allowed_urls, True)
341
        return BranchOpener(policy, probers)
342
343
    def test_redirect_forbidden(self):
344
        b = self.make_branch('b')
345
        self.setup_redirect(b.base)
346
        class TrackingProber(BzrProber):
347
            seen_urls = []
348
349
            @classmethod
350
            def probe_transport(klass, transport):
351
                klass.seen_urls.append(transport.base)
352
                return BzrProber.probe_transport(transport)
353
354
        opener = self.make_branch_opener(['redirecting:///'], probers=[TrackingProber])
355
        self.assertRaises(BadUrl, opener.open, 'redirecting:///')
356
357
        opener = self.make_branch_opener(['redirecting:///', b.base], probers=[TrackingProber])
358
        opener.open('redirecting:///')
359
360
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
361
class TestOpenOnlyScheme(TestCaseWithTransport):
362
    """Tests for `open_only_scheme`."""
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
363
364
    def setUp(self):
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
365
        super(TestOpenOnlyScheme, self).setUp()
366
        BranchOpener.install_hook()
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
367
368
    def test_hook_does_not_interfere(self):
369
        # The transform_fallback_location hook does not interfere with regular
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
370
        # stacked branch access outside of open_only_scheme.
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
371
        self.make_branch('stacked')
372
        self.make_branch('stacked-on')
373
        Branch.open('stacked').set_stacked_on_url('../stacked-on')
374
        Branch.open('stacked')
375
376
    def get_chrooted_scheme(self, relpath):
377
        """Create a server that is chrooted to `relpath`.
378
379
        :return: ``(scheme, get_url)`` where ``scheme`` is the scheme of the
380
            chroot server and ``get_url`` returns URLs on said server.
381
        """
382
        transport = self.get_transport(relpath)
383
        chroot_server = chroot.ChrootServer(transport)
384
        chroot_server.start_server()
385
        self.addCleanup(chroot_server.stop_server)
386
387
        def get_url(relpath):
6402.3.2 by Jelmer Vernooij
bzrify
388
            return chroot_server.get_url() + relpath
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
389
7143.15.5 by Jelmer Vernooij
More PEP8 fixes.
390
        return (urlutils.URL.from_string(chroot_server.get_url()).scheme,
391
                get_url)
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
392
393
    def test_stacked_within_scheme(self):
394
        # A branch that is stacked on a URL of the same scheme is safe to
395
        # open.
396
        self.get_transport().mkdir('inside')
397
        self.make_branch('inside/stacked')
398
        self.make_branch('inside/stacked-on')
399
        scheme, get_chrooted_url = self.get_chrooted_scheme('inside')
400
        Branch.open(get_chrooted_url('stacked')).set_stacked_on_url(
401
            get_chrooted_url('stacked-on'))
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
402
        open_only_scheme(scheme, get_chrooted_url('stacked'))
6402.3.1 by Jelmer Vernooij
Add safe_open class to bzr.
403
404
    def test_stacked_outside_scheme(self):
405
        # A branch that is stacked on a URL that is not of the same scheme is
406
        # not safe to open.
407
        self.get_transport().mkdir('inside')
408
        self.get_transport().mkdir('outside')
409
        self.make_branch('inside/stacked')
410
        self.make_branch('outside/stacked-on')
411
        scheme, get_chrooted_url = self.get_chrooted_scheme('inside')
412
        Branch.open(get_chrooted_url('stacked')).set_stacked_on_url(
413
            self.get_url('outside/stacked-on'))
414
        self.assertRaises(
6402.3.10 by Jelmer Vernooij
Name changes suggested by mgz.
415
            BadUrl, open_only_scheme, scheme, get_chrooted_url('stacked'))