/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Vincent Ladeuil
  • Date: 2012-01-18 14:09:19 UTC
  • mto: This revision was merged to the branch mainline in revision 6468.
  • Revision ID: v.ladeuil+lp@free.fr-20120118140919-rlvdrhpc0nq1lbwi
Change set/remove to require a lock for the branch config files.

This means that tests (or any plugin for that matter) do not requires an
explicit lock on the branch anymore to change a single option. This also
means the optimisation becomes "opt-in" and as such won't be as
spectacular as it may be and/or harder to get right (nothing fails
anymore).

This reduces the diff by ~300 lines.

Code/tests that were updating more than one config option is still taking
a lock to at least avoid some IOs and demonstrate the benefits through
the decreased number of hpss calls.

The duplication between BranchStack and BranchOnlyStack will be removed
once the same sharing is in place for local config files, at which point
the Stack class itself may be able to host the changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005-2010 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
"""Test testaments for gpg signing."""
 
18
 
 
19
# TODO: Testaments with x-bits
 
20
 
 
21
import os
 
22
 
 
23
from bzrlib import osutils
 
24
from bzrlib.tests import TestCaseWithTransport
 
25
from bzrlib.testament import (
 
26
    Testament,
 
27
    StrictTestament,
 
28
    StrictTestament3,
 
29
    )
 
30
from bzrlib.transform import TreeTransform
 
31
from bzrlib.tests.features import (
 
32
    SymlinkFeature,
 
33
    )
 
34
 
 
35
 
 
36
class TestamentSetup(TestCaseWithTransport):
 
37
 
 
38
    def setUp(self):
 
39
        super(TestamentSetup, self).setUp()
 
40
        self.wt = self.make_branch_and_tree('.', format='dirstate-with-subtree')
 
41
        self.wt.set_root_id('TREE_ROT')
 
42
        b = self.b = self.wt.branch
 
43
        b.nick = "test branch"
 
44
        self.wt.commit(message='initial null commit',
 
45
                 committer='test@user',
 
46
                 timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
 
47
                 timezone=0,
 
48
                 rev_id='test@user-1')
 
49
        self.build_tree_contents([('hello', 'contents of hello file'),
 
50
                             ('src/', ),
 
51
                             ('src/foo.c', 'int main()\n{\n}\n')])
 
52
        self.wt.add(['hello', 'src', 'src/foo.c'],
 
53
                             ['hello-id', 'src-id', 'foo.c-id'])
 
54
        tt = TreeTransform(self.wt)
 
55
        trans_id = tt.trans_id_tree_path('hello')
 
56
        tt.set_executability(True, trans_id)
 
57
        tt.apply()
 
58
        self.wt.commit(message='add files and directories',
 
59
                 timestamp=1129025483,
 
60
                 timezone=36000,
 
61
                 rev_id='test@user-2',
 
62
                 committer='test@user')
 
63
 
 
64
 
 
65
class TestamentTests(TestamentSetup):
 
66
 
 
67
    def testament_class(self):
 
68
        return Testament
 
69
 
 
70
    def expected(self, key):
 
71
        return texts[self.testament_class()][key]
 
72
 
 
73
    def from_revision(self, repository, revision_id):
 
74
        return self.testament_class().from_revision(repository, revision_id)
 
75
 
 
76
    def test_null_testament(self):
 
77
        """Testament for a revision with no contents."""
 
78
        t = self.from_revision(self.b.repository, 'test@user-1')
 
79
        ass = self.assertTrue
 
80
        eq = self.assertEqual
 
81
        ass(isinstance(t, Testament))
 
82
        eq(t.revision_id, 'test@user-1')
 
83
        eq(t.committer, 'test@user')
 
84
        eq(t.timestamp, 1129025423)
 
85
        eq(t.timezone, 0)
 
86
 
 
87
    def test_testment_text_form(self):
 
88
        """Conversion of testament to canonical text form."""
 
