~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

Fix lock test failures by taking lock breaking into account.

* tests/test_lockdir.py:
(TestLockDir.test_43_break): Release the lock after breaking and
acquiring it.

* tests/__init__.py:
(TestCase._check_locks): Consider lock breaks as releases.
(TestCase._track_locks, TestCase._lock_broken): Also track broken locks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Test testaments for gpg signing."""
18
18
 
19
19
# TODO: Testaments with x-bits
20
20
 
21
21
import os
22
 
from sha import sha
23
 
import sys
24
 
 
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
31
 
 
32
 
 
33
 
class TestamentTests(TestCaseInTempDir):
 
22
 
 
23
from bzrlib import osutils
 
24
from bzrlib.tests import SymlinkFeature, TestCaseWithTransport
 
25
from bzrlib.testament import Testament, StrictTestament, StrictTestament3
 
26
from bzrlib.transform import TreeTransform
 
27
 
 
28
 
 
29
class TestamentSetup(TestCaseWithTransport):
34
30
 
35
31
    def setUp(self):
36
 
        super(TestamentTests, self).setUp()
37
 
        b = self.b = Branch.initialize('.')
38
 
        b.commit(message='initial null commit',
 
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')
 
35
        b = self.b = self.wt.branch
 
36
        b.nick = "test branch"
 
37
        self.wt.commit(message='initial null commit',
39
38
                 committer='test@user',
40
39
                 timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
41
40
                 timezone=0,
42
41
                 rev_id='test@user-1')
43
 
        build_tree_contents([('hello', 'contents of hello file'),
 
42
        self.build_tree_contents([('hello', 'contents of hello file'),
44
43
                             ('src/', ),
45
44
                             ('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',
 
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)
 
50
        tt.apply()
 
51
        self.wt.commit(message='add files and directories',
49
52
                 timestamp=1129025483,
50
53
                 timezone=36000,
51
54
                 rev_id='test@user-2',
52
55
                 committer='test@user')
53
56
 
 
57
 
 
58
class TestamentTests(TestamentSetup):
 
59
 
 
60
    def testament_class(self):
 
61
        return Testament
 
62
 
 
63
    def expected(self, key):
 
64
        return texts[self.testament_class()][key]
 
65
 
 
66
    def from_revision(self, repository, revision_id):
 
67
        return self.testament_class().from_revision(repository, revision_id)
 
68
 
54
69
    def test_null_testament(self):
55
70
        """Testament for a revision with no contents."""
56
 
        t = Testament.from_revision(self.b, 'test@user-1')
 
71
        t = self.from_revision(self.b.repository, 'test@user-1')
57
72
        ass = self.assertTrue
58
73
        eq = self.assertEqual
59
74
        ass(isinstance(t, Testament))
64
79
 
65
80
    def test_testment_text_form(self):
66
81
        """Conversion of testament to canonical text form."""
67
 
        t = Testament.from_revision(self.b, 'test@user-1')
 
82
        t = self.from_revision(self.b.repository, 'test@user-1')
68
83
        text_form = t.as_text()
69
84
        self.log('testament text form:\n' + text_form)
70
 
        self.assertEqual(text_form, REV_1_TESTAMENT)
 
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'))
71
88
 
72
89
    def test_testament_with_contents(self):
73
90
        """Testament containing a file and a directory."""
74
 
        t = Testament.from_revision(self.b, 'test@user-2')
 
91
        t = self.from_revision(self.b.repository, 'test@user-2')
75
92
        text_form = t.as_text()
76
93
        self.log('testament text form:\n' + text_form)
77
 
        self.assertEqualDiff(text_form, REV_2_TESTAMENT)
 
94
        self.assertEqualDiff(text_form, self.expected('rev_2'))
78
95
        actual_short = t.as_short_text()
79
 
        self.assertEqualDiff(actual_short, REV_2_SHORT)
80
 
 
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)
86
 
 
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)
 
96
        self.assertEqualDiff(actual_short, self.expected('rev_2_short'))
92
97
 
93
98
    def test_testament_symlinks(self):
94
99
        """Testament containing symlink (where possible)"""
95
 
        if not has_symlinks():
96
 
            return
 
100
        self.requireFeature(SymlinkFeature)
97
101
        os.symlink('wibble/linktarget', 'link')
98
 
        self.b.add(['link'], ['link-id'])
99
 
        self.b.commit(message='add symlink',
 
102
        self.wt.add(['link'], ['link-id'])
 
103
        self.wt.commit(message='add symlink',
100
104
                 timestamp=1129025493,
101
105
                 timezone=36000,
102
106
                 rev_id='test@user-3',
103
107
                 committer='test@user')
104
 
        t = Testament.from_revision(self.b, 'test@user-3')
105
 
        self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
 
108
        t = self.from_revision(self.b.repository, 'test@user-3')
 
109
        self.assertEqualDiff(t.as_text(), self.expected('rev_3'))
106
110
 
107
111
    def test_testament_revprops(self):
108
112
        """Testament to revision with extra properties"""
109
113
        props = dict(flavor='sour cherry\ncream cheese',
110
 
                     size='medium')
111
 
        self.b.commit(message='revision with properties',
 
114
                     size='medium',
 
115
                     empty='',
 
116
                    )
 
117
        self.wt.commit(message='revision with properties',
112
118
                      timestamp=1129025493,
113
119
                      timezone=36000,
114
120
                      rev_id='test@user-3',
115
121
                      committer='test@user',
116
122
                      revprops=props)
117
 
        t = Testament.from_revision(self.b, 'test@user-3')
118
 
        self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
 
123
        t = self.from_revision(self.b.repository, 'test@user-3')
 
124
        self.assertEqualDiff(t.as_text(), self.expected('rev_props'))
 
125
 
 
126
    def test_testament_unicode_commit_message(self):
 
127
        self.wt.commit(
 
128
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
 
129
            timestamp=1129025493,
 
130
            timezone=36000,
 
131
            rev_id='test@user-3',
 
132
            committer='Erik B\xe5gfors <test@user>',
 
133
            revprops={'uni':u'\xb5'}
 
134
            )
 
135
        t = self.from_revision(self.b.repository, 'test@user-3')
 
136
        self.assertEqualDiff(
 
137
            self.expected('sample_unicode').encode('utf-8'), t.as_text())
119
138
 
120
139
    def test___init__(self):
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)
127
 
                    
 
140
        revision = self.b.repository.get_revision('test@user-2')
 
141
        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)
 
147
 
 
148
 
 
149
class TestamentTestsStrict(TestamentTests):
 
150
 
 
151
    def testament_class(self):
 
152
        return StrictTestament
 
153
 
 
154
 
 
155
class TestamentTestsStrict2(TestamentTests):
 
156
 
 
157
    def testament_class(self):
 
158
        return StrictTestament3
 
159
 
128
160
 
129
161
REV_1_TESTAMENT = """\
130
162
bazaar-ng testament version 1
136
168
message:
137
169
  initial null commit
