~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_config.py

  • Committer: Martin Pool
  • Date: 2005-09-06 02:26:28 UTC
  • Revision ID: mbp@sourcefrog.net-20050906022628-66d65f0feb4a9e80
- implement version 5 xml storage, and tests

  This stores files identified by the version that introduced the 
  text, and the version that introduced the name.  Entry kinds are
  given by the xml tag not an explicit kind field.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
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
20
 
from bzrlib.util.configobj.configobj import ConfigObj, ConfigObjError
21
 
from cStringIO import StringIO
22
 
import os
23
 
import sys
24
 
 
25
 
#import bzrlib specific imports here
26
 
import bzrlib.config as config
27
 
import bzrlib.errors as errors
28
 
from bzrlib.tests import TestCase, TestCaseInTempDir
29
 
 
30
 
 
31
 
sample_long_alias="log -r-15..-1 --line"
32
 
sample_config_text = ("[DEFAULT]\n"
33
 
                      u"email=Erik B\u00e5gfors <erik@bagfors.nu>\n"
34
 
                      "editor=vim\n"
35
 
                      "gpg_signing_command=gnome-gpg\n"
36
 
                      "log_format=short\n"
37
 
                      "user_global_option=something\n"
38
 
                      "[ALIASES]\n"
39
 
                      "h=help\n"
40
 
                      "ll=" + sample_long_alias + "\n")
41
 
 
42
 
 
43
 
sample_always_signatures = ("[DEFAULT]\n"
44
 
                            "check_signatures=require\n")
45
 
 
46
 
 
47
 
sample_ignore_signatures = ("[DEFAULT]\n"
48
 
                            "check_signatures=ignore\n")
49
 
 
50
 
 
51
 
sample_maybe_signatures = ("[DEFAULT]\n"
52
 
                            "check_signatures=check-available\n")
53
 
 
54
 
 
55
 
sample_branches_text = ("[http://www.example.com]\n"
56
 
                        "# Top level policy\n"
57
 
                        "email=Robert Collins <robertc@example.org>\n"
58
 
                        "[http://www.example.com/useglobal]\n"
59
 
                        "# different project, forces global lookup\n"
60
 
                        "recurse=false\n"
61
 
                        "[/b/]\n"
62
 
                        "check_signatures=require\n"
63
 
                        "# test trailing / matching with no children\n"
64
 
                        "[/a/]\n"
65
 
                        "check_signatures=check-available\n"
66
 
                        "gpg_signing_command=false\n"
67
 
                        "user_local_option=local\n"
68
 
                        "# test trailing / matching\n"
69
 
                        "[/a/*]\n"
70
 
                        "#subdirs will match but not the parent\n"
71
 
                        "recurse=False\n"
72
 
                        "[/a/c]\n"
73
 
                        "check_signatures=ignore\n"
74
 
                        "post_commit=bzrlib.tests.test_config.post_commit\n"
75
 
                        "#testing explicit beats globs\n")
76
 
 
77
 
 
78
 
 
79
 
class InstrumentedConfigObj(object):
80
 
    """A config obj look-enough-alike to record calls made to it."""
81
 
 
82
 
    def __contains__(self, thing):
83
 
        self._calls.append(('__contains__', thing))
84
 
        return False
85
 
 
86
 
    def __getitem__(self, key):
87
 
        self._calls.append(('__getitem__', key))
88
 
        return self
89
 
 
90
 
    def __init__(self, input, encoding=None):
91
 
        self._calls = [('__init__', input, encoding)]
92
 
 
93
 
    def __setitem__(self, key, value):
94
 
        self._calls.append(('__setitem__', key, value))
95
 
 
96
 
    def write(self, arg):
97
 
        self._calls.append(('write',))
98
 
 
99
 
 
100
 
class FakeBranch(object):
101
 
 
102
 
    def __init__(self):
103
 
        self.base = "http://example.com/branches/demo"
104
 
        self.control_files = FakeControlFiles()
105
 
 
106
 
 
107
 
class FakeControlFiles(object):
108
 
 
109
 
    def __init__(self):
