~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Jelmer Vernooij
  • Date: 2011-11-30 20:02:16 UTC
  • mto: This revision was merged to the branch mainline in revision 6333.
  • Revision ID: jelmer@samba.org-20111130200216-aoju21pdl20d1gkd
Consistently pass tree path when exporting.

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
}