/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/test_testament.py

  • Committer: Jelmer Vernooij
  • Date: 2020-05-24 00:39:50 UTC
  • mto: This revision was merged to the branch mainline in revision 7504.
  • Revision ID: jelmer@jelmer.uk-20200524003950-bbc545r76vc5yajg
Add github action.

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 breezy import osutils
 
24
from breezy.tests import TestCaseWithTransport
 
25
from breezy.bzr.testament import (
 
26
    Testament,
 
27
    StrictTestament,
 
28
    StrictTestament3,
 
29
    )
 
30
from breezy.tests.features import (
 
31
    SymlinkFeature,
 
32
    )
 
33
 
 
34
 
 
35
class TestamentSetup(TestCaseWithTransport):
 
36
 
 
37
    def setUp(self):
 
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'
 
46
                       timezone=0,
 
47
                       rev_id=b'test@user-1')
 
48
        self.build_tree_contents([('hello', b'contents of hello file'),
 
49
                                  ('src/', ),
 
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)
 
56
        tt.apply()
 
57
        self.wt.commit(message='add files and directories',
 
58
                       timestamp=1129025483,
 
59
                       timezone=36000,
 
60
                       rev_id=b'test@user-2',
 
61
                       committer='test@user')
 
62
 
 
63
 
 
64
class TestamentTests(TestamentSetup):
 
65
 
 
66
    def testament_class(self):
 
67
        return Testament
 
68
 
 
69
    def expected(self, key):
 
70
        return texts[self.testament_class()][key]
 
71
 
 
72
    def from_revision(self, repository, revision_id):
 
73
        return self.testament_class().from_revision(repository, revision_id)
 
74
 
 
75
    def test_null_testament(self):
 
76
        """Testament for a revision with no contents."""
 
77
        t = self.from_revision(self.b.repository, b'test@user-1')
 
78
        ass = self.assertTrue
 
79
        eq = self.assertEqual
 
80
        ass(isinstance(t, Testament))
 
81
        eq(t.revision_id, b'test@user-1')
 
82
        eq(t.committer, 'test@user')
 
83
        eq(t.timestamp, 1129025423)
 
84
        eq(t.timezone, 0)
 
85
 
 
86
    def test_testment_text_form(self):
 
87
        """Conversion of testament to canonical text form."""
 
88
        t = self.from_revision(self.b.repository, b'test@user-1')
 
89
        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'))
 
94
 
 
95
    def test_testament_with_contents(self):
 
96
        """Testament containing a file and a directory."""
 
97
        t = self.from_revision(self.b.repository, b'test@user-2')
 
98
        text_form = t.as_text()
 
99
        self.log('testament text form:\n%s' % text_form)
 
100
        self.assertEqualDiff(text_form, self.expected('rev_2'))
 
101
        actual_short = t.as_short_text()
 
102
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
 
103
 
 
104
    def test_testament_symlinks(self):
 
105
        """Testament containing symlink (where possible)"""
 
106
        self.requireFeature(SymlinkFeature)
 
107
        os.symlink('wibble/linktarget', 'link')
 
108
        self.wt.add(['link'], [b'link-id'])
 
109
        self.wt.commit(message='add symlink',
 
110
                       timestamp=1129025493,
 
111
                       timezone=36000,
 
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'))
 
116
 
 
117
    def test_testament_revprops(self):
 
118
        """Testament to revision with extra properties"""
 
119
        props = {u'flavor': 'sour cherry\ncream cheese',
 
120
                 u'size': 'medium',
 
121
                 u'empty': '',
 
122
                 }
 
123
        self.wt.commit(message='revision with properties',
 
124
                       timestamp=1129025493,
 
125
                       timezone=36000,
 
126
                       rev_id=b'test@user-3',
 
127
                       committer='test@user',
 
128
                       revprops=props)
 
129
        t = self.from_revision(self.b.repository, b'test@user-3')
 
130
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
 
131
 
 
132
    def test_testament_unicode_commit_message(self):
 
133
        self.wt.commit(
 
134
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
 
135
            timestamp=1129025493,
 
136
            timezone=36000,
 
137
            rev_id=b'test@user-3',
 
138
            committer=u'Erik B\xe5gfors <test@user>',
 
139
            revprops={u'uni': u'\xb5'}
 
140
            )
 
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())
 
144
 
 
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)
 
152
 
 
153
    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)
 
161
 
 
162
 
 
163
class TestamentTestsStrict(TestamentTests):
 
164
 
 
165
    def testament_class(self):
 
166
        return StrictTestament
 
167
 
 
168
 
 
169
class TestamentTestsStrict2(TestamentTests):
 
170
 
 
171
    def testament_class(self):
 