110
 
        self.email = 'Robert Collins <robertc@example.net>\n'
111
 
 
112
 
    def get_utf8(self, filename):
113
 
        if filename != 'email':
114
 
            raise NotImplementedError
115
 
        if self.email is not None:
116
 
            return StringIO(self.email)
117
 
        raise errors.NoSuchFile(filename)
118
 
 
119
 
 
120
 
class InstrumentedConfig(config.Config):
121
 
    """An instrumented config that supplies stubs for template methods."""
122
 
    
123
 
    def __init__(self):
124
 
        super(InstrumentedConfig, self).__init__()
125
 
        self._calls = []
126
 
        self._signatures = config.CHECK_NEVER
127
 
 
128
 
    def _get_user_id(self):
129
 
        self._calls.append('_get_user_id')
130
 
        return "Robert Collins <robert.collins@example.org>"
131
 
 
132
 
    def _get_signature_checking(self):
133
 
        self._calls.append('_get_signature_checking')
134
 
        return self._signatures
135
 
 
136
 
 
137
 
bool_config = """[DEFAULT]
138
 
active = true
139
 
inactive = false
140
 
[UPPERCASE]
141
 
active = True
142
 
nonactive = False
143
 
"""
144
 
class TestConfigObj(TestCase):
145
 
    def test_get_bool(self):
146
 
        from bzrlib.config import ConfigObj
147
 
        co = ConfigObj(StringIO(bool_config))
148
 
        self.assertIs(co.get_bool('DEFAULT', 'active'), True)
149
 
        self.assertIs(co.get_bool('DEFAULT', 'inactive'), False)
150
 
        self.assertIs(co.get_bool('UPPERCASE', 'active'), True)
151
 
        self.assertIs(co.get_bool('UPPERCASE', 'nonactive'), False)
152
 
 
153
 
 
154
 
class TestConfig(TestCase):
155
 
 
156
 
    def test_constructs(self):
157
 
        config.Config()
158
 
 
159
 
    def test_no_default_editor(self):
160
 
        self.assertRaises(NotImplementedError, config.Config().get_editor)
161
 
 
162
 
    def test_user_email(self):
163
 
        my_config = InstrumentedConfig()
164
 
        self.assertEqual('robert.collins@example.org', my_config.user_email())
165
 
        self.assertEqual(['_get_user_id'], my_config._calls)
166
 
 
167
 
    def test_username(self):
168
 
        my_config = InstrumentedConfig()
169
 
        self.assertEqual('Robert Collins <robert.collins@example.org>',
170
 
                         my_config.username())
171
 
        self.assertEqual(['_get_user_id'], my_config._calls)
172
 
 
173
 
    def test_signatures_default(self):
174
 
        my_config = config.Config()
175
 
        self.assertEqual(config.CHECK_IF_POSSIBLE,
176
 
                         my_config.signature_checking())
177
 
 
178
 
    def test_signatures_template_method(self):
179
 
        my_config = InstrumentedConfig()
180
 
        self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
181
 
        self.assertEqual(['_get_signature_checking'], my_config._calls)
182
 
 
183
 
    def test_signatures_template_method_none(self):
184
 
        my_config = InstrumentedConfig()
185
 
        my_config._signatures = None
186
 
        self.assertEqual(config.CHECK_IF_POSSIBLE,
187
 
                         my_config.signature_checking())
188
 
        self.assertEqual(['_get_signature_checking'], my_config._calls)
189
 
 
190
 
    def test_gpg_signing_command_default(self):
191
 
        my_config = config.Config()
192
 
        self.assertEqual('gpg', my_config.gpg_signing_command())
193
 
 
194
 
    def test_get_user_option_default(self):
195
 
        my_config = config.Config()
196
 
        self.assertEqual(None, my_config.get_user_option('no_option'))
197
 
 
198
 
    def test_post_commit_default(self):
199
 
        my_config = config.Config()
200
 
        self.assertEqual(None, my_config.post_commit())
201
 
 
202
 
    def test_log_format_default(self):
203
 
        my_config = config.Config()
