1 # -*- coding: utf-8 -*-
3 # Copyright (C) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 3 of the License, or
8 # (at your option) any later version.
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, see <http://www.gnu.org/licenses/>.
20 from bzrlib.errors import InvalidRevisionId, NotBranchError
21 from bzrlib.tests import TestCase, TestNotApplicable
22 from bzrlib.revision import Revision
24 from bzrlib.plugins.svn.errors import InvalidPropertyValue
25 from bzrlib.plugins.svn.mapping import (generate_revision_metadata, parse_revision_metadata,
26 parse_revid_property, parse_merge_property, parse_text_parents_property,
27 generate_text_parents_property,
28 escape_svn_path, unescape_svn_path)
29 from bzrlib.plugins.svn.mapping2 import BzrSvnMappingv1, BzrSvnMappingv2
30 from bzrlib.plugins.svn.mapping3 import BzrSvnMappingv3FileProps
31 from bzrlib.plugins.svn.mapping4 import BzrSvnMappingv4
34 class MetadataMarshallerTests(TestCase):
35 def test_generate_revision_metadata_none(self):
37 generate_revision_metadata(None, None, None, None))
39 def test_generate_revision_metadata_committer(self):
40 self.assertEquals("committer: bla\n",
41 generate_revision_metadata(None, None, "bla", None))
43 def test_generate_revision_metadata_timestamp(self):
44 self.assertEquals("timestamp: 2005-06-30 17:38:52.350850105 +0000\n",
45 generate_revision_metadata(1120153132.350850105, 0,
48 def test_generate_revision_metadata_properties(self):
49 self.assertEquals("properties: \n" +
52 generate_revision_metadata(None, None,
53 None, {"propbla": "bloe", "propfoo": "bla"}))
55 def test_parse_revision_metadata_empty(self):
56 parse_revision_metadata("", None)
58 def test_parse_revision_metadata_committer(self):
59 rev = Revision('someid')
60 parse_revision_metadata("committer: somebody\n", rev)
61 self.assertEquals("somebody", rev.committer)
63 def test_parse_revision_metadata_timestamp(self):
64 rev = Revision('someid')
65 parse_revision_metadata("timestamp: 2005-06-30 12:38:52.350850105 -0500\n", rev)
66 self.assertEquals(1120153132.3508501, rev.timestamp)
67 self.assertEquals(-18000, rev.timezone)
69 def test_parse_revision_metadata_timestamp_day(self):
70 rev = Revision('someid')
71 parse_revision_metadata("timestamp: Thu 2005-06-30 12:38:52.350850105 -0500\n", rev)
72 self.assertEquals(1120153132.3508501, rev.timestamp)
73 self.assertEquals(-18000, rev.timezone)
75 def test_parse_revision_metadata_properties(self):
76 rev = Revision('someid')
77 parse_revision_metadata("properties: \n" +
80 self.assertEquals({"foo": "bar", "ha": "ha"}, rev.properties)
82 def test_parse_revision_metadata_no_colon(self):
83 rev = Revision('someid')
84 self.assertRaises(InvalidPropertyValue,
85 lambda: parse_revision_metadata("bla", rev))
87 def test_parse_revision_metadata_specialchar(self):
88 rev = Revision('someid')
89 parse_revision_metadata("committer: Adeodato Simó <dato@net.com.org.es>", rev)
90 self.assertEquals(u"Adeodato Simó <dato@net.com.org.es>", rev.committer)
92 def test_parse_revision_metadata_invalid_name(self):
93 rev = Revision('someid')
94 self.assertRaises(InvalidPropertyValue,
95 lambda: parse_revision_metadata("bla: b", rev))
97 def test_parse_revid_property(self):
98 self.assertEquals((1, "bloe"), parse_revid_property("1 bloe"))
100 def test_parse_revid_property_space(self):
101 self.assertEquals((42, "bloe bla"), parse_revid_property("42 bloe bla"))
103 def test_parse_revid_property_invalid(self):
104 self.assertRaises(InvalidPropertyValue,
105 lambda: parse_revid_property("blabla"))
107 def test_parse_revid_property_empty_revid(self):
108 self.assertRaises(InvalidPropertyValue,
109 lambda: parse_revid_property("2 "))
111 def test_parse_revid_property_newline(self):
112 self.assertRaises(InvalidPropertyValue,
113 lambda: parse_revid_property("foo\nbar"))
116 class ParseTextParentsTestCase(TestCase):
117 def test_text_parents(self):
118 self.assertEquals({"bla": ["bloe"]}, parse_text_parents_property("bla\tbloe\n"))
120 def test_text_parents_empty(self):
121 self.assertEquals({}, parse_text_parents_property(""))
124 class GenerateTextParentsTestCase(TestCase):
125 def test_generate_empty(self):
126 self.assertEquals("", generate_text_parents_property({}))
128 def test_generate_simple(self):
129 self.assertEquals("bla\tbloe\n", generate_text_parents_property({"bla": ["bloe"]}))
132 class ParseMergePropertyTestCase(TestCase):
133 def test_parse_merge_space(self):
134 self.assertEqual((), parse_merge_property("bla bla"))
136 def test_parse_merge_empty(self):
137 self.assertEqual((), parse_merge_property(""))
139 def test_parse_merge_simple(self):
140 self.assertEqual(("bla", "bloe"), parse_merge_property("bla\tbloe"))
145 return sha.new(text).hexdigest()
148 class ParseRevisionIdTests(object):
151 self.assertEqual(("uuid", "trunk", 1, BzrSvnMappingv4()),
152 mapping_registry.parse_revision_id("svn-v3:uuid:trunk:1"))
155 self.assertEqual(("uuid", "trunk", 1, BzrSvnMappingv3FileProps(TrunkBranchingScheme())),
156 mapping_registry.parse_revision_id("svn-v3-trunk0:uuid:trunk:1"))
158 def test_v3_undefined(self):
159 self.assertEqual(("uuid", "trunk", 1, BzrSvnMappingv3FileProps(TrunkBranchingScheme())),
160 mapping_registry.parse_revision_id("svn-v3-undefined:uuid:trunk:1"))
163 self.assertEqual(("uuid", "trunk", 1, BzrSvnMappingv2()),
164 mapping_registry.parse_revision_id("svn-v2:1@uuid-trunk"))
167 self.assertEqual(("uuid", "trunk", 1, BzrSvnMappingv1()),
168 mapping_registry.parse_revision_id("svn-v1:1@uuid-trunk"))
170 def test_except(self):
171 self.assertRaises(InvalidRevisionId,
172 mapping_registry.parse_revision_id, "svn-v0:1@uuid-trunk")
174 def test_except_nonsvn(self):
175 self.assertRaises(InvalidRevisionId,
176 mapping_registry.parse_revision_id, "blah")
179 class EscapeTest(TestCase):
180 def test_escape_svn_path_none(self):
181 self.assertEqual("", escape_svn_path(""))
183 def test_escape_svn_path_simple(self):
184 self.assertEqual("ab", escape_svn_path("ab"))
186 def test_escape_svn_path_percent(self):
187 self.assertEqual("a%25b", escape_svn_path("a%b"))
189 def test_escape_svn_path_whitespace(self):
190 self.assertEqual("foobar%20", escape_svn_path("foobar "))
192 def test_escape_svn_path_slash(self):
193 self.assertEqual("foobar%2F", escape_svn_path("foobar/"))
195 def test_escape_svn_path_special_char(self):
196 self.assertEqual("foobar%8A", escape_svn_path("foobar\x8a"))
198 def test_unescape_svn_path_slash(self):
199 self.assertEqual("foobar/", unescape_svn_path("foobar%2F"))
201 def test_unescape_svn_path_none(self):
202 self.assertEqual("foobar", unescape_svn_path("foobar"))
204 def test_unescape_svn_path_percent(self):
205 self.assertEqual("foobar%b", unescape_svn_path("foobar%25b"))
207 def test_escape_svn_path_nordic(self):
208 self.assertEqual("foobar%C3%A6", escape_svn_path(u"foobar\xe6".encode("utf-8")))