OLD | NEW |
| (Empty) |
1 # -*- test-case-name: buildbot.test.test_mailparse -*- | |
2 | |
3 import time | |
4 import os | |
5 from twisted.trial import unittest | |
6 from twisted.python import util | |
7 from buildbot.changes import mail | |
8 | |
9 import sys | |
10 if sys.version_info[:3] < (2,4,0): | |
11 from sets import Set as set | |
12 | |
13 class TestFreshCVS(unittest.TestCase): | |
14 | |
15 def get(self, msg): | |
16 msg = util.sibpath(__file__, msg) | |
17 s = mail.FCMaildirSource(None) | |
18 return s.parse_file(open(msg, "r")) | |
19 | |
20 def testMsg1(self): | |
21 c = self.get("mail/freshcvs.1") | |
22 self.assertEqual(c.who, "moshez") | |
23 self.assertEqual(set(c.files), set(["Twisted/debian/python-twisted.menu.
in"])) | |
24 self.assertEqual(c.comments, "Instance massenger, apparently\n") | |
25 self.assertEqual(c.isdir, 0) | |
26 | |
27 def testMsg2(self): | |
28 c = self.get("mail/freshcvs.2") | |
29 self.assertEqual(c.who, "itamarst") | |
30 self.assertEqual(set(c.files), set(["Twisted/twisted/web/woven/form.py", | |
31 "Twisted/twisted/python/formmethod.py"])) | |
32 self.assertEqual(c.comments, | |
33 "submit formmethod now subclass of Choice\n") | |
34 self.assertEqual(c.isdir, 0) | |
35 | |
36 def testMsg3(self): | |
37 # same as msg2 but missing the ViewCVS section | |
38 c = self.get("mail/freshcvs.3") | |
39 self.assertEqual(c.who, "itamarst") | |
40 self.assertEqual(set(c.files), set(["Twisted/twisted/web/woven/form.py", | |
41 "Twisted/twisted/python/formmethod.py"])) | |
42 self.assertEqual(c.comments, | |
43 "submit formmethod now subclass of Choice\n") | |
44 self.assertEqual(c.isdir, 0) | |
45 | |
46 def testMsg4(self): | |
47 # same as msg3 but also missing CVS patch section | |
48 c = self.get("mail/freshcvs.4") | |
49 self.assertEqual(c.who, "itamarst") | |
50 self.assertEqual(set(c.files), set(["Twisted/twisted/web/woven/form.py", | |
51 "Twisted/twisted/python/formmethod.py"])) | |
52 self.assertEqual(c.comments, | |
53 "submit formmethod now subclass of Choice\n") | |
54 self.assertEqual(c.isdir, 0) | |
55 | |
56 def testMsg5(self): | |
57 # creates a directory | |
58 c = self.get("mail/freshcvs.5") | |
59 self.assertEqual(c.who, "etrepum") | |
60 self.assertEqual(set(c.files), set(["Twisted/doc/examples/cocoaDemo"])) | |
61 self.assertEqual(c.comments, | |
62 "Directory /cvs/Twisted/doc/examples/cocoaDemo added to
the repository\n") | |
63 self.assertEqual(c.isdir, 1) | |
64 | |
65 def testMsg6(self): | |
66 # adds files | |
67 c = self.get("mail/freshcvs.6") | |
68 self.assertEqual(c.who, "etrepum") | |
69 self.assertEqual(set(c.files), set([ | |
70 "Twisted/doc/examples/cocoaDemo/MyAppDelegate.py", | |
71 "Twisted/doc/examples/cocoaDemo/__main__.py", | |
72 "Twisted/doc/examples/cocoaDemo/bin-python-main.m", | |
73 "Twisted/doc/examples/cocoaDemo/English.lproj/InfoPlist.strings", | |
74 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.n
ib", | |
75 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib"
, | |
76 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobje
cts.nib", | |
77 "Twisted/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj"])) | |
78 self.assertEqual(c.comments, | |
79 "Cocoa (OS X) clone of the QT demo, using polling react
or\n\nRequires pyobjc ( http://pyobjc.sourceforge.net ), it's not much different
than the template project. The reactor is iterated periodically by a repeating
NSTimer.\n") | |
80 self.assertEqual(c.isdir, 0) | |
81 | |
82 def testMsg7(self): | |
83 # deletes files | |
84 c = self.get("mail/freshcvs.7") | |
85 self.assertEqual(c.who, "etrepum") | |
86 self.assertEqual(set(c.files), set([ | |
87 "Twisted/doc/examples/cocoaDemo/MyAppDelegate.py", | |
88 "Twisted/doc/examples/cocoaDemo/__main__.py", | |
89 "Twisted/doc/examples/cocoaDemo/bin-python-main.m", | |
90 "Twisted/doc/examples/cocoaDemo/English.lproj/InfoPlist.strings", | |
91 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.n
ib", | |
92 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib"
, | |
93 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobje
cts.nib", | |
94 "Twisted/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj"])) | |
95 self.assertEqual(c.comments, | |
96 "Directories break debian build script, waiting for rea
sonable fix\n") | |
97 self.assertEqual(c.isdir, 0) | |
98 | |
99 def testMsg8(self): | |
100 # files outside Twisted/ | |
101 c = self.get("mail/freshcvs.8") | |
102 self.assertEqual(c.who, "acapnotic") | |
103 self.assertEqual(set(c.files), set([ "CVSROOT/freshCfg" ])) | |
104 self.assertEqual(c.comments, "it doesn't work with invalid syntax\n") | |
105 self.assertEqual(c.isdir, 0) | |
106 | |
107 def testMsg9(self): | |
108 # also creates a directory | |
109 c = self.get("mail/freshcvs.9") | |
110 self.assertEqual(c.who, "exarkun") | |
111 self.assertEqual(set(c.files), set(["Twisted/sandbox/exarkun/persist-plu
gin"])) | |
112 self.assertEqual(c.comments, | |
113 "Directory /cvs/Twisted/sandbox/exarkun/persist-plugin
added to the repository\n") | |
114 self.assertEqual(c.isdir, 1) | |
115 | |
116 | |
117 class TestFreshCVS_Prefix(unittest.TestCase): | |
118 def get(self, msg): | |
119 msg = util.sibpath(__file__, msg) | |
120 s = mail.FCMaildirSource(None) | |
121 return s.parse_file(open(msg, "r"), prefix="Twisted/") | |
122 | |
123 def testMsg1p(self): | |
124 c = self.get("mail/freshcvs.1") | |
125 self.assertEqual(c.who, "moshez") | |
126 self.assertEqual(set(c.files), set(["debian/python-twisted.menu.in"])) | |
127 self.assertEqual(c.comments, "Instance massenger, apparently\n") | |
128 | |
129 def testMsg2p(self): | |
130 c = self.get("mail/freshcvs.2") | |
131 self.assertEqual(c.who, "itamarst") | |
132 self.assertEqual(set(c.files), set(["twisted/web/woven/form.py", | |
133 "twisted/python/formmethod.py"])) | |
134 self.assertEqual(c.comments, | |
135 "submit formmethod now subclass of Choice\n") | |
136 | |
137 def testMsg3p(self): | |
138 # same as msg2 but missing the ViewCVS section | |
139 c = self.get("mail/freshcvs.3") | |
140 self.assertEqual(c.who, "itamarst") | |
141 self.assertEqual(set(c.files), set(["twisted/web/woven/form.py", | |
142 "twisted/python/formmethod.py"])) | |
143 self.assertEqual(c.comments, | |
144 "submit formmethod now subclass of Choice\n") | |
145 | |
146 def testMsg4p(self): | |
147 # same as msg3 but also missing CVS patch section | |
148 c = self.get("mail/freshcvs.4") | |
149 self.assertEqual(c.who, "itamarst") | |
150 self.assertEqual(set(c.files), set(["twisted/web/woven/form.py", | |
151 "twisted/python/formmethod.py"])) | |
152 self.assertEqual(c.comments, | |
153 "submit formmethod now subclass of Choice\n") | |
154 | |
155 def testMsg5p(self): | |
156 # creates a directory | |
157 c = self.get("mail/freshcvs.5") | |
158 self.assertEqual(c.who, "etrepum") | |
159 self.assertEqual(set(c.files), set(["doc/examples/cocoaDemo"])) | |
160 self.assertEqual(c.comments, | |
161 "Directory /cvs/Twisted/doc/examples/cocoaDemo added to
the repository\n") | |
162 self.assertEqual(c.isdir, 1) | |
163 | |
164 def testMsg6p(self): | |
165 # adds files | |
166 c = self.get("mail/freshcvs.6") | |
167 self.assertEqual(c.who, "etrepum") | |
168 self.assertEqual(set(c.files), set([ | |
169 "doc/examples/cocoaDemo/MyAppDelegate.py", | |
170 "doc/examples/cocoaDemo/__main__.py", | |
171 "doc/examples/cocoaDemo/bin-python-main.m", | |
172 "doc/examples/cocoaDemo/English.lproj/InfoPlist.strings", | |
173 "doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.nib", | |
174 "doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib", | |
175 "doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib"
, | |
176 "doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj"])) | |
177 self.assertEqual(c.comments, | |
178 "Cocoa (OS X) clone of the QT demo, using polling react
or\n\nRequires pyobjc ( http://pyobjc.sourceforge.net ), it's not much different
than the template project. The reactor is iterated periodically by a repeating
NSTimer.\n") | |
179 self.assertEqual(c.isdir, 0) | |
180 | |
181 def testMsg7p(self): | |
182 # deletes files | |
183 c = self.get("mail/freshcvs.7") | |
184 self.assertEqual(c.who, "etrepum") | |
185 self.assertEqual(set(c.files), set([ | |
186 "doc/examples/cocoaDemo/MyAppDelegate.py", | |
187 "doc/examples/cocoaDemo/__main__.py", | |
188 "doc/examples/cocoaDemo/bin-python-main.m", | |
189 "doc/examples/cocoaDemo/English.lproj/InfoPlist.strings", | |
190 "doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.nib", | |
191 "doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib", | |
192 "doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib"
, | |
193 "doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj"])) | |
194 self.assertEqual(c.comments, | |
195 "Directories break debian build script, waiting for rea
sonable fix\n") | |
196 self.assertEqual(c.isdir, 0) | |
197 | |
198 def testMsg8p(self): | |
199 # files outside Twisted/ | |
200 c = self.get("mail/freshcvs.8") | |
201 self.assertEqual(c, None) | |
202 | |
203 | |
204 class TestSyncmail(unittest.TestCase): | |
205 def get(self, msg): | |
206 msg = util.sibpath(__file__, msg) | |
207 s = mail.SyncmailMaildirSource(None) | |
208 return s.parse_file(open(msg, "r"), prefix="buildbot/") | |
209 | |
210 def getNoPrefix(self, msg): | |
211 msg = util.sibpath(__file__, msg) | |
212 s = mail.SyncmailMaildirSource(None) | |
213 return s.parse_file(open(msg, "r")) | |
214 | |
215 def testMsgS1(self): | |
216 c = self.get("mail/syncmail.1") | |
217 self.failUnless(c is not None) | |
218 self.assertEqual(c.who, "warner") | |
219 self.assertEqual(set(c.files), set(["buildbot/changes/freshcvsmail.py"])
) | |
220 self.assertEqual(c.comments, | |
221 "remove leftover code, leave a temporary compatibility
import. Note! Start\nimporting FCMaildirSource from changes.mail instead of chan
ges.freshcvsmail\n") | |
222 self.assertEqual(c.isdir, 0) | |
223 | |
224 def testMsgS2(self): | |
225 c = self.get("mail/syncmail.2") | |
226 self.assertEqual(c.who, "warner") | |
227 self.assertEqual(set(c.files), set(["ChangeLog"])) | |
228 self.assertEqual(c.comments, "\t* NEWS: started adding new features\n") | |
229 self.assertEqual(c.isdir, 0) | |
230 | |
231 def testMsgS3(self): | |
232 c = self.get("mail/syncmail.3") | |
233 self.failUnless(c == None) | |
234 | |
235 def testMsgS4(self): | |
236 c = self.get("mail/syncmail.4") | |
237 self.assertEqual(c.who, "warner") | |
238 self.assertEqual(set(c.files), | |
239 set(["test/mail/syncmail.1", | |
240 "test/mail/syncmail.2", | |
241 "test/mail/syncmail.3"])) | |
242 self.assertEqual(c.comments, "test cases for syncmail parser\n") | |
243 self.assertEqual(c.isdir, 0) | |
244 self.assertEqual(c.branch, None) | |
245 | |
246 # tests a tag | |
247 def testMsgS5(self): | |
248 c = self.getNoPrefix("mail/syncmail.5") | |
249 self.failUnless(c) | |
250 self.assertEqual(c.who, "thomas") | |
251 self.assertEqual(set(c.files), | |
252 set(['test1/MANIFEST', | |
253 'test1/Makefile.am', | |
254 'test1/autogen.sh', | |
255 'test1/configure.in'])) | |
256 self.assertEqual(c.branch, "BRANCH-DEVEL") | |
257 self.assertEqual(c.isdir, 0) | |
258 | |
259 | |
260 class TestSVNCommitEmail(unittest.TestCase): | |
261 def get(self, msg, prefix): | |
262 msg = util.sibpath(__file__, msg) | |
263 s = mail.SVNCommitEmailMaildirSource(None) | |
264 return s.parse_file(open(msg, "r"), prefix) | |
265 | |
266 def test1(self): | |
267 c = self.get("mail/svn-commit.1", "spamassassin/trunk/") | |
268 self.failUnless(c) | |
269 self.failUnlessEqual(c.who, "felicity") | |
270 self.failUnlessEqual(set(c.files), set(["sa-update.raw"])) | |
271 self.failUnlessEqual(c.branch, None) | |
272 self.failUnlessEqual(c.comments, | |
273 "bug 4864: remove extraneous front-slash " | |
274 "from gpghomedir path\n") | |
275 | |
276 def test2a(self): | |
277 c = self.get("mail/svn-commit.2", "spamassassin/trunk/") | |
278 self.failIf(c) | |
279 | |
280 def test2b(self): | |
281 c = self.get("mail/svn-commit.2", "spamassassin/branches/3.1/") | |
282 self.failUnless(c) | |
283 self.failUnlessEqual(c.who, "sidney") | |
284 self.failUnlessEqual(set(c.files), | |
285 set(["lib/Mail/SpamAssassin/Timeout.pm", | |
286 "MANIFEST", | |
287 "lib/Mail/SpamAssassin/Logger.pm", | |
288 "lib/Mail/SpamAssassin/Plugin/DCC.pm", | |
289 "lib/Mail/SpamAssassin/Plugin/DomainKeys.pm", | |
290 "lib/Mail/SpamAssassin/Plugin/Pyzor.pm", | |
291 "lib/Mail/SpamAssassin/Plugin/Razor2.pm", | |
292 "lib/Mail/SpamAssassin/Plugin/SPF.pm", | |
293 "lib/Mail/SpamAssassin/SpamdForkScaling.pm", | |
294 "spamd/spamd.raw", | |
295 ])) | |
296 self.failUnlessEqual(c.comments, | |
297 "Bug 4696: consolidated fixes for timeout bugs\n") | |
298 | |
299 | |
300 class TestBzrLaunchpadEmail(unittest.TestCase): | |
301 def get(self, msg, **kwargs): | |
302 msg = util.sibpath(__file__, "mail/" + msg) | |
303 s = mail.BzrLaunchpadEmailMaildirSource(None, None, **kwargs) | |
304 if not os.path.exists(msg): | |
305 raise unittest.SkipTest("'%s' not found" % msg) | |
306 return s.parse_file(open(msg, "r")) | |
307 | |
308 # Modified file | |
309 def test1(self): | |
310 c = self.get("launchpad.1") | |
311 self.failUnlessEqual(c.revision, "2700") | |
312 self.failUnlessEqual(c.who, "Kristian Nielsen <knielsen@loke>") | |
313 self.failUnlessEqual(c.branch, "lp:~knielsen/maria/tmp-buildbot-test") | |
314 self.failUnlessEqual(time.gmtime(c.when)[0:6], (2009, 5, 15, 6, 40, 43)) | |
315 self.failUnlessEqual(c.comments, "test commit 2\n") | |
316 self.failUnlessEqual(set(c.files), set(["README MODIFIED", | |
317 "Makefile.am MODIFIED"])) | |
318 | |
319 # Added file and branchMap match with lp: | |
320 def test2(self): | |
321 c = self.get("launchpad.2", | |
322 branchMap = { "lp:~knielsen/maria/tmp-buildbot-test" : "5.1
", | |
323 "foobar" : "baz" }, | |
324 defaultBranch = "bogux") | |
325 self.failUnlessEqual(c.revision, "2701") | |
326 self.failUnlessEqual(c.who, "Kristian Nielsen <knielsen@loke>") | |
327 self.failUnlessEqual(c.branch, "5.1") | |
328 self.failUnlessEqual(time.gmtime(c.when)[0:6], (2009, 5, 15, 8, 35, 43)) | |
329 self.failUnlessEqual(c.comments, "test add file\n") | |
330 self.failUnlessEqual(set(c.files), set(["test-add-file ADDED"])) | |
331 | |
332 # Rename file and branchMap match without lp: | |
333 def test3(self): | |
334 c = self.get("launchpad.3", | |
335 branchMap = { "~knielsen/maria/tmp-buildbot-test" : "5.1", | |
336 "foobar" : "baz" }, | |
337 defaultBranch = "bogux") | |
338 self.failUnlessEqual(c.revision, "2702") | |
339 self.failUnlessEqual(c.who, "Kristian Nielsen <knielsen@loke>") | |
340 self.failUnlessEqual(c.branch, "5.1") | |
341 self.failUnlessEqual(time.gmtime(c.when)[0:6], (2009, 5, 15, 8, 36, 24)) | |
342 self.failUnlessEqual(c.comments, "test rename file\n") | |
343 self.failUnlessEqual(set(c.files), set(["test-add-file RENAMED test-rena
me-file"])) | |
344 | |
345 # Remove file and branchMap fallback to defaultBranch | |
346 def test4(self): | |
347 c = self.get("launchpad.4", | |
348 branchMap = { "lp::~knielsen/maria/tmp-buildbot-test" : "5.
1", | |
349 "foobar" : "baz" }, | |
350 defaultBranch = "db") | |
351 self.failUnlessEqual(c.revision, "2703") | |
352 self.failUnlessEqual(c.who, "Kristian Nielsen <knielsen@loke>") | |
353 self.failUnlessEqual(c.branch, "db") | |
354 self.failUnlessEqual(time.gmtime(c.when)[0:6], (2009, 5, 15, 8, 36, 35)) | |
355 self.failUnlessEqual(c.comments, "test remove file\n") | |
356 self.failUnlessEqual(set(c.files), set(["test-rename-file REMOVED"])) | |
357 | |
358 # MIME decoding of message body and branch name fallback to repository name | |
359 def test5(self): | |
360 c = self.get("launchpad.5", | |
361 branchMap = { "lp::~knielsen/maria/tmp-buildbot-test" : "5.
1", | |
362 "foobar" : "baz" }) | |
363 self.failUnlessEqual(c.revision, "2704") | |
364 self.failUnlessEqual(c.who, "Kristian Nielsen <knielsen@loke>") | |
365 self.failUnlessEqual(c.branch, "lp:~knielsen/maria/tmp-buildbot-test") | |
366 self.failUnlessEqual(time.gmtime(c.when)[0:6], (2009, 5, 15, 8, 39, 58)) | |
367 self.failUnlessEqual(c.comments, "10\n") | |
368 self.failUnlessEqual(set(c.files), set(["tricky=>rename ADDED"])) | |
369 | |
370 # Both rename and modify in same message. | |
371 def test6(self): | |
372 c = self.get("launchpad.6") | |
373 self.failUnlessEqual(c.revision, "2706") | |
374 self.failUnlessEqual(c.who, "Kristian Nielsen <knielsen@loke>") | |
375 self.failUnlessEqual(c.branch, "lp:~knielsen/maria/tmp-buildbot-test") | |
376 self.failUnlessEqual(time.gmtime(c.when)[0:6], (2009, 5, 15, 8, 47, 13)) | |
377 self.failUnlessEqual(c.comments, "rename+mod\n") | |
378 self.failUnlessEqual(set(c.files), | |
379 set(["renamed with => tricky <= name RENAMED better
_name.txt", | |
380 "better_name.txt MODIFIED"])) | |
381 | |
382 # Test equality comparison (for working config reload). | |
383 def test_bzr_mail_reload(self): | |
384 s0 = mail.BzrLaunchpadEmailMaildirSource("/dir1") | |
385 s1 = mail.BzrLaunchpadEmailMaildirSource("/dir2") | |
386 self.failIfEqual(s0,s1) | |
387 s2 = mail.BzrLaunchpadEmailMaildirSource("/dir1", prefix = "lp:") | |
388 self.failIfEqual(s0,s2) | |
389 s3 = mail.BzrLaunchpadEmailMaildirSource("/dir1", prefix = "pl:") | |
390 self.failIfEqual(s2,s3) | |
391 s4 = mail.BzrLaunchpadEmailMaildirSource("/dir1", | |
392 branchMap = { "a" : "A" }) | |
393 self.failIfEqual(s0,s4) | |
394 s5 = mail.BzrLaunchpadEmailMaildirSource("/dir1", | |
395 branchMap = { "a" : "A", "b" :
"B" }) | |
396 self.failIfEqual(s4,s5) | |
397 s6 = mail.BzrLaunchpadEmailMaildirSource("/dir1", | |
398 defaultBranch = "b1") | |
399 self.failIfEqual(s0,s6) | |
400 s7 = mail.BzrLaunchpadEmailMaildirSource("/dir1", | |
401 defaultBranch = "b2") | |
402 self.failIfEqual(s6,s7) | |
403 s8 = mail.BzrLaunchpadEmailMaildirSource("/dir1", | |
404 prefix = "lp", | |
405 branchMap = { "c" : "C" }, | |
406 defaultBranch = "b3") | |
407 self.failIfEqual(s6,s8) | |
408 s9 = mail.BzrLaunchpadEmailMaildirSource("/dir1", | |
409 prefix = "lp", | |
410 branchMap = { "c" : "C" }, | |
411 defaultBranch = "b3") | |
412 s9.dummy = 42 | |
413 self.assertEqual(s8,s9) | |
OLD | NEW |