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
17
17
"""Test testaments for gpg signing."""
19
19
# TODO: Testaments with x-bits
23
from breezy import osutils
24
from breezy.tests import TestCaseWithTransport
25
from breezy.bzr.testament import (
30
from breezy.tests.features import (
35
class TestamentSetup(TestCaseWithTransport):
25
from bzrlib.selftest import TestCaseInTempDir
26
from bzrlib.selftest.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
33
class TestamentTests(TestCaseInTempDir):
38
super(TestamentSetup, self).setUp()
39
self.wt = self.make_branch_and_tree('.', format='development-subtree')
40
self.wt.set_root_id(b'TREE_ROT')
41
b = self.b = self.wt.branch
42
b.nick = "test branch"
43
self.wt.commit(message='initial null commit',
44
committer='test@user',
45
timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
47
rev_id=b'test@user-1')
48
self.build_tree_contents([('hello', b'contents of hello file'),
50
('src/foo.c', b'int main()\n{\n}\n')])
51
self.wt.add(['hello', 'src', 'src/foo.c'],
52
[b'hello-id', b'src-id', b'foo.c-id'])
53
tt = self.wt.get_transform()
54
trans_id = tt.trans_id_tree_path('hello')
55
tt.set_executability(True, trans_id)
57
self.wt.commit(message='add files and directories',
60
rev_id=b'test@user-2',
61
committer='test@user')
64
class TestamentTests(TestamentSetup):
66
def testament_class(self):
69
def expected(self, key):
70
return texts[self.testament_class()][key]
72
def from_revision(self, repository, revision_id):
73
return self.testament_class().from_revision(repository, revision_id)
36
super(TestamentTests, self).setUp()
37
b = self.b = Branch.initialize('.')
38
b.commit(message='initial null commit',
39
committer='test@user',
40
timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
43
build_tree_contents([('hello', 'contents of hello file'),
45
('src/foo.c', 'int main()\n{\n}\n')])
46
b.add(['hello', 'src', 'src/foo.c'],
47
['hello-id', 'src-id', 'foo.c-id'])
48
b.commit(message='add files and directories',
52
committer='test@user')
75
54
def test_null_testament(self):
76
55
"""Testament for a revision with no contents."""
77
t = self.from_revision(self.b.repository, b'test@user-1')
56
t = Testament.from_revision(self.b, 'test@user-1')
78
57
ass = self.assertTrue
79
58
eq = self.assertEqual
80
59
ass(isinstance(t, Testament))
81
eq(t.revision_id, b'test@user-1')
60
eq(t.revision_id, 'test@user-1')
82
61
eq(t.committer, 'test@user')
83
62
eq(t.timestamp, 1129025423)
86
65
def test_testment_text_form(self):
87
66
"""Conversion of testament to canonical text form."""
88
t = self.from_revision(self.b.repository, b'test@user-1')
67
t = Testament.from_revision(self.b, 'test@user-1')
89
68
text_form = t.as_text()
90
self.log('testament text form:\n%s' % text_form)
91
self.assertEqualDiff(text_form, self.expected('rev_1'))
92
short_text_form = t.as_short_text()
93
self.assertEqualDiff(short_text_form, self.expected('rev_1_short'))
69
self.log('testament text form:\n' + text_form)
70
self.assertEqual(text_form, REV_1_TESTAMENT)
95
72
def test_testament_with_contents(self):
96
73
"""Testament containing a file and a directory."""
97
t = self.from_revision(self.b.repository, b'test@user-2')
74
t = Testament.from_revision(self.b, 'test@user-2')
98
75
text_form = t.as_text()
99
self.log('testament text form:\n%s' % text_form)
100
self.assertEqualDiff(text_form, self.expected('rev_2'))
76
self.log('testament text form:\n' + text_form)
77
self.assertEqualDiff(text_form, REV_2_TESTAMENT)
101
78
actual_short = t.as_short_text()
102
self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
79
self.assertEqualDiff(actual_short, REV_2_SHORT)
81
def test_testament_command(self):
82
"""Testament containing a file and a directory."""
83
out, err = self.run_bzr_captured(['testament', '--long'])
84
self.assertEqualDiff(err, '')
85
self.assertEqualDiff(out, REV_2_TESTAMENT)
87
def test_testament_command_2(self):
88
"""Command getting short testament of previous version."""
89
out, err = self.run_bzr_captured(['testament', '-r1'])
90
self.assertEqualDiff(err, '')
91
self.assertEqualDiff(out, REV_1_SHORT)
104
93
def test_testament_symlinks(self):
105
94
"""Testament containing symlink (where possible)"""
106
self.requireFeature(SymlinkFeature)
95
if not has_symlinks():
107
97
os.symlink('wibble/linktarget', 'link')
108
self.wt.add(['link'], [b'link-id'])
109
self.wt.commit(message='add symlink',
110
timestamp=1129025493,
112
rev_id=b'test@user-3',
113
committer='test@user')
114
t = self.from_revision(self.b.repository, b'test@user-3')
115
self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
98
self.b.add(['link'], ['link-id'])
99
self.b.commit(message='add symlink',
100
timestamp=1129025493,
102
rev_id='test@user-3',
103
committer='test@user')
104
t = Testament.from_revision(self.b, 'test@user-3')
105
self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
117
107
def test_testament_revprops(self):
118
108
"""Testament to revision with extra properties"""
119
props = {u'flavor': 'sour cherry\ncream cheese',
123
self.wt.commit(message='revision with properties',
124
timestamp=1129025493,
126
rev_id=b'test@user-3',
127
committer='test@user',
129
t = self.from_revision(self.b.repository, b'test@user-3')
130
self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
132
def test_testament_unicode_commit_message(self):
134
message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
135
timestamp=1129025493,
137
rev_id=b'test@user-3',
138
committer=u'Erik B\xe5gfors <test@user>',
139
revprops={u'uni': u'\xb5'}
141
t = self.from_revision(self.b.repository, b'test@user-3')
142
self.assertEqualDiff(
143
self.expected('sample_unicode').encode('utf-8'), t.as_text())
145
def test_from_tree(self):
146
tree = self.b.repository.revision_tree(b'test@user-2')
147
testament = self.testament_class().from_revision_tree(tree)
148
text_1 = testament.as_short_text()
149
text_2 = self.from_revision(self.b.repository,
150
b'test@user-2').as_short_text()
151
self.assertEqual(text_1, text_2)
109
props = dict(flavor='sour cherry\ncream cheese',
111
self.b.commit(message='revision with properties',
112
timestamp=1129025493,
114
rev_id='test@user-3',
115
committer='test@user',
117
t = Testament.from_revision(self.b, 'test@user-3')
118
self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
153
120
def test___init__(self):
154
revision = self.b.repository.get_revision(b'test@user-2')
155
tree = self.b.repository.revision_tree(b'test@user-2')
156
testament_1 = self.testament_class()(revision, tree)
157
text_1 = testament_1.as_short_text()
158
text_2 = self.from_revision(self.b.repository,
159
b'test@user-2').as_short_text()
160
self.assertEqual(text_1, text_2)
163
class TestamentTestsStrict(TestamentTests):
165
def testament_class(self):
166
return StrictTestament
169
class TestamentTestsStrict2(TestamentTests):
171
def testament_class(self):
172
return StrictTestament3
175
REV_1_TESTAMENT = b"""\
176
bazaar-ng testament version 1
177
revision-id: test@user-1
179
timestamp: 1129025423
191
REV_1_STRICT_TESTAMENT = b"""\
192
bazaar-ng testament version 2.1
193
revision-id: test@user-1
195
timestamp: 1129025423
207
REV_1_STRICT_TESTAMENT3 = b"""\
208
bazaar testament version 3 strict
209
revision-id: test@user-1
211
timestamp: 1129025423
217
directory . TREE_ROT test@user-1 no
225
bazaar-ng testament short form 1
226
revision-id: test@user-1
228
""" % osutils.sha_string(REV_1_TESTAMENT)
231
REV_1_SHORT_STRICT = b"""\
232
bazaar-ng testament short form 2.1
233
revision-id: test@user-1
235
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT)
238
REV_1_SHORT_STRICT3 = b"""\
239
bazaar testament short form 3 strict
240
revision-id: test@user-1
242
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT3)
245
REV_2_TESTAMENT = b"""\
246
bazaar-ng testament version 1
247
revision-id: test@user-2
249
timestamp: 1129025483
254
add files and directories
256
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
258
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
265
REV_2_STRICT_TESTAMENT = b"""\
266
bazaar-ng testament version 2.1
267
revision-id: test@user-2
269
timestamp: 1129025483
274
add files and directories
276
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
277
directory src src-id test@user-2 no
278
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
285
REV_2_STRICT_TESTAMENT3 = b"""\
286
bazaar testament version 3 strict
287
revision-id: test@user-2
289
timestamp: 1129025483
294
add files and directories
296
directory . TREE_ROT test@user-1 no
297
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
298
directory src src-id test@user-2 no
299
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
307
bazaar-ng testament short form 1
308
revision-id: test@user-2
310
""" % osutils.sha_string(REV_2_TESTAMENT)
313
REV_2_SHORT_STRICT = b"""\
314
bazaar-ng testament short form 2.1
315
revision-id: test@user-2
317
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT)
320
REV_2_SHORT_STRICT3 = b"""\
321
bazaar testament short form 3 strict
322
revision-id: test@user-2
324
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT3)
327
REV_PROPS_TESTAMENT = b"""\
328
bazaar-ng testament version 1
329
revision-id: test@user-3
331
timestamp: 1129025493
336
revision with properties
338
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
340
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
353
REV_PROPS_TESTAMENT_STRICT = b"""\
354
bazaar-ng testament version 2.1
355
revision-id: test@user-3
357
timestamp: 1129025493
362
revision with properties
364
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
365
directory src src-id test@user-2 no
366
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
379
REV_PROPS_TESTAMENT_STRICT3 = b"""\
380
bazaar testament version 3 strict
381
revision-id: test@user-3
383
timestamp: 1129025493
388
revision with properties
390
directory . TREE_ROT test@user-1 no
391
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
392
directory src src-id test@user-2 no
393
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
406
REV_3_TESTAMENT = b"""\
121
revision = self.b.get_revision('test@user-2')
122
inventory = self.b.get_inventory('test@user-2')
123
testament_1 = Testament(revision, inventory).as_short_text()
124
testament_2 = Testament.from_revision(self.b,
125
'test@user-2').as_short_text()
126
self.assertEqual(testament_1, testament_2)
129
REV_1_TESTAMENT = """\
130
bazaar-ng testament version 1
131
revision-id: test@user-1
133
timestamp: 1129025423
142
bazaar-ng testament short form 1
143
revision-id: test@user-1
145
""" % sha(REV_1_TESTAMENT).hexdigest()
148
REV_2_TESTAMENT = """\
149
bazaar-ng testament version 1
150
revision-id: test@user-2
152
timestamp: 1129025483
157
add files and directories
159
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
161
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
166
bazaar-ng testament short form 1
167
revision-id: test@user-2
169
""" % sha(REV_2_TESTAMENT).hexdigest()
172
REV_PROPS_TESTAMENT = """\
173
bazaar-ng testament version 1
174
revision-id: test@user-3
176
timestamp: 1129025493
181
revision with properties
183
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
185
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
195
REV_3_TESTAMENT = """\
407
196
bazaar-ng testament version 1
408
197
revision-id: test@user-3
409
198
committer: test@user
418
207
symlink link link-id wibble/linktarget
419
208
directory src src-id
420
209
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
427
REV_3_TESTAMENT_STRICT = b"""\
428
bazaar-ng testament version 2.1
429
revision-id: test@user-3
431
timestamp: 1129025493
438
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
439
symlink link link-id wibble/linktarget test@user-3 no
440
directory src src-id test@user-2 no
441
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
448
REV_3_TESTAMENT_STRICT3 = b"""\
449
bazaar testament version 3 strict
450
revision-id: test@user-3
452
timestamp: 1129025493
459
directory . TREE_ROT test@user-1 no
460
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
461
symlink link link-id wibble/linktarget test@user-3 no
462
directory src src-id test@user-2 no
463
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
470
SAMPLE_UNICODE_TESTAMENT = u"""\
471
bazaar-ng testament version 1
472
revision-id: test@user-3
473
committer: Erik B\xe5gfors <test@user>
474
timestamp: 1129025493
479
non-ascii commit \N{COPYRIGHT SIGN} me
481
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
483
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
492
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
493
bazaar-ng testament version 2.1
494
revision-id: test@user-3
495
committer: Erik B\xe5gfors <test@user>
496
timestamp: 1129025493
501
non-ascii commit \N{COPYRIGHT SIGN} me
503
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
504
directory src src-id test@user-2 no
505
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
514
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
515
bazaar testament version 3 strict
516
revision-id: test@user-3
517
committer: Erik B\xe5gfors <test@user>
518
timestamp: 1129025493
523
non-ascii commit \N{COPYRIGHT SIGN} me
525
directory . TREE_ROT test@user-1 no
526
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
527
directory src src-id test@user-2 no
528
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
538
Testament: {'rev_1': REV_1_TESTAMENT,
539
'rev_1_short': REV_1_SHORT,
540
'rev_2': REV_2_TESTAMENT,
541
'rev_2_short': REV_2_SHORT,
542
'rev_3': REV_3_TESTAMENT,
543
'rev_props': REV_PROPS_TESTAMENT,
544
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
546
StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
547
'rev_1_short': REV_1_SHORT_STRICT,
548
'rev_2': REV_2_STRICT_TESTAMENT,
549
'rev_2_short': REV_2_SHORT_STRICT,
550
'rev_3': REV_3_TESTAMENT_STRICT,
551
'rev_props': REV_PROPS_TESTAMENT_STRICT,
552
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
554
StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
555
'rev_1_short': REV_1_SHORT_STRICT3,
556
'rev_2': REV_2_STRICT_TESTAMENT3,
557
'rev_2_short': REV_2_SHORT_STRICT3,
558
'rev_3': REV_3_TESTAMENT_STRICT3,
559
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
560
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,