172
        return StrictTestament3
 
173
 
 
174
 
 
175
REV_1_TESTAMENT = b"""\
 
176
bazaar-ng testament version 1
 
177
revision-id: test@user-1
 
178
committer: test@user
 
179
timestamp: 1129025423
 
180
timezone: 0
 
181
parents:
 
182
message:
 
183
  initial null commit
 
184
inventory:
 
185
properties:
 
186
  branch-nick:
 
187
    test branch
 
188
"""
 
189
 
 
190
 
 
191
REV_1_STRICT_TESTAMENT = b"""\
 
192
bazaar-ng testament version 2.1
 
193
revision-id: test@user-1
 
194
committer: test@user
 
195
timestamp: 1129025423
 
196
timezone: 0
 
197
parents:
 
198
message:
 
199
  initial null commit
 
200
inventory:
 
201
properties:
 
202
  branch-nick:
 
203
    test branch
 
204
"""
 
205
 
 
206
 
 
207
REV_1_STRICT_TESTAMENT3 = b"""\
 
208
bazaar testament version 3 strict
 
209
revision-id: test@user-1
 
210
committer: test@user
 
211
timestamp: 1129025423
 
212
timezone: 0
 
213
parents:
 
214
message:
 
215
  initial null commit
 
216
inventory:
 
217
  directory . TREE_ROT test@user-1 no
 
218
properties:
 
219
  branch-nick:
 
220
    test branch
 
221
"""
 
222
 
 
223
 
 
224
REV_1_SHORT = b"""\
 
225
bazaar-ng testament short form 1
 
226
revision-id: test@user-1
 
227
sha1: %s
 
228
""" % osutils.sha_string(REV_1_TESTAMENT)
 
229
 
 
230
 
 
231
REV_1_SHORT_STRICT = b"""\
 
232
bazaar-ng testament short form 2.1
 
233
revision-id: test@user-1
 
234
sha1: %s
 
235
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT)
 
236
 
 
237
 
 
238
REV_1_SHORT_STRICT3 = b"""\
 
239
bazaar testament short form 3 strict
 
240
revision-id: test@user-1
 
241
sha1: %s
 
242
""" % osutils.sha_string(REV_1_STRICT_TESTAMENT3)
 
243
 
 
244
 
 
245
REV_2_TESTAMENT = b"""\
 
246
bazaar-ng testament version 1
 
247
revision-id: test@user-2
 
248
committer: test@user
 
249
timestamp: 1129025483
 
250
timezone: 36000
 
251
parents:
 
252
  test@user-1
 
253
message:
 
254
  add files and directories
 
255
inventory:
 
256
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
257
  directory src src-id
 
258
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
259
properties:
 
260
  branch-nick:
 
261
    test branch
 
262
"""
 
263
 
 
264
 
 
265
REV_2_STRICT_TESTAMENT = b"""\
 
266
bazaar-ng testament version 2.1
 
267
revision-id: test@user-2
 
268
committer: test@user
 
269
timestamp: 1129025483
 
270
timezone: 36000
 
271
parents:
 
272
  test@user-1
 
273
message:
 
274
  add files and directories
 
275
inventory:
 
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
 
279
properties:
 
280
  branch-nick:
 
281
    test branch
 
282
"""
 
283
 
 
284
 
 
285
REV_2_STRICT_TESTAMENT3 = b"""\
 
286
bazaar testament version 3 strict
 
287
revision-id: test@user-2
 
288
committer: test@user
 
289
timestamp: 1129025483
 
290
timezone: 36000
 
291
parents:
 
292
  test@user-1
 
293
message:
 
294
  add files and directories
 
295
inventory:
 
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
 
300
properties:
 
301
  branch-nick:
 
302
    test branch
 
303
"""
 
304
 
 
305
 
 
306
REV_2_SHORT = b"""\
 
307
bazaar-ng testament short form 1
 
308
revision-id: test@user-2
 
309
sha1: %s
 
310
""" % osutils.sha_string(REV_2_TESTAMENT)
 
311
 
 
312
 
 
313
REV_2_SHORT_STRICT = b"""\
 
314
bazaar-ng testament short form 2.1
 
315
revision-id: test@user-2
 
316
sha1: %s
 
317
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT)
 
318
 
 
319
 
 
320
REV_2_SHORT_STRICT3 = b"""\
 
321
bazaar testament short form 3 strict
 
322
revision-id: test@user-2
 
323
sha1: %s
 
324
""" % osutils.sha_string(REV_2_STRICT_TESTAMENT3)
 
