~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_testament.py

Deprecate compare_trees and move its body to InterTree.changes_from.

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
        self.wt.commit(message='revision with properties',
 
140
                      timestamp=1129025493,
 
141
                      timezone=36000,
 
142
                      rev_id='test@user-3',
 
143
                      committer='test@user',
 
144
                      revprops=props)
 
145
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
146
        self.assertEqualDiff(t.as_text(), REV_PROPS_TESTAMENT)
 
147
 
 
148
    def test_testament_unicode_commit_message(self):
 
149
        self.wt.commit(
 
150
            message=u'non-ascii commit \N{COPYRIGHT SIGN} me',
 
151
            timestamp=1129025493,
 
152
            timezone=36000,
 
153
            rev_id='test@user-3',
 
154
            committer='test@user')
 
155
        t = Testament.from_revision(self.b.repository, 'test@user-3')
 
156
        self.assertEqualDiff(
 
157
            SAMPLE_UNICODE_TESTAMENT.encode('utf-8'), t.as_text())
 
158
 
 
159
    def test___init__(self):
 
160
        revision = self.b.repository.get_revision('test@user-2')
 
161
        inventory = self.b.repository.get_inventory('test@user-2')
 
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)
 
166
                    
 
167
 
 
168
REV_1_TESTAMENT = """\
 
169
bazaar-ng testament version 1
 
170
revision-id: test@user-1
 
171
committer: test@user
 
172
timestamp: 1129025423
 
173
timezone: 0
 
174
parents:
 
175
message:
 
176
  initial null commit
 
177
inventory:
 
178
properties:
 
179
  branch-nick:
 
180
    test branch
 
181
"""
 
182
 
 
183
REV_1_STRICT_TESTAMENT = """\
 
184
bazaar-ng testament version 2.1
 
185
revision-id: test@user-1
 
186
committer: test@user
 
187
timestamp: 1129025423
 
188
timezone: 0
 
189
parents:
 
190
message:
 
191
  initial null commit
 
192
inventory:
 
193
properties:
 
194
  branch-nick:
 
195
    test branch
 
196
"""
 
197
 
 
198
 
 
199
REV_1_SHORT = """\
 
200
bazaar-ng testament short form 1
 
201
revision-id: test@user-1
 
202
sha1: %s
 
203
""" % sha(REV_1_TESTAMENT).hexdigest()
 
204
 
 
205
 
 
206
REV_1_SHORT_STRICT = """\
 
207
bazaar-ng testament short form 2.1
 
208
revision-id: test@user-1
 
209
sha1: %s
 
210
""" % sha(REV_1_STRICT_TESTAMENT).hexdigest()
 
211
 
 
212
 
 
213
REV_2_TESTAMENT = """\
 
214
bazaar-ng testament version 1
 
215
revision-id: test@user-2
 
216
committer: test@user
 
217
timestamp: 1129025483
 
218
timezone: 36000
 
219
parents:
 
220
  test@user-1
 
221
message:
 
222
  add files and directories
 
223
inventory:
 
224
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
225
  directory src src-id
 
226
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
227
properties:
 
228
  branch-nick:
 
229
    test branch
 
230
"""
 
231
 
 
232
 
 
233
REV_2_STRICT_TESTAMENT = """\
 
234
bazaar-ng testament version 2.1
 
235
revision-id: test@user-2
 
236
committer: test@user
 
237
timestamp: 1129025483
 
238
timezone: 36000
 
239
parents:
 
240
  test@user-1
 
241
message:
 
242
  add files and directories
 
243
inventory:
 
244
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73 test@user-2 yes
 
245
  directory src src-id test@user-2 no
 
246
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24 test@user-2 no
 
247
properties:
 
248
  branch-nick:
 
249
    test branch
 
250
"""
 
251
 
 
252
 
 
253
REV_2_SHORT = """\
 
254
bazaar-ng testament short form 1
 
255
revision-id: test@user-2
 
256
sha1: %s
 
257
""" % sha(REV_2_TESTAMENT).hexdigest()
 
258
 
 
259
 
 
260
REV_2_SHORT_STRICT = """\
 
261
bazaar-ng testament short form 2.1
 
262
revision-id: test@user-2
 
263
sha1: %s
 
264
""" % sha(REV_2_STRICT_TESTAMENT).hexdigest()
 
265
 
 
266
 
 
267
REV_PROPS_TESTAMENT = """\
 
268
bazaar-ng testament version 1
 
269
revision-id: test@user-3
 
270
committer: test@user
 
271
timestamp: 1129025493
 
272
timezone: 36000
 
273
parents:
 
274
  test@user-2
 
275
message:
 
276
  revision with properties
 
277
inventory:
 
278
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
279
  directory src src-id
 
280
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
281
properties:
 
282
  branch-nick:
 
283
    test branch
 
284
  flavor:
 
285
    sour cherry
 
286
    cream cheese
 
287
  size:
 
288
    medium
 
289
"""
 
290
 
 
291
 
 
292
REV_3_TESTAMENT = """\
 
293
bazaar-ng testament version 1
 
294
revision-id: test@user-3
 
295
committer: test@user
 
296
timestamp: 1129025493
 
297
timezone: 36000
 
298
parents:
 
299
  test@user-2
 
300
message:
 
301
  add symlink
 
302
inventory:
 
303
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
304
  symlink link link-id wibble/linktarget
 
305
  directory src src-id
 
306
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
307
properties:
 
308
  branch-nick:
 
309
    test branch
 
310
"""
 
311
 
 
312
 
 
313
SAMPLE_UNICODE_TESTAMENT = u"""\
 
314
bazaar-ng testament version 1
 
315
revision-id: test@user-3
 
316
committer: test@user
 
317
timestamp: 1129025493
 
318
timezone: 36000
 
319
parents:
 
320
  test@user-2
 
321
message:
 
322
  non-ascii commit \N{COPYRIGHT SIGN} me
 
323
inventory:
 
324
  file hello hello-id 34dd0ac19a24bf80c4d33b5c8960196e8d8d1f73
 
325
  directory src src-id
 
326
  file src/foo.c foo.c-id a2a049c20f908ae31b231d98779eb63c66448f24
 
327
properties:
 
328
  branch-nick:
 
329
    test branch
 
330
"""