1 # -*- test-case-name: buildbot.test.test_mailparse -*-
5 from twisted
.trial
import unittest
6 from twisted
.python
import util
7 from buildbot
.changes
import mail
10 if sys
.version_info
[:3] < (2,4,0):
11 from sets
import Set
as set
13 class TestFreshCVS(unittest
.TestCase
):
16 msg
= util
.sibpath(__file__
, msg
)
17 s
= mail
.FCMaildirSource(None)
18 return s
.parse_file(open(msg
, "r"))
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)
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)
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)
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)
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)
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)
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)
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)
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
):
119 msg
= util
.sibpath(__file__
, msg
)
120 s
= mail
.FCMaildirSource(None)
121 return s
.parse_file(open(msg
, "r"), prefix
="Twisted/")
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")
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")
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")
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")
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)
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)
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)
199 # files outside Twisted/
200 c
= self
.get("mail/freshcvs.8")
201 self
.assertEqual(c
, None)
204 class TestSyncmail(unittest
.TestCase
):
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"))
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)
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)
232 c
= self
.get("mail/syncmail.3")
233 self
.failUnless(c
== None)
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)
248 c
= self
.getNoPrefix("mail/syncmail.5")
250 self
.assertEqual(c
.who
, "thomas")
251 self
.assertEqual(set(c
.files
),
252 set(['test1/MANIFEST',
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
)
267 c
= self
.get("mail/svn-commit.1", "spamassassin/trunk/")
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")
277 c
= self
.get("mail/svn-commit.2", "spamassassin/trunk/")
281 c
= self
.get("mail/svn-commit.2", "spamassassin/branches/3.1/")
283 self
.failUnlessEqual(c
.who
, "sidney")
284 self
.failUnlessEqual(set(c
.files
),
285 set(["lib/Mail/SpamAssassin/Timeout.pm",
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",
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"))
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:
321 c
= self
.get("launchpad.2",
322 branchMap
= { "lp:~knielsen/maria/tmp-buildbot-test" : "5.1",
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:
334 c
= self
.get("launchpad.3",
335 branchMap
= { "~knielsen/maria/tmp-buildbot-test" : "5.1",
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
347 c
= self
.get("launchpad.4",
348 branchMap
= { "lp::~knielsen/maria/tmp-buildbot-test" : "5.1",
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
360 c
= self
.get("launchpad.5",
361 branchMap
= { "lp::~knielsen/maria/tmp-buildbot-test" : "5.1",
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.
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",
405 branchMap
= { "c" : "C" },
406 defaultBranch
= "b3")
407 self
.failIfEqual(s6
,s8
)
408 s9
= mail
.BzrLaunchpadEmailMaildirSource("/dir1",
410 branchMap
= { "c" : "C" },
411 defaultBranch
= "b3")
413 self
.assertEqual(s8
,s9
)