source: tailor/vcpx/tests/svn.py @ 1346

Revision 1346, 11.2 KB checked in by lele@…, 6 years ago (diff)

Fix the svn log parser
Now the parser explicitly adds a slash to the module name, when it tries
to get the relative portion of each pathname.

Line 
1# -*- mode: python; coding: utf-8 -*-
2# :Progetto: vcpx -- svn specific tests
3# :Creato:   gio 11 nov 2004 19:09:06 CET
4# :Autore:   Lele Gaifax <lele@nautilus.homeip.net>
5# :Licenza:  GNU General Public License
6#
7
8from unittest import TestCase
9from datetime import datetime
10from vcpx.repository.svn import changesets_from_svnlog
11from vcpx.tzinfo import UTC
12
13
14class FakeLogger:
15    def warning(self, *args):
16        pass
17
18
19class FakeRepository:
20    def __init__(self, repo, module):
21        self.repository = repo
22        self.module = module
23        self.log = FakeLogger()
24FR = FakeRepository
25
26
27class SvnLogParser(TestCase):
28    """Ensure the svn log parser does its job"""
29
30    def getSvnLog(self, testname):
31        from os.path import join, split
32
33        logname = join(split(__file__)[0], 'data', testname)+'.log'
34        return file(logname)
35
36    def testRenameBehaviour(self):
37        """Verify svn log parser behaves correctly on renames"""
38
39        log = self.getSvnLog('svn-simple_rename_test')
40        csets = changesets_from_svnlog(log, FR('file:///tmp/t/repo', '/trunk'))
41
42        cset = csets.next()
43        self.assertEqual(cset.author, 'lele')
44        self.assertEqual(cset.date, datetime(2004,11,12,15,05,37,134366,UTC))
45        self.assertEqual(cset.log, 'create tree')
46        self.assertEqual(len(cset.entries), 2)
47
48        entry = cset.entries[0]
49        self.assertEqual(entry.name, 'dir')
50        self.assertEqual(entry.action_kind, entry.ADDED)
51
52        entry = cset.entries[1]
53        self.assertEqual(entry.name, 'dir/a.txt')
54        self.assertEqual(entry.action_kind, entry.ADDED)
55
56        cset = csets.next()
57        self.assertEqual(cset.author, 'lele')
58        self.assertEqual(cset.date, datetime(2004,11,12,15,06,04,193650,UTC))
59        self.assertEqual(cset.log, 'rename dir')
60        self.assertEqual(len(cset.entries), 1)
61
62        entry = cset.entries[0]
63        self.assertEqual(entry.name, 'new')
64        self.assertEqual(entry.action_kind, entry.RENAMED)
65        self.assertEqual(entry.old_name, 'dir')
66
67        self.assertRaises(StopIteration, csets.next)
68
69    def testRenameOutBehaviour(self):
70        """Verify svn log parser behaves correctly on renames out of scope"""
71
72        log = self.getSvnLog('svn-rename_out_test')
73        csets = changesets_from_svnlog(log,
74                                       FR('http://srv/svn/Shtoom', '/trunk'))
75
76        cset = csets.next()
77        self.assertEqual(cset.author, 'anthony')
78        self.assertEqual(cset.date, datetime(2004,11,9,6,54,20,709243,UTC))
79        self.assertEqual(cset.log, 'Moving to a /sandbox\n')
80        self.assertEqual(len(cset.entries), 1)
81
82        entry = cset.entries[0]
83        self.assertEqual(entry.name, 'shtoom/tmp')
84        self.assertEqual(entry.action_kind, entry.DELETED)
85
86        self.assertRaises(StopIteration, csets.next)
87
88    def testCopyAndRename(self):
89        """Verify svn log parser behaves correctly on copies"""
90
91        log = self.getSvnLog('svn-copy_and_rename_test')
92        csets = list(changesets_from_svnlog(log,
93                                            FR('file:///tmp/rep', '/test')))
94        self.assertEqual(len(csets), 4)
95
96        cset = csets[1]
97        self.assertEqual(cset.author, 'lele')
98        self.assertEqual(cset.date, datetime(2005,1,8, 17,36,55,174757,UTC))
99        self.assertEqual(cset.log, 'Copy')
100        self.assertEqual(len(cset.entries), 1)
101
102        entry = cset.entries[0]
103        self.assertEqual(entry.name, 'file2.txt')
104        self.assertEqual(entry.action_kind, entry.ADDED)
105        self.assertEqual(entry.old_name, 'file1.txt')
106
107        cset = csets[2]
108        self.assertEqual(cset.date, datetime(2005,1,8, 17,42,41,347315,UTC))
109        self.assertEqual(cset.log, 'Remove')
110        self.assertEqual(len(cset.entries), 1)
111
112        entry = cset.entries[0]
113        self.assertEqual(entry.name, 'file1.txt')
114        self.assertEqual(entry.action_kind, entry.DELETED)
115
116        cset = csets[3]
117        self.assertEqual(cset.date, datetime(2005,1,8, 17,43,9,909127,UTC))
118        self.assertEqual(cset.log, 'Move')
119        self.assertEqual(len(cset.entries), 1)
120
121        entry = cset.entries[0]
122        self.assertEqual(entry.name, 'file1.txt')
123        self.assertEqual(entry.action_kind, entry.RENAMED)
124        self.assertEqual(entry.old_name, 'file2.txt')
125
126    def testREvent(self):
127        """Verify how tailor handle svn "R" event"""
128
129        log = self.getSvnLog('svn-svn_r_event_test')
130        csets = changesets_from_svnlog(log, FR('file:///tmp/rep', '/trunk'))
131
132        cset = csets.next()
133
134        cset = csets.next()
135        self.assertEqual(cset.author, 'cmlenz')
136        self.assertEqual(cset.date, datetime(2005,3,21, 8,34, 2,522947,UTC))
137        self.assertEqual(len(cset.entries), 7)
138
139        entry = cset.entries[0]
140        self.assertEqual(entry.name, 'scripts/trac-admin')
141        self.assertEqual(entry.action_kind, entry.ADDED)
142
143        entry = cset.entries[1]
144        self.assertEqual(entry.name, 'setup.py')
145        self.assertEqual(entry.action_kind, entry.UPDATED)
146
147        entry = cset.entries[2]
148        self.assertEqual(entry.name, 'trac/scripts')
149        self.assertEqual(entry.action_kind, entry.ADDED)
150
151        entry = cset.entries[3]
152        self.assertEqual(entry.name, 'trac/scripts/__init__.py')
153        self.assertEqual(entry.action_kind, entry.ADDED)
154
155        entry = cset.entries[4]
156        self.assertEqual(entry.name, 'trac/scripts/admin.py')
157        self.assertEqual(entry.action_kind, entry.RENAMED)
158        self.assertEqual(entry.old_name, 'scripts/trac-admin')
159
160        entry = cset.entries[5]
161        self.assertEqual(entry.name, 'trac/tests/environment.py')
162        self.assertEqual(entry.action_kind, entry.UPDATED)
163
164        self.assertRaises(StopIteration, csets.next)
165
166    def testTrackingRoot(self):
167        """Verify we are able to track the root of the repository"""
168
169        log = self.getSvnLog('svn-svn_repos_root_test')
170        csets = list(changesets_from_svnlog(log,
171                                            FR('svn+ssh://caia/tmp/svn', '/')))
172        self.assertEqual(len(csets), 4)
173
174        cset = csets[1]
175        self.assertEqual(len(cset.entries), 3)
176
177        entry = cset.entries[0]
178        self.assertEqual(entry.name, 'branches/branch-a')
179        self.assertEqual(entry.action_kind, entry.ADDED)
180
181        entry = cset.entries[1]
182        self.assertEqual(entry.name, 'branches/branch-a/a.txt')
183        self.assertEqual(entry.action_kind, entry.ADDED)
184
185        entry = cset.entries[2]
186        self.assertEqual(entry.name, 'branches/branch-a/b.txt')
187        self.assertEqual(entry.action_kind, entry.ADDED)
188
189    def testPydistStrangeCase(self):
190        """Verify we are able to groke with svn 'R' strangeness"""
191
192        log = self.getSvnLog('svn-pydist_strange_case')
193        csets = changesets_from_svnlog(log, FR('http://srv/svn', '/py/dist'))
194
195        cset = csets.next()
196        self.assertEqual(len(cset.entries), 3)
197
198        entry = cset.entries[0]
199        self.assertEqual(entry.name, 'py/documentation/example')
200        self.assertEqual(entry.action_kind, entry.RENAMED)
201        self.assertEqual(entry.old_name, 'example')
202
203        entry = cset.entries[1]
204        self.assertEqual(entry.name, 'py/documentation/example/test')
205        self.assertEqual(entry.action_kind, entry.ADDED)
206
207        entry = cset.entries[2]
208        self.assertEqual(entry.name, 'py/documentation/test.txt')
209        self.assertEqual(entry.action_kind, entry.UPDATED)
210
211        self.assertRaises(StopIteration, csets.next)
212
213    def testUnicode(self):
214        """Verify svn parser returns unicode strings"""
215
216        log = self.getSvnLog('svn-encoding_test')
217        csets = changesets_from_svnlog(log, FR('http://srv/plone/CMFPlone',
218                                               '/branches/2.1'))
219
220        log = csets.next().log
221        self.assertEqual(type(log), type(u'€'))
222        self.assertEqual(len(log), 91)
223        self.assertRaises(UnicodeEncodeError, log.encode, 'iso-8859-1')
224        self.assertEqual(len(log.encode('ascii', 'ignore')), 90)
225
226        self.assertRaises(StopIteration, csets.next)
227
228    def testCopyAndReplace(self):
229        """Verify the svn parser handle copy+replace"""
230
231        log = self.getSvnLog('svn-copy_and_replace_test')
232        csets = changesets_from_svnlog(log,
233                                       FR('http://srv/repos/trac', '/trunk'))
234
235        cset = csets.next()
236        self.assertEqual(len(cset.entries), 7)
237
238        entry = cset.entries[0]
239        self.assertEqual(entry.name, 'scripts/trac-admin')
240        self.assertEqual(entry.action_kind, entry.ADDED)
241
242        entry = cset.entries[1]
243        self.assertEqual(entry.name, 'setup.py')
244        self.assertEqual(entry.action_kind, entry.UPDATED)
245
246        entry = cset.entries[2]
247        self.assertEqual(entry.name, 'trac/scripts')
248        self.assertEqual(entry.action_kind, entry.ADDED)
249
250        entry = cset.entries[3]
251        self.assertEqual(entry.name, 'trac/scripts/__init__.py')
252        self.assertEqual(entry.action_kind, entry.ADDED)
253
254        entry = cset.entries[4]
255        self.assertEqual(entry.name, 'trac/scripts/admin.py')
256        self.assertEqual(entry.action_kind, entry.RENAMED)
257        self.assertEqual(entry.old_name, 'scripts/trac-admin')
258
259    def testCopyFromAndRemove(self):
260        """Verify the svn parser handle copyfrom+remove"""
261
262        log = self.getSvnLog('svn-copyfrom_and_remove_test')
263        csets = changesets_from_svnlog(log, FR('http://srv/samba',
264                                               '/branches/SAMBA_4_0'))
265
266        cset = csets.next()
267        self.assertEqual(len(cset.entries), 3)
268
269        entry = cset.entries[0]
270        self.assertEqual(entry.name, 'source/nsswitch')
271        self.assertEqual(entry.action_kind, entry.ADDED)
272
273        entry = cset.entries[1]
274        self.assertEqual(entry.name, 'source/nsswitch/config.m4')
275        self.assertEqual(entry.action_kind, entry.ADDED)
276
277        entry = cset.entries[2]
278        self.assertEqual(entry.name, 'source/nsswitch/wb_common.c')
279        self.assertEqual(entry.action_kind, entry.ADDED)
280
281    def testIncrementalParser(self):
282        """Verify that the svn log parser is effectively incremental"""
283
284        log = self.getSvnLog('svn-svn_repos_root_test')
285        csets = list(changesets_from_svnlog(log,
286                                            FR('svn+ssh://caia/tmp/svn', '/'),
287                                            chunksize=100))
288        self.assertEqual(len(csets), 4)
289
290    def testExternalCopies(self):
291        """Verify that external copies+deletions are handled ok"""
292
293        log = self.getSvnLog('svn-external_copies_test')
294        csets = changesets_from_svnlog(log,
295                                       FR('svn+ssh://caia/tmp/svn', '/trunk'))
296
297        cset = csets.next()
298        cset = csets.next()
299        self.assertEqual(len(cset.entries), 5)
300
301        entry = cset.removedEntries()[0]
302        self.assertEqual(entry.name, 'README_LOGIN')
303
304        cset = csets.next()
305        self.assertEqual(len(cset.entries), 4)
306
307    def testCollidingNames(self):
308        """Verify svn log parser behaves correctly with colliding names"""
309
310        # Sorry, couldn't find a better name
311
312        log = self.getSvnLog('svn-colliding_names_test')
313        csets = changesets_from_svnlog(log,
314                                       FR('svn://ixion.tartarus.org/main', '/putty'))
315
316        cset = csets.next()
317        self.assertEqual(len(cset.entries), 1)
Note: See TracBrowser for help on using the repository browser.