325
 
 
326
 
 
327
REV_PROPS_TESTAMENT = b"""\
 
328
bazaar-ng testament version 1
 
329
revision-id: test@user-3
 
330
committer: test@user
 
331
timestamp: 1129025493
 
332
timezone: 36000
 
333
parents:
 
334
  test@user-2
 
335
message:
 
336
  revision with properties
 
337
inventory:
 
338
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
339
  directory src src-id
 
340
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
341
properties:
 
342
  branch-nick:
 
343
    test branch
 
344
  empty:
 
345
  flavor:
 
346
    sour cherry
 
347
    cream cheese
 
348
  size:
 
349
    medium
 
350
"""
 
351
 
 
352
 
 
353
REV_PROPS_TESTAMENT_STRICT = b"""\
 
354
bazaar-ng testament version 2.1
 
355
revision-id: test@user-3
 
356
committer: test@user
 
357
timestamp: 1129025493
 
358
timezone: 36000
 
359
parents:
 
360
  test@user-2
 
361
message:
 
362
  revision with properties
 
363
inventory:
 
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
 
367
properties:
 
368
  branch-nick:
 
369
    test branch
 
370
  empty:
 
371
  flavor:
 
372
    sour cherry
 
373
    cream cheese
 
374
  size:
 
375
    medium
 
376
"""
 
377
 
 
378
 
 
379
REV_PROPS_TESTAMENT_STRICT3 = b"""\
 
380
bazaar testament version 3 strict
 
381
revision-id: test@user-3
 
382
committer: test@user
 
383
timestamp: 1129025493
 
384
timezone: 36000
 
385
parents:
 
386
  test@user-2
 
387
message:
 
388
  revision with properties
 
389
inventory:
 
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
 
394
properties:
 
395
  branch-nick:
 
396
    test branch
 
397
  empty:
 
398
  flavor:
 
399
    sour cherry
 
400
    cream cheese
 
401
  size:
 
402
    medium
 
403
"""
 
404
 
 
405
 
 
406
REV_3_TESTAMENT = b"""\
 
407
bazaar-ng testament version 1
 
408
revision-id: test@user-3
 
409
committer: test@user
 
410
timestamp: 1129025493
 
411
timezone: 36000
 
412
parents:
 
413
  test@user-2
 
414
message:
 
415
  add symlink
 
416
inventory:
 
417
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
418
  symlink link link-id wibble/linktarget
 
419
  directory src src-id
 
420
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
421
properties:
 
422
  branch-nick:
 
423
    test branch
 
424
"""
 
425
 
 
426
 
 
427
REV_3_TESTAMENT_STRICT = b"""\
 
428
bazaar-ng testament version 2.1
 
429
revision-id: test@user-3
 
430
committer: test@user
 
431
timestamp: 1129025493
 
432
timezone: 36000
 
433
parents:
 
434
  test@user-2
 
435
message:
 
436
  add symlink
 
437
inventory:
 
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
 
442
properties:
 
443
  branch-nick:
 
444
    test branch
 
445
"""
 
446
 
 
447
 
 
448
REV_3_TESTAMENT_STRICT3 = b"""\
 
449
bazaar testament version 3 strict
 
450
revision-id: test@user-3
 
451
committer: test@user
 
452
timestamp: 1129025493
 
453
timezone: 36000
 
454
parents:
 
455
  test@user-2
 
456
message:
 
457
  add symlink
 
458
inventory:
 
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
 
464
properties:
 
465
  branch-nick:
 
466
    test branch
 
467
"""
 
468
 
 
469
 
 
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
 
475
timezone: 36000
 
476
parents:
 
477
  test@user-2
 
478
message:
 
479
  non-ascii commit \N{COPYRIGHT SIGN} me
 
480
inventory:
 
481
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
482
  directory src src-id
 
483
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
484
properties:
 
485
  branch-nick:
 
486
    test branch
 
487
  uni:
 
488
    \xb5
 
489
"""
 
490
 
 
491
 
 
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
 
497
timezone: 36000
 
498
parents:
 
499
  test@user-2
 
500
message:
 
501
  non-ascii commit \N{COPYRIGHT SIGN} me
 
502
inventory:
 
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
 
506
properties:
 
507
  branch-nick:
 
508
    test branch
 
509
  uni:
 
510
    \xb5
 
511
"""
 
512
 
 
513
 
 
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
 
519
timezone: 36000
 
520
parents:
 
521
  test@user-2
 
522
message:
 
523
  non-ascii commit \N{COPYRIGHT SIGN} me
 
524
inventory:
 
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
 
529
properties:
 
530
  branch-nick:
 
531
    test branch
 
532
  uni:
 
533
    \xb5
 
534
"""
 
535
 
 
536
 
 
537
texts = {
 
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,
 
545
                },
 
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,
 
553
                      },
 
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,
 
561
                       },
 
562
}