89
        t = self.from_revision(self.b.repository, 'test@user-1')
 
90
        text_form = t.as_text()
 
91
        self.log('testament text form:\n' + text_form)
 
92
        self.assertEqualDiff(text_form, self.expected('rev_1'))
 
93
        short_text_form = t.as_short_text()
 
94
        self.assertEqualDiff(short_text_form, self.expected('rev_1_short'))
 
95
 
 
96
    def test_testament_with_contents(self):
 
97
        """Testament containing a file and a directory."""
 
98
        t = self.from_revision(self.b.repository, 'test@user-2')
 
99
        text_form = t.as_text()
 
100
        self.log('testament text form:\n' + text_form)
 
101
        self.assertEqualDiff(text_form, self.expected('rev_2'))
 
102
        actual_short = t.as_short_text()
 
103
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
 
104
 
 
105
    def test_testament_symlinks(self):
 
106
        """Testament containing symlink (where possible)"""
 
107
        self.requireFeature(SymlinkFeature)
 
108
        os.symlink('wibble/linktarget', 'link')
 
109
        self.wt.add(['link'], ['link-id'])
 
110
        self.wt.commit(message='add symlink',
 
111
                 timestamp=1129025493,
 
112
                 timezone=36000,
 
113
                 rev_id='test@user-3',
 
114
                 committer='test@user')
 
115
        t = self.from_revision(self.b.repository, 'test@user-3')
 
116
        self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
 
117
 
 
118
    def test_testament_revprops(self):
 
119
        """Testament to revision with extra properties"""
 
120
        props = dict(flavor='sour cherry\ncream cheese',
 
121
                     size='medium',
 
122
                     empty='',
 
123
                    )
 
124
        self.wt.commit(message='revision with properties',
 
125
                      timestamp=1129025493,
 
126
                      timezone=36000,
 
127
                      rev_id='test@user-3',
 
128
                      committer='test@user',
 
129
                      revprops=props)
 
130
        t = self.from_revision(self.b.repository, 'test@user-3')
 
131
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
 
132
 
 
133
    def test_testament_unicode_commit_message(self):
 
134
        self.wt.commit(
 
135
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
 
136
            timestamp=1129025493,
 
137
            timezone=36000,
 
138
            rev_id='test@user-3',
 
139
            committer=u'Erik B\xe5gfors <test@user>',
 
140
            revprops={'uni':u'\xb5'}
 
141
            )
 
142
        t = self.from_revision(self.b.repository, 'test@user-3')
 
143
        self.assertEqualDiff(
 
144
            self.expected('sample_unicode').encode('utf-8'), t.as_text())
 
145
 
 
146
    def test_from_tree(self):
 
147
        tree = self.b.repository.revision_tree('test@user-2')
 
148
        testament = self.testament_class().from_revision_tree(tree)
 
149
        text_1 = testament.as_short_text()
 
150
        text_2 = self.from_revision(self.b.repository,
 
151
                                    'test@user-2').as_short_text()
 
152
        self.assertEqual(text_1, text_2)
 
153
 
 
154
    def test___init__(self):
 
155
        revision = self.b.repository.get_revision('test@user-2')
 
156
        tree = self.b.repository.revision_tree('test@user-2')
 
157
        testament_1 = self.testament_class()(revision, tree)
 
158
        text_1 = testament_1.as_short_text()
 
159
        text_2 = self.from_revision(self.b.repository,
 
160
                                    'test@user-2').as_short_text()
 
161
        self.assertEqual(text_1, text_2)
 
162
 
 
163
 
 
164
class TestamentTestsStrict(TestamentTests):
 
165
 
 
166
    def testament_class(self):
 
167
        return StrictTestament
 
168
 
 
169
 
 
170
class TestamentTestsStrict2(TestamentTests):
 
171
 
 
172
    def testament_class(self):
 
173
        return StrictTestament3
 
