summaryrefslogtreecommitdiff
path: root/bzrlib/tests/test_directory_service.py
blob: f3a265303db43058d03faa50b5aeaac9d5130e2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Copyright (C) 2008-2012 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

"""Test directory service implementation"""

from bzrlib import (
    errors,
    transport,
    urlutils,
    )
from bzrlib.directory_service import (
    AliasDirectory,
    DirectoryServiceRegistry,
    directories,
    )
from bzrlib.tests import TestCase, TestCaseWithTransport


class FooService(object):
    """A directory service that maps the name to a FILE url"""

    # eg 'file:///foo' on Unix, or 'file:///C:/foo' on Windows
    base = urlutils.local_path_to_url('/foo')

    def look_up(self, name, url):
        return self.base + name


class TestDirectoryLookup(TestCase):

    def setUp(self):
        TestCase.setUp(self)
        self.registry = DirectoryServiceRegistry()
        self.registry.register('foo:', FooService, 'Map foo URLs to http urls')

    def test_get_directory_service(self):
        directory, suffix = self.registry.get_prefix('foo:bar')
        self.assertIs(FooService, directory)
        self.assertEqual('bar', suffix)

    def test_dereference(self):
        self.assertEqual(FooService.base + 'bar',
                         self.registry.dereference('foo:bar'))
        self.assertEqual('baz:qux', self.registry.dereference('baz:qux'))

    def test_get_transport(self):
        directories.register('foo:', FooService, 'Map foo URLs to http urls')
        self.addCleanup(directories.remove, 'foo:')
        self.assertEqual(FooService.base + 'bar/',
                         transport.get_transport('foo:bar').base)


class TestAliasDirectory(TestCaseWithTransport):

    def setUp(self):
        super(TestAliasDirectory, self).setUp()
        self.branch = self.make_branch('.')

    def assertAliasFromBranch(self, setter, value, alias):
        setter(value)
        self.assertEquals(value, directories.dereference(alias))

    def test_lookup_parent(self):
        self.assertAliasFromBranch(self.branch.set_parent, 'http://a',
                                  ':parent')

    def test_lookup_submit(self):
        self.assertAliasFromBranch(self.branch.set_submit_branch, 'http://b',
                                   ':submit')

    def test_lookup_public(self):
        self.assertAliasFromBranch(self.branch.set_public_branch, 'http://c',
                                   ':public')

    def test_lookup_bound(self):
        self.assertAliasFromBranch(self.branch.set_bound_location, 'http://d',
                                   ':bound')

    def test_lookup_push(self):
        self.assertAliasFromBranch(self.branch.set_push_location, 'http://e',
                                   ':push')

    def test_lookup_this(self):
        self.assertEqual(self.branch.base, directories.dereference(':this'))

    def test_extra_path(self):
        self.assertEqual(urlutils.join(self.branch.base, 'arg'),
                         directories.dereference(':this/arg'))

    def test_lookup_badname(self):
        e = self.assertRaises(errors.InvalidLocationAlias,
                              directories.dereference, ':booga')
        self.assertEqual('":booga" is not a valid location alias.',
                         str(e))

    def test_lookup_badvalue(self):
        e = self.assertRaises(errors.UnsetLocationAlias,
                              directories.dereference, ':parent')
        self.assertEqual('No parent location assigned.', str(e))

    def test_register_location_alias(self):
        self.addCleanup(AliasDirectory.branch_aliases.remove, "booga")
        AliasDirectory.branch_aliases.register("booga",
            lambda b: "UHH?", help="Nobody knows")
        self.assertEquals("UHH?", directories.dereference(":booga"))


class TestColocatedDirectory(TestCaseWithTransport):

    def test_lookup_non_default(self):
        default = self.make_branch('.')
        non_default = default.bzrdir.create_branch(name='nondefault')
        self.assertEquals(non_default.base, directories.dereference('co:nondefault'))

    def test_lookup_default(self):
        default = self.make_branch('.')
        non_default = default.bzrdir.create_branch(name='nondefault')
        self.assertEquals(urlutils.join_segment_parameters(default.bzrdir.user_url,
            {"branch": ""}), directories.dereference('co:'))

    def test_no_such_branch(self):
        # No error is raised in this case, that is up to the code that actually
        # opens the branch.
        default = self.make_branch('.')
        self.assertEquals(urlutils.join_segment_parameters(default.bzrdir.user_url,
            {"branch": "foo"}), directories.dereference('co:foo'))