204
 
        self.assertEqual('long', my_config.log_format())
205
 
 
206
 
 
207
 
class TestConfigPath(TestCase):
208
 
 
209
 
    def setUp(self):
210
 
        super(TestConfigPath, self).setUp()
211
 
        self.old_home = os.environ.get('HOME', None)
212
 
        self.old_appdata = os.environ.get('APPDATA', None)
213
 
        os.environ['HOME'] = '/home/bogus'
214
 
        os.environ['APPDATA'] = \
215
 
            r'C:\Documents and Settings\bogus\Application Data'
216
 
 
217
 
    def tearDown(self):
218
 
        if self.old_home is None:
219
 
            del os.environ['HOME']
220
 
        else:
221
 
            os.environ['HOME'] = self.old_home
222
 
        if self.old_appdata is None:
223
 
            del os.environ['APPDATA']
224
 
        else:
225
 
            os.environ['APPDATA'] = self.old_appdata
226
 
        super(TestConfigPath, self).tearDown()
227
 
    
228
 
    def test_config_dir(self):
229
 
        if sys.platform == 'win32':
230
 
            self.assertEqual(config.config_dir(), 
231
 
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0')
232
 
        else:
233
 
            self.assertEqual(config.config_dir(), '/home/bogus/.bazaar')
234
 
 
235
 
    def test_config_filename(self):
236
 
        if sys.platform == 'win32':
237
 
            self.assertEqual(config.config_filename(), 
238
 
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/bazaar.conf')
239
 
        else:
240
 
            self.assertEqual(config.config_filename(),
241
 
                             '/home/bogus/.bazaar/bazaar.conf')
242
 
 
243
 
    def test_branches_config_filename(self):
244
 
        if sys.platform == 'win32':
245
 
            self.assertEqual(config.branches_config_filename(), 
246
 
                'C:/Documents and Settings/bogus/Application Data/bazaar/2.0/branches.conf')
247
 
        else:
248
 
            self.assertEqual(config.branches_config_filename(),
249
 
                             '/home/bogus/.bazaar/branches.conf')
250
 
 
251
 
class TestIniConfig(TestCase):
252
 
 
253
 
    def test_contructs(self):
254
 
        my_config = config.IniBasedConfig("nothing")
255
 
 
256
 
    def test_from_fp(self):
257
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
258
 
        my_config = config.IniBasedConfig(None)
259
 
        self.failUnless(
260
 
            isinstance(my_config._get_parser(file=config_file),
261
 
                        ConfigObj))
262
 
 
263
 
    def test_cached(self):
264
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
265
 
        my_config = config.IniBasedConfig(None)
266
 
        parser = my_config._get_parser(file=config_file)
267
 
        self.failUnless(my_config._get_parser() is parser)
268
 
 
269
 
 
270
 
class TestGetConfig(TestCase):
271
 
 
272
 
    def test_constructs(self):
273
 
        my_config = config.GlobalConfig()
274
 
 
275
 
    def test_calls_read_filenames(self):
276
 
        # replace the class that is constructured, to check its parameters
277
 
        oldparserclass = config.ConfigObj
278
 
        config.ConfigObj = InstrumentedConfigObj
279
 
        my_config = config.GlobalConfig()
280
 
        try:
281
 
            parser = my_config._get_parser()
282
 
        finally:
283
 
            config.ConfigObj = oldparserclass
284
 
        self.failUnless(isinstance(parser, InstrumentedConfigObj))
285
 
        self.assertEqual(parser._calls, [('__init__', config.config_filename(),
286
 
                                          'utf-8')])
287
 
 
288
 
 
289
 
class TestBranchConfig(TestCaseInTempDir):
290
 
 
291
 
    def test_constructs(self):
292
 
        branch = FakeBranch()
293
 
        my_config = config.BranchConfig(branch)
294
 
        self.assertRaises(TypeError, config.BranchConfig)
295
 
 
296
 
    def test_get_location_config(self):
297
 
        branch = FakeBranch()
298
 
        my_config = config.BranchConfig(branch)
299
 
        location_config = my_config._get_location_config()
300
 
        self.assertEqual(branch.base, location_config.location)
301
 
        self.failUnless(location_config is my_config._get_location_config())
302
 
 
303
 
 
304
 
class TestGlobalConfigItems(TestCase):
305
 
 
306
 
    def test_user_id(self):
307
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
308
 
        my_config = config.GlobalConfig()
309
 
        my_config._parser = my_config._get_parser(file=config_file)
310
 
        self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
311
 
                         my_config._get_user_id())
312
 
 
313
 
    def test_absent_user_id(self):
314
 
        config_file = StringIO("")
315
 
        my_config = config.GlobalConfig()
316
 
        my_config._parser = my_config._get_parser(file=config_file)
317
 
        self.assertEqual(None, my_config._get_user_id())
318
 
 
319
 
    def test_configured_editor(self):
320
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
321
 
        my_config = config.GlobalConfig()
322
 
        my_config._parser = my_config._get_parser(file=config_file)
323
 
        self.assertEqual("vim", my_config.get_editor())
324
 
 
325
 
    def test_signatures_always(self):
326
 
        config_file = StringIO(sample_always_signatures)
327
 
        my_config = config.GlobalConfig()
328
 
        my_config._parser = my_config._get_parser(file=config_file)
329
 
        self.assertEqual(config.CHECK_ALWAYS,
330
 
                         my_config.signature_checking())
331
 
        self.assertEqual(True, my_config.signature_needed())
332
 
 
333
 
    def test_signatures_if_possible(self):
334
 
        config_file = StringIO(sample_maybe_signatures)
335
 
        my_config = config.GlobalConfig()
336
 
        my_config._parser = my_config._get_parser(file=config_file)
337
 
        self.assertEqual(config.CHECK_IF_POSSIBLE,
338
 
                         my_config.signature_checking())
339
 
        self.assertEqual(False, my_config.signature_needed())
340
 
 
341
 
    def test_signatures_ignore(self):
342
 
        config_file = StringIO(sample_ignore_signatures)
343
 
        my_config = config.GlobalConfig()
344
 
        my_config._parser = my_config._get_parser(file=config_file)
345
 
        self.assertEqual(config.CHECK_NEVER,
346
 
                         my_config.signature_checking())
347
 
        self.assertEqual(False, my_config.signature_needed())
348
 
 
349
 
    def _get_sample_config(self):
350
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
351
 
        my_config = config.GlobalConfig()
352
 
        my_config._parser = my_config._get_parser(file=config_file)
353
 
        return my_config
354
 
 
355
 
    def test_gpg_signing_command(self):
356
 
        my_config = self._get_sample_config()
357
 
        self.assertEqual("gnome-gpg", my_config.gpg_signing_command())
358
 
        self.assertEqual(False, my_config.signature_needed())
359
 
 
360
 
    def _get_empty_config(self):
361
 
        config_file = StringIO("")
362
 
        my_config = config.GlobalConfig()
363
 
        my_config._parser = my_config._get_parser(file=config_file)
364
 
        return my_config
365
 
 
366
 
    def test_gpg_signing_command_unset(self):
367
 
        my_config = self._get_empty_config()
368
 
        self.assertEqual("gpg", my_config.gpg_signing_command())
369
 
 
370
 
    def test_get_user_option_default(self):
371
 
        my_config = self._get_empty_config()
372
 
        self.assertEqual(None, my_config.get_user_option('no_option'))
373
 
 
374
 
    def test_get_user_option_global(self):
375
 
        my_config = self._get_sample_config()
376
 
        self.assertEqual("something",
377
 
                         my_config.get_user_option('user_global_option'))
378
 
        
379
 
    def test_post_commit_default(self):
380
 
        my_config = self._get_sample_config()
381
 
        self.assertEqual(None, my_config.post_commit())
382
 
 
383
 
    def test_configured_logformat(self):
384
 
        my_config = self._get_sample_config()
385
 
        self.assertEqual("short", my_config.log_format())
386
 
 
387
 
    def test_get_alias(self):
388
 
        my_config = self._get_sample_config()
389
 
        self.assertEqual('help', my_config.get_alias('h'))
390
 
 
391
 
    def test_get_no_alias(self):
392
 
        my_config = self._get_sample_config()
393
 
        self.assertEqual(None, my_config.get_alias('foo'))
394
 
 
395
 
    def test_get_long_alias(self):
396
 
        my_config = self._get_sample_config()
397
 
        self.assertEqual(sample_long_alias, my_config.get_alias('ll'))
398
 
 
399
 
 
400
 
class TestLocationConfig(TestCaseInTempDir):
401
 
 
402
 
    def test_constructs(self):
403
 
        my_config = config.LocationConfig('http://example.com')
404
 
        self.assertRaises(TypeError, config.LocationConfig)
405
 
 
406
 
    def test_branch_calls_read_filenames(self):
407
 
        # This is testing the correct file names are provided.
408
 
        # TODO: consolidate with the test for GlobalConfigs filename checks.
409
 
        #
410
 
        # replace the class that is constructured, to check its parameters
411
 
        oldparserclass = config.ConfigObj
412
 
        config.ConfigObj = InstrumentedConfigObj
413
 
        my_config = config.LocationConfig('http://www.example.com')
414
 
        try:
415
 
            parser = my_config._get_parser()
416
 
        finally:
417
 
            config.ConfigObj = oldparserclass
418
 
        self.failUnless(isinstance(parser, InstrumentedConfigObj))
419
 
        self.assertEqual(parser._calls,
420
 
                         [('__init__', config.branches_config_filename(),
421
 
                           'utf-8')])
422
 
 
423
 
    def test_get_global_config(self):
424
 
        my_config = config.LocationConfig('http://example.com')
425
 
        global_config = my_config._get_global_config()
426
 
        self.failUnless(isinstance(global_config, config.GlobalConfig))
427
 
        self.failUnless(global_config is my_config._get_global_config())
428
 
 
429
 
    def test__get_section_no_match(self):
430
 
        self.get_location_config('/')
431
 
        self.assertEqual(None, self.my_config._get_section())
432
 
        
433
 
    def test__get_section_exact(self):
434
 
        self.get_location_config('http://www.example.com')
435
 
        self.assertEqual('http://www.example.com',
436
 
                         self.my_config._get_section())
437
 
   
438
 
    def test__get_section_suffix_does_not(self):
439
 
        self.get_location_config('http://www.example.com-com')
440
 
        self.assertEqual(None, self.my_config._get_section())
441
 
 
442
 
    def test__get_section_subdir_recursive(self):
443
 
        self.get_location_config('http://www.example.com/com')
444
 
        self.assertEqual('http://www.example.com',
445
 
                         self.my_config._get_section())
446
 
 
447
 
    def test__get_section_subdir_matches(self):
448
 
        self.get_location_config('http://www.example.com/useglobal')
449
 
        self.assertEqual('http://www.example.com/useglobal',
450
 
                         self.my_config._get_section())
451
 
 
452
 
    def test__get_section_subdir_nonrecursive(self):
453
 
        self.get_location_config(
454
 
            'http://www.example.com/useglobal/childbranch')
455
 
        self.assertEqual('http://www.example.com',
456
 
                         self.my_config._get_section())
457
 
 
458
 
    def test__get_section_subdir_trailing_slash(self):
459
 
        self.get_location_config('/b')
460
 
        self.assertEqual('/b/', self.my_config._get_section())
461
 
 
462
 
    def test__get_section_subdir_child(self):
463
 
        self.get_location_config('/a/foo')
464
 
        self.assertEqual('/a/*', self.my_config._get_section())
465
 
 
466
 
    def test__get_section_subdir_child_child(self):
467
 
        self.get_location_config('/a/foo/bar')
468
 
        self.assertEqual('/a/', self.my_config._get_section())
469
 
 
470
 
    def test__get_section_trailing_slash_with_children(self):
471
 
        self.get_location_config('/a/')
472
 
        self.assertEqual('/a/', self.my_config._get_section())
473
 
 
474
 
    def test__get_section_explicit_over_glob(self):
475
 
        self.get_location_config('/a/c')
476
 
        self.assertEqual('/a/c', self.my_config._get_section())
477
 
 
478
 
 
479
 
    def test_location_without_username(self):
480
 
        self.get_location_config('http://www.example.com/useglobal')
481
 
        self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
482
 
                         self.my_config.username())
