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

Revision 933, 9.7 KB checked in by lele@…, 8 years ago (diff)

Use an incremental parser for svn log
This transforms the changesets_from_svnlog() function into a generator
that yields changesets as they are parsed out from XML, that is read
in chunks.

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