rendered paste body# -*- test-case-name: buildbot.test.test_bonsaipoller -*-
from twisted.trial import unittest
from buildbot.changes.bonsaipoller import *
from StringIO import StringIO
from copy import deepcopy
import re
log1 = "Add Bug 338541a"
who1 = "sar@gmail.com"
date1 = 1161908700
log2 = "bug 357427 add static ctor/dtor methods"
who2 = "aarrg@ooacm.org"
date2 = 1161910620
log3 = "Testing log #3 lbah blah"
who3 = "huoents@hueont.net"
date3 = 1889822728
rev1 = "1.8"
file1 = "mozilla/testing/mochitest/tests/index.html"
rev2 = "1.1"
file2 = "mozilla/testing/mochitest/tests/test_bug338541.xhtml"
rev3 = "1.1812"
file3 = "mozilla/xpcom/threads/nsAutoLock.cpp"
rev4 = "1.3"
file4 = "mozilla/xpcom/threads/nsAutoLock.h"
rev5 = "2.4"
file5 = "mozilla/xpcom/threads/test.cpp"
nodes = []
files = []
files.append(FileNode(rev1,file1))
nodes.append(CiNode(log1, who1, date1, files))
files = []
files.append(FileNode(rev2, file2))
files.append(FileNode(rev3, file3))
nodes.append(CiNode(log2, who2, date2, files))
nodes.append(CiNode(log3, who3, date3, []))
goodParsedResult = BonsaiResult(nodes)
goodUnparsedResult = """\
<?xml version="1.0"?>
<queryResults>
<ci who="%s" date="%d">
<log>%s</log>
<files>
<f rev="%s">%s</f>
</files>
</ci>
<ci who="%s" date="%d">
<log>%s</log>
<files>
<f rev="%s">%s</f>
<f rev="%s">%s</f>
</files>
</ci>
<ci who="%s" date="%d">
<log>%s</log>
<files>
</files>
</ci>
</queryResults>
""" % (
who1, date1, log1, rev1, file1,
who2, date2, log2, rev2, file2, rev3, file3,
who3, date3, log3)
badUnparsedResult = deepcopy(goodUnparsedResult)
badUnparsedResult = badUnparsedResult.replace("</queryResults>", "")
invalidDateResult = deepcopy(goodUnparsedResult)
invalidDateResult = invalidDateResult.replace(str(date1), "foobar")
missingRevisionResult = deepcopy(goodUnparsedResult)
missingRevisionResult = missingRevisionResult.replace("rev=\""+rev3+"\"", "")
duplicateLogResult = deepcopy(goodUnparsedResult)
duplicateLogResult = re.sub("<log>"+log1+"</log>",
"<log>blah</log><log>blah</log>",
duplicateLogResult)
duplicateFilesResult = deepcopy(goodUnparsedResult)
duplicateFilesResult = re.sub("<files>.*</files>",
"<files></files><files></files>",
duplicateFilesResult)
missingCiResult = deepcopy(goodUnparsedResult)
missingCiResult = re.sub("<ci>.*</ci>", "", missingCiResult)
print duplicateFilesResult
print missingCiResult
def compareResults(r1, r2):
if len(r1.nodes) != len(r2.nodes):
return False
for i in range(len(r1.nodes)):
if r1.nodes[i].log != r2.nodes[i].log \
or r1.nodes[i].who != r2.nodes[i].who \
or r1.nodes[i].date != r2.nodes[i].date \
or len(r1.nodes[i].files) != len(r2.nodes[i].files):
return False
for j in range(len(r1.nodes[i].files)):
if r1.nodes[i].files[j].revision != r2.nodes[i].files[j].revision \
or r1.nodes[i].files[j].filename != r2.nodes[i].files[j].filename:
return False
return True
class TestBonsaiPoller:
badResults = [badUnparsedResult, invalidDateResult, missingRevisionResult,
duplicateLogResult, duplicateFilesResult, missingCiResult]
badResultMsgs = [
"BonsaiParser did not raise an exception when given a bad query",
"BonsaiParser did not raise an exception when given an invalid date",
"BonsaiParser did not raise an exception when a revision was missing",
"BonsaiParser did not raise an exception when there was two <log>s",
"BonsaiParser did not raise an exception when there was two <files>s",
"BonsaiParser did not raise an exception when there was no <ci>s"
]
def testFullyFormedResult(self):
br = BonsaiParser(goodUnparsedResult)
result = br.getData()
# make sure the result is a BonsaiResult
self.failIf(isinstance(BonsaiResult, result))
# test for successful parsing
self.failIf(compareResults(goodParsedResult, result))
def testBadResults(self):
"Test to make sure all bad queries raise exceptions"
for i in range(len(badResults)):
try:
BonsaiParser(badResults[i])
self.fail(badResultMsgs[i])
except InvalidResultError:
pass