/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
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
30
from bzrlib.tests import TestCase, TestCaseInTempDir
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
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
324
class TestBranchConfig(TestCaseInTempDir):
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
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
351
1442.1.55 by Robert Collins
move environment preservation up to the root test case, making it available to all tests
352
class TestGlobalConfigItems(TestCase):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
353
1442.1.2 by Robert Collins
create a config module - there is enough config logic to make this worthwhile, and start testing config processing.
354
    def test_user_id(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
355
        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
356
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
357
        my_config._parser = my_config._get_parser(file=config_file)
1551.2.21 by Aaron Bentley
Formatted unicode config tests as ASCII
358
        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
359
                         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.
360
361
    def test_absent_user_id(self):
362
        config_file = StringIO("")
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
363
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
364
        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
365
        self.assertEqual(None, my_config._get_user_id())
366
367
    def test_configured_editor(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
368
        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
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("vim", my_config.get_editor())
372
1442.1.17 by Robert Collins
allow global overriding of signature policy to force checking, or (pointless but allowed) to set auto checking
373
    def test_signatures_always(self):
374
        config_file = StringIO(sample_always_signatures)
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)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
377
        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
378
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
379
        self.assertEqual(config.SIGN_ALWAYS,
380
                         my_config.signing_policy())
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
381
        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
382
383
    def test_signatures_if_possible(self):
384
        config_file = StringIO(sample_maybe_signatures)
385
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
386
        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
387
        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
388
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
389
        self.assertEqual(config.SIGN_WHEN_REQUIRED,
390
                         my_config.signing_policy())
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
391
        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
392
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
393
    def test_signatures_ignore(self):
394
        config_file = StringIO(sample_ignore_signatures)
395
        my_config = config.GlobalConfig()
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
396
        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
397
        self.assertEqual(config.CHECK_ALWAYS,
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
398
                         my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
399
        self.assertEqual(config.SIGN_NEVER,
400
                         my_config.signing_policy())
1442.1.21 by Robert Collins
create signature_needed() call for commit to trigger creating signatures
401
        self.assertEqual(False, my_config.signature_needed())
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
402
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
403
    def _get_sample_config(self):
1551.2.20 by Aaron Bentley
Treated config files as utf-8
404
        config_file = StringIO(sample_config_text.encode('utf-8'))
1534.7.154 by Aaron Bentley
Removed changes from bzr.ab 1529..1536
405
        my_config = config.GlobalConfig()
406
        my_config._parser = my_config._get_parser(file=config_file)
407
        return my_config
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
408
1442.1.56 by Robert Collins
gpg_signing_command configuration item
409
    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.
410
        my_config = self._get_sample_config()
1442.1.56 by Robert Collins
gpg_signing_command configuration item
411
        self.assertEqual("gnome-gpg", my_config.gpg_signing_command())
412
        self.assertEqual(False, my_config.signature_needed())
413
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
414
    def _get_empty_config(self):
415
        config_file = StringIO("")
416
        my_config = config.GlobalConfig()
417
        my_config._parser = my_config._get_parser(file=config_file)
418
        return my_config
419
1442.1.59 by Robert Collins
Add re-sign command to generate a digital signature on a single revision.
420
    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.
421
        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.
422
        self.assertEqual("gpg", my_config.gpg_signing_command())
423
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
424
    def test_get_user_option_default(self):
425
        my_config = self._get_empty_config()
426
        self.assertEqual(None, my_config.get_user_option('no_option'))
427
428
    def test_get_user_option_global(self):
429
        my_config = self._get_sample_config()
430
        self.assertEqual("something",
431
                         my_config.get_user_option('user_global_option'))
1472 by Robert Collins
post commit hook, first pass implementation
432
        
433
    def test_post_commit_default(self):
434
        my_config = self._get_sample_config()
435
        self.assertEqual(None, my_config.post_commit())
436
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
437
    def test_configured_logformat(self):
1553.2.8 by Erik Bågfors
tests for config log_formatter
438
        my_config = self._get_sample_config()
1553.2.9 by Erik Bågfors
log_formatter => log_format for "named" formatters
439
        self.assertEqual("short", my_config.log_format())
1553.2.8 by Erik Bågfors
tests for config log_formatter
440
1553.6.12 by Erik Bågfors
remove AliasConfig, based on input from abentley
441
    def test_get_alias(self):
442
        my_config = self._get_sample_config()
443
        self.assertEqual('help', my_config.get_alias('h'))
444
445
    def test_get_no_alias(self):
446
        my_config = self._get_sample_config()
447
        self.assertEqual(None, my_config.get_alias('foo'))
448
449
    def test_get_long_alias(self):
450
        my_config = self._get_sample_config()
451
        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.
452
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
453
454
class TestLocationConfig(TestCaseInTempDir):
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
455
456
    def test_constructs(self):
457
        my_config = config.LocationConfig('http://example.com')
458
        self.assertRaises(TypeError, config.LocationConfig)
459
460
    def test_branch_calls_read_filenames(self):
1474 by Robert Collins
Merge from Aaron Bentley.
461
        # This is testing the correct file names are provided.
462
        # TODO: consolidate with the test for GlobalConfigs filename checks.
463
        #
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
464
        # replace the class that is constructured, to check its parameters
1474 by Robert Collins
Merge from Aaron Bentley.
465
        oldparserclass = config.ConfigObj
466
        config.ConfigObj = InstrumentedConfigObj
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
467
        try:
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
468
            my_config = config.LocationConfig('http://www.example.com')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
469
            parser = my_config._get_parser()
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
470
        finally:
1474 by Robert Collins
Merge from Aaron Bentley.
471
            config.ConfigObj = oldparserclass
472
        self.failUnless(isinstance(parser, InstrumentedConfigObj))
473
        self.assertEqual(parser._calls,
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
474
                         [('__init__', config.locations_config_filename(),
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
475
                           'utf-8')])
1770.2.2 by Aaron Bentley
Rename branches.conf to locations.conf
476
        os.mkdir(config.config_dir())
477
        f = file(config.branches_config_filename(), 'wb')
478
        f.write('')
479
        f.close()
480
        oldparserclass = config.ConfigObj
481
        config.ConfigObj = InstrumentedConfigObj
482
        try:
483
            my_config = config.LocationConfig('http://www.example.com')
484
            parser = my_config._get_parser()
485
        finally:
486
            config.ConfigObj = oldparserclass
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
487
488
    def test_get_global_config(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
489
        my_config = config.BranchConfig(FakeBranch('http://example.com'))
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
490
        global_config = my_config._get_global_config()
491
        self.failUnless(isinstance(global_config, config.GlobalConfig))
492
        self.failUnless(global_config is my_config._get_global_config())
493
494
    def test__get_section_no_match(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
495
        self.get_branch_config('/')
496
        self.assertEqual(None, self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
497
        
498
    def test__get_section_exact(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
499
        self.get_branch_config('http://www.example.com')
1442.1.9 by Robert Collins
exact section test passes
500
        self.assertEqual('http://www.example.com',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
501
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
502
   
503
    def test__get_section_suffix_does_not(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
504
        self.get_branch_config('http://www.example.com-com')
505
        self.assertEqual(None, self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
506
507
    def test__get_section_subdir_recursive(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
508
        self.get_branch_config('http://www.example.com/com')
1442.1.11 by Robert Collins
LocationConfig lookups for non matching prefixes pass tests
509
        self.assertEqual('http://www.example.com',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
510
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
511
512
    def test__get_section_subdir_matches(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
513
        self.get_branch_config('http://www.example.com/useglobal')
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
514
        self.assertEqual('http://www.example.com/useglobal',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
515
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
516
517
    def test__get_section_subdir_nonrecursive(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
518
        self.get_branch_config(
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
519
            'http://www.example.com/useglobal/childbranch')
1442.1.11 by Robert Collins
LocationConfig lookups for non matching prefixes pass tests
520
        self.assertEqual('http://www.example.com',
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
521
                         self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
522
523
    def test__get_section_subdir_trailing_slash(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
524
        self.get_branch_config('/b')
525
        self.assertEqual('/b/', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
526
527
    def test__get_section_subdir_child(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
528
        self.get_branch_config('/a/foo')
529
        self.assertEqual('/a/*', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
530
531
    def test__get_section_subdir_child_child(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
532
        self.get_branch_config('/a/foo/bar')
533
        self.assertEqual('/a/', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
534
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
535
    def test__get_section_trailing_slash_with_children(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
536
        self.get_branch_config('/a/')
537
        self.assertEqual('/a/', self.my_location_config._get_section())
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
538
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
539
    def test__get_section_explicit_over_glob(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
540
        self.get_branch_config('/a/c')
541
        self.assertEqual('/a/c', self.my_location_config._get_section())
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
542
543
544
    def test_location_without_username(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
545
        self.get_branch_config('http://www.example.com/useglobal')
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
546
        self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
547
                         self.my_config.username())
548
549
    def test_location_not_listed(self):
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
550
        """Test that the global username is used when no location matches"""
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
551
        self.get_branch_config('/home/robertc/sources')
1704.2.18 by Martin Pool
Remove duplicated TestLocationConfig and update previously hidden tests. (#32587)
552
        self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
1442.1.8 by Robert Collins
preparing some tests for LocationConfig
553
                         self.my_config.username())
554
1442.1.13 by Robert Collins
branches.conf is now able to override the users email
555
    def test_overriding_location(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
556
        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
557
        self.assertEqual('Robert Collins <robertc@example.org>',
558
                         self.my_config.username())
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
559
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
560
    def test_signatures_not_set(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
561
        self.get_branch_config('http://www.example.com',
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
562
                                 global_config=sample_ignore_signatures)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
563
        self.assertEqual(config.CHECK_ALWAYS,
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
564
                         self.my_config.signature_checking())
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
565
        self.assertEqual(config.SIGN_NEVER,
566
                         self.my_config.signing_policy())
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
567
568
    def test_signatures_never(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
569
        self.get_branch_config('/a/c')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
570
        self.assertEqual(config.CHECK_NEVER,
571
                         self.my_config.signature_checking())
572
        
1442.1.16 by Robert Collins
allow global overriding of signature policy to never check
573
    def test_signatures_when_available(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
574
        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
575
        self.assertEqual(config.CHECK_IF_POSSIBLE,
576
                         self.my_config.signature_checking())
1442.1.13 by Robert Collins
branches.conf is now able to override the users email
577
        
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
578
    def test_signatures_always(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
579
        self.get_branch_config('/b')
1442.1.18 by Robert Collins
permit per branch location overriding of signature checking policy
580
        self.assertEqual(config.CHECK_ALWAYS,
581
                         self.my_config.signature_checking())
582
        
1442.1.56 by Robert Collins
gpg_signing_command configuration item
583
    def test_gpg_signing_command(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
584
        self.get_branch_config('/b')
1442.1.56 by Robert Collins
gpg_signing_command configuration item
585
        self.assertEqual("gnome-gpg", self.my_config.gpg_signing_command())
586
587
    def test_gpg_signing_command_missing(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
588
        self.get_branch_config('/a')
1442.1.56 by Robert Collins
gpg_signing_command configuration item
589
        self.assertEqual("false", self.my_config.gpg_signing_command())
590
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
591
    def test_get_user_option_global(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
592
        self.get_branch_config('/a')
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
593
        self.assertEqual('something',
594
                         self.my_config.get_user_option('user_global_option'))
595
596
    def test_get_user_option_local(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
597
        self.get_branch_config('/a')
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
598
        self.assertEqual('local',
599
                         self.my_config.get_user_option('user_local_option'))
1472 by Robert Collins
post commit hook, first pass implementation
600
        
601
    def test_post_commit_default(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
602
        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
603
        self.assertEqual('bzrlib.tests.test_config.post_commit',
1472 by Robert Collins
post commit hook, first pass implementation
604
                         self.my_config.post_commit())
1442.1.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
605
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
606
    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.
607
        if global_config is None:
1551.2.20 by Aaron Bentley
Treated config files as utf-8
608
            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.
609
        else:
1551.2.20 by Aaron Bentley
Treated config files as utf-8
610
            global_file = StringIO(global_config.encode('utf-8'))
611
        branches_file = StringIO(sample_branches_text.encode('utf-8'))
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
612
        self.my_config = config.BranchConfig(FakeBranch(location))
613
        # Force location config to use specified file
614
        self.my_location_config = self.my_config._get_location_config()
615
        self.my_location_config._get_parser(branches_file)
616
        # 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.
617
        self.my_config._get_global_config()._get_parser(global_file)
618
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
619
    def test_set_user_setting_sets_and_saves(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
620
        self.get_branch_config('/a/c')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
621
        record = InstrumentedConfigObj("foo")
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
622
        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
623
624
        real_mkdir = os.mkdir
625
        self.created = False
626
        def checked_mkdir(path, mode=0777):
627
            self.log('making directory: %s', path)
628
            real_mkdir(path, mode)
629
            self.created = True
630
631
        os.mkdir = checked_mkdir
632
        try:
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
633
            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
634
        finally:
635
            os.mkdir = real_mkdir
636
637
        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.
638
        self.assertEqual([('__contains__', '/a/c'),
639
                          ('__contains__', '/a/c/'),
640
                          ('__setitem__', '/a/c', {}),
641
                          ('__getitem__', '/a/c'),
642
                          ('__setitem__', 'foo', 'bar'),
643
                          ('write',)],
644
                         record._calls[1:])
645
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
646
    def test_set_user_setting_sets_and_saves2(self):
647
        self.get_branch_config('/a/c')
648
        self.assertIs(self.my_config.get_user_option('foo'), None)
649
        self.my_config.set_user_option('foo', 'bar')
650
        self.assertEqual(
651
            self.my_config.branch.control_files.files['branch.conf'], 
652
            'foo = bar')
653
        self.assertEqual(self.my_config.get_user_option('foo'), 'bar')
654
        self.my_config.set_user_option('foo', 'baz', local=True)
655
        self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
656
        self.my_config.set_user_option('foo', 'qux')
657
        self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
658
        
1185.62.7 by John Arbash Meinel
Whitespace cleanup.
659
1770.2.8 by Aaron Bentley
Add precedence test
660
precedence_global = 'option = global'
661
precedence_branch = 'option = branch'
662
precedence_location = """
663
[http://]
664
recurse = true
665
option = recurse
666
[http://example.com/specific]
667
option = exact
668
"""
669
670
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
671
class TestBranchConfigItems(TestCaseInTempDir):
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
672
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
673
    def get_branch_config(self, global_config=None, location=None, 
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
674
                          location_config=None, branch_data_config=None):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
675
        my_config = config.BranchConfig(FakeBranch(location))
676
        if global_config is not None:
677
            global_file = StringIO(global_config.encode('utf-8'))
678
            my_config._get_global_config()._get_parser(global_file)
679
        self.my_location_config = my_config._get_location_config()
680
        if location_config is not None:
681
            location_file = StringIO(location_config.encode('utf-8'))
682
            self.my_location_config._get_parser(location_file)
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
683
        if branch_data_config is not None:
684
            my_config.branch.control_files.files['branch.conf'] = \
685
                branch_data_config
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
686
        return my_config
687
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
688
    def test_user_id(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
689
        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
690
        my_config = config.BranchConfig(branch)
691
        self.assertEqual("Robert Collins <robertc@example.net>",
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
692
                         my_config.username())
1185.65.11 by Robert Collins
Disable inheritance for getting at LockableFiles, rather use composition.
693
        branch.control_files.email = "John"
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
694
        my_config.set_user_option('email', 
695
                                  "Robert Collins <robertc@example.org>")
696
        self.assertEqual("John", my_config.username())
697
        branch.control_files.email = None
698
        self.assertEqual("Robert Collins <robertc@example.org>",
699
                         my_config.username())
1442.1.6 by Robert Collins
first stage major overhaul of configs, giving use BranchConfigs, LocationConfigs and GlobalConfigs
700
701
    def test_not_set_in_branch(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
702
        my_config = self.get_branch_config(sample_config_text)
703
        my_config.branch.control_files.email = None
1551.2.21 by Aaron Bentley
Formatted unicode config tests as ASCII
704
        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
705
                         my_config._get_user_id())
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
706
        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
707
        self.assertEqual("John", my_config._get_user_id())
708
709
    def test_BZREMAIL_OVERRIDES(self):
710
        os.environ['BZREMAIL'] = "Robert Collins <robertc@example.org>"
711
        branch = FakeBranch()
712
        my_config = config.BranchConfig(branch)
713
        self.assertEqual("Robert Collins <robertc@example.org>",
714
                         my_config.username())
715
    
1442.1.19 by Robert Collins
BranchConfigs inherit signature_checking policy from their LocationConfig.
716
    def test_signatures_forced(self):
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
717
        my_config = self.get_branch_config(
718
            global_config=sample_always_signatures)
1770.2.1 by Aaron Bentley
Use create_signature for signing policy, deprecate check_signatures for this
719
        self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
720
        self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
721
        self.assertTrue(my_config.signature_needed())
1442.1.56 by Robert Collins
gpg_signing_command configuration item
722
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
723
    def test_signatures_forced_branch(self):
724
        my_config = self.get_branch_config(
725
            global_config=sample_ignore_signatures,
726
            branch_data_config=sample_always_signatures)
727
        self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
728
        self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
729
        self.assertTrue(my_config.signature_needed())
730
1442.1.56 by Robert Collins
gpg_signing_command configuration item
731
    def test_gpg_signing_command(self):
1770.2.10 by Aaron Bentley
Added test that branch_config can't influence gpg_signing_command
732
        my_config = self.get_branch_config(
733
            # branch data cannot set gpg_signing_command
734
            branch_data_config="gpg_signing_command=pgp")
1551.2.20 by Aaron Bentley
Treated config files as utf-8
735
        config_file = StringIO(sample_config_text.encode('utf-8'))
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
736
        my_config._get_global_config()._get_parser(config_file)
1442.1.56 by Robert Collins
gpg_signing_command configuration item
737
        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.
738
739
    def test_get_user_option_global(self):
740
        branch = FakeBranch()
741
        my_config = config.BranchConfig(branch)
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.69 by Robert Collins
config.Config has a 'get_user_option' call that accepts an option name.
744
        self.assertEqual('something',
745
                         my_config.get_user_option('user_global_option'))
1472 by Robert Collins
post commit hook, first pass implementation
746
747
    def test_post_commit_default(self):
748
        branch = FakeBranch()
1770.2.5 by Aaron Bentley
Integrate branch.conf into BranchConfig
749
        my_config = self.get_branch_config(sample_config_text, '/a/c',
750
                                           sample_branches_text)
751
        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
752
        self.assertEqual('bzrlib.tests.test_config.post_commit',
1472 by Robert Collins
post commit hook, first pass implementation
753
                         my_config.post_commit())
1770.2.6 by Aaron Bentley
Ensure branch.conf works properly
754
        my_config.set_user_option('post_commit', 'rmtree_root')
755
        # post-commit is ignored when bresent in branch data
756
        self.assertEqual('bzrlib.tests.test_config.post_commit',
757
                         my_config.post_commit())
758
        my_config.set_user_option('post_commit', 'rmtree_root', local=True)
759
        self.assertEqual('rmtree_root', my_config.post_commit())
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
760
1770.2.8 by Aaron Bentley
Add precedence test
761
    def test_config_precedence(self):
762
        my_config = self.get_branch_config(global_config=precedence_global)
763
        self.assertEqual(my_config.get_user_option('option'), 'global')
764
        my_config = self.get_branch_config(global_config=precedence_global, 
765
                                      branch_data_config=precedence_branch)
766
        self.assertEqual(my_config.get_user_option('option'), 'branch')
767
        my_config = self.get_branch_config(global_config=precedence_global, 
768
                                      branch_data_config=precedence_branch,
769
                                      location_config=precedence_location)
770
        self.assertEqual(my_config.get_user_option('option'), 'recurse')
771
        my_config = self.get_branch_config(global_config=precedence_global, 
772
                                      branch_data_config=precedence_branch,
773
                                      location_config=precedence_location,
774
                                      location='http://example.com/specific')
775
        self.assertEqual(my_config.get_user_option('option'), 'exact')
776
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
777
778
class TestMailAddressExtraction(TestCase):
779
780
    def test_extract_email_address(self):
781
        self.assertEqual('jane@test.com',
782
                         config.extract_email_address('Jane <jane@test.com>'))
783
        self.assertRaises(errors.BzrError,
784
                          config.extract_email_address, 'Jane Tester')