~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

  • Committer: Aaron Bentley
  • Date: 2006-08-09 16:42:10 UTC
  • mto: This revision was merged to the branch mainline in revision 1911.
  • Revision ID: abentley@panoramicfeedback.com-20060809164210-3945898670a299ca
Merge takes --uncommitted parameter

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 by 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""Test testaments for gpg signing."""
 
18
 
 
19
# TODO: Testaments with x-bits
 
20
 
 
21
import os
 
22
from sha import sha
 
23
import sys
 
24
 
 
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
 
29
from bzrlib.transform import TreeTransform
 
30
from bzrlib.osutils import has_symlinks
 
31
 
 
32
 
 
33
class TestamentTests(TestCaseWithTransport):
 
34
 
 
35
    def setUp(self):
 
36
        super(TestamentTests, self).setUp()
 
37
        self.wt = self.make_branch_and_tree('.')
 
38
        b = self.b = self.wt.branch
 
39
        b.nick = "test branch"
 
40
        self.wt.commit(message='initial null commit',
 
41
                 committer='test@user',
 
42
                 timestamp=1129025423, # 'Tue Oct 11 20:10:23 2005'
 
43
                 timezone=0,
 
44
                 rev_id='test@user-1')
 
45
        self.build_tree_contents([('hello', 'contents of hello file'),
 
46
                             ('src/', ),
 
47
                             ('src/foo.c', 'int main()\n{\n}\n')])
 
48
        self.wt.add(['hello', 'src', 'src/foo.c'],
 
49
                             ['hello-id', 'src-id', 'foo.c-id'])
 
50
        tt = TreeTransform(self.wt)
 
51
        trans_id = tt.trans_id_tree_path('hello')
 
52
        tt.set_executability(True, trans_id)
 
53
        tt.apply()
 
54
        self.wt.commit(message='add files and directories',
 
55
                 timestamp=1129025483,
 
56
                 timezone=36000,
 
57
                 rev_id='test@user-2',
 
58
                 committer='test@user')
 
59
 
 
60
    def test_null_testament(self):
 
61
        """Testament for a revision with no contents."""
 
62
        t = Testament.from_revision(self.b.repository, 'test@user-1')
 
63
        ass = self.assertTrue
 
64
        eq = self.assertEqual
 
65
        ass(isinstance(t, Testament))
 
66
        eq(t.revision_id, 'test@user-1')
 
67
        eq(t.committer, 'test@user')
 
68
        eq(t.timestamp, 1129025423)
 
69
        eq(t.timezone, 0)
 
70
 
 
71
    def test_testment_text_form(self):
 
72
        """Conversion of testament to canonical text form."""
 
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)
 
77
 
 
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)
 
84
 
 
85
    def test_testament_with_contents(self):
 
86
        """Testament containing a file and a directory."""
 
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)
 
93
 
 
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)
 
102
 
 
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)
 
108
 
 
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)
 
114
 
 
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)
 
120
 
 
121
    def test_testament_symlinks(self):
 
122
        """Testament containing symlink (where possible)"""
 
123
        if not has_symlinks():
 
124
            return
 
125
        os.symlink('wibble/linktarget', 'link')
 
126
        self.wt.add(['link'], ['link-id'])
 
127
        self.wt.commit(message='add symlink',
 
128
                 timestamp=1129025493,
 
129
                 timezone=36000,
 
130
                 rev_id='test@user-3',
 
131
                 committer='test@user')
 
132
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
133
        self.assertEqualDiff(t.as_text(), REV_3_TESTAMENT)
 
134
 
 
135
    def test_testament_revprops(self):
 
136
        """Testament to revision with extra properties"""
 
137
        props = dict(flavor='sour cherry\ncream cheese',
 
138
                     size='medium',
 
139
                     empty='',
 
140
                    )
 
141
        self.wt.commit(message='revision with properties',
 
142
                      timestamp=1129025493,
 
143
                      timezone=36000,
 
144
                      rev_id='test@user-3',
 
145
                      committer='test@user',
 
146
                      revprops=props)
 
147
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
148
        self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
 
149
 
 
150
    def test_testament_unicode_commit_message(self):
 
151
        self.wt.commit(
 
152
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
 
153
            timestamp=1129025493,
 
154
            timezone=36000,
 
155
            rev_id='test@user-3',
 
156
            committer='test@user')
 
157
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
158
        self.assertEqualDiff(
 
159
            SAMPLE_UNICODE_TESTAMENT.encode('utf-8'), t.as_text())
 
160
 
 
161
    def test___init__(self):
 
162
        revision = self.b.repository.get_revision('test@user-2')
 
163
        inventory = self.b.repository.get_inventory('test@user-2')
 
164
        testament_1 = Testament(revision, inventory).as_short_text()
 
165
        testament_2 = Testament.from_revision(self.b.repository, 
 
166
                                              'test@user-2').as_short_text()
 
167
        self.assertEqual(testament_1, testament_2)
 
168
                    
 
169
 
 
170
REV_1_TESTAMENT = """\
 