483
 
 
484
 
    def test_location_not_listed(self):
485
 
        """Test that the global username is used when no location matches"""
486
 
        self.get_location_config('/home/robertc/sources')
487
 
        self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
488
 
                         self.my_config.username())
489
 
 
490
 
    def test_overriding_location(self):
491
 
        self.get_location_config('http://www.example.com/foo')
492
 
        self.assertEqual('Robert Collins <robertc@example.org>',
493
 
                         self.my_config.username())
494
 
 
495
 
    def test_signatures_not_set(self):
496
 
        self.get_location_config('http://www.example.com',
497
 
                                 global_config=sample_ignore_signatures)
498
 
        self.assertEqual(config.CHECK_NEVER,
499
 
                         self.my_config.signature_checking())
500
 
 
501
 
    def test_signatures_never(self):
502
 
        self.get_location_config('/a/c')
503
 
        self.assertEqual(config.CHECK_NEVER,
504
 
                         self.my_config.signature_checking())
505
 
        
506
 
    def test_signatures_when_available(self):
507
 
        self.get_location_config('/a/', global_config=sample_ignore_signatures)
508
 
        self.assertEqual(config.CHECK_IF_POSSIBLE,
509
 
                         self.my_config.signature_checking())
510
 
        
511
 
    def test_signatures_always(self):
