1
# Copyright (C) 2005-2006 by Canonical Ltd
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.
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.
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
17
"""Test testaments for gpg signing."""
19
# TODO: Testaments with x-bits
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
30
class TestamentSetup(TestCaseWithTransport):
33
super(TestamentSetup, self).setUp()
34
self.wt = self.make_branch_and_tree('.')
35
b = self.b = self.wt.branch
36
b.nick = "test branch"
37
self.wt.commit(message='initial null commit',
38
committer='test@user',
39
timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
42
self.build_tree_contents([('hello', 'contents of hello file'),
44
('src/foo.c', 'int main()\n{\n}\n')])
45
self.wt.add(['hello', 'src', 'src/foo.c'],
46
['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)
51
self.wt.commit(message='add files and directories',
55
committer='test@user')
58
class TestamentTests(TestamentSetup):
60
def testament_class(self):
63
def expected(self, key):
64
return texts[self.testament_class()][key]
66
def from_revision(self, repository, revision_id):
67
return self.testament_class().from_revision(repository, revision_id)
69
def test_null_testament(self):
70
"""Testament for a revision with no contents."""
71
t = self.from_revision(self.b.repository, 'test@user-1')
74
ass(isinstance(t, Testament))
75
eq(t.revision_id, 'test@user-1')
76
eq(t.committer, 'test@user')
77
eq(t.timestamp, 1129025423)
80
def test_testment_text_form(self):
81
"""Conversion of testament to canonical text form."""
82
t = self.from_revision(self.b.repository, 'test@user-1')
83
text_form = t.as_text()
84
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'))
89
def test_testament_with_contents(self):
90
"""Testament containing a file and a directory."""
91
t = self.from_revision(self.b.repository, 'test@user-2')
92
text_form = t.as_text()
93
self.log('testament text form:\n' + text_form)
94
self.assertEqualDiff(text_form, self.expected('rev_2'))
95
actual_short = t.as_short_text()
96
self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
98
def test_testament_symlinks(self):
99
"""Testament containing symlink (where possible)"""
100
if not has_symlinks():
102
os.symlink('wibble/linktarget', 'link')
103
self.wt.add(['link'], ['link-id'])
104
self.wt.commit(message='add symlink',
105
timestamp=1129025493,
107
rev_id='test@user-3',
108
committer='test@user')
109
t = self.from_revision(self.b.repository, 'test@user-3')
110
self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
112
def test_testament_revprops(self):
113
"""Testament to revision with extra properties"""
114
props = dict(flavor='sour cherry\ncream cheese',
118
self.wt.commit(message='revision with properties',
119
timestamp=1129025493,
121
rev_id='test@user-3',
122
committer='test@user',
124
t = self.from_revision(self.b.repository, 'test@user-3')
125
self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
127
def test_testament_unicode_commit_message(self):
129
message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
130
timestamp=1129025493,
132
rev_id='test@user-3',
133
committer='Erik B\xe5gfors <test@user>',
134
revprops={'uni':u'\xb5'}
136
t = self.from_revision(self.b.repository, 'test@user-3')
137
self.assertEqualDiff(
138
self.expected('sample_unicode').encode('utf-8'), t.as_text())
140
def test___init__(self):
141
revision = self.b.repository.get_revision('test@user-2')
142
inventory = self.b.repository.get_inventory('test@user-2')
143
testament_1 = self.testament_class()(revision, inventory)
144
text_1 = testament_1.as_short_text()
145
text_2 = self.from_revision(self.b.repository,
146
'test@user-2').as_short_text()
147
self.assertEqual(text_1, text_2)
150
class TestamentTestsStrict(TestamentTests):
152
def testament_class(self):
153
return StrictTestament
156
class TestamentTestsStrict2(TestamentTests):
158
def testament_class(self):
159
return StrictTestament3
162
REV_1_TESTAMENT = """\
163
bazaar-ng testament version 1
164
revision-id: test@user-1
166
timestamp: 1129025423
178
REV_1_STRICT_TESTAMENT = """\
179
bazaar-ng testament version 2.1
180
revision-id: test@user-1
182
timestamp: 1129025423
194
REV_1_STRICT_TESTAMENT3 = """\
195
bazaar testament version 3 strict
196
revision-id: test@user-1
198
timestamp: 1129025423
204
directory . TREE_ROOT test@user-1 no
212
bazaar-ng testament short form 1
213
revision-id: test@user-1
215
""" % sha(REV_1_TESTAMENT).hexdigest()
218
REV_1_SHORT_STRICT = """\
219
bazaar-ng testament short form 2.1
220
revision-id: test@user-1
222
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
225
REV_1_SHORT_STRICT3 = """\
226
bazaar testament short form 3 strict
227
revision-id: test@user-1
229
""" % sha(REV_1_STRICT_TESTAMENT3).hexdigest()
232
REV_2_TESTAMENT = """\
233
bazaar-ng testament version 1
234
revision-id: test@user-2
236
timestamp: 1129025483
241
add files and directories
243
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
245
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
252
REV_2_STRICT_TESTAMENT = """\
253
bazaar-ng testament version 2.1
254
revision-id: test@user-2
256
timestamp: 1129025483
261
add files and directories
263
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
264
directory src src-id test@user-2 no
265
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
272
REV_2_STRICT_TESTAMENT3 = """\
273
bazaar testament version 3 strict
274
revision-id: test@user-2
276
timestamp: 1129025483
281
add files and directories
283
directory . TREE_ROOT test@user-2 no
284
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
285
directory src src-id test@user-2 no
286
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
294
bazaar-ng testament short form 1
295
revision-id: test@user-2
297
""" % sha(REV_2_TESTAMENT).hexdigest()
300
REV_2_SHORT_STRICT = """\
301
bazaar-ng testament short form 2.1
302
revision-id: test@user-2
304
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
307
REV_2_SHORT_STRICT3 = """\
308
bazaar testament short form 3 strict
309
revision-id: test@user-2
311
""" % sha(REV_2_STRICT_TESTAMENT3).hexdigest()
314
REV_PROPS_TESTAMENT = """\
315
bazaar-ng testament version 1
316
revision-id: test@user-3
318
timestamp: 1129025493
323
revision with properties
325
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
327
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
340
REV_PROPS_TESTAMENT_STRICT = """\
341
bazaar-ng testament version 2.1
342
revision-id: test@user-3
344
timestamp: 1129025493
349
revision with properties
351
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
352
directory src src-id test@user-2 no
353
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
366
REV_PROPS_TESTAMENT_STRICT3 = """\
367
bazaar testament version 3 strict
368
revision-id: test@user-3
370
timestamp: 1129025493
375
revision with properties
377
directory . TREE_ROOT test@user-3 no
378
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
379
directory src src-id test@user-2 no
380
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
393
REV_3_TESTAMENT = """\
394
bazaar-ng testament version 1
395
revision-id: test@user-3
397
timestamp: 1129025493
404
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
405
symlink link link-id wibble/linktarget
407
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
414
REV_3_TESTAMENT_STRICT = """\
415
bazaar-ng testament version 2.1
416
revision-id: test@user-3
418
timestamp: 1129025493
425
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
426
symlink link link-id wibble/linktarget test@user-3 no
427
directory src src-id test@user-2 no
428
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
435
REV_3_TESTAMENT_STRICT3 = """\
436
bazaar testament version 3 strict
437
revision-id: test@user-3
439
timestamp: 1129025493
446
directory . TREE_ROOT test@user-3 no
447
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
448
symlink link link-id wibble/linktarget test@user-3 no
449
directory src src-id test@user-2 no
450
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
457
SAMPLE_UNICODE_TESTAMENT = u"""\
458
bazaar-ng testament version 1
459
revision-id: test@user-3
460
committer: Erik B\xe5gfors <test@user>
461
timestamp: 1129025493
466
non-ascii commit \N{COPYRIGHT SIGN} me
468
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
470
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
479
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
480
bazaar-ng testament version 2.1
481
revision-id: test@user-3
482
committer: Erik B\xe5gfors <test@user>
483
timestamp: 1129025493
488
non-ascii commit \N{COPYRIGHT SIGN} me
490
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
491
directory src src-id test@user-2 no
492
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
501
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
502
bazaar testament version 3 strict
503
revision-id: test@user-3
504
committer: Erik B\xe5gfors <test@user>
505
timestamp: 1129025493
510
non-ascii commit \N{COPYRIGHT SIGN} me
512
directory . TREE_ROOT test@user-3 no
513
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
514
directory src src-id test@user-2 no
515
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
525
Testament: { 'rev_1': REV_1_TESTAMENT,
526
'rev_1_short': REV_1_SHORT,
527
'rev_2': REV_2_TESTAMENT,
528
'rev_2_short': REV_2_SHORT,
529
'rev_3': REV_3_TESTAMENT,
530
'rev_props': REV_PROPS_TESTAMENT,
531
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
533
StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
534
'rev_1_short': REV_1_SHORT_STRICT,
535
'rev_2': REV_2_STRICT_TESTAMENT,
536
'rev_2_short': REV_2_SHORT_STRICT,
537
'rev_3': REV_3_TESTAMENT_STRICT,
538
'rev_props': REV_PROPS_TESTAMENT_STRICT,
539
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
541
StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
542
'rev_1_short': REV_1_SHORT_STRICT3,
543
'rev_2': REV_2_STRICT_TESTAMENT3,
544
'rev_2_short': REV_2_SHORT_STRICT3,
545
'rev_3': REV_3_TESTAMENT_STRICT3,
546
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
547
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,