171
bazaar-ng testament version 1
 
172
revision-id: test@user-1
 
173
committer: test@user
 
174
timestamp: 1129025423
 
175
timezone: 0
 
176
parents:
 
177
message:
 
178
  initial null commit
 
179
inventory:
 
180
properties:
 
181
  branch-nick:
 
182
    test branch
 
183
"""
 
184
 
 
185
REV_1_STRICT_TESTAMENT = """\
 
186
bazaar-ng testament version 2.1
 
187
revision-id: test@user-1
 
188
committer: test@user
 
189
timestamp: 1129025423
 
190
timezone: 0
 
191
parents:
 
192
message:
 
193
  initial null commit
 
194
inventory:
 
195
properties:
 
196
  branch-nick:
 
197
    test branch
 
198
"""
 
199
 
 
200
 
 
201
REV_1_SHORT = """\
 
202
bazaar-ng testament short form 1
 
203
revision-id: test@user-1
 
204
sha1: %s
 
205
""" % sha(REV_1_TESTAMENT).hexdigest()
 
206
 
 
207
 
 
208
REV_1_SHORT_STRICT = """\
 
209
bazaar-ng testament short form 2.1
 
210
revision-id: test@user-1
 
211
sha1: %s
 
212
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
 
213
 
 
214
 
 
215
REV_2_TESTAMENT = """\
 
216
bazaar-ng testament version 1
 
217
revision-id: test@user-2
 
218
committer: test@user
 
219
timestamp: 1129025483
 
220
timezone: 36000
 
221
parents:
 
222
  test@user-1
 
223
message:
 
224
  add files and directories
 
225
inventory:
 
226
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
227
  directory src src-id
 
228
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
229
properties:
 
230
  branch-nick:
 
231
    test branch
 
232
"""
 
233
 
 
234
 
 
235
REV_2_STRICT_TESTAMENT = """\
 
236
bazaar-ng testament version 2.1
 
237
revision-id: test@user-2
 
238
committer: test@user
 
239
timestamp: 1129025483
 
240
timezone: 36000
 
241
parents:
 
242
  test@user-1
 
243
message:
 
244
  add files and directories
 
245
inventory:
 
246
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
247
  directory src src-id test@user-2 no
 
248
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
249
properties:
 
250
  branch-nick:
 
251
    test branch
 
252
"""
 
253
 
 
254
 
 
255
REV_2_SHORT = """\
 
256
bazaar-ng testament short form 1
 
257
revision-id: test@user-2
 
258
sha1: %s
 
259
""" % sha(REV_2_TESTAMENT).hexdigest()
 
260
 
 
261
 
 
262
REV_2_SHORT_STRICT = """\
 
263
bazaar-ng testament short form 2.1
 
264
revision-id: test@user-2
 
265
sha1: %s
 
266
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
 
267
 
 
268
 
 
269
REV_PROPS_TESTAMENT = """\
 
270
bazaar-ng testament version 1
 
271
revision-id: test@user-3
 
272
committer: test@user
 
273
timestamp: 1129025493
 
274
timezone: 36000
 
275
parents:
 
276
  test@user-2
 
277
message:
 
278
  revision with properties
 
279
inventory:
 
280
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
281
  directory src src-id
 
282
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
283
properties:
 
284
  branch-nick:
 
285
    test branch
 
286
  empty:
 
287
  flavor:
 
288
    sour cherry
 
289
    cream cheese
 
290
  size:
 
291
    medium
 
292
"""
 
293
 
 
294
 
 
295
REV_3_TESTAMENT = """\
 
296
bazaar-ng testament version 1
 
297
revision-id: test@user-3
 
298
committer: test@user
 
299
timestamp: 1129025493
 
300
timezone: 36000
 
301
parents:
 
302
  test@user-2
 
303
message:
 
304
  add symlink
 
305
inventory:
 
306
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
307
  symlink link link-id wibble/linktarget
 
308
  directory src src-id
 
309
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
310
properties:
 
311
  branch-nick:
 
312
    test branch
 
313
"""
 
314
 
 
315
 
 
316
SAMPLE_UNICODE_TESTAMENT = u"""\
 
317
bazaar-ng testament version 1
 
318
revision-id: test@user-3
 
319
committer: test@user
 
320
timestamp: 1129025493
 
321
timezone: 36000
 
322
parents:
 
323
  test@user-2
 
324
message:
 
325
  non-ascii commit \N{COPYRIGHT SIGN} me
 
326
inventory:
 
327
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
328
  directory src src-id
 
329
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
330
properties:
 
331
  branch-nick:
 
332
    test branch
 
333
"""