512
 
        self.get_location_config('/b')
513
 
        self.assertEqual(config.CHECK_ALWAYS,
514
 
                         self.my_config.signature_checking())
515
 
        
516
 
    def test_gpg_signing_command(self):
517
 
        self.get_location_config('/b')
518
 
        self.assertEqual("gnome-gpg", self.my_config.gpg_signing_command())
519
 
 
520
 
    def test_gpg_signing_command_missing(self):
521
 
        self.get_location_config('/a')
522
 
        self.assertEqual("false", self.my_config.gpg_signing_command())
523
 
 
524
 
    def test_get_user_option_global(self):
525
 
        self.get_location_config('/a')
526
 
        self.assertEqual('something',
527
 
                         self.my_config.get_user_option('user_global_option'))
528
 
 
529
 
    def test_get_user_option_local(self):
530
 
        self.get_location_config('/a')
531
 
        self.assertEqual('local',
532
 
                         self.my_config.get_user_option('user_local_option'))
533
 
        
534
 
    def test_post_commit_default(self):
535
 
        self.get_location_config('/a/c')
536
 
        self.assertEqual('bzrlib.tests.test_config.post_commit',
537
 
                         self.my_config.post_commit())
538
 
 
539
 
    def get_location_config(self, location, global_config=None):
540
 
        if global_config is None:
