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 bzrlib import osutils
24
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
25
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
25
from bzrlib.tests import TestCaseWithTransport
26
from bzrlib.branch import Branch
27
from bzrlib.testament import Testament, StrictTestament
28
from bzrlib.trace import mutter
26
29
from bzrlib.transform import TreeTransform
29
class TestamentSetup(TestCaseWithTransport):
30
from bzrlib.osutils import has_symlinks
33
class TestamentTests(TestCaseWithTransport):
32
super(TestamentSetup, self).setUp()
33
self.wt = self.make_branch_and_tree('.', format='dirstate-with-subtree')
34
self.wt.set_root_id('TREE_ROT')
36
super(TestamentTests, self).setUp()
37
self.wt = self.make_branch_and_tree('.')
35
38
b = self.b = self.wt.branch
36
39
b.nick = "test branch"
37
40
self.wt.commit(message='initial null commit',
54
57
rev_id='test@user-2',
55
58
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
60
def test_null_testament(self):
70
61
"""Testament for a revision with no contents."""
71
t = self.from_revision(self.b.repository, 'test@user-1')
62
t = Testament.from_revision(self.b.repository, 'test@user-1')
72
63
ass = self.assertTrue
73
64
eq = self.assertEqual
74
65
ass(isinstance(t, Testament))
80
71
def test_testment_text_form(self):
81
72
"""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'))
73
t = Testament.from_revision(self.b.repository, 'test@user-1')
74
text_form = t.as_text()
75
self.log('testament text form:\n' + text_form)
76
self.assertEqual(text_form, REV_1_TESTAMENT)
78
def test_strict_testment_text_form(self):
79
"""Conversion of testament to canonical text form."""
80
t = StrictTestament.from_revision(self.b.repository, 'test@user-1')
81
text_form = t.as_text()
82
self.log('testament text form:\n' + text_form)
83
self.assertEqualDiff(text_form, REV_1_STRICT_TESTAMENT)
89
85
def test_testament_with_contents(self):
90
86
"""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'))
87
t = Testament.from_revision(self.b.repository, 'test@user-2')
88
text_form = t.as_text()
89
self.log('testament text form:\n' + text_form)
90
self.assertEqualDiff(text_form, REV_2_TESTAMENT)
91
actual_short = t.as_short_text()
92
self.assertEqualDiff(actual_short, REV_2_SHORT)
94
def test_strict_testament_with_contents(self):
95
"""Testament containing a file and a directory."""
96
t = StrictTestament.from_revision(self.b.repository, 'test@user-2')
97
text_form = t.as_text()
98
self.log('testament text form:\n' + text_form)
99
self.assertEqualDiff(text_form, REV_2_STRICT_TESTAMENT)
100
actual_short = t.as_short_text()
101
self.assertEqualDiff(actual_short, REV_2_SHORT_STRICT)
103
def test_testament_command(self):
104
"""Testament containing a file and a directory."""
105
out, err = self.run_bzr_captured(['testament', '--long'])
106
self.assertEqualDiff(err, '')
107
self.assertEqualDiff(out, REV_2_TESTAMENT)
109
def test_testament_command_2(self):
110
"""Command getting short testament of previous version."""
111
out, err = self.run_bzr_captured(['testament', '-r1'])
112
self.assertEqualDiff(err, '')
113
self.assertEqualDiff(out, REV_1_SHORT)
115
def test_testament_command_3(self):
116
"""Command getting short testament of previous version."""
117
out, err = self.run_bzr_captured(['testament', '-r1', '--strict'])
118
self.assertEqualDiff(err, '')
119
self.assertEqualDiff(out, REV_1_SHORT_STRICT)
98
121
def test_testament_symlinks(self):
99
122
"""Testament containing symlink (where possible)"""
100
self.requireFeature(SymlinkFeature)
123
if not has_symlinks():
101
125
os.symlink('wibble/linktarget', 'link')
102
126
self.wt.add(['link'], ['link-id'])
103
127
self.wt.commit(message='add symlink',
106
130
rev_id='test@user-3',
107
131
committer='test@user')
108
t = self.from_revision(self.b.repository, 'test@user-3')
109
self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
132
t = Testament.from_revision(self.b.repository, 'test@user-3')
133
self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
111
135
def test_testament_revprops(self):
112
136
"""Testament to revision with extra properties"""
113
137
props = dict(flavor='sour cherry\ncream cheese',
117
139
self.wt.commit(message='revision with properties',
118
140
timestamp=1129025493,
120
142
rev_id='test@user-3',
121
143
committer='test@user',
123
t = self.from_revision(self.b.repository, 'test@user-3')
124
self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
145
t = Testament.from_revision(self.b.repository, 'test@user-3')
146
self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
126
148
def test_testament_unicode_commit_message(self):
129
151
timestamp=1129025493,
131
153
rev_id='test@user-3',
132
committer='Erik B\xe5gfors <test@user>',
133
revprops={'uni':u'\xb5'}
135
t = self.from_revision(self.b.repository, 'test@user-3')
154
committer='test@user')
155
t = Testament.from_revision(self.b.repository, 'test@user-3')
136
156
self.assertEqualDiff(
137
self.expected('sample_unicode').encode('utf-8'), t.as_text())
157
SAMPLE_UNICODE_TESTAMENT.encode('utf-8'), t.as_text())
139
159
def test___init__(self):
140
160
revision = self.b.repository.get_revision('test@user-2')
141
161
inventory = self.b.repository.get_inventory('test@user-2')
142
testament_1 = self.testament_class()(revision, inventory)
143
text_1 = testament_1.as_short_text()
144
text_2 = self.from_revision(self.b.repository,
145
'test@user-2').as_short_text()
146
self.assertEqual(text_1, text_2)
149
class TestamentTestsStrict(TestamentTests):
151
def testament_class(self):
152
return StrictTestament
155
class TestamentTestsStrict2(TestamentTests):
157
def testament_class(self):
158
return StrictTestament3
162
testament_1 = Testament(revision, inventory).as_short_text()
163
testament_2 = Testament.from_revision(self.b.repository,
164
'test@user-2').as_short_text()
165
self.assertEqual(testament_1, testament_2)
161
168
REV_1_TESTAMENT = """\
162
169
bazaar-ng testament version 1
193
REV_1_STRICT_TESTAMENT3 = """\
194
bazaar testament version 3 strict
195
revision-id: test@user-1
197
timestamp: 1129025423
203
directory . TREE_ROT test@user-1 no
210
199
REV_1_SHORT = """\
211
200
bazaar-ng testament short form 1
212
201
revision-id: test@user-1
214
""" % osutils.sha(REV_1_TESTAMENT).hexdigest()
203
""" % sha(REV_1_TESTAMENT).hexdigest()
217
206
REV_1_SHORT_STRICT = """\
218
207
bazaar-ng testament short form 2.1
219
208
revision-id: test@user-1
221
""" % osutils.sha(REV_1_STRICT_TESTAMENT).hexdigest()
224
REV_1_SHORT_STRICT3 = """\
225
bazaar testament short form 3 strict
226
revision-id: test@user-1
228
""" % osutils.sha(REV_1_STRICT_TESTAMENT3).hexdigest()
210
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
231
213
REV_2_TESTAMENT = """\
271
REV_2_STRICT_TESTAMENT3 = """\
272
bazaar testament version 3 strict
273
revision-id: test@user-2
275
timestamp: 1129025483
280
add files and directories
282
directory . TREE_ROT test@user-1 no
283
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
284
directory src src-id test@user-2 no
285
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
292
253
REV_2_SHORT = """\
293
254
bazaar-ng testament short form 1
294
255
revision-id: test@user-2
296
""" % osutils.sha(REV_2_TESTAMENT).hexdigest()
257
""" % sha(REV_2_TESTAMENT).hexdigest()
299
260
REV_2_SHORT_STRICT = """\
300
261
bazaar-ng testament short form 2.1
301
262
revision-id: test@user-2
303
""" % osutils.sha(REV_2_STRICT_TESTAMENT).hexdigest()
306
REV_2_SHORT_STRICT3 = """\
307
bazaar testament short form 3 strict
308
revision-id: test@user-2
310
""" % osutils.sha(REV_2_STRICT_TESTAMENT3).hexdigest()
264
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
313
267
REV_PROPS_TESTAMENT = """\
339
REV_PROPS_TESTAMENT_STRICT = """\
340
bazaar-ng testament version 2.1
341
revision-id: test@user-3
343
timestamp: 1129025493
348
revision with properties
350
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
351
directory src src-id test@user-2 no
352
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
365
REV_PROPS_TESTAMENT_STRICT3 = """\
366
bazaar testament version 3 strict
367
revision-id: test@user-3
369
timestamp: 1129025493
374
revision with properties
376
directory . TREE_ROT test@user-1 no
377
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
378
directory src src-id test@user-2 no
379
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
413
REV_3_TESTAMENT_STRICT = """\
414
bazaar-ng testament version 2.1
415
revision-id: test@user-3
417
timestamp: 1129025493
424
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
425
symlink link link-id wibble/linktarget test@user-3 no
426
directory src src-id test@user-2 no
427
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
434
REV_3_TESTAMENT_STRICT3 = """\
435
bazaar testament version 3 strict
436
revision-id: test@user-3
438
timestamp: 1129025493
445
directory . TREE_ROT test@user-1 no
446
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
447
symlink link link-id wibble/linktarget test@user-3 no
448
directory src src-id test@user-2 no
449
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
456
313
SAMPLE_UNICODE_TESTAMENT = u"""\
457
314
bazaar-ng testament version 1
458
315
revision-id: test@user-3
459
committer: Erik B\xe5gfors <test@user>
460
317
timestamp: 1129025493
478
SAMPLE_UNICODE_TESTAMENT_STRICT = u"""\
479
bazaar-ng testament version 2.1
480
revision-id: test@user-3
481
committer: Erik B\xe5gfors <test@user>
482
timestamp: 1129025493
487
non-ascii commit \N{COPYRIGHT SIGN} me
489
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
490
directory src src-id test@user-2 no
491
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
500
SAMPLE_UNICODE_TESTAMENT_STRICT3 = u"""\
501
bazaar testament version 3 strict
502
revision-id: test@user-3
503
committer: Erik B\xe5gfors <test@user>
504
timestamp: 1129025493
509
non-ascii commit \N{COPYRIGHT SIGN} me
511
directory . TREE_ROT test@user-1 no
512
file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
513
directory src src-id test@user-2 no
514
file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
524
Testament: { 'rev_1': REV_1_TESTAMENT,
525
'rev_1_short': REV_1_SHORT,
526
'rev_2': REV_2_TESTAMENT,
527
'rev_2_short': REV_2_SHORT,
528
'rev_3': REV_3_TESTAMENT,
529
'rev_props': REV_PROPS_TESTAMENT,
530
'sample_unicode': SAMPLE_UNICODE_TESTAMENT,
532
StrictTestament: {'rev_1': REV_1_STRICT_TESTAMENT,
533
'rev_1_short': REV_1_SHORT_STRICT,
534
'rev_2': REV_2_STRICT_TESTAMENT,
535
'rev_2_short': REV_2_SHORT_STRICT,
536
'rev_3': REV_3_TESTAMENT_STRICT,
537
'rev_props': REV_PROPS_TESTAMENT_STRICT,
538
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT,
540
StrictTestament3: {'rev_1': REV_1_STRICT_TESTAMENT3,
541
'rev_1_short': REV_1_SHORT_STRICT3,
542
'rev_2': REV_2_STRICT_TESTAMENT3,
543
'rev_2_short': REV_2_SHORT_STRICT3,
544
'rev_3': REV_3_TESTAMENT_STRICT3,
545
'rev_props': REV_PROPS_TESTAMENT_STRICT3,
546
'sample_unicode': SAMPLE_UNICODE_TESTAMENT_STRICT3,