source: tailor/vcpx/tests/cvs.py @ 1119

Revision 1119, 14.3 KB checked in by lele@…, 7 years ago (diff)

Simple tests for basic CVS revision numbers handling

Line 
1# -*- mode: python; coding: utf-8 -*-
2# :Progetto: vcpx -- cvs specific tests
3# :Creato:   dom 11 lug 2004 18:21:11 CEST
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.cvs import changesets_from_cvslog, compare_cvs_revs, \
12                     cvs_revs_same_branch, normalize_cvs_rev
13
14class CvsEntry(TestCase):
15    """Tests for the CvsEntry class"""
16
17    def testBasicCapabilities(self):
18        """Verify CvsEntry parser"""
19
20        from datetime import datetime, timedelta
21        from vcpx.cvs import CvsEntry
22
23        tagline = "/version.txt/1.16.2.1/Tue Jul 13 12:49:02 2004//T1.16.2.1"
24        e = CvsEntry(tagline)
25        self.assertEqual(e.filename, 'version.txt')
26        self.assertEqual(e.cvs_version, '1.16.2.1')
27        self.assertEqual(e.timestamp, datetime(2004, 7, 13, 12, 49, 2))
28        self.assertEqual(e.cvs_tag, 'T1.16.2.1')
29
30        tagline = "/Validator.py/1.31.2.5/Result of merge+Tue Jul 13 13:43:06 2004//T1.31.2.5"
31        e = CvsEntry(tagline)
32        self.assertEqual(e.filename, 'Validator.py')
33        self.assertEqual(e.cvs_version, '1.31.2.5')
34        self.assertEqual(e.timestamp, datetime(2004, 7, 13, 13, 43, 6))
35        self.assertEqual(e.cvs_tag, 'T1.31.2.5')
36
37        tagline = "/Makefile.am/1.55/Result of merge//T1.55"
38        e = CvsEntry(tagline)
39        self.assertEqual(e.filename, 'Makefile.am')
40        self.assertEqual(e.cvs_version, '1.55')
41        self.assert_((datetime.today() - e.timestamp) < timedelta(seconds=1))
42        self.assertEqual(e.cvs_tag, 'T1.55')
43
44
45class CvsLogParser(TestCase):
46    """Ensure the cvs log parser does its job"""
47
48    def getCvsLog(self, testname):
49        from codecs import open
50        from os.path import join, split
51
52        logname = join(split(__file__)[0], 'data', testname)+'.log'
53        return open(logname, 'r', 'utf-8')
54
55    def testBasicBehaviour(self):
56        """Verify basic cvs log parser behaviour"""
57
58        log = self.getCvsLog('cvs-simple_test')
59        csets = list(changesets_from_cvslog(log, 'docutils'))
60
61        self.assertEqual(len(csets), 2)
62
63        cset = csets[0]
64        self.assertEqual(cset.author, "goodger")
65        self.assertEqual(cset.date, datetime(2004, 6, 3, 13, 50, 58))
66        self.assertEqual(cset.log, "Added to project (exctracted from "
67                                   "HISTORY.txt)")
68        entry = cset.entries[0]
69        self.assertEqual(entry.name, 'THANKS.txt')
70        self.assertEqual(entry.new_revision, '1.1')
71        self.assertEqual(entry.action_kind, entry.ADDED)
72
73        cset = csets[1]
74        self.assertEqual(cset.author, "goodger")
75        self.assertEqual(cset.date, datetime(2004, 6, 10, 2, 17, 20))
76        self.assertEqual(cset.log, "")
77        entry = cset.entries[0]
78        self.assertEqual(entry.name, 'THANKS.txt')
79        self.assertEqual(entry.new_revision, '1.2')
80        self.assertEqual(entry.action_kind, entry.UPDATED)
81
82    def testGroupingCapability(self):
83        """Verify cvs log parser grouping capability"""
84
85        log = self.getCvsLog('cvs-double_test')
86        csets = changesets_from_cvslog(log, 'docutils')
87
88        cset = csets.next()
89        self.assertEqual(cset.author, "goodger")
90        self.assertEqual(cset.date, datetime(2004, 4, 27, 19, 51, 07))
91
92        cset = csets.next()
93        self.assertEqual(cset.author, "goodger")
94        self.assertEqual(cset.date, datetime(2004, 6, 17, 2, 8, 48))
95
96        cset = csets.next()
97        self.assertEqual(cset.author, "goodger")
98        self.assertEqual(cset.date, datetime(2004, 6, 17, 2, 51, 31))
99
100        cset = csets.next()
101        self.assertEqual(cset.author, "goodger")
102        self.assertEqual(cset.date, datetime(2004, 6, 17, 21, 46, 50))
103        self.assertEqual(cset.log,"support for CSV directive implementation")
104        self.assertEqual(len(cset.entries), 2)
105
106        entry = cset.entries[0]
107        self.assertEqual(entry.name, 'docutils/statemachine.py')
108        self.assertEqual(entry.new_revision, '1.16')
109
110        entry = cset.entries[1]
111        self.assertEqual(entry.name, 'docutils/utils.py')
112        self.assertEqual(entry.new_revision, '1.34')
113
114        cset = csets.next()
115        self.assertEqual(cset.author, "felixwiemann")
116        self.assertEqual(cset.date, datetime(2004, 6, 20, 16, 3, 17))
117
118    def testDeletedEntry(self):
119        """Verify recognition of deleted entries in the cvs log"""
120
121        log = self.getCvsLog('cvs-deleted_test')
122        csets = list(changesets_from_cvslog(log, 'docutils'))
123
124        self.assertEqual(len(csets), 2)
125
126        cset = csets[0]
127        entry = cset.entries[0]
128        self.assertEqual(entry.action_kind, entry.ADDED)
129
130        cset = csets[1]
131        entry = cset.entries[0]
132        self.assertEqual(entry.name, 'THANKS.txt')
133        self.assertEqual(entry.action_kind, entry.DELETED)
134
135    def testCollapsedChangeset(self):
136        """Verify the mechanism used to collapse related changesets"""
137
138        log = self.getCvsLog('cvs-collapse_test')
139        csets = list(changesets_from_cvslog(log, 'PyObjC'))
140
141        self.assertEqual(len(csets), 5)
142
143        cset = csets[0]
144        self.assertEqual(len(cset.entries), 2)
145        self.assertEqual(cset.date, datetime(1996, 10, 7, 18, 32, 12))
146
147        cset = csets[1]
148        self.assertEqual(len(cset.entries), 1)
149        self.assertEqual(cset.date, datetime(1996, 10, 14, 13, 56, 50))
150        entry = cset.entries[0]
151        self.assertEqual(entry.name, 'Doc/libObjCStreams.tex')
152
153        cset = csets[2]
154        self.assertEqual(len(cset.entries), 1)
155        self.assertEqual(cset.date, datetime(1996, 10, 18, 12, 36, 4))
156        entry = cset.entries[0]
157        self.assertEqual(entry.name, 'Doc/libPyObjC.tex')
158
159        cset = csets[3]
160        self.assertEqual(len(cset.entries), 2)
161        self.assertEqual(cset.date, datetime(1996, 10, 18, 13, 48, 45))
162
163    def testBranchesInLog(self):
164        """Verify the parser groks with the branches info on revision"""
165
166        log = self.getCvsLog('cvs-branches_test')
167        csets = list(changesets_from_cvslog(log, 'Archetypes'))
168
169        self.assertEqual(len(csets), 3)
170
171        cset = csets[0]
172        self.assertEqual(cset.log,"Fixed deepcopy problem in validations")
173
174    def testReposPath(self):
175        """Verify the parser is right in determine working copy file paths"""
176
177        log = self.getCvsLog('cvs-repospath_test')
178        csets = changesets_from_cvslog(log, 'Zope')
179
180        cset = csets.next()
181        self.assertEqual(cset.log,"backported copy constructor from trunk")
182        self.assertEqual(len(cset.entries), 1)
183        entry = cset.entries[0]
184        self.assertEqual(entry.name, 'lib/python/DateTime/DateTime.py')
185
186    def testLongLog(self):
187        """Stress the parser with a very long changelog"""
188
189        log = self.getCvsLog('cvs-longlog_test')
190        csets = changesets_from_cvslog(log, 'ATContentTypes')
191
192        cset = csets.next()
193        self.assertEqual(cset.author, "tiran")
194        self.assertEqual(cset.date, datetime(2004, 8, 6, 20, 13, 30))
195        self.assertEqual(cset.log, "Added ExtendingType")
196        entry = cset.entries[0]
197        self.assertEqual(entry.name, 'docs/ExtendingType.txt')
198        self.assertEqual(entry.new_revision, '1.1')
199        self.assertEqual(entry.action_kind, entry.ADDED)
200
201        cset = csets.next()
202        self.assertEqual(cset.author, "tiran")
203        self.assertEqual(cset.date, datetime(2004, 8, 9, 7, 44, 9))
204        self.assertEqual(cset.log, """\
205Recoded migration walkers to use a generator instead returning a list to make them much more memory efficient.
206
207Rewritten folder migration to use the depth inside the folder structur instead of recursing into the full side.
208
209Added a findStaledObjects external method to ATCT to find staled objects. It is very useful to clean up a site before running the migration.""")
210        entry = cset.entries[0]
211        self.assertEqual(entry.name, 'Extensions/batchCreate.py')
212        self.assertEqual(entry.new_revision, '1.2')
213        self.assertEqual(entry.action_kind, entry.UPDATED)
214
215        cset = csets.next()
216        self.assertEqual(cset.author, "tiran")
217        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 15, 46))
218        self.assertEqual(cset.log, "Fixed typo")
219
220        cset = csets.next()
221        self.assertEqual(cset.author, "tiran")
222        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 21, 24))
223        self.assertEqual(cset.log, "Something went wrong ...")
224
225        cset = csets.next()
226        self.assertEqual(cset.author, "tiran")
227        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 21, 53))
228        self.assertEqual(cset.log, "Somehow I mixed up two sentences")
229
230        cset = csets.next()
231        self.assertEqual(cset.author, "rochael")
232        self.assertEqual(cset.date, datetime(2004, 8, 13, 13, 59, 55))
233        self.assertEqual(cset.log, "removed duplicated ENABLE_TEMPLATE_MIXIN")
234        entry = cset.entries[0]
235        self.assertEqual(entry.name, 'customconfig.py.example')
236        self.assertEqual(entry.new_revision, '1.7')
237        self.assertEqual(entry.action_kind, entry.UPDATED)
238
239    SILLY_TEST = u"""\
240RCS file: /cvsroot/docutils/docutils/THANKS.txt,v
241head: 1.2
242"""
243
244    def testDirectoryMissing(self):
245        """Verify how parser reacts on bad input"""
246
247        log = StringIO(self.SILLY_TEST)
248        csets = changesets_from_cvslog(log, 'docutils')
249        self.assertRaises(AssertionError, csets.next)
250
251    def testInitialCreationOnBranchBehaviour(self):
252        """Verify cvs log parser skip spurious entries"""
253
254        log = self.getCvsLog('cvs-created_in_branch_test')
255        csets = list(changesets_from_cvslog(log, 'dsssl-utils'))
256
257        self.assertEqual(len(csets), 1)
258
259    def testDescriptionPresent(self):
260        """Verify cvs log parser handle eventual description"""
261
262        log = self.getCvsLog('cvs-description_test')
263        csets = changesets_from_cvslog(log, 'zope')
264
265    def testAddDelAddAgain(self):
266        """Verify add->delete->add/modify->modify CVS case"""
267
268        log = self.getCvsLog('cvs-add_del_add_again_test')
269        csets = list(changesets_from_cvslog(log, 'test'))
270
271        self.assertEqual(len(csets), 6)
272
273        cset = csets[0]
274        entry = cset.entries[0]
275        self.assertEqual(entry.name, 'file')
276        self.assertEqual(entry.new_revision, '1.1')
277        self.assertEqual(entry.action_kind, entry.ADDED)
278
279        cset = csets[1]
280        entry = cset.entries[0]
281        self.assertEqual(entry.name, 'file')
282        self.assertEqual(entry.new_revision, '1.2')
283        self.assertEqual(entry.action_kind, entry.DELETED)
284
285        cset = csets[2]
286        entry = cset.entries[0]
287        self.assertEqual(entry.name, 'file')
288        self.assertEqual(entry.new_revision, '1.3')
289        self.assertEqual(entry.action_kind, entry.ADDED)
290
291    def testModules(self):
292        """Verify the parser correctly handle multimodules"""
293
294        log = self.getCvsLog('cvs-multi_module_test')
295        csets = changesets_from_cvslog(log, 'apache-1.3')
296
297    def testEntryNames(self):
298        """Verify the parser removes module name from entries"""
299
300        log = self.getCvsLog('cvs-entry_names_test')
301        csets = changesets_from_cvslog(log, 'Products/PluggableAuthService')
302
303        cset = csets.next()
304        entry = cset.entries[0]
305        self.assertEqual(entry.name, 'COPYRIGHT.txt')
306
307    def testUnicode(self):
308        """Verify cvs parser returns unicode strings"""
309
310        log = self.getCvsLog('cvs-encoding_test')
311        csets = changesets_from_cvslog(log, 'pxlib')
312
313        log = csets.next().log
314        self.assertEqual(type(log), type(u'€'))
315        self.assertEqual(len(log), 42)
316        self.assertRaises(UnicodeEncodeError, log.encode, 'ascii')
317        self.assertEqual(len(log.encode('ascii', 'ignore')), 41)
318
319    def testDoubleDead(self):
320        """Verify the parser collapse multiple deletions on a single entry"""
321
322        log = self.getCvsLog('cvs-double_dead_test')
323        csets = changesets_from_cvslog(log,
324                                       'composestar/temp/ComposestarVSAddin')
325
326        cset = csets.next()
327        self.assertEqual(len(cset.entries), 2)
328        entry = cset.entries[0]
329        self.assertEqual(entry.name, 'ComposestarVSAddin/Ini.cs')
330        self.assertEqual(entry.new_revision, '1.1')
331        self.assertEqual(entry.action_kind, entry.ADDED)
332        entry = cset.entries[1]
333        self.assertEqual(entry.name, 'ComposestarVSAddin/ConfigManager.cs')
334        self.assertEqual(entry.new_revision, '1.1')
335        self.assertEqual(entry.action_kind, entry.ADDED)
336
337        cset = csets.next()
338        self.assertEqual(len(cset.entries), 2)
339        entry = cset.entries[0]
340        self.assertEqual(entry.name, 'ComposestarVSAddin/Ini.cs')
341        self.assertEqual(entry.new_revision, '1.3')
342        self.assertEqual(entry.action_kind, entry.DELETED)
343        entry = cset.entries[1]
344        self.assertEqual(entry.name, 'ComposestarVSAddin/ConfigManager.cs')
345        self.assertEqual(entry.new_revision, '1.3')
346        self.assertEqual(entry.action_kind, entry.DELETED)
347
348    def testHumanTouched(self):
349        """Verify how the parser behaves with manually tweaked logs"""
350
351        log = self.getCvsLog('cvs-human_touched')
352        csets = list(changesets_from_cvslog(log, 'src'))
353
354        cset = csets[0]
355        self.assertEqual(cset.date, datetime(1994, 5, 17, 13, 03, 36))
356
357        cset = csets[-1]
358        self.assertEqual(cset.date, datetime(1995, 12, 30, 18, 32, 46))
359
360class CvsRevisions(TestCase):
361    """Tests the basic CVS revisions handling"""
362
363    def testComparison(self):
364        """Verify CVS revision comparison is done right"""
365
366        self.assertEqual(0, compare_cvs_revs('1.1', '1.1'))
367        self.assertEqual(-1, compare_cvs_revs('1.1', '1.3'))
368        self.assertEqual(-1, compare_cvs_revs('1.5', '1.51'))
369        self.assertEqual(-1, compare_cvs_revs('1.1', '1.1.2.2'))
370
371    def testBranches(self):
372        """Verify how the backend recognizes branches"""
373
374        n = normalize_cvs_rev
375        self.assertEqual(True, cvs_revs_same_branch(n('1.2'), n('1.2')))
376        self.assertEqual(True, cvs_revs_same_branch(n('1.2.2'), n('1.2.2')))
377        self.assertEqual(False, cvs_revs_same_branch(n('1.2.2'), n('1.2.2.3.3')))
378        self.assertEqual(True, cvs_revs_same_branch(n('1.2.3.4'), n('1.2.3.4')))
379        self.assertEqual(True, cvs_revs_same_branch(n('1.2'), n('1.2.3')))
380        self.assertEqual(True, cvs_revs_same_branch(n('1.2.3'), n('1.2')))
Note: See TracBrowser for help on using the repository browser.