138
170
inventory:
139
 
"""
 
171
properties:
 
172
  branch-nick:
 
173
    test branch
 
174
"""
 
175
 
 
176
 
 
177
REV_1_STRICT_TESTAMENT = """\
 
178
bazaar-ng testament version 2.1
 
179
revision-id: test@user-1
 
180
committer: test@user
 
181
timestamp: 1129025423
 
182
timezone: 0
 
183
parents:
 
184
message:
 
185
  initial null commit
 
186
inventory:
 
187
properties:
 
188
  branch-nick:
 
189
    test branch
 
190
"""
 
191
 
 
192
 
 
193
REV_1_STRICT_TESTAMENT3 = """\
 
194
bazaar testament version 3 strict
 
195
revision-id: test@user-1
 
196
committer: test@user
 
197
timestamp: 1129025423
 
198
timezone: 0
 
199
parents:
 
200
message:
 
201
  initial null commit
 
202
inventory:
 
203
  directory . TREE_ROT test@user-1 no
 
204
properties:
 
205
  branch-nick:
 
206
    test branch
 
207
"""
 
208
 
140
209
 
141
210
REV_1_SHORT = """\
142
211
bazaar-ng testament short form 1
143
212
revision-id: test@user-1
144
213
sha1: %s
145
 
""" % sha(REV_1_TESTAMENT).hexdigest()
 
