(closes #575) explicitly import set() on py2.3
[buildbot.git] / buildbot / test / test_mailparse.py
blob8228f2054652ad1daeea67477a7d725fed926f68
1 # -*- test-case-name: buildbot.test.test_mailparse -*-
3 import time
4 import os
5 from twisted.trial import unittest
6 from twisted.python import util
7 from buildbot.changes import mail
9 import sys
10 if sys.version_info[:3] < (2,4,0):
11 from sets import Set as set
13 class TestFreshCVS(unittest.TestCase):
15 def get(self, msg):
16 msg = util.sibpath(__file__, msg)
17 s = mail.FCMaildirSource(None)
18 return s.parse_file(open(msg, "r"))
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)
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)
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)
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)
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)
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.nib",
75 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib",
76 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.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 reactor\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)
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.nib",
92 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib",
93 "Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib",
94 "Twisted/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj"]))
95 self.assertEqual(c.comments,
96 "Directories break debian build script, waiting for reasonable fix\n")
97 self.assertEqual(c.isdir, 0)
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)
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-plugin"]))
112 self.assertEqual(c.comments,
113 "Directory /cvs/Twisted/sandbox/exarkun/persist-plugin added to the repository\n")
114 self.assertEqual(c.isdir, 1)
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/")
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")
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")
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")
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")
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)
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 reactor\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)
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 reasonable fix\n")
196 self.assertEqual(c.isdir, 0)
198 def testMsg8p(self):
199 # files outside Twisted/
200 c = self.get("mail/freshcvs.8")
201 self.assertEqual(c, None)
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/")
210 def getNoPrefix(self, msg):
211 msg = util.sibpath(__file__, msg)
212 s = mail.SyncmailMaildirSource(None)
213 return s.parse_file(open(msg, "r"))
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 changes.freshcvsmail\n")
222 self.assertEqual(c.isdir, 0)
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)
231 def testMsgS3(self):
232 c = self.get("mail/syncmail.3")
233 self.failUnless(c == None)
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)
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)
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)
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")
276 def test2a(self):
277 c = self.get("mail/svn-commit.2", "spamassassin/trunk/")
278 self.failIf(c)
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",
296 self.failUnlessEqual(c.comments,
297 "Bug 4696: consolidated fixes for timeout bugs\n")
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"))
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"]))
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"]))
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-rename-file"]))
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"]))
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"]))
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"]))
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)