~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

doc

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005 by 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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
 
 
23
 
from bzrlib import osutils
24
 
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
25
 
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
26
 
from bzrlib.transform import TreeTransform
27
 
 
28
 
 
29
 
class TestamentSetup(TestCaseWithTransport):
 
22
from sha import sha
 
23
import sys
 
24
 
 
25
from bzrlib.tests import TestCaseInTempDir
 
26
from bzrlib.tests.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):
30
34
 
31
35
    def setUp(self):
32
 
        super(TestamentSetup, self).setUp()
33
 
        self.wt = self.make_branch_and_tree('.', format='dirstate-with-subtree')
34
 
        self.wt.set_root_id('TREE_ROT')
35
 
        b = self.b = self.wt.branch
 
36
        super(TestamentTests, self).setUp()
 
37
        b = self.b = Branch.initialize('.')
36
38
        b.nick = "test branch"
37
 
        self.wt.commit(message='initial null commit',
 
39
        b.working_tree().commit(message='initial null commit',
38
40
                 committer='test@user',
39
41
                 timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
40
42
                 timezone=0,
41
43
                 rev_id='test@user-1')
42
 
        self.build_tree_contents([('hello', 'contents of hello file'),
 
44
        build_tree_contents([('hello', 'contents of hello file'),
43
45
                             ('src/', ),
44
46
                             ('src/foo.c', 'int main()\n{\n}\n')])
45
 
        self.wt.add(['hello', 'src', 'src/foo.c'],
 
47
        b.working_tree().add(['hello', 'src', 'src/foo.c'],
46
48
                             ['hello-id', 'src-id', 'foo.c-id'])
47
 
        tt = TreeTransform(self.wt)
48
 
        trans_id = tt.trans_id_tree_path('hello')
49
 
        tt.set_executability(True, trans_id)
50
 
        tt.apply()
51
 
        self.wt.commit(message='add files and directories',
 
49
        b.working_tree().commit(message='add files and directories',
52
50
                 timestamp=1129025483,
53
51
                 timezone=36000,
54
52
                 rev_id='test@user-2',
55
53
                 committer='test@user')
56
54
 
57
 
 
58
 
class TestamentTests(TestamentSetup):
59
 
 
60
 
    def testament_class(self):
61
 
        return Testament
62
 
 
63
 
    def expected(self, key):
64
 
        return texts[self.testament_class()][key]
65
 
 
66
 
    def from_revision(self, repository, revision_id):
67
 
        return self.testament_class().from_revision(repository, revision_id)
68
 
 
69
55
    def test_null_testament(self):
70
56
        """Testament for a revision with no contents."""
71
 
        t = self.from_revision(self.b.repository, 'test@user-1')
 
57
        t = Testament.from_revision(self.b, 'test@user-1')
72
58
        ass = self.assertTrue
73
59
        eq = self.assertEqual
74
60
        ass(isinstance(t, Testament))
79
65
 
80
66
    def test_testment_text_form(self):
81
67
        """Conversion of testament to canonical text form."""
82
 
        t = self.from_revision(self.b.repository, 'test@user-1')
 
68
        t = Testament.from_revision(self.b, 'test@user-1')
83
69
        text_form = t.as_text()
84
70
        self.log('testament text form:\n' + text_form)
85
 
        self.assertEqualDiff(text_form, self.expected('rev_1'))
86
 
        short_text_form = t.as_short_text()
87
 
        self.assertEqualDiff(short_text_form, self.expected('rev_1_short'))
 
71
        self.assertEqual(text_form, REV_1_TESTAMENT)
88
72
 
89
73
    def test_testament_with_contents(self):
90
74
        """Testament containing a file and a directory."""
91
 
        t = self.from_revision(self.b.repository, 'test@user-2')
 
75
        t = Testament.from_revision(self.b, 'test@user-2')
92
76
        text_form = t.as_text()
93
77
        self.log('testament text form:\n' + text_form)
94
 
        self.assertEqualDiff(text_form, self.expected('rev_2'))
 
78
        self.assertEqualDiff(text_form, REV_2_TESTAMENT)
95
79
        actual_short = t.as_short_text()
96
 
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
 
80
        self.assertEqualDiff(actual_short, REV_2_SHORT)
 
81
 
 
82
    def test_testament_command(self):
 
83
        """Testament containing a file and a directory."""
 
84
        out, err = self.run_bzr_captured(['testament', '--long'])
 
85
        self.assertEqualDiff(err, '')
 
86
        self.assertEqualDiff(out, REV_2_TESTAMENT)
 
87
 
 
88
    def test_testament_command_2(self):
 
89
        """Command getting short testament of previous version."""
 
90
        out, err = self.run_bzr_captured(['testament', '-r1'])
 
91
        self.assertEqualDiff(err, '')
 
92
        self.assertEqualDiff(out, REV_1_SHORT)
97
93
 
98
94
    def test_testament_symlinks(self):
99
95
        """Testament containing symlink (where possible)"""
100
 
        self.requireFeature(SymlinkFeature)
 
96
        if not has_symlinks():
 
97
            return
101
98
        os.symlink('wibble/linktarget', 'link')
102
 
        self.wt.add(['link'], ['link-id'])
103
 
        self.wt.commit(message='add symlink',
 
99
        self.b.working_tree().add(['link'], ['link-id'])
 
100
        self.b.working_tree().commit(message='add symlink',
104
101
                 timestamp=1129025493,
105
102
                 timezone=36000,
106
103
                 rev_id='test@user-3',
107
104
                 committer='test@user')
108
 
        t = self.from_revision(self.b.repository, 'test@user-3')
109
 
        self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
 
105
        t = Testament.from_revision(self.b, 'test@user-3')
 
106
        self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
110
107
 
111
108
    def test_testament_revprops(self):
112
109
        """Testament to revision with extra properties"""
113
110
        props = dict(flavor='sour cherry\ncream cheese',
114
 
                     size='medium',
115
 
                     empty='',
116
 
                    )
117
 
        self.wt.commit(message='revision with properties',
 
111
                     size='medium')
 
112
        self.b.working_tree().commit(message='revision with properties',
118
113
                      timestamp=1129025493,
119
114
                      timezone=36000,
120
115
                      rev_id='test@user-3',
121
116
                      committer='test@user',
122
117
                      revprops=props)
123
 
        t = self.from_revision(self.b.repository, 'test@user-3')
124
 
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
125
 
 
126
 
    def test_testament_unicode_commit_message(self):
127
 
        self.wt.commit(
128
 
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
129
 
            timestamp=1129025493,
130
 
            timezone=36000,
131
 
            rev_id='test@user-3',
132
 
            committer='Erik B\xe5gfors <test@user>',
133
 
            revprops={'uni':u'\xb5'}
134
 
            )
135
 
        t = self.from_revision(self.b.repository, 'test@user-3')
136
 
        self.assertEqualDiff(
137
 
            self.expected('sample_unicode').encode('utf-8'), t.as_text())
 
118
        t = Testament.from_revision(self.b, 'test@user-3')
 
119
        self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
138
120
 
139
121
    def test___init__(self):
140
 
        revision = self.b.repository.get_revision('test@user-2')
141
 
        inventory = self.b.repository.get_inventory('test@user-2')
142
 
        testament_1 = self.testament_class()(revision, inventory)
143
 
        text_1 = testament_1.as_short_text()
144
 
        text_2 = self.from_revision(self.b.repository,
145
 
                                    'test@user-2').as_short_text()
146
 
        self.assertEqual(text_1, text_2)
147
 
 
148
 
 
149
 
class TestamentTestsStrict(TestamentTests):
150
 
 
151
 
    def testament_class(self):
152
 
        return StrictTestament
153
 
 
154
 
 
155
 
class TestamentTestsStrict2(TestamentTests):
156
 
 
157
 
    def testament_class(self):
158
 
        return StrictTestament3
159
 
 
 
122
        revision = self.b.get_revision('test@user-2')
 
123
        inventory = self.b.get_inventory('test@user-2')
 
124
        testament_1 = Testament(revision, inventory).as_short_text()
 
125
        testament_2 = Testament.from_revision(self.b, 
 
126
                                              'test@user-2').as_short_text()
 
127
        self.assertEqual(testament_1, testament_2)
 
128
                    
160
129
 
161
130
REV_1_TESTAMENT = """\
162
131
bazaar-ng testament version 1
173
142
    test branch
174
143
"""
175
144
 
176
 
 
177
 
REV_1_STRICT_TESTAMENT = """\
178
 
bazaar-ng testament version 2.1
179
 
revision-id: test@user-1
180
 
committer: test@user
181
 
timestamp: 1129025423
182
 
timezone: 0
183
 
parents:
184
 
message:
185
 
  initial null commit
186
 
inventory:
187
 
properties:
188
 
  branch-nick:
189
 
    test branch
190
 
"""
191
 
 
192
 
 
193
 
REV_1_STRICT_TESTAMENT3 = """\
194
 
bazaar testament version 3 strict
195
 
revision-id: test@user-1
196
 
committer: test@user
197
 
timestamp: 1129025423
198
 
timezone: 0
199
 
parents:
200
 
message:
201
 
  initial null commit
202
 
inventory:
203
 
  directory . TREE_ROT test@user-1 no
204
 
properties:
205
 
  branch-nick:
206
 
    test branch
207
 
"""
208
 
 
209
 
 
210
145
REV_1_SHORT = """\
211
146
bazaar-ng testament short form 1
212
147
revision-id: test@user-1
213
148
sha1: %s
214
 
""" % osutils.sha(REV_1_TESTAMENT).hexdigest()
215
 
 
216
 
 
217
 
REV_1_SHORT_STRICT = """\
218
 
bazaar-ng testament short form 2.1
219
 
revision-id: test@user-1
220
 
sha1: %s
221
 
""" % osutils.sha(REV_1_STRICT_TESTAMENT).hexdigest()
222
 
 
223
 
 
224
 
REV_1_SHORT_STRICT3 = """\
225
 
bazaar testament short form 3 strict
226
 
revision-id: test@user-1
227
 
sha1: %s
228
 
""" % osutils.sha(REV_1_STRICT_TESTAMENT3).hexdigest()
 
149
""" % sha(REV_1_TESTAMENT).hexdigest()
229
150
 
230
151
 
231
152
REV_2_TESTAMENT = """\
248
169
"""
249
170
 
250
171
 
251
 
REV_2_STRICT_TESTAMENT = """\
252
 
bazaar-ng testament version 2.1
253
 
revision-id: test@user-2
254
 
committer: test@user
255
 
timestamp: 1129025483
256
 
timezone: 36000
257
 
parents:
258
 
  test@user-1
259
 
message:
260
 
  add files and directories
261
 
inventory:
262
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
263
 
  directory src src-id test@user-2 no
264
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
265
 
properties:
266
 
  branch-nick:
267
 
    test branch
268
 
"""
269
 
 
270
 
 
271
 
REV_2_STRICT_TESTAMENT3 = """\
272
 
bazaar testament version 3 strict
273
 
revision-id: test@user-2
274
 
committer: test@user
275
 
timestamp: 1129025483
276
 
timezone: 36000
277
 
parents:
278
 
  test@user-1
279
 
message:
280
 
  add files and directories
281
 
inventory:
282
 
  directory . TREE_ROT test@user-1 no
283
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
284
 
  directory src src-id test@user-2 no
285
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
286
 
properties:
287
 
  branch-nick:
288
 
    test branch
289
 
"""
290
 
 
291
 
 
292
172
REV_2_SHORT = """\
293
173
bazaar-ng testament short form 1
294
174
revision-id: test@user-2
295
175
sha1: %s
296
 
""" % osutils.sha(REV_2_TESTAMENT).hexdigest()
297
 
 
298
 
 
299
 
REV_2_SHORT_STRICT = """\
300
 
bazaar-ng testament short form 2.1
301
 
revision-id: test@user-2
302
 
sha1: %s
303
 
""" % osutils.sha(REV_2_STRICT_TESTAMENT).hexdigest()
304
 
 
305
 
 
306
 
REV_2_SHORT_STRICT3 = """\
307
 
bazaar testament short form 3 strict
308
 
revision-id: test@user-2
309
 
sha1: %s
310
 
""" % osutils.sha(REV_2_STRICT_TESTAMENT3).hexdigest()
 
176
""" % sha(REV_2_TESTAMENT).hexdigest()
311
177
 
312
178
 
313
179
REV_PROPS_TESTAMENT = """\
327
193
properties:
328
194
  branch-nick:
329
195
    test branch
330
 
  empty:
331
 
  flavor:
332
 
    sour cherry
333
 
    cream cheese
334
 
  size:
335
 
    medium
336
 
"""
337
 
 
338
 
 
339
 
REV_PROPS_TESTAMENT_STRICT = """\
340
 
bazaar-ng testament version 2.1
341
 
revision-id: test@user-3
342
 
committer: test@user
343
 
timestamp: 1129025493
344
 
timezone: 36000
345
 
parents:
346
 
  test@user-2
347
 
message:
348
 
  revision with properties
349
 
inventory:
350
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
351
 
  directory src src-id test@user-2 no
352
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
353
 
properties:
354
 
  branch-nick:
355
 
    test branch
356
 
  empty:
357
 
  flavor:
358
 
    sour cherry
359
 
    cream cheese
360
 
  size:
361
 
    medium
362
 
"""
363
 
 
364
 
 
365
 
REV_PROPS_TESTAMENT_STRICT3 = """\
366
 
bazaar testament version 3 strict
367
 
revision-id: test@user-3
368
 
committer: test@user
369
 
timestamp: 1129025493
370
 
timezone: 36000
371
 
parents:
372
 
  test@user-2
373
 
message:
374
 
  revision with properties
375
 
inventory:
376
 
  directory . TREE_ROT test@user-1 no
377
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
378
 
  directory src src-id test@user-2 no
379
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
380
 
properties:
381
 
  branch-nick:
382
 
    test branch
383
 
  empty:
384
196
  flavor:
385
197
    sour cherry
386
198
    cream cheese
408
220
  branch-nick:
409
221
    test branch
410
222
"""
411
 
 
412
 
 
413
 
REV_3_TESTAMENT_STRICT = """\
414
 
bazaar-ng testament version 2.1
415
 
revision-id: test@user-3
416
 
committer: test@user
417
 
timestamp: 1129025493
418
 
timezone: 36000
419
 
parents:
420
 
  test@user-2
421
 
message:
422
 
  add symlink
423
 
inventory:
424
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
425
 
  symlink link link-id wibble/linktarget test@user-3 no
426
 
  directory src src-id test@user-2 no
427
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
428
 
properties:
429
 
  branch-nick:
430
 
    test branch
431
 
"""
432
 
 
433
 
 
434
 
REV_3_TESTAMENT_STRICT3 = """\
435
 
bazaar testament version 3 strict
436
 
revision-id: test@user-3
437
 
committer: test@user
438
 
timestamp: 1129025493
439
 
timezone: 36000
440
 
parents:
441
 
  test@user-2
442
 
message:
443
 
  add symlink
444
 
inventory:
445
 
  directory . TREE_ROT test@user-1 no
446
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
447
 
  symlink link link-id wibble/linktarget test@user-3 no
448
 
  directory src src-id test@user-2 no
449
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
450
 
properties:
451
 
  branch-nick:
452
 
    test branch
453
 
"""
454
 
 
455
 
 
456
 
SAMPLE_UNICODE_TESTAMENT = u"""\
457
 
bazaar-ng testament version 1
458
 
revision-id: test@user-3
459
 
committer: Erik B\xe5gfors <test@user>
460
 
timestamp: 1129025493
461
 
timezone: 36000
462
 
parents:
463
 
  test@user-2
464
 
message:
465
 
  non-ascii commit \N{COPYRIGHT SIGN} me
466
 
inventory:
467
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
468
 
  directory src src-id
469
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
470
 
properties:
471
 
  branch-nick:
472
 
    test branch
473
 
  uni:
474
 
    \xb5
475
 
"""
476
 
 
477
 
 
478
 
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
479
 
bazaar-ng testament version 2.1
480
 
revision-id: test@user-3
481
 
committer: Erik B\xe5gfors <test@user>
482
 
timestamp: 1129025493
483
 
timezone: 36000
484
 
parents:
485
 
  test@user-2
486
 
message:
487
 
  non-ascii commit \N{COPYRIGHT SIGN} me
488
 
inventory:
489
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
490
 
  directory src src-id test@user-2 no
491
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
492
 
properties:
493
 
  branch-nick:
494
 
    test branch
495
 
  uni:
496
 
    \xb5
497
 
"""
498
 
 
499
 
 
500
 
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
501
 
bazaar testament version 3 strict
502
 
revision-id: test@user-3
503
 
committer: Erik B\xe5gfors <test@user>
504
 
timestamp: 1129025493
505
 
timezone: 36000
506
 
parents:
507
 
  test@user-2
508
 
message:
509
 
  non-ascii commit \N{COPYRIGHT SIGN} me
510
 
inventory:
511
 
  directory . TREE_ROT test@user-1 no
512
 
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
513
 
  directory src src-id test@user-2 no
514
 
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
515
 
properties:
516
 
  branch-nick:
517
 
    test branch
518
 
  uni:
519
 
    \xb5
520
 
"""
521
 
 
522
 
 
523
 
texts = {
524
 
    Testament: { 'rev_1': REV_1_TESTAMENT,
525
 
                 'rev_1_short': REV_1_SHORT,
526
 
                 'rev_2': REV_2_TESTAMENT,
527
 
                 'rev_2_short': REV_2_SHORT,
528
 
                 'rev_3': REV_3_TESTAMENT,
529
 
                 'rev_props': REV_PROPS_TESTAMENT,
530
 
                 'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
531
 
    },
532
 
    StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
533
 
                      'rev_1_short': REV_1_SHORT_STRICT,
534
 
                      'rev_2': REV_2_STRICT_TESTAMENT,
535
 
                      'rev_2_short': REV_2_SHORT_STRICT,
536
 
                      'rev_3': REV_3_TESTAMENT_STRICT,
537
 
                      'rev_props': REV_PROPS_TESTAMENT_STRICT,
538
 
                      'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
539
 
    },
540
 
    StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
541
 
                      'rev_1_short': REV_1_SHORT_STRICT3,
542
 
                      'rev_2': REV_2_STRICT_TESTAMENT3,
543
 
                      'rev_2_short': REV_2_SHORT_STRICT3,
544
 
                      'rev_3': REV_3_TESTAMENT_STRICT3,
545
 
                      'rev_props': REV_PROPS_TESTAMENT_STRICT3,
546
 
                      'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,
547
 
    },
548
 
}