214
""" % osutils.sha(REV_1_TESTAMENT).hexdigest()
 
215
 
 
216
 
 
217
REV_1_SHORT_STRICT = """\
 
218
bazaar-ng testament short form 2.1
 
219
revision-id: test@user-1
 
220
sha1: %s
 
221
""" % osutils.sha(REV_1_STRICT_TESTAMENT).hexdigest()
 
222
 
 
223
 
 
224
REV_1_SHORT_STRICT3 = """\
 
225
bazaar testament short form 3 strict
 
226
revision-id: test@user-1
 
227
sha1: %s
 
228
""" % osutils.sha(REV_1_STRICT_TESTAMENT3).hexdigest()
146
229
 
147
230
 
148
231
REV_2_TESTAMENT = """\
159
242
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
160
243
  directory src src-id
161
244
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
245
properties:
 
246
  branch-nick:
 
247
    test branch
 
248
"""
 
249
 
 
250
 
 
251
REV_2_STRICT_TESTAMENT = """\
 
252
bazaar-ng testament version 2.1
 
253
revision-id: test@user-2
 
254
committer: test@user
 
255
timestamp: 1129025483
 
256
timezone: 36000
 
257
parents:
 
258
  test@user-1
 
259
message:
 
260
  add files and directories
 
261
inventory:
 
262
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
263
  directory src src-id test@user-2 no
 
264
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
265
properties:
 
266
  branch-nick:
 
267
    test branch
 
268
"""
 
269
 
 
270
 
 
271
REV_2_STRICT_TESTAMENT3 = """\
 
272
bazaar testament version 3 strict
 
273
revision-id: test@user-2
 
274
committer: test@user
 
275
timestamp: 1129025483
 
276
timezone: 36000
 
277
parents:
 
278
  test@user-1
 
279
message:
 
280
  add files and directories
 
281
inventory:
 
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
 
286
properties:
 
287
  branch-nick:
 
288
    test branch
162
289
"""
163
290
 
164
291
 
166
293
bazaar-ng testament short form 1
167
294
revision-id: test@user-2
168
295
sha1: %s
169
 
""" % sha(REV_2_TESTAMENT).hexdigest()
 
296
""" % osutils.sha(REV_2_TESTAMENT).hexdigest()
 
297
 
 
298
 
 
299
REV_2_SHORT_STRICT = """\
 
300
bazaar-ng testament short form 2.1
 
301
revision-id: test@user-2
 
302
sha1: %s
 
303
""" % osutils.sha(REV_2_STRICT_TESTAMENT).hexdigest()
 
304
 
 
305
 
 
306
REV_2_SHORT_STRICT3 = """\
 
307
bazaar testament short form 3 strict
 
308
revision-id: test@user-2
 
309
sha1: %s
 
310
""" % osutils.sha(REV_2_STRICT_TESTAMENT3).hexdigest()
170
311
 
171
312
 
172
313
REV_PROPS_TESTAMENT = """\
184
325
  directory src src-id
185
326
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
186
327
properties:
 
328
  branch-nick:
 
329
    test branch
 
330
  empty:
 
331
  flavor:
 
332
    sour cherry
 
333
    cream cheese
 
334
  size:
 
335
    medium
 
336
"""
 
337
 
 
338
 
 
339
REV_PROPS_TESTAMENT_STRICT = """\
 