174
 
 
175
 
 
176
REV_1_TESTAMENT = """\
 
177
bazaar-ng testament version 1
 
178
revision-id: test@user-1
 
179
committer: test@user
 
180
timestamp: 1129025423
 
181
timezone: 0
 
182
parents:
 
183
message:
 
184
  initial null commit
 
185
inventory:
 
186
properties:
 
187
  branch-nick:
 
188
    test branch
 
189
"""
 
190
 
 
191
 
 
192
REV_1_STRICT_TESTAMENT = """\
 
193
bazaar-ng testament version 2.1
 
194
revision-id: test@user-1
 
195
committer: test@user
 
196
timestamp: 1129025423
 
197
timezone: 0
 
198
parents:
 
199
message:
 
200
  initial null commit
 
201
inventory:
 
202
properties:
 
203
  branch-nick:
 
204
    test branch
 
205
"""
 
206
 
 
207
 
 
208
REV_1_STRICT_TESTAMENT3 = """\
 
209
bazaar testament version 3 strict
 
210
revision-id: test@user-1
 
211
committer: test@user
 
212
timestamp: 1129025423
 
213
timezone: 0
 
214
parents:
 
215
message:
 
216
  initial null commit
 
217
inventory:
 
218
  directory . TREE_ROT test@user-1 no
 
219
properties:
 
220
  branch-nick:
 
221
    test branch
 
222
"""
 
223
 
 
224
 
 
225
REV_1_SHORT = """\
 
226
bazaar-ng testament short form 1
 
227
revision-id: test@user-1
 
228
sha1: %s
 
229
""" % osutils.sha_string(REV_1_TESTAMENT)
 
230
 
 
231
 
 
232
REV_1_SHORT_STRICT = """\
 
233
bazaar-ng testament short form 2.1
 
234
revision-id: test@user-1
 
235
sha1: %s
 
236
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT)
 
237
 
 
238
 
 
239
REV_1_SHORT_STRICT3 = """\
 
240
bazaar testament short form 3 strict
 
241
revision-id: test@user-1
 
242
sha1: %s
 
243
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT3)
 
244
 
 
245
 
 
246
REV_2_TESTAMENT = """\
 
247
bazaar-ng testament version 1
 
248
revision-id: test@user-2
 
249
committer: test@user
 
250
timestamp: 1129025483
 
251
timezone: 36000
 
252
parents:
 
253
  test@user-1
 
254
message:
 
255
  add files and directories
 
256
inventory:
 
257
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
258
  directory src src-id
 
259
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
260
properties:
 
261
  branch-nick:
 
262
    test branch
 
263
"""
 
264
 
 
265
 
 
266
REV_2_STRICT_TESTAMENT = """\
 
267
bazaar-ng testament version 2.1
 
268
revision-id: test@user-2
 
269
committer: test@user
 
270
timestamp: 1129025483
 
271
timezone: 36000
 
272
parents:
 
273
  test@user-1
 
274
message:
 
275
  add files and directories
 
276
inventory:
 
277
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
278
  directory src src-id test@user-2 no
 
279
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
280
properties:
 
281
  branch-nick:
 
282
    test branch
 
283
"""
 
284
 
 
285
 
 
286
REV_2_STRICT_TESTAMENT3 = """\
 
287
bazaar testament version 3 strict
 
288
revision-id: test@user-2
 
289
committer: test@user
 
290
timestamp: 1129025483
 
291
timezone: 36000
 
292
parents:
 
293
  test@user-1
 
294
message:
 
295
  add files and directories
 
296
inventory:
 
297
  directory . TREE_ROT test@user-1 no
 
298
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
299
  directory src src-id test@user-2 no
 
300
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
301
properties:
 
302
  branch-nick:
 
303
    test branch
 
304
"""
 
305
 
 
306
 
 
307
REV_2_SHORT = """\
 
308
bazaar-ng testament short form 1
 
309
revision-id: test@user-2
 
310
sha1: %s
 
311
""" % osutils.sha_string(REV_2_TESTAMENT)
 
