/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
1
# Copyright (C) 2005, 2006 by Canonical Ltd
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
2
#   Authors: Robert Collins <robert.collins@canonical.com>
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
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18
"""Tests for finding and reading the bzr config file[s]."""
19
# import system imports here
1474 by Robert Collins
Merge from Aaron Bentley.
20
from bzrlib.util.configobj.configobj import ConfigObj, ConfigObjError
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
21
from cStringIO import StringIO
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
22
import os
23
import sys
24
25
#import bzrlib specific imports here
26
import bzrlib.config as config
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
27
from bzrlib.branch import Branch
28
from bzrlib.bzrdir import BzrDir
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
29
import bzrlib.errors as errors
1824.1.1 by Robert Collins
Add BranchConfig.has_explicit_nickname call.
30
from bzrlib.tests import TestCase, TestCaseInTempDir, TestCaseWithTransport
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
31
32
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
33
sample_long_alias="log -r-15..-1 --line"
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
34
sample_config_text = ("[DEFAULT]\n"
1551.2.21 by Aaron Bentley
Formatted unicode config tests as ASCII
35
                      u"email=Erik B\u00e5gfors <erik@bagfors.nu>\n"
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
36
                      "editor=vim\n"
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
37
                      "gpg_signing_command=gnome-gpg\n"
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
38
                      "log_format=short\n"
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
39
                      "user_global_option=something\n"
40
                      "[ALIASES]\n"
41
                      "h=help\n"
42
                      "ll=" + sample_long_alias + "\n")
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
43
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
44
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
45
sample_always_signatures = ("[DEFAULT]\n"
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
46
                            "check_signatures=ignore\n"
47
                            "create_signatures=always")
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
48
49
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
50
sample_ignore_signatures = ("[DEFAULT]\n"
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
51
                            "check_signatures=require\n"
52
                            "create_signatures=never")
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
53
54
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
55
sample_maybe_signatures = ("[DEFAULT]\n"
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
56
                            "check_signatures=ignore\n"
57
                            "create_signatures=when-required")
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
58
59
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
60
sample_branches_text = ("[http://www.example.com]\n"
61
                        "# Top level policy\n"
62
                        "email=Robert Collins <robertc@example.org>\n"
63
                        "[http://www.example.com/useglobal]\n"
64
                        "# different project, forces global lookup\n"
65
                        "recurse=false\n"
66
                        "[/b/]\n"
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
67
                        "check_signatures=require\n"
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
68
                        "# test trailing / matching with no children\n"
69
                        "[/a/]\n"
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
70
                        "check_signatures=check-available\n"
1442.1.56 by Robert Collins
gpg_signing_command configuration item
71
                        "gpg_signing_command=false\n"
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
72
                        "user_local_option=local\n"
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
73
                        "# test trailing / matching\n"
74
                        "[/a/*]\n"
75
                        "#subdirs will match but not the parent\n"
76
                        "recurse=False\n"
77
                        "[/a/c]\n"
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
78
                        "check_signatures=ignore\n"
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
79
                        "post_commit=bzrlib.tests.test_config.post_commit\n"
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
80
                        "#testing explicit beats globs\n")
81
1553.6.3 by Erik Bågfors
tests for AliasesConfig
82
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
83
1474 by Robert Collins
Merge from Aaron Bentley.
84
class InstrumentedConfigObj(object):
85
    """A config obj look-enough-alike to record calls made to it."""
86
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
87
    def __contains__(self, thing):
88
        self._calls.append(('__contains__', thing))
89
        return False
90
91
    def __getitem__(self, key):
92
        self._calls.append(('__getitem__', key))
93
        return self
94
1551.2.20 by Aaron Bentley
Treated config files as utf-8
95
    def __init__(self, input, encoding=None):
96
        self._calls = [('__init__', input, encoding)]
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
97
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
98
    def __setitem__(self, key, value):
99
        self._calls.append(('__setitem__', key, value))
100
1551.2.49 by abentley
Made ConfigObj output binary-identical files on win32 and *nix
101
    def write(self, arg):
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
102
        self._calls.append(('write',))
103
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
104
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
105
class FakeBranch(object):
106
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
107
    def __init__(self, base=None, user_id=None):
108
        if base is None:
109
            self.base = "http://example.com/branches/demo"
110
        else:
111
            self.base = base
112
        self.control_files = FakeControlFiles(user_id=user_id)
113
114
    def lock_write(self):
115
        pass
116
117
    def unlock(self):
118
        pass
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
119
120
121
class FakeControlFiles(object):
122
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
123
    def __init__(self, user_id=None):
124
        self.email = user_id