541
 
            global_file = StringIO(sample_config_text.encode('utf-8'))
542
 
        else:
543
 
            global_file = StringIO(global_config.encode('utf-8'))
544
 
        branches_file = StringIO(sample_branches_text.encode('utf-8'))
545
 
        self.my_config = config.LocationConfig(location)
546
 
        self.my_config._get_parser(branches_file)
547
 
        self.my_config._get_global_config()._get_parser(global_file)
548
 
 
549
 
    def test_set_user_setting_sets_and_saves(self):
550
 
        self.get_location_config('/a/c')
551
 
        record = InstrumentedConfigObj("foo")
552
 
        self.my_config._parser = record
553
 
 
554
 
        real_mkdir = os.mkdir
555
 
        self.created = False
556
 
        def checked_mkdir(path, mode=0777):
557
 
            self.log('making directory: %s', path)
558
 
            real_mkdir(path, mode)
559
 
            self.created = True
560
 
 
561
 
        os.mkdir = checked_mkdir
562
 
        try:
563
 
            self.my_config.set_user_option('foo', 'bar')
564
 
        finally:
565
 
            os.mkdir = real_mkdir
566
 
 
567
 
        self.failUnless(self.created, 'Failed to create ~/.bazaar')
568
 
        self.assertEqual([('__contains__', '/a/c'),
569
 
                          ('__contains__', '/a/c/'),
570
 
                          ('__setitem__', '/a/c', {}),
571
 
                          ('__getitem__', '/a/c'),
572
 
                          ('__setitem__', 'foo', 'bar'),
573
 
                          ('write',)],
574
 
                         record._calls[1:])
