1 # test_objects.py -- tests for objects.py
2 # Copyright (C) 2007 James Westby <jw+debian@jameswestby.net>
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; version 2
7 # of the License or (at your option) any later version of
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21 """Tests for git base objects."""
28 from dulwich.objects import (
38 a_sha = '6f670c0fb53f9463760b7295fbb814e965fb20c8'
39 b_sha = '2969be3e8ee1c0222396a5611407e4769f14e54b'
40 c_sha = '954a536f7819d40e6f637f849ee187dd10066349'
41 tree_sha = '70c190eb48fa8bbb50ddc692a17b44cb781af7f6'
42 tag_sha = '71033db03a03c6a36721efcf1968dd8f8e0cf023'
44 class BlobReadTests(unittest.TestCase):
45 """Test decompression of blobs"""
47 def get_sha_file(self, obj, base, sha):
48 return obj.from_file(os.path.join(os.path.dirname(__file__),
51 def get_blob(self, sha):
52 """Return the blob named sha from the test data dir"""
53 return self.get_sha_file(Blob, 'blobs', sha)
55 def get_tree(self, sha):
56 return self.get_sha_file(Tree, 'trees', sha)
58 def get_tag(self, sha):
59 return self.get_sha_file(Tag, 'tags', sha)
61 def commit(self, sha):
62 return self.get_sha_file(Commit, 'commits', sha)
64 def test_decompress_simple_blob(self):
65 b = self.get_blob(a_sha)
66 self.assertEqual(b.data, 'test 1\n')
67 self.assertEqual(b.sha().hexdigest(), a_sha)
70 b = self.get_blob(a_sha)
71 self.assertEqual(hash(b.id), hash(b))
73 def test_parse_empty_blob_object(self):
74 sha = 'e69de29bb2d1d6434b8b29ae775ad8c2e48c5391'
75 b = self.get_blob(sha)
76 self.assertEqual(b.data, '')
77 self.assertEqual(b.id, sha)
78 self.assertEqual(b.sha().hexdigest(), sha)
80 def test_create_blob_from_string(self):
82 b = Blob.from_string(string)
83 self.assertEqual(b.data, string)
84 self.assertEqual(b.sha().hexdigest(), b_sha)
86 def test_parse_legacy_blob(self):
88 b = self.get_blob(c_sha)
89 self.assertEqual(b.data, string)
90 self.assertEqual(b.sha().hexdigest(), c_sha)
93 blob1 = self.get_blob(a_sha)
94 blob2 = self.get_blob(a_sha)
95 self.assertEqual(blob1, blob2)
97 def test_read_tree_from_file(self):
98 t = self.get_tree(tree_sha)
99 self.assertEqual(t.entries()[0], (33188, 'a', a_sha))
100 self.assertEqual(t.entries()[1], (33188, 'b', b_sha))
102 def test_read_tag_from_file(self):
103 t = self.get_tag(tag_sha)
104 self.assertEqual(t.object, (Commit, '51b668fd5bf7061b7d6fa525f88803e6cfadaa51'))
105 self.assertEqual(t.name,'signed')
106 self.assertEqual(t.tagger,'Ali Sabil <ali.sabil@gmail.com>')
107 self.assertEqual(t.tag_time, 1231203091)
108 self.assertEqual(t.message, 'This is a signed tag\n-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1.4.9 (GNU/Linux)\n\niEYEABECAAYFAkliqx8ACgkQqSMmLy9u/kcx5ACfakZ9NnPl02tOyYP6pkBoEkU1\n5EcAn0UFgokaSvS371Ym/4W9iJj6vh3h\n=ql7y\n-----END PGP SIGNATURE-----\n')
111 def test_read_commit_from_file(self):
112 sha = '60dacdc733de308bb77bb76ce0fb0f9b44c9769e'
114 self.assertEqual(c.tree, tree_sha)
115 self.assertEqual(c.parents, ['0d89f20333fbb1d2f3a94da77f4981373d8f4310'])
116 self.assertEqual(c.author,
117 'James Westby <jw+debian@jameswestby.net>')
118 self.assertEqual(c.committer,
119 'James Westby <jw+debian@jameswestby.net>')
120 self.assertEqual(c.commit_time, 1174759230)
121 self.assertEqual(c.commit_timezone, 0)
122 self.assertEqual(c.author_timezone, 0)
123 self.assertEqual(c.message, 'Test commit\n')
125 def test_read_commit_no_parents(self):
126 sha = '0d89f20333fbb1d2f3a94da77f4981373d8f4310'
128 self.assertEqual(c.tree, '90182552c4a85a45ec2a835cadc3451bebdfe870')
129 self.assertEqual(c.parents, [])
130 self.assertEqual(c.author,
131 'James Westby <jw+debian@jameswestby.net>')
132 self.assertEqual(c.committer,
133 'James Westby <jw+debian@jameswestby.net>')
134 self.assertEqual(c.commit_time, 1174758034)
135 self.assertEqual(c.commit_timezone, 0)
136 self.assertEqual(c.author_timezone, 0)
137 self.assertEqual(c.message, 'Test commit\n')
139 def test_read_commit_two_parents(self):
140 sha = '5dac377bdded4c9aeb8dff595f0faeebcc8498cc'
142 self.assertEqual(c.tree, 'd80c186a03f423a81b39df39dc87fd269736ca86')
143 self.assertEqual(c.parents, ['ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd',
144 '4cffe90e0a41ad3f5190079d7c8f036bde29cbe6'])
145 self.assertEqual(c.author,
146 'James Westby <jw+debian@jameswestby.net>')
147 self.assertEqual(c.committer,
148 'James Westby <jw+debian@jameswestby.net>')
149 self.assertEqual(c.commit_time, 1174773719)
150 self.assertEqual(c.commit_timezone, 0)
151 self.assertEqual(c.author_timezone, 0)
152 self.assertEqual(c.message, 'Merge ../b\n')
156 class CommitSerializationTests(unittest.TestCase):
160 c.tree = 'd80c186a03f423a81b39df39dc87fd269736ca86'
161 c.parents = ['ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd', '4cffe90e0a41ad3f5190079d7c8f036bde29cbe6']
162 c.author = 'James Westby <jw+debian@jameswestby.net>'
163 c.committer = 'James Westby <jw+debian@jameswestby.net>'
164 c.commit_time = 1174773719
165 c.author_time = 1174773719
166 c.commit_timezone = 0
167 c.author_timezone = 0
168 c.message = 'Merge ../b\n'
171 def test_encoding(self):
173 c.encoding = "iso8859-1"
174 self.assertTrue("encoding iso8859-1\n" in c.as_raw_string())
176 def test_short_timestamp(self):
180 c1.set_raw_string(c.as_raw_string())
181 self.assertEquals(30, c1.commit_time)
183 def test_raw_length(self):
185 self.assertEquals(len(c.as_raw_string()), c._raw_length())
187 def test_simple(self):
189 self.assertEquals(c.id, '5dac377bdded4c9aeb8dff595f0faeebcc8498cc')
191 'tree d80c186a03f423a81b39df39dc87fd269736ca86\n'
192 'parent ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd\n'
193 'parent 4cffe90e0a41ad3f5190079d7c8f036bde29cbe6\n'
194 'author James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
195 'committer James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
197 'Merge ../b\n', c.as_raw_string())
199 def test_timezone(self):
201 c.commit_timezone = 5 * 60
202 self.assertTrue(" +0005\n" in c.as_raw_string())
204 def test_neg_timezone(self):
206 c.commit_timezone = -1 * 3600
207 self.assertTrue(" -0100\n" in c.as_raw_string())
210 class CommitDeserializationTests(unittest.TestCase):
212 def test_simple(self):
213 c = Commit.from_string(
214 'tree d80c186a03f423a81b39df39dc87fd269736ca86\n'
215 'parent ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd\n'
216 'parent 4cffe90e0a41ad3f5190079d7c8f036bde29cbe6\n'
217 'author James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
218 'committer James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
221 self.assertEquals('Merge ../b\n', c.message)
222 self.assertEquals('James Westby <jw+debian@jameswestby.net>',
224 self.assertEquals('James Westby <jw+debian@jameswestby.net>',
226 self.assertEquals('d80c186a03f423a81b39df39dc87fd269736ca86',
228 self.assertEquals(['ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd',
229 '4cffe90e0a41ad3f5190079d7c8f036bde29cbe6'],
232 def test_custom(self):
233 c = Commit.from_string(
234 'tree d80c186a03f423a81b39df39dc87fd269736ca86\n'
235 'parent ab64bbdcc51b170d21588e5c5d391ee5c0c96dfd\n'
236 'parent 4cffe90e0a41ad3f5190079d7c8f036bde29cbe6\n'
237 'author James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
238 'committer James Westby <jw+debian@jameswestby.net> 1174773719 +0000\n'
242 self.assertEquals([('extra-field', 'data')], c.extra)
245 class TreeSerializationTests(unittest.TestCase):
247 def test_simple(self):
248 myhexsha = "d80c186a03f423a81b39df39dc87fd269736ca86"
250 x["myname"] = (0100755, myhexsha)
251 self.assertEquals('100755 myname\0' + hex_to_sha(myhexsha),
254 def test_tree_dir_sort(self):
256 x["a.c"] = (0100755, "d80c186a03f423a81b39df39dc87fd269736ca86")
257 x["a"] = (stat.S_IFDIR, "d80c186a03f423a81b39df39dc87fd269736ca86")
258 x["a/c"] = (stat.S_IFDIR, "d80c186a03f423a81b39df39dc87fd269736ca86")
259 self.assertEquals(["a.c", "a", "a/c"], [p[0] for p in x.iteritems()])
262 class TagSerializeTests(unittest.TestCase):
264 def test_serialize_simple(self):
266 x.tagger = "Jelmer Vernooij <jelmer@samba.org>"
268 x.message = "Tag 0.1"
269 x.object = (3, "d80c186a03f423a81b39df39dc87fd269736ca86")
270 x.tag_time = 423423423
272 self.assertEquals("""object d80c186a03f423a81b39df39dc87fd269736ca86
275 tagger Jelmer Vernooij <jelmer@samba.org> 423423423 +0000
277 Tag 0.1""", x.as_raw_string())
280 class TagParseTests(unittest.TestCase):
282 def test_parse_ctime(self):
284 x.set_raw_string("""object a38d6181ff27824c79fc7df825164a212eff6a3f
287 tagger Linus Torvalds <torvalds@woody.linux-foundation.org> Sun Jul 1 12:54:34 2007 -0700
290 -----BEGIN PGP SIGNATURE-----
291 Version: GnuPG v1.4.7 (GNU/Linux)
293 iD8DBQBGiAaAF3YsRnbiHLsRAitMAKCiLboJkQECM/jpYsY3WPfvUgLXkACgg3ql
294 OK2XeQOiEeXtT76rV4t2WR4=
296 -----END PGP SIGNATURE-----
298 self.assertEquals("Linus Torvalds <torvalds@woody.linux-foundation.org>", x.tagger)
299 self.assertEquals("v2.6.22-rc7", x.name)
301 def test_parse_no_tagger(self):
303 x.set_raw_string("""object a38d6181ff27824c79fc7df825164a212eff6a3f
308 -----BEGIN PGP SIGNATURE-----
309 Version: GnuPG v1.4.7 (GNU/Linux)
311 iD8DBQBGiAaAF3YsRnbiHLsRAitMAKCiLboJkQECM/jpYsY3WPfvUgLXkACgg3ql
312 OK2XeQOiEeXtT76rV4t2WR4=
314 -----END PGP SIGNATURE-----
316 self.assertEquals(None, x.tagger)
317 self.assertEquals("v2.6.22-rc7", x.name)
320 class TimezoneTests(unittest.TestCase):
322 def test_parse_timezone_utc(self):
323 self.assertEquals(0, parse_timezone("+0000"))
325 def test_generate_timezone_utc(self):
326 self.assertEquals("+0000", format_timezone(0))
328 def test_parse_timezone_cet(self):
329 self.assertEquals(60 * 60, parse_timezone("+0100"))
331 def test_format_timezone_cet(self):
332 self.assertEquals("+0100", format_timezone(60 * 60))
334 def test_format_timezone_pdt(self):
335 self.assertEquals("-0400", format_timezone(-4 * 60 * 60))
337 def test_parse_timezone_pdt(self):
338 self.assertEquals(-4 * 60 * 60, parse_timezone("-0400"))
340 def test_format_timezone_pdt_half(self):
341 self.assertEquals("-0440", format_timezone(int(((-4 * 60) - 40) * 60)))
343 def test_parse_timezone_pdt_half(self):
344 self.assertEquals(((-4 * 60) - 40) * 60, parse_timezone("-0440"))