125
        self.files = {}
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
126
1185.65.29 by Robert Collins
Implement final review suggestions.
127
    def get_utf8(self, filename):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
128
        if filename != 'email':
129
            raise NotImplementedError
130
        if self.email is not None:
131
            return StringIO(self.email)
1185.31.45 by John Arbash Meinel
Refactoring Exceptions found some places where the wrong exception was caught.
132
        raise errors.NoSuchFile(filename)
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
133
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
134
    def get(self, filename):
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
135
        try:
136
            return StringIO(self.files[filename])
137
        except KeyError:
138
            raise errors.NoSuchFile(filename)
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
139
140
    def put(self, filename, fileobj):
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
141
        self.files[filename] = fileobj.read()
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
142
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
143
144
class InstrumentedConfig(config.Config):
145
    """An instrumented config that supplies stubs for template methods."""
146
    
147
    def __init__(self):
148
        super(InstrumentedConfig, self).__init__()
149
        self._calls = []
1442.1.15 by Robert Collins
make getting the signature checking policy a template method
150
        self._signatures = config.CHECK_NEVER
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
151
152
    def _get_user_id(self):
153
        self._calls.append('_get_user_id')
154
        return "Robert Collins <robert.collins@example.org>"
155
1442.1.15 by Robert Collins
make getting the signature checking policy a template method
156
    def _get_signature_checking(self):
157
        self._calls.append('_get_signature_checking')
158
        return self._signatures
159
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
160
1556.2.2 by Aaron Bentley
Fixed get_bool
161
bool_config = """[DEFAULT]
162
active = true
163
inactive = false
164
[UPPERCASE]
165
active = True
166
nonactive = False
167
"""
168
class TestConfigObj(TestCase):
169
    def test_get_bool(self):
170
        from bzrlib.config import ConfigObj
171
        co = ConfigObj(StringIO(bool_config))
172
        self.assertIs(co.get_bool('DEFAULT', 'active'), True)
173
        self.assertIs(co.get_bool('DEFAULT', 'inactive'), False)
174
        self.assertIs(co.get_bool('UPPERCASE', 'active'), True)
175
        self.assertIs(co.get_bool('UPPERCASE', 'nonactive'), False)
176
177
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
178
class TestConfig(TestCase):
179
180
    def test_constructs(self):
181
        config.Config()
182
 
183
    def test_no_default_editor(self):
184
        self.assertRaises(NotImplementedError, config.Config().get_editor)
185
186
    def test_user_email(self):
187
        my_config = InstrumentedConfig()
188
        self.assertEqual('robert.collins@example.org', my_config.user_email())
189
        self.assertEqual(['_get_user_id'], my_config._calls)
190
191
    def test_username(self):
192
        my_config = InstrumentedConfig()
193
        self.assertEqual('Robert Collins <robert.collins@example.org>',
194
                         my_config.username())
195
        self.assertEqual(['_get_user_id'], my_config._calls)
1442.1.14 by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE
196
197
    def test_signatures_default(self):
198
        my_config = config.Config()
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
199
        self.assertFalse(my_config.signature_needed())