575
 
 
576
 
 
577
 
class TestBranchConfigItems(TestCase):
578
 
 
579
 
    def test_user_id(self):
580
 
        branch = FakeBranch()
581
 
        my_config = config.BranchConfig(branch)
582
 
        self.assertEqual("Robert Collins <robertc@example.net>",
583
 
                         my_config._get_user_id())
584
 
        branch.control_files.email = "John"
585
 
        self.assertEqual("John", my_config._get_user_id())
586
 
 
587
 
    def test_not_set_in_branch(self):
588
 
        branch = FakeBranch()
589
 
        my_config = config.BranchConfig(branch)
590
 
        branch.control_files.email = None
591
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
592
 
        (my_config._get_location_config().
593
 
            _get_global_config()._get_parser(config_file))
594
 
        self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
595
 
                         my_config._get_user_id())
596
 
        branch.control_files.email = "John"
597
 
        self.assertEqual("John", my_config._get_user_id())
598
 
 
599
 
    def test_BZREMAIL_OVERRIDES(self):
600
 
        os.environ['BZREMAIL'] = "Robert Collins <robertc@example.org>"
601
 
        branch = FakeBranch()
602
 
        my_config = config.BranchConfig(branch)
603
 
        self.assertEqual("Robert Collins <robertc@example.org>",
604
 
                         my_config.username())
605
 
    
606
 
    def test_signatures_forced(self):
607
 
        branch = FakeBranch()
608
 
        my_config = config.BranchConfig(branch)
609
 
        config_file = StringIO(sample_always_signatures)
610
 
        (my_config._get_location_config().
611
 
            _get_global_config()._get_parser(config_file))
612
 
        self.assertEqual(config.CHECK_ALWAYS, my_config.signature_checking())
613
 
 
614
 
    def test_gpg_signing_command(self):
615
 
        branch = FakeBranch()
616
 
        my_config = config.BranchConfig(branch)
617
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
618
 
        (my_config._get_location_config().
619
 
            _get_global_config()._get_parser(config_file))
620
 
        self.assertEqual('gnome-gpg', my_config.gpg_signing_command())
621
 
 
622
 
    def test_get_user_option_global(self):
623
 
        branch = FakeBranch()
624
 
        my_config = config.BranchConfig(branch)
625
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
626
 
        (my_config._get_location_config().
627
 
            _get_global_config()._get_parser(config_file))
628
 
        self.assertEqual('something',
629
 
                         my_config.get_user_option('user_global_option'))
630
 
 
631
 
    def test_post_commit_default(self):
632
 
        branch = FakeBranch()
633
 
        branch.base='/a/c'
634
 
        my_config = config.BranchConfig(branch)
635
 
        config_file = StringIO(sample_config_text.encode('utf-8'))
636
 
        (my_config._get_location_config().
637
 
            _get_global_config()._get_parser(config_file))
638
 
        branch_file = StringIO(sample_branches_text)
639
 
        my_config._get_location_config()._get_parser(branch_file)
640
 
        self.assertEqual('bzrlib.tests.test_config.post_commit',
641
 
                         my_config.post_commit())
642
 
 
643
 
 
644
 
class TestMailAddressExtraction(TestCase):
645
 
 
646
 
    def test_extract_email_address(self):
647
 
        self.assertEqual('jane@test.com',
648
 
                         config.extract_email_address('Jane <jane@test.com>'))
649
 
        self.assertRaises(errors.BzrError,
650
 
                          config.extract_email_address, 'Jane Tester')