~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: John Arbash Meinel
  • Date: 2011-05-11 11:35:28 UTC
  • mto: This revision was merged to the branch mainline in revision 5851.
  • Revision ID: john@arbash-meinel.com-20110511113528-qepibuwxicjrbb2h
Break compatibility with python <2.6.

This includes auditing the code for places where we were doing
explicit 'sys.version' checks and removing them as appropriate.

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