1442.1.14 by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE
200
        self.assertEqual(config.CHECK_IF_POSSIBLE,
201
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
202
        self.assertEqual(config.SIGN_WHEN_REQUIRED,
203
                         my_config.signing_policy())
1442.1.14 by Robert Collins
Create a default signature checking policy of CHECK_IF_POSSIBLE
204
1442.1.15 by Robert Collins
make getting the signature checking policy a template method
205
    def test_signatures_template_method(self):
206
        my_config = InstrumentedConfig()
207
        self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
208
        self.assertEqual(['_get_signature_checking'], my_config._calls)
209
210
    def test_signatures_template_method_none(self):
211
        my_config = InstrumentedConfig()
212
        my_config._signatures = None
213
        self.assertEqual(config.CHECK_IF_POSSIBLE,
214
                         my_config.signature_checking())
215
        self.assertEqual(['_get_signature_checking'], my_config._calls)
216
1442.1.56 by Robert Collins
gpg_signing_command configuration item
217
    def test_gpg_signing_command_default(self):
218
        my_config = config.Config()
219
        self.assertEqual('gpg', my_config.gpg_signing_command())
220
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
221
    def test_get_user_option_default(self):
222
        my_config = config.Config()
223
        self.assertEqual(None, my_config.get_user_option('no_option'))
224
1472 by Robert Collins
post commit hook, first pass implementation
225
    def test_post_commit_default(self):
226
        my_config = config.Config()
227
        self.assertEqual(None, my_config.post_commit())
228
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
229
    def test_log_format_default(self):
1553.2.8 by Erik Bågfors
tests for config log_formatter
230
        my_config = config.Config()
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
231
        self.assertEqual('long', my_config.log_format())
1553.2.8 by Erik Bågfors
tests for config log_formatter
232
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
233
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
234
class TestConfigPath(TestCase):
235
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
236
    def setUp(self):
237
        super(TestConfigPath, self).setUp()
1185.38.5 by John Arbash Meinel
Updating testconfig to handle missing environment variables
238
        self.old_home = os.environ.get('HOME', None)
239
        self.old_appdata = os.environ.get('APPDATA', None)
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
240
        os.environ['HOME'] = '/home/bogus'
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
241
        os.environ['APPDATA'] = \
242
            r'C:\Documents and Settings\bogus\Application Data'
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
243
244
    def tearDown(self):
1185.38.5 by John Arbash Meinel
Updating testconfig to handle missing environment variables
245
        if self.old_home is None:
246
            del os.environ['HOME']
247
        else:
248
            os.environ['HOME'] = self.old_home
249
        if self.old_appdata is None:
250
            del os.environ['APPDATA']
251
        else:
252
            os.environ['APPDATA'] = self.old_appdata
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
253
        super(TestConfigPath, self).tearDown()
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
254
    
1442.1.1 by Robert Collins
move config_dir into bzrlib.config
255
    def test_config_dir(self):
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
256
        if sys.platform == 'win32':
257
            self.assertEqual(config.config_dir(), 
1185.31.36 by John Arbash Meinel
Fixup test_config.py to handle new paths
258
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0')
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
259
        else:
260
            self.assertEqual(config.config_dir(), '/home/bogus/.bazaar')
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
261
262
    def test_config_filename(self):
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
263
        if sys.platform == 'win32':
264
            self.assertEqual(config.config_filename(), 
1185.31.36 by John Arbash Meinel
Fixup test_config.py to handle new paths
265
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/bazaar.conf')
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
266
        else:
267
            self.assertEqual(config.config_filename(),
268
                             '/home/bogus/.bazaar/bazaar.conf')
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
269
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
270
    def test_branches_config_filename(self):
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
271
        if sys.platform == 'win32':
272
            self.assertEqual(config.branches_config_filename(), 
1185.31.36 by John Arbash Meinel
Fixup test_config.py to handle new paths
273
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/branches.conf')
1185.38.1 by John Arbash Meinel
Adding my win32 patch for moving the home directory.
274
        else:
275
            self.assertEqual(config.branches_config_filename(),
276
                             '/home/bogus/.bazaar/branches.conf')
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
277
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
278
    def test_locations_config_filename(self):
279
        if sys.platform == 'win32':
280
            self.assertEqual(config.locations_config_filename(), 
281
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/locations.conf')
282
        else:
283
            self.assertEqual(config.locations_config_filename(),
284
                             '/home/bogus/.bazaar/locations.conf')
285
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
286
class TestIniConfig(TestCase):
287
288
    def test_contructs(self):
289
        my_config = config.IniBasedConfig("nothing")
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
290
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
291
    def test_from_fp(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
292
        config_file = StringIO(sample_config_text.encode('utf-8'))
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
293
        my_config = config.IniBasedConfig(None)
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
294
        self.failUnless(
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
295
            isinstance(my_config._get_parser(file=config_file),
1474 by Robert Collins
Merge from Aaron Bentley.
296
                        ConfigObj))
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
297
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
298
    def test_cached(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
299
        config_file = StringIO(sample_config_text.encode('utf-8'))
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
300
        my_config = config.IniBasedConfig(None)
301
        parser = my_config._get_parser(file=config_file)
302
        self.failUnless(my_config._get_parser() is parser)
303
304
305
class TestGetConfig(TestCase):
306
307
    def test_constructs(self):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
308
        my_config = config.GlobalConfig()
309
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
310
    def test_calls_read_filenames(self):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
311
        # replace the class that is constructured, to check its parameters
1474 by Robert Collins
Merge from Aaron Bentley.
312
        oldparserclass = config.ConfigObj
313
        config.ConfigObj = InstrumentedConfigObj
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
314
        my_config = config.GlobalConfig()
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
315
        try:
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
316
            parser = my_config._get_parser()
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
317
        finally:
1474 by Robert Collins
Merge from Aaron Bentley.
318
            config.ConfigObj = oldparserclass
319
        self.failUnless(isinstance(parser, InstrumentedConfigObj))
1551.2.20 by Aaron Bentley
Treated config files as utf-8
320
        self.assertEqual(parser._calls, [('__init__', config.config_filename(),
321
                                          'utf-8')])
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
322
323
1824.1.1 by Robert Collins
Add BranchConfig.has_explicit_nickname call.
324
class TestBranchConfig(TestCaseWithTransport):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
325
326
    def test_constructs(self):
327
        branch = FakeBranch()
328
        my_config = config.BranchConfig(branch)
329
        self.assertRaises(TypeError, config.BranchConfig)
330
331
    def test_get_location_config(self):
332
        branch = FakeBranch()
333
        my_config = config.BranchConfig(branch)
334
        location_config = my_config._get_location_config()
335
        self.assertEqual(branch.base, location_config.location)
336
        self.failUnless(location_config is my_config._get_location_config())
337
1770.2.9 by Aaron Bentley
Add Branch.get_config, update BranchConfig() callers
338
    def test_get_config(self):
339
        """The Branch.get_config method works properly"""
340
        b = BzrDir.create_standalone_workingtree('.').branch
341
        my_config = b.get_config()
342
        self.assertIs(my_config.get_user_option('wacky'), None)
343
        my_config.set_user_option('wacky', 'unlikely')
344
        self.assertEqual(my_config.get_user_option('wacky'), 'unlikely')
345
346
        # Ensure we get the same thing if we start again
347
        b2 = Branch.open('.')
348
        my_config2 = b2.get_config()
349
        self.assertEqual(my_config2.get_user_option('wacky'), 'unlikely')
350
1824.1.1 by Robert Collins
Add BranchConfig.has_explicit_nickname call.
351
    def test_has_explicit_nickname(self):
352
        b = self.make_branch('.')
353
        self.assertFalse(b.get_config().has_explicit_nickname())
354
        b.nick = 'foo'
355
        self.assertTrue(b.get_config().has_explicit_nickname())
356
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
357
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
358
class TestGlobalConfigItems(TestCase):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
359
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
360
    def test_user_id(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
361
        config_file = StringIO(sample_config_text.encode('utf-8'))
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
362
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
363
        my_config._parser = my_config._get_parser(file=config_file)
1551.2.21 by Aaron Bentley
Formatted unicode config tests as ASCII
364
        self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
365
                         my_config._get_user_id())
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
366
367
    def test_absent_user_id(self):
368
        config_file = StringIO("")
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
369
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
370
        my_config._parser = my_config._get_parser(file=config_file)
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
371
        self.assertEqual(None, my_config._get_user_id())
372
373
    def test_configured_editor(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
374
        config_file = StringIO(sample_config_text.encode('utf-8'))
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
375
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
376
        my_config._parser = my_config._get_parser(file=config_file)
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
377
        self.assertEqual("vim", my_config.get_editor())
378
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
379
    def test_signatures_always(self):
380
        config_file = StringIO(sample_always_signatures)
381
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
382
        my_config._parser = my_config._get_parser(file=config_file)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
383
        self.assertEqual(config.CHECK_NEVER,
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
384
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
385
        self.assertEqual(config.SIGN_ALWAYS,
386
                         my_config.signing_policy())
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
387
        self.assertEqual(True, my_config.signature_needed())
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
388
389
    def test_signatures_if_possible(self):
390
        config_file = StringIO(sample_maybe_signatures)
391
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
392
        my_config._parser = my_config._get_parser(file=config_file)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
393
        self.assertEqual(config.CHECK_NEVER,
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
394
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
395
        self.assertEqual(config.SIGN_WHEN_REQUIRED,
396
                         my_config.signing_policy())
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
397
        self.assertEqual(False, my_config.signature_needed())
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
398
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
399
    def test_signatures_ignore(self):
400
        config_file = StringIO(sample_ignore_signatures)
401
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
402
        my_config._parser = my_config._get_parser(file=config_file)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
403
        self.assertEqual(config.CHECK_ALWAYS,
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
404
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
405
        self.assertEqual(config.SIGN_NEVER,
406
                         my_config.signing_policy())
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
407
        self.assertEqual(False, my_config.signature_needed())
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
408
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
409
    def _get_sample_config(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
410
        config_file = StringIO(sample_config_text.encode('utf-8'))
1534.7.154 by Aaron Bentley
Removed changes from bzr.ab 1529..1536
411
        my_config = config.GlobalConfig()
412
        my_config._parser = my_config._get_parser(file=config_file)
413
        return my_config
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
414
1442.1.56 by Robert Collins
gpg_signing_command configuration item
415
    def test_gpg_signing_command(self):
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
416
        my_config = self._get_sample_config()
1442.1.56 by Robert Collins
gpg_signing_command configuration item
417
        self.assertEqual("gnome-gpg", my_config.gpg_signing_command())
418
        self.assertEqual(False, my_config.signature_needed())
419
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
420
    def _get_empty_config(self):
421
        config_file = StringIO("")
422
        my_config = config.GlobalConfig()
423
        my_config._parser = my_config._get_parser(file=config_file)
424
        return my_config
425
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
426
    def test_gpg_signing_command_unset(self):
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
427
        my_config = self._get_empty_config()
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
428
        self.assertEqual("gpg", my_config.gpg_signing_command())
429
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
430
    def test_get_user_option_default(self):
431
        my_config = self._get_empty_config()
432
        self.assertEqual(None, my_config.get_user_option('no_option'))
433
434
    def test_get_user_option_global(self):
435
        my_config = self._get_sample_config()
436
        self.assertEqual("something",
437
                         my_config.get_user_option('user_global_option'))
1472 by Robert Collins
post commit hook, first pass implementation
438
        
439
    def test_post_commit_default(self):
440
        my_config = self._get_sample_config()
441
        self.assertEqual(None, my_config.post_commit())
442
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
443
    def test_configured_logformat(self):
1553.2.8 by Erik Bågfors
tests for config log_formatter
444
        my_config = self._get_sample_config()
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
445
        self.assertEqual("short", my_config.log_format())
1553.2.8 by Erik Bågfors
tests for config log_formatter
446
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
447
    def test_get_alias(self):
448
        my_config = self._get_sample_config()
449
        self.assertEqual('help', my_config.get_alias('h'))
450
451
    def test_get_no_alias(self):
452
        my_config = self._get_sample_config()
453
        self.assertEqual(None, my_config.get_alias('foo'))
454
455
    def test_get_long_alias(self):
456
        my_config = self._get_sample_config()
457
        self.assertEqual(sample_long_alias, my_config.get_alias('ll'))
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
458
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
459
460
class TestLocationConfig(TestCaseInTempDir):
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
461
462
    def test_constructs(self):
463
        my_config = config.LocationConfig('http://example.com')
464
        self.assertRaises(TypeError, config.LocationConfig)
465
466
    def test_branch_calls_read_filenames(self):
1474 by Robert Collins
Merge from Aaron Bentley.
467
        # This is testing the correct file names are provided.
468
        # TODO: consolidate with the test for GlobalConfigs filename checks.
469
        #
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
470
        # replace the class that is constructured, to check its parameters
1474 by Robert Collins
Merge from Aaron Bentley.
471
        oldparserclass = config.ConfigObj
472
        config.ConfigObj = InstrumentedConfigObj
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
473
        try:
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
474
            my_config = config.LocationConfig('http://www.example.com')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
475
            parser = my_config._get_parser()
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
476
        finally:
1474 by Robert Collins
Merge from Aaron Bentley.
477
            config.ConfigObj = oldparserclass
478
        self.failUnless(isinstance(parser, InstrumentedConfigObj))
479
        self.assertEqual(parser._calls,
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
480
                         [('__init__', config.locations_config_filename(),
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
481
                           'utf-8')])
1711.4.29 by John Arbash Meinel
Alexander Belchenko, fix test_config to use ensure_config_dir, rather than os.mkdir()
482
        config.ensure_config_dir_exists()
483
        #os.mkdir(config.config_dir())
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
484
        f = file(config.branches_config_filename(), 'wb')
485
        f.write('')
486
        f.close()
487
        oldparserclass = config.ConfigObj
488
        config.ConfigObj = InstrumentedConfigObj
489
        try:
490
            my_config = config.LocationConfig('http://www.example.com')
491
            parser = my_config._get_parser()
492
        finally:
493
            config.ConfigObj = oldparserclass
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
494
495
    def test_get_global_config(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
496
        my_config = config.BranchConfig(FakeBranch('http://example.com'))
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
497
        global_config = my_config._get_global_config()
498
        self.failUnless(isinstance(global_config, config.GlobalConfig))
499
        self.failUnless(global_config is my_config._get_global_config())
500
501
    def test__get_section_no_match(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
502
        self.get_branch_config('/')
503
        self.assertEqual(None, self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
504
        
505
    def test__get_section_exact(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
506
        self.get_branch_config('http://www.example.com')
1442.1.9 by Robert Collins
exact section test passes
507
        self.assertEqual('http://www.example.com',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
508
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
509
   
510
    def test__get_section_suffix_does_not(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
511
        self.get_branch_config('http://www.example.com-com')
512
        self.assertEqual(None, self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
513
514
    def test__get_section_subdir_recursive(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
515
        self.get_branch_config('http://www.example.com/com')
1442.1.11 by Robert Collins
LocationConfig lookups for non matching prefixes pass tests
516
        self.assertEqual('http://www.example.com',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
517
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
518
519
    def test__get_section_subdir_matches(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
520
        self.get_branch_config('http://www.example.com/useglobal')
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
521
        self.assertEqual('http://www.example.com/useglobal',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
522
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
523
524
    def test__get_section_subdir_nonrecursive(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
525
        self.get_branch_config(
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
526
            'http://www.example.com/useglobal/childbranch')
1442.1.11 by Robert Collins
LocationConfig lookups for non matching prefixes pass tests
527
        self.assertEqual('http://www.example.com',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
528
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
529
530
    def test__get_section_subdir_trailing_slash(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
531
        self.get_branch_config('/b')
532
        self.assertEqual('/b/', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
533
534
    def test__get_section_subdir_child(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
535
        self.get_branch_config('/a/foo')
536
        self.assertEqual('/a/*', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
537
538
    def test__get_section_subdir_child_child(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
539
        self.get_branch_config('/a/foo/bar')
540
        self.assertEqual('/a/', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
541
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
542
    def test__get_section_trailing_slash_with_children(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
543
        self.get_branch_config('/a/')
544
        self.assertEqual('/a/', self.my_location_config._get_section())
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
545
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
546
    def test__get_section_explicit_over_glob(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
547
        self.get_branch_config('/a/c')
548
        self.assertEqual('/a/c', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
549
550
551
    def test_location_without_username(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
552
        self.get_branch_config('http://www.example.com/useglobal')
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
553
        self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
554
                         self.my_config.username())
555
556
    def test_location_not_listed(self):
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
557
        """Test that the global username is used when no location matches"""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
558
        self.get_branch_config('/home/robertc/sources')
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
559
        self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
560
                         self.my_config.username())
561
1442.1.13 by Robert Collins
branches.conf is now able to override the users email
562
    def test_overriding_location(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
563
        self.get_branch_config('http://www.example.com/foo')
1442.1.13 by Robert Collins
branches.conf is now able to override the users email
564
        self.assertEqual('Robert Collins <robertc@example.org>',
565
                         self.my_config.username())
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
566
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
567
    def test_signatures_not_set(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
568
        self.get_branch_config('http://www.example.com',
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
569
                                 global_config=sample_ignore_signatures)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
570
        self.assertEqual(config.CHECK_ALWAYS,
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
571
                         self.my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
572
        self.assertEqual(config.SIGN_NEVER,
573
                         self.my_config.signing_policy())
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
574
575
    def test_signatures_never(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
576
        self.get_branch_config('/a/c')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
577
        self.assertEqual(config.CHECK_NEVER,
578
                         self.my_config.signature_checking())
579
        
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
580
    def test_signatures_when_available(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
581
        self.get_branch_config('/a/', global_config=sample_ignore_signatures)
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
582
        self.assertEqual(config.CHECK_IF_POSSIBLE,
583
                         self.my_config.signature_checking())
1442.1.13 by Robert Collins
branches.conf is now able to override the users email
584
        
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
585
    def test_signatures_always(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
586
        self.get_branch_config('/b')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
587
        self.assertEqual(config.CHECK_ALWAYS,
588
                         self.my_config.signature_checking())
589
        
1442.1.56 by Robert Collins
gpg_signing_command configuration item
590
    def test_gpg_signing_command(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
591
        self.get_branch_config('/b')
1442.1.56 by Robert Collins
gpg_signing_command configuration item
592
        self.assertEqual("gnome-gpg", self.my_config.gpg_signing_command())
593
594
    def test_gpg_signing_command_missing(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
595
        self.get_branch_config('/a')
1442.1.56 by Robert Collins
gpg_signing_command configuration item
596
        self.assertEqual("false", self.my_config.gpg_signing_command())
597
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
598
    def test_get_user_option_global(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
599
        self.get_branch_config('/a')
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
600
        self.assertEqual('something',
601
                         self.my_config.get_user_option('user_global_option'))
602
603
    def test_get_user_option_local(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
604
        self.get_branch_config('/a')
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
605
        self.assertEqual('local',
606
                         self.my_config.get_user_option('user_local_option'))
1472 by Robert Collins
post commit hook, first pass implementation
607
        
608
    def test_post_commit_default(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
609
        self.get_branch_config('/a/c')
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
610
        self.assertEqual('bzrlib.tests.test_config.post_commit',
1472 by Robert Collins
post commit hook, first pass implementation
611
                         self.my_config.post_commit())
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
612
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
613
    def get_branch_config(self, location, global_config=None):
1502 by Robert Collins
Bugfix the config test suite to not create .bazaar in the dir where it is run.
614
        if global_config is None:
1551.2.20 by Aaron Bentley
Treated config files as utf-8
615
            global_file = StringIO(sample_config_text.encode('utf-8'))
1502 by Robert Collins
Bugfix the config test suite to not create .bazaar in the dir where it is run.
616
        else:
1551.2.20 by Aaron Bentley
Treated config files as utf-8
617
            global_file = StringIO(global_config.encode('utf-8'))
618
        branches_file = StringIO(sample_branches_text.encode('utf-8'))
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
619
        self.my_config = config.BranchConfig(FakeBranch(location))
620
        # Force location config to use specified file
621
        self.my_location_config = self.my_config._get_location_config()
622
        self.my_location_config._get_parser(branches_file)
623
        # Force global config to use specified file
1502 by Robert Collins
Bugfix the config test suite to not create .bazaar in the dir where it is run.
624
        self.my_config._get_global_config()._get_parser(global_file)
625
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
626
    def test_set_user_setting_sets_and_saves(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
627
        self.get_branch_config('/a/c')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
628
        record = InstrumentedConfigObj("foo")
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
629
        self.my_location_config._parser = record
1185.62.6 by John Arbash Meinel
Updated test_set_user_setting_sets_and_saves to remove the print statement, and make sure it is doing the right thing
630
631
        real_mkdir = os.mkdir
632
        self.created = False
633
        def checked_mkdir(path, mode=0777):
634
            self.log('making directory: %s', path)
635
            real_mkdir(path, mode)
636
            self.created = True
637
638
        os.mkdir = checked_mkdir
639
        try:
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
640
            self.my_config.set_user_option('foo', 'bar', local=True)
1185.62.6 by John Arbash Meinel
Updated test_set_user_setting_sets_and_saves to remove the print statement, and make sure it is doing the right thing
641
        finally:
642
            os.mkdir = real_mkdir
643
644
        self.failUnless(self.created, 'Failed to create ~/.bazaar')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
645
        self.assertEqual([('__contains__', '/a/c'),
646
                          ('__contains__', '/a/c/'),
647
                          ('__setitem__', '/a/c', {}),
648
                          ('__getitem__', '/a/c'),
649
                          ('__setitem__', 'foo', 'bar'),
650
                          ('write',)],
651
                         record._calls[1:])
652
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
653
    def test_set_user_setting_sets_and_saves2(self):
654
        self.get_branch_config('/a/c')
655
        self.assertIs(self.my_config.get_user_option('foo'), None)
656
        self.my_config.set_user_option('foo', 'bar')
657
        self.assertEqual(
658
            self.my_config.branch.control_files.files['branch.conf'], 
659
            'foo = bar')
660
        self.assertEqual(self.my_config.get_user_option('foo'), 'bar')
661
        self.my_config.set_user_option('foo', 'baz', local=True)
662
        self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
663
        self.my_config.set_user_option('foo', 'qux')
664
        self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
665
        
1185.62.7 by John Arbash Meinel
Whitespace cleanup.
666
1770.2.8 by Aaron Bentley
Add precedence test
667
precedence_global = 'option = global'
668
precedence_branch = 'option = branch'
669
precedence_location = """
670
[http://]
671
recurse = true
672
option = recurse
673
[http://example.com/specific]
674
option = exact
675
"""
676
677
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
678
class TestBranchConfigItems(TestCaseInTempDir):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
679
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
680
    def get_branch_config(self, global_config=None, location=None, 
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
681
                          location_config=None, branch_data_config=None):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
682
        my_config = config.BranchConfig(FakeBranch(location))
683
        if global_config is not None:
684
            global_file = StringIO(global_config.encode('utf-8'))
685
            my_config._get_global_config()._get_parser(global_file)
686
        self.my_location_config = my_config._get_location_config()
687
        if location_config is not None:
688
            location_file = StringIO(location_config.encode('utf-8'))
689
            self.my_location_config._get_parser(location_file)
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
690
        if branch_data_config is not None:
691
            my_config.branch.control_files.files['branch.conf'] = \
692
                branch_data_config
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
693
        return my_config
694
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
695
    def test_user_id(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
696
        branch = FakeBranch(user_id='Robert Collins <robertc@example.net>')
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
697
        my_config = config.BranchConfig(branch)
698
        self.assertEqual("Robert Collins <robertc@example.net>",
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
699
                         my_config.username())
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
700
        branch.control_files.email = "John"
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
701
        my_config.set_user_option('email', 
702
                                  "Robert Collins <robertc@example.org>")
703
        self.assertEqual("John", my_config.username())
704
        branch.control_files.email = None
705
        self.assertEqual("Robert Collins <robertc@example.org>",
706
                         my_config.username())
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
707
708
    def test_not_set_in_branch(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
709
        my_config = self.get_branch_config(sample_config_text)
710
        my_config.branch.control_files.email = None
1551.2.21 by Aaron Bentley
Formatted unicode config tests as ASCII
711
        self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
712
                         my_config._get_user_id())
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
713
        my_config.branch.control_files.email = "John"
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
714
        self.assertEqual("John", my_config._get_user_id())
715
716
    def test_BZREMAIL_OVERRIDES(self):
717
        os.environ['BZREMAIL'] = "Robert Collins <robertc@example.org>"
718
        branch = FakeBranch()
719
        my_config = config.BranchConfig(branch)
720
        self.assertEqual("Robert Collins <robertc@example.org>",
721
                         my_config.username())
722
    
1442.1.19 by Robert Collins
BranchConfigs inherit signature_checking policy from their LocationConfig.
723
    def test_signatures_forced(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
724
        my_config = self.get_branch_config(
725
            global_config=sample_always_signatures)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
726
        self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
727
        self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
728
        self.assertTrue(my_config.signature_needed())
1442.1.56 by Robert Collins
gpg_signing_command configuration item
729
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
730
    def test_signatures_forced_branch(self):
731
        my_config = self.get_branch_config(
732
            global_config=sample_ignore_signatures,
733
            branch_data_config=sample_always_signatures)
734
        self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
735
        self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
736
        self.assertTrue(my_config.signature_needed())
737
1442.1.56 by Robert Collins
gpg_signing_command configuration item
738
    def test_gpg_signing_command(self):
1770.2.10 by Aaron Bentley
Added test that branch_config can't influence gpg_signing_command
739
        my_config = self.get_branch_config(
740
            # branch data cannot set gpg_signing_command
741
            branch_data_config="gpg_signing_command=pgp")
1551.2.20 by Aaron Bentley
Treated config files as utf-8
742
        config_file = StringIO(sample_config_text.encode('utf-8'))
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
743
        my_config._get_global_config()._get_parser(config_file)
1442.1.56 by Robert Collins
gpg_signing_command configuration item
744
        self.assertEqual('gnome-gpg', my_config.gpg_signing_command())
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
745
746
    def test_get_user_option_global(self):
747
        branch = FakeBranch()
748
        my_config = config.BranchConfig(branch)
1551.2.20 by Aaron Bentley
Treated config files as utf-8
749
        config_file = StringIO(sample_config_text.encode('utf-8'))
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
750
        (my_config._get_global_config()._get_parser(config_file))
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
751
        self.assertEqual('something',
752
                         my_config.get_user_option('user_global_option'))
1472 by Robert Collins
post commit hook, first pass implementation
753
754
    def test_post_commit_default(self):
755
        branch = FakeBranch()
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
756
        my_config = self.get_branch_config(sample_config_text, '/a/c',
757
                                           sample_branches_text)
758
        self.assertEqual(my_config.branch.base, '/a/c')
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
759
        self.assertEqual('bzrlib.tests.test_config.post_commit',
1472 by Robert Collins
post commit hook, first pass implementation
760
                         my_config.post_commit())
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
761
        my_config.set_user_option('post_commit', 'rmtree_root')
762
        # post-commit is ignored when bresent in branch data
763
        self.assertEqual('bzrlib.tests.test_config.post_commit',
764
                         my_config.post_commit())
765
        my_config.set_user_option('post_commit', 'rmtree_root', local=True)
766
        self.assertEqual('rmtree_root', my_config.post_commit())
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
767
1770.2.8 by Aaron Bentley
Add precedence test
768
    def test_config_precedence(self):
769
        my_config = self.get_branch_config(global_config=precedence_global)
770
        self.assertEqual(my_config.get_user_option('option'), 'global')
771
        my_config = self.get_branch_config(global_config=precedence_global, 
772
                                      branch_data_config=precedence_branch)
773
        self.assertEqual(my_config.get_user_option('option'), 'branch')
774
        my_config = self.get_branch_config(global_config=precedence_global, 
775
                                      branch_data_config=precedence_branch,
776
                                      location_config=precedence_location)
777
        self.assertEqual(my_config.get_user_option('option'), 'recurse')
778
        my_config = self.get_branch_config(global_config=precedence_global, 
779
                                      branch_data_config=precedence_branch,
780
                                      location_config=precedence_location,
781
                                      location='http://example.com/specific')
782
        self.assertEqual(my_config.get_user_option('option'), 'exact')
783
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
784
785
class TestMailAddressExtraction(TestCase):
786
787
    def test_extract_email_address(self):
788
        self.assertEqual('jane@test.com',
789
                         config.extract_email_address('Jane <jane@test.com>'))
790
        self.assertRaises(errors.BzrError,
791
                          config.extract_email_address, 'Jane Tester')