312
 
 
313
 
 
314
REV_2_SHORT_STRICT = """\
 
315
bazaar-ng testament short form 2.1
 
316
revision-id: test@user-2
 
317
sha1: %s
 
318
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT)
 
319
 
 
320
 
 
321
REV_2_SHORT_STRICT3 = """\
 
322
bazaar testament short form 3 strict
 
323
revision-id: test@user-2
 
324
sha1: %s
 
325
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT3)
 
326
 
 
327
 
 
328
REV_PROPS_TESTAMENT = """\
 
329
bazaar-ng testament version 1
 
330
revision-id: test@user-3
 
331
committer: test@user
 
332
timestamp: 1129025493
 
333
timezone: 36000
 
334
parents:
 
335
  test@user-2
 
336
message:
 
337
  revision with properties
 
338
inventory:
 
339
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
340
  directory src src-id
 
341
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
342
properties:
 
343
  branch-nick:
 
344
    test branch
 
345
  empty:
 
346
  flavor:
 
347
    sour cherry
 
348
    cream cheese
 
349
  size:
 
350
    medium
 
351
"""
 
352
 
 
353
 
 
354
REV_PROPS_TESTAMENT_STRICT = """\
 
355
bazaar-ng testament version 2.1
 
356
revision-id: test@user-3
 
357
committer: test@user
 
358
timestamp: 1129025493
 
359
timezone: 36000
 
360
parents:
 
361
  test@user-2
 
362
message:
 
363
  revision with properties
 
364
inventory:
 
365
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
366
  directory src src-id test@user-2 no
 
367
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
368
properties:
 
369
  branch-nick:
 
370
    test branch
 
371
  empty:
 
372
  flavor:
 
373
    sour cherry
 
374
    cream cheese
 
375
  size:
 
376
    medium
 
377
"""
 
378
 
 
379
 
 
380
REV_PROPS_TESTAMENT_STRICT3 = """\
 
381
bazaar testament version 3 strict
 
382
revision-id: test@user-3
 
383
committer: test@user
 
384
timestamp: 1129025493
 
385
timezone: 36000
 
386
parents:
 
387
  test@user-2
 
388
message:
 
389
  revision with properties
 
390
inventory:
 
391
  directory . TREE_ROT test@user-1 no
 
392
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
393
  directory src src-id test@user-2 no
 
394
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
395
properties:
 
396
  branch-nick:
 
397
    test branch
 
398
  empty:
 
399
  flavor:
 
400
    sour cherry
 
401
    cream cheese
 
402
  size:
 
403
    medium
 
404
"""
 
405
 
 
406
 
 
407
REV_3_TESTAMENT = """\
 
408
bazaar-ng testament version 1
 
409
revision-id: test@user-3
 
410
committer: test@user
 
411
timestamp: 1129025493
 
412
timezone: 36000
 
413
parents:
 
414
  test@user-2
 
415
message:
 
416
  add symlink
 
417
inventory:
 
418
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
419
  symlink link link-id wibble/linktarget
 
420
  directory src src-id
 
421
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
422
properties:
 
423
  branch-nick:
 
424
    test branch
 
425
"""
 
426
 
 
427
 
 
428
REV_3_TESTAMENT_STRICT = """\
 
429
bazaar-ng testament version 2.1
 
430
revision-id: test@user-3
 
431
committer: test@user
 
432
timestamp: 1129025493
 
433
timezone: 36000
 
434
parents:
 
435
  test@user-2
 
436
message:
 
437
  add symlink
 
438
inventory:
 
439
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
440
  symlink link link-id wibble/linktarget test@user-3 no
 
441
  directory src src-id test@user-2 no
 
442
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
443
properties:
 
444
  branch-nick:
 
445
    test branch
 
446
"""
 
