~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Martin Pool
  • Date: 2007-04-04 06:17:31 UTC
  • mto: This revision was merged to the branch mainline in revision 2397.
  • Revision ID: mbp@sourcefrog.net-20070404061731-tt2xrzllqhbodn83
Contents of TODO file moved into bug tracker

Show diffs side-by-side

added added

removed removed

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