340
bazaar-ng testament version 2.1
 
341
revision-id: test@user-3
 
342
committer: test@user
 
343
timestamp: 1129025493
 
344
timezone: 36000
 
345
parents:
 
346
  test@user-2
 
347
message:
 
348
  revision with properties
 
349
inventory:
 
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
 
353
properties:
 
354
  branch-nick:
 
355
    test branch
 
356
  empty:
 
357
  flavor:
 
358
    sour cherry
 
359
    cream cheese
 
360
  size:
 
361
    medium
 
362
"""
 
363
 
 
364
 
 
365
REV_PROPS_TESTAMENT_STRICT3 = """\
 
366
bazaar testament version 3 strict
 
367
revision-id: test@user-3
 
368
committer: test@user
 
369
timestamp: 1129025493
 
370
timezone: 36000
 
371
parents:
 
372
  test@user-2
 
373
message:
 
374
  revision with properties
 
375
inventory:
 
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
 
380
properties:
 
381
  branch-nick:
 
382
    test branch
 
383
  empty:
187
384
  flavor:
188
385
    sour cherry
189
386
    cream cheese
207
404
  symlink link link-id wibble/linktarget
208
405
  directory src src-id
209
406
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
210
 
"""
 
407
properties:
 
408
  branch-nick:
 
409
    test branch
 
410
"""
 
411
 
 
412
 
 
413
REV_3_TESTAMENT_STRICT = """\
 
414
bazaar-ng testament version 2.1
 
415
revision-id: test@user-3
 
416
committer: test@user
 
417
timestamp: 1129025493
 
418
timezone: 36000
 
419
parents:
 
420
  test@user-2
 
421
message:
 
422
  add symlink
 
423
inventory:
 
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
 
428
properties:
 
429
  branch-nick:
 
430
    test branch
 
431
"""
 
432
 
 
433
 
 
434
REV_3_TESTAMENT_STRICT3 = """\
 
435
bazaar testament version 3 strict
 
436
revision-id: test@user-3
 
437
committer: test@user
 
438
timestamp: 1129025493
 
439
timezone: 36000
 
440
parents:
 
441
  test@user-2
 
442
message:
 
443
  add symlink
 
444
inventory:
 
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
 
450
properties:
 
451
  branch-nick:
 
452
    test branch
 
453
"""
 
454
 
 
455
 
 
456
SAMPLE_UNICODE_TESTAMENT = u"""\
 
457
bazaar-ng testament version 1
 
458
revision-id: test@user-3
 
459
committer: Erik B\xe5gfors <test@user>
 
460
timestamp: 1129025493
 
461
timezone: 36000
 
462
parents:
 
463
  test@user-2
 
464
message:
 
465
  non-ascii commit \N{COPYRIGHT SIGN} me
 
466
inventory:
 
467
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
468
  directory src src-id
 
469
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
470
properties:
 
471
  branch-nick:
 
472
    test branch
 
473
  uni:
 
474
    \xb5
 
475
"""
 
476
 
 
477
 
 
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
 
483
timezone: 36000
 
484
parents:
 
485
  test@user-2
 
486
message:
 
487
  non-ascii commit \N{COPYRIGHT SIGN} me
 
488
inventory:
 
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
 
492
properties:
 
493
  branch-nick:
 
494
    test branch
 
495
  uni:
 
496
    \xb5
 
497
"""
 
498
 
 
499
 
 
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
 
505
timezone: 36000
 
506
parents:
 
507
  test@user-2
 
508
message:
 
509
  non-ascii commit \N{COPYRIGHT SIGN} me
 
510
inventory:
 
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
 
515
properties:
 
516
  branch-nick:
 
517
    test branch
 
518
  uni:
 
519
    \xb5
 
520
"""
 
521
 
 
522
 
 
523
texts = {
 
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,
 
531
    },
 
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,
 
539
    },
 
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,
 
547
    },
 
548
}