1 # Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@jelmer.uk>
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU Lesser General Public License as published by
5 # the Free Software Foundation; either version 2.1 of the License, or
6 # (at your option) any later version.
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 Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 """Subversion ra library tests."""
18 from StringIO import StringIO
22 from subvertpy import (
26 from subvertpy.tests import (
32 class VersionTest(TestCase):
34 def test_version_length(self):
35 self.assertEqual(4, len(wc.version()))
37 def test_api_version_length(self):
38 self.assertEqual(4, len(wc.api_version()))
40 def test_api_version_later_same(self):
41 self.assertTrue(wc.api_version() <= wc.version())
44 class WorkingCopyTests(TestCase):
46 def test_get_adm_dir(self):
47 self.assertEqual(".svn", wc.get_adm_dir())
49 def test_set_adm_dir(self):
50 old_dir_name = wc.get_adm_dir()
52 wc.set_adm_dir("_svn")
53 self.assertEqual("_svn", wc.get_adm_dir())
55 wc.set_adm_dir(old_dir_name)
57 def test_is_normal_prop(self):
58 self.assertTrue(wc.is_normal_prop("svn:ignore"))
60 def test_is_entry_prop(self):
61 self.assertTrue(wc.is_entry_prop("svn:entry:foo"))
63 def test_is_wc_prop(self):
64 self.assertTrue(wc.is_wc_prop("svn:wc:foo"))
66 def test_match_ignore_list(self):
67 if wc.api_version() < (1, 5):
68 self.assertRaises(NotImplementedError, wc.match_ignore_list, "foo", [])
70 self.assertTrue(wc.match_ignore_list("foo", [ "f*"]))
71 self.assertTrue(wc.match_ignore_list("foo", ["foo"]))
72 self.assertFalse(wc.match_ignore_list("foo", []))
73 self.assertFalse(wc.match_ignore_list("foo", ["bar"]))
76 class WcTests(SubversionTestCase):
78 def test_revision_status(self):
79 repos_url = self.make_client("repos", "checkout")
80 ret = wc.revision_status("checkout")
81 self.assertEqual((0, 0, 0, 0), ret)
83 def test_revision_status_trailing(self):
84 repos_url = self.make_client("repos", "checkout")
85 ret = wc.revision_status("checkout/")
86 self.assertEqual((0, 0, 0, 0), ret)
89 class AdmTests(SubversionTestCase):
92 super(AdmTests, self).setUp()
93 if getattr(wc, "WorkingCopy", None) is None:
95 "Subversion 1.7 API for WorkingCopy not yet supported")
97 def test_has_binary_prop(self):
98 repos_url = self.make_client("repos", "checkout")
99 self.build_tree({"checkout/bar": "\x00\x01"})
100 self.client_add('checkout/bar')
101 adm = wc.WorkingCopy(None, "checkout")
102 path = os.path.join(self.test_dir, "checkout/bar")
103 self.assertFalse(adm.has_binary_prop(path))
106 def test_get_ancestry(self):
107 repos_url = self.make_client("repos", "checkout")
108 self.build_tree({"checkout/bar": "\x00\x01"})
109 self.client_add('checkout/bar')
110 adm = wc.WorkingCopy(None, "checkout")
111 path = os.path.join(self.test_dir, "checkout/bar")
112 self.assertEqual(("%s/bar" % repos_url, 0), adm.get_ancestry("checkout/bar"))
115 def test_maybe_set_repos_root(self):
116 repos_url = self.make_client("repos", "checkout")
117 adm = wc.WorkingCopy(None, "checkout")
118 adm.maybe_set_repos_root(os.path.join(self.test_dir, "checkout"), repos_url)
121 def test_add_repos_file(self):
122 repos_url = self.make_client("repos", "checkout")
123 adm = wc.WorkingCopy(None, "checkout", True)
124 adm.add_repos_file("checkout/bar", StringIO("basecontents"), StringIO("contents"), {}, {})
125 self.assertEqual(b"basecontents", wc.get_pristine_contents("checkout/bar").read())
127 def test_mark_missing_deleted(self):
128 repos_url = self.make_client("repos", "checkout")
129 self.build_tree({"checkout/bar": "\x00\x01"})
130 self.client_add('checkout/bar')
131 adm = wc.WorkingCopy(None, "checkout", True)
132 os.remove("checkout/bar")
133 adm.mark_missing_deleted("checkout/bar")
134 self.assertFalse(os.path.exists("checkout/bar"))
136 def test_remove_from_revision_control(self):
137 repos_url = self.make_client("repos", "checkout")
138 self.build_tree({"checkout/bar": "\x00\x01"})
139 self.client_add('checkout/bar')
140 adm = wc.WorkingCopy(None, "checkout", True)
141 adm.remove_from_revision_control("bar")
142 self.assertTrue(os.path.exists("checkout/bar"))
144 def test_relocate(self):
145 repos_url = self.make_client("repos", "checkout")
146 adm = wc.WorkingCopy(None, "checkout", True)
147 adm.relocate("checkout", "file://", "http://")
149 def test_translated_stream(self):
150 repos_url = self.make_client("repos", "checkout")
151 self.build_tree({"checkout/bar": "My id: $Id$"})
152 self.client_add('checkout/bar')
153 self.client_set_prop("checkout/bar", "svn:keywords", "Id\n")
154 self.client_commit("checkout", "foo")
155 adm = wc.WorkingCopy(None, "checkout", True)
156 path = os.path.join(self.test_dir, "checkout/bar")
157 stream = adm.translated_stream(path, path, wc.TRANSLATE_TO_NF)
158 self.assertTrue(stream.read().startswith(b"My id: $Id: "))
160 def test_text_modified(self):
161 repos_url = self.make_client("repos", "checkout")
162 self.build_tree({"checkout/bar": "My id: $Id$"})
163 self.client_add('checkout/bar')
164 self.client_set_prop("checkout/bar", "svn:keywords", "Id\n")
165 self.client_commit("checkout", "foo")
166 adm = wc.WorkingCopy(None, "checkout")
167 self.assertFalse(adm.text_modified("checkout/bar"))
168 self.build_tree({"checkout/bar": "gambon"})
169 self.assertTrue(adm.text_modified("checkout/bar", True))
171 def test_props_modified(self):
172 repos_url = self.make_client("repos", "checkout")
173 self.build_tree({"checkout/bar": "My id: $Id$"})
174 self.client_add('checkout/bar')
175 self.client_set_prop("checkout/bar", "svn:keywords", "Id\n")
176 self.client_commit("checkout", "foo")
177 adm = wc.WorkingCopy(None, "checkout", True)
178 self.assertFalse(adm.props_modified("checkout/bar"))
179 adm.prop_set("aprop", "avalue", "checkout/bar")
180 self.assertTrue(adm.props_modified("checkout/bar"))
182 def test_prop_set(self):
183 repos_url = self.make_client("repos", "checkout")
184 self.build_tree({"checkout/bar": "file"})
185 self.client_add('checkout/bar')
186 adm = wc.WorkingCopy(None, "checkout", True)
187 adm.prop_set("aprop", "avalue", "checkout/bar")
188 self.assertEqual(adm.prop_get("aprop", "checkout/bar"), "avalue")
189 adm.prop_set("aprop", None, "checkout/bar")
190 self.assertEqual(adm.prop_get("aprop", "checkout/bar"), None)
192 def test_committed_queue(self):
193 if getattr(wc, "CommittedQueue", None) is None:
194 raise SkipTest("CommittedQueue not available")
195 cq = wc.CommittedQueue()
196 repos_url = self.make_client("repos", "checkout")
197 adm = wc.WorkingCopy(None, "checkout", True)
198 adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z", "jelmer")
200 def test_entry_not_found(self):
201 repos_url = self.make_client("repos", "checkout")
202 adm = wc.WorkingCopy(None, "checkout")
203 self.assertRaises(KeyError, adm.entry, "bar")
205 def test_entry(self):
206 repos_url = self.make_client("repos", "checkout")
207 self.build_tree({"checkout/bar": "\x00\x01"})
208 self.client_add('checkout/bar')
209 adm = wc.WorkingCopy(None, "checkout")
210 entry = adm.entry("checkout/bar")
211 self.assertEqual("bar", entry.name)
212 self.assertEqual(NODE_FILE, entry.kind)
213 self.assertEqual(0, entry.revision)
214 self.client_commit("checkout", "msg")
215 adm = wc.WorkingCopy(None, "checkout")
216 entry = adm.entry("checkout/bar")
217 self.assertEqual("bar", entry.name)
218 self.assertEqual(NODE_FILE, entry.kind)
219 self.assertEqual(1, entry.revision)
221 def test_get_actual_target(self):
222 repos_url = self.make_client("repos", ".")
223 self.assertEqual((self.test_dir, "bla"),
224 wc.get_actual_target("%s/bla" % self.test_dir))
226 def test_is_wc_root(self):
227 repos_url = self.make_client("repos", ".")
228 self.build_tree({"bar": None})
229 self.client_add('bar')
230 adm = wc.WorkingCopy(None, ".")
231 self.assertTrue(adm.is_wc_root(self.test_dir))
232 self.assertFalse(adm.is_wc_root(os.path.join(self.test_dir, "bar")))
234 def test_status(self):
235 repos_url = self.make_client("repos", "checkout")
236 self.build_tree({"checkout/bar": "text"})
237 self.client_add('checkout/bar')
238 adm = wc.WorkingCopy(None, "checkout")
239 self.assertEqual(wc.STATUS_ADDED, adm.status('bar').status)
240 self.client_commit("checkout", "foo")
241 adm = wc.WorkingCopy(None, "checkout")
242 self.assertEqual(wc.STATUS_NORMAL, adm.status('bar').status)
244 def test_transmit_text_deltas(self):
245 repos_url = self.make_client("repos", ".")
246 self.build_tree({"bar": "blala"})
247 self.client_add('bar')
248 adm = wc.WorkingCopy(None, ".", True)
249 class Editor(object):
255 def apply_textdelta(self, checksum):
256 def window_handler(window):
257 self._windows.append(window)
258 return window_handler
263 (tmpfile, digest) = adm.transmit_text_deltas("bar", True, editor)
264 self.assertEqual(editor._windows, [(0L, 0, 5, 0, [(2, 0, 5)], b'blala'), None])
265 self.assertIsInstance(tmpfile, str)
266 self.assertEqual(16, len(digest))
268 bar = adm.entry("bar")
269 self.assertEqual(-1, bar.cmt_rev)
270 self.assertEqual(0, bar.revision)
272 cq = wc.CommittedQueue()
274 adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z", "jelmer")
275 bar = adm.entry("bar")
276 self.assertEqual("bar", bar.name)
277 self.assertEqual(NODE_FILE, bar.kind)
278 self.assertEqual(wc.SCHEDULE_NORMAL, bar.schedule)
279 self.assertIs(None, bar.checksum)
280 self.assertEqual(1, bar.cmt_rev)
281 self.assertEqual(1, bar.revision)
283 def test_process_committed_queue(self):
284 repos_url = self.make_client("repos", "checkout")
285 self.build_tree({"checkout/bar": "la"})
286 self.client_add('checkout/bar')
287 adm = wc.WorkingCopy(None, "checkout", True)
288 cq = wc.CommittedQueue()
289 cq.queue(os.path.join(self.test_dir, "checkout/bar"), adm)
290 adm.process_committed_queue(cq, 1, "2010-05-31T08:49:22.430000Z", "jelmer")
291 bar = adm.entry("checkout/bar")
292 self.assertEqual("bar", bar.name)
293 self.assertEqual(NODE_FILE, bar.kind)
294 self.assertEqual(wc.SCHEDULE_ADD, bar.schedule)
296 def test_probe_try(self):
297 repos_url = self.make_client("repos", "checkout")
298 self.build_tree({"checkout/bar": "la"})
299 self.client_add('checkout/bar')
300 adm = wc.WorkingCopy(None, "checkout", True)
302 self.assertIs(None, adm.probe_try(self.test_dir))
303 except subvertpy.SubversionException as e:
305 if num != subvertpy.ERR_WC_NOT_WORKING_COPY:
307 self.assertEqual("checkout", adm.probe_try(os.path.join("checkout", "bar")).access_path())