447
 
 
448
 
 
449
REV_3_TESTAMENT_STRICT3 = """\
 
450
bazaar testament version 3 strict
 
451
revision-id: test@user-3
 
452
committer: test@user
 
453
timestamp: 1129025493
 
454
timezone: 36000
 
455
parents:
 
456
  test@user-2
 
457
message:
 
458
  add symlink
 
459
inventory:
 
460
  directory . TREE_ROT test@user-1 no
 
461
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
462
  symlink link link-id wibble/linktarget test@user-3 no
 
463
  directory src src-id test@user-2 no
 
464
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
465
properties:
 
466
  branch-nick:
 
467
    test branch
 
468
"""
 
469
 
 
470
 
 
471
SAMPLE_UNICODE_TESTAMENT = u"""\
 
472
bazaar-ng testament version 1
 
473
revision-id: test@user-3
 
474
committer: Erik B\xe5gfors <test@user>
 
475
timestamp: 1129025493
 
476
timezone: 36000
 
477
parents:
 
478
  test@user-2
 
479
message:
 
480
  non-ascii commit \N{COPYRIGHT SIGN} me
 
481
inventory:
 
482
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
483
  directory src src-id
 
484
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
485
properties:
 
486
  branch-nick:
 
487
    test branch
 
488
  uni:
 
489
    \xb5
 
490
"""
 
491
 
 
492
 
 
493
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
 
494
bazaar-ng testament version 2.1
 
495
revision-id: test@user-3
 
496
committer: Erik B\xe5gfors <test@user>
 
497
timestamp: 1129025493
 
498
timezone: 36000
 
499
parents:
 
500
  test@user-2
 
501
message:
 
502
  non-ascii commit \N{COPYRIGHT SIGN} me
 
503
inventory:
 
504
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
505
  directory src src-id test@user-2 no
 
506
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
507
properties:
 
508
  branch-nick:
 
509
    test branch
 
510
  uni:
 
511
    \xb5
 
512
"""
 
513
 
 
514
 
 
515
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
 
516
bazaar testament version 3 strict
 
517
revision-id: test@user-3
 
518
committer: Erik B\xe5gfors <test@user>
 
519
timestamp: 1129025493
 
520
timezone: 36000
 
521
parents:
 
522
  test@user-2
 
523
message:
 
524
  non-ascii commit \N{COPYRIGHT SIGN} me
 
525
inventory:
 
526
  directory . TREE_ROT test@user-1 no
 
527
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
528
  directory src src-id test@user-2 no
 
529
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
530
properties:
 
531
  branch-nick:
 
532
    test branch
 
533
  uni:
 
534
    \xb5
 
535
"""
 
536
 
 
537
 
 
538
texts = {
 
539
    Testament: { 'rev_1': REV_1_TESTAMENT,
 
540
                 'rev_1_short': REV_1_SHORT,
 
541
                 'rev_2': REV_2_TESTAMENT,
 
542
                 'rev_2_short': REV_2_SHORT,
 
543
                 'rev_3': REV_3_TESTAMENT,
 
544
                 'rev_props': REV_PROPS_TESTAMENT,
 
545
                 'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
 
546
    },
 
547
    StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
 
548
                      'rev_1_short': REV_1_SHORT_STRICT,
 
549
                      'rev_2': REV_2_STRICT_TESTAMENT,
 
550
                      'rev_2_short': REV_2_SHORT_STRICT,
 
551
                      'rev_3': REV_3_TESTAMENT_STRICT,
 
552
                      'rev_props': REV_PROPS_TESTAMENT_STRICT,
 
553
                      'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
 
554
    },
 
555
    StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
 
556
                      'rev_1_short': REV_1_SHORT_STRICT3,
 
557
                      'rev_2': REV_2_STRICT_TESTAMENT3,
 
558
                      'rev_2_short': REV_2_SHORT_STRICT3,
 
559
                      'rev_3': REV_3_TESTAMENT_STRICT3,
 
560
                      'rev_props': REV_PROPS_TESTAMENT_STRICT3,
 
561
                      'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,
 
562
    },
 
563
}