~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Patch Queue Manager
  • Date: 2016-04-21 04:10:52 UTC
  • mfrom: (6616.1.1 fix-en-user-guide)
  • Revision ID: pqm@pqm.ubuntu.com-20160421041052-clcye7ns1qcl2n7w
(richard-wilbur) Ensure build of English use guide always uses English text
 even when user's locale specifies a different language. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Test testaments for gpg signing."""
18
18
 
19
19
# TODO: Testaments with x-bits
20
20
 
21
21
import os
22
 
from sha import sha
23
 
import sys
24
 
 
25
 
from bzrlib.selftest import TestCaseInTempDir
26
 
from bzrlib.selftest.treeshape import build_tree_contents
27
 
from bzrlib.branch import Branch
28
 
from bzrlib.testament import Testament
29
 
from bzrlib.trace import mutter
30
 
from bzrlib.osutils import has_symlinks
31
 
 
32
 
 
33
 
class TestamentTests(TestCaseInTempDir):
 
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):
34
37
 
35
38
    def setUp(self):
36
 
        super(TestamentTests, self).setUp()
37
 
        b = self.b = Branch.initialize('.')
38
 
        b.commit(message='initial null commit',
 
39
        super(TestamentSetup, self).setUp()
 
40
        self.wt = self.make_branch_and_tree('.', format='development-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',
39
45
                 committer='test@user',
40
46
                 timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
41
47
                 timezone=0,
42
48
                 rev_id='test@user-1')
43
 
        build_tree_contents([('hello', 'contents of hello file'),
 
49
        self.build_tree_contents([('hello', 'contents of hello file'),
44
50
                             ('src/', ),
45
51
                             ('src/foo.c', 'int main()\n{\n}\n')])
46
 
        b.add(['hello', 'src', 'src/foo.c'],
47
 
              ['hello-id', 'src-id', 'foo.c-id'])
48
 
        b.commit(message='add files and directories',
 
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',
49
59
                 timestamp=1129025483,
50
60
                 timezone=36000,
51
61
                 rev_id='test@user-2',
52
62
                 committer='test@user')
53
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
 
54
76
    def test_null_testament(self):
55
77
        """Testament for a revision with no contents."""
56
 
        t = Testament.from_revision(self.b, 'test@user-1')
 
78
        t = self.from_revision(self.b.repository, 'test@user-1')
57
79
        ass = self.assertTrue
58
80
        eq = self.assertEqual
59
81
        ass(isinstance(t, Testament))
64
86
 
65
87
    def test_testment_text_form(self):
66
88
        """Conversion of testament to canonical text form."""
67
 
        t = Testament.from_revision(self.b, 'test@user-1')
 
89
        t = self.from_revision(self.b.repository, 'test@user-1')
68
90
        text_form = t.as_text()
69
91
        self.log('testament text form:\n' + text_form)
70
 
        self.assertEqual(text_form, REV_1_TESTAMENT)
 
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'))
71
95
 
72
96
    def test_testament_with_contents(self):
73
97
        """Testament containing a file and a directory."""
74
 
        t = Testament.from_revision(self.b, 'test@user-2')
 
98
        t = self.from_revision(self.b.repository, 'test@user-2')
75
99
        text_form = t.as_text()
76
100
        self.log('testament text form:\n' + text_form)
77
 
        self.assertEqualDiff(text_form, REV_2_TESTAMENT)
 
101
        self.assertEqualDiff(text_form, self.expected('rev_2'))
78
102
        actual_short = t.as_short_text()
79
 
        self.assertEqualDiff(actual_short, REV_2_SHORT)
80
 
 
81
 
    def test_testament_command(self):
82
 
        """Testament containing a file and a directory."""
83
 
        out, err = self.run_bzr_captured(['testament', '--long'])
84
 
        self.assertEqualDiff(err, '')
85
 
        self.assertEqualDiff(out, REV_2_TESTAMENT)
86
 
 
87
 
    def test_testament_command_2(self):
88
 
        """Command getting short testament of previous version."""
89
 
        out, err = self.run_bzr_captured(['testament', '-r1'])
90
 
        self.assertEqualDiff(err, '')
91
 
        self.assertEqualDiff(out, REV_1_SHORT)
 
103
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
92
104
 
93
105
    def test_testament_symlinks(self):
94
106
        """Testament containing symlink (where possible)"""
95
 
        if not has_symlinks():
96
 
            return
 
107
        self.requireFeature(SymlinkFeature)
97
108
        os.symlink('wibble/linktarget', 'link')
98
 
        self.b.add(['link'], ['link-id'])
99
 
        self.b.commit(message='add symlink',
 
109
        self.wt.add(['link'], ['link-id'])
 
110
        self.wt.commit(message='add symlink',
100
111
                 timestamp=1129025493,
101
112
                 timezone=36000,
102
113
                 rev_id='test@user-3',
103
114
                 committer='test@user')
104
 
        t = Testament.from_revision(self.b, 'test@user-3')
105
 
        self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
 
115
        t = self.from_revision(self.b.repository, 'test@user-3')
 
116
        self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
106
117
 
107
118
    def test_testament_revprops(self):
108
119
        """Testament to revision with extra properties"""
109
120
        props = dict(flavor='sour cherry\ncream cheese',
110
 
                     size='medium')
111
 
        self.b.commit(message='revision with properties',
 
121
                     size='medium',
 
122
                     empty='',
 
123
                    )
 
124
        self.wt.commit(message='revision with properties',
112
125
                      timestamp=1129025493,
113
126
                      timezone=36000,
114
127
                      rev_id='test@user-3',
115
128
                      committer='test@user',
116
129
                      revprops=props)
117
 
        t = Testament.from_revision(self.b, 'test@user-3')
118
 
        self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
 
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)
119
153
 
120
154
    def test___init__(self):
121
 
        revision = self.b.get_revision('test@user-2')
122
 
        inventory = self.b.get_inventory('test@user-2')
123
 
        testament_1 = Testament(revision, inventory).as_short_text()
124
 
        testament_2 = Testament.from_revision(self.b, 
125
 
                                              'test@user-2').as_short_text()
126
 
        self.assertEqual(testament_1, testament_2)
127
 
                    
 
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
 
128
175
 
129
176
REV_1_TESTAMENT = """\
130
177
bazaar-ng testament version 1
136
183
message:
137
184
  initial null commit
138
185
inventory:
139
 
"""
 
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
 
140
224
 
141
225
REV_1_SHORT = """\
142
226
bazaar-ng testament short form 1
143
227
revision-id: test@user-1
144
228
sha1: %s
145
 
""" % sha(REV_1_TESTAMENT).hexdigest()
 
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)
146
244
 
147
245
 
148
246
REV_2_TESTAMENT = """\
159
257
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
160
258
  directory src src-id
161
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
162
304
"""
163
305
 
164
306
 
166
308
bazaar-ng testament short form 1
167
309
revision-id: test@user-2
168
310
sha1: %s
169
 
""" % sha(REV_2_TESTAMENT).hexdigest()
 
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)
170
326
 
171
327
 
172
328
REV_PROPS_TESTAMENT = """\
184
340
  directory src src-id
185
341
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
186
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:
187
399
  flavor:
188
400
    sour cherry
189
401
    cream cheese
207
419
  symlink link link-id wibble/linktarget
208
420
  directory src src-id
209
421
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
210
 
"""
 
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
}