bonsaipoller: apply bugfixes from the mozilla folks. Closes #61.
[buildbot.git] / buildbot / test / test_bonsaipoller.py
blob666b84033f7ee8e736913d9481e4f4fb7766dd85
1 # -*- test-case-name: buildbot.test.test_bonsaipoller -*-
3 from twisted.trial import unittest
4 from buildbot.changes.bonsaipoller import FileNode, CiNode, BonsaiResult, \
5 BonsaiParser, BonsaiPoller, InvalidResultError, EmptyResult
7 from copy import deepcopy
8 import re
10 log1 = "Add Bug 338541a"
11 who1 = "sar@gmail.com"
12 date1 = 1161908700
13 log2 = "bug 357427 add static ctor/dtor methods"
14 who2 = "aarrg@ooacm.org"
15 date2 = 1161910620
16 log3 = "Testing log #3 lbah blah"
17 who3 = "huoents@hueont.net"
18 date3 = 1889822728
19 rev1 = "1.8"
20 file1 = "mozilla/testing/mochitest/tests/index.html"
21 rev2 = "1.1"
22 file2 = "mozilla/testing/mochitest/tests/test_bug338541.xhtml"
23 rev3 = "1.1812"
24 file3 = "mozilla/xpcom/threads/nsAutoLock.cpp"
25 rev4 = "1.3"
26 file4 = "mozilla/xpcom/threads/nsAutoLock.h"
27 rev5 = "2.4"
28 file5 = "mozilla/xpcom/threads/test.cpp"
30 nodes = []
31 files = []
32 files.append(FileNode(rev1,file1))
33 nodes.append(CiNode(log1, who1, date1, files))
35 files = []
36 files.append(FileNode(rev2, file2))
37 files.append(FileNode(rev3, file3))
38 nodes.append(CiNode(log2, who2, date2, files))
40 nodes.append(CiNode(log3, who3, date3, []))
42 goodParsedResult = BonsaiResult(nodes)
44 goodUnparsedResult = """\
45 <?xml version="1.0"?>
46 <queryResults>
47 <ci who="%s" date="%d">
48 <log>%s</log>
49 <files>
50 <f rev="%s">%s</f>
51 </files>
52 </ci>
53 <ci who="%s" date="%d">
54 <log>%s</log>
55 <files>
56 <f rev="%s">%s</f>
57 <f rev="%s">%s</f>
58 </files>
59 </ci>
60 <ci who="%s" date="%d">
61 <log>%s</log>
62 <files>
63 </files>
64 </ci>
65 </queryResults>
66 """ % (who1, date1, log1, rev1, file1,
67 who2, date2, log2, rev2, file2, rev3, file3,
68 who3, date3, log3)
70 badUnparsedResult = deepcopy(goodUnparsedResult)
71 badUnparsedResult = badUnparsedResult.replace("</queryResults>", "")
73 invalidDateResult = deepcopy(goodUnparsedResult)
74 invalidDateResult = invalidDateResult.replace(str(date1), "foobar")
76 missingRevisionResult = deepcopy(goodUnparsedResult)
77 missingRevisionResult = missingRevisionResult.replace("rev=\""+rev3+"\"", "")
79 missingFilenameResult = deepcopy(goodUnparsedResult)
80 missingFilenameResult = missingFilenameResult.replace(file2, "")
82 duplicateLogResult = deepcopy(goodUnparsedResult)
83 duplicateLogResult = re.sub("<log>"+log1+"</log>",
84 "<log>blah</log><log>blah</log>",
85 duplicateLogResult)
87 duplicateFilesResult = deepcopy(goodUnparsedResult)
88 duplicateFilesResult = re.sub("<files>\s*</files>",
89 "<files></files><files></files>",
90 duplicateFilesResult)
92 missingCiResult = deepcopy(goodUnparsedResult)
93 r = re.compile("<ci.*</ci>", re.DOTALL | re.MULTILINE)
94 missingCiResult = re.sub(r, "", missingCiResult)
96 badResultMsgs = { 'badUnparsedResult':
97 "BonsaiParser did not raise an exception when given a bad query",
98 'invalidDateResult':
99 "BonsaiParser did not raise an exception when given an invalid date",
100 'missingRevisionResult':
101 "BonsaiParser did not raise an exception when a revision was missing",
102 'missingFilenameResult':
103 "BonsaiParser did not raise an exception when a filename was missing",
104 'duplicateLogResult':
105 "BonsaiParser did not raise an exception when there was two <log> tags",
106 'duplicateFilesResult':
107 "BonsaiParser did not raise an exception when there was two <files> tags",
108 'missingCiResult':
109 "BonsaiParser did not raise an exception when there was no <ci> tags"
112 class FakeBonsaiPoller(BonsaiPoller):
113 def __init__(self):
114 BonsaiPoller.__init__(self, "fake url", "fake module", "fake branch")
116 class TestBonsaiPoller(unittest.TestCase):
117 def testFullyFormedResult(self):
118 br = BonsaiParser(goodUnparsedResult)
119 result = br.getData()
120 # make sure the result is a BonsaiResult
121 self.failUnless(isinstance(result, BonsaiResult))
122 # test for successful parsing
123 self.failUnlessEqual(goodParsedResult, result,
124 "BonsaiParser did not return the expected BonsaiResult")
126 def testBadUnparsedResult(self):
127 try:
128 BonsaiParser(badUnparsedResult)
129 self.fail(badResultMsgs["badUnparsedResult"])
130 except InvalidResultError:
131 pass
133 def testInvalidDateResult(self):
134 try:
135 BonsaiParser(invalidDateResult)
136 self.fail(badResultMsgs["invalidDateResult"])
137 except InvalidResultError:
138 pass
140 def testMissingRevisionResult(self):
141 try:
142 BonsaiParser(missingRevisionResult)
143 self.fail(badResultMsgs["missingRevisionResult"])
144 except InvalidResultError:
145 pass
147 def testMissingFilenameResult(self):
148 try:
149 BonsaiParser(missingFilenameResult)
150 self.fail(badResultMsgs["missingFilenameResult"])
151 except InvalidResultError:
152 pass
154 def testDuplicateLogResult(self):
155 try:
156 BonsaiParser(duplicateLogResult)
157 self.fail(badResultMsgs["duplicateLogResult"])
158 except InvalidResultError:
159 pass
161 def testDuplicateFilesResult(self):
162 try:
163 BonsaiParser(duplicateFilesResult)
164 self.fail(badResultMsgs["duplicateFilesResult"])
165 except InvalidResultError:
166 pass
168 def testMissingCiResult(self):
169 try:
170 BonsaiParser(missingCiResult)
171 self.fail(badResultMsgs["missingCiResult"])
172 except EmptyResult:
173 pass
175 def testChangeNotSubmitted(self):
176 "Make sure a change is not submitted if the BonsaiParser fails"
177 poller = FakeBonsaiPoller()
178 lastChangeBefore = poller.lastChange
179 poller._process_changes(badUnparsedResult)
180 # self.lastChange will not be updated if the change was not submitted
181 self.failUnlessEqual(lastChangeBefore, poller.lastChange)