# -*- 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 = """\
%s
%s
%s
%s
%s
%s
""" % (
who1, date1, log1, rev1, file1,
who2, date2, log2, rev2, file2, rev3, file3,
who3, date3, log3)
badUnparsedResult = deepcopy(goodUnparsedResult)
badUnparsedResult = badUnparsedResult.replace("", "")
invalidDateResult = deepcopy(goodUnparsedResult)
invalidDateResult = invalidDateResult.replace(str(date1), "foobar")
missingRevisionResult = deepcopy(goodUnparsedResult)
missingRevisionResult = missingRevisionResult.replace("rev=\""+rev3+"\"", "")
duplicateLogResult = deepcopy(goodUnparsedResult)
duplicateLogResult = re.sub(""+log1+"",
"blahblah",
duplicateLogResult)
duplicateFilesResult = deepcopy(goodUnparsedResult)
duplicateFilesResult = re.sub(".*",
"",
duplicateFilesResult)
missingCiResult = deepcopy(goodUnparsedResult)
missingCiResult = re.sub(".*", "", 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 s",
"BonsaiParser did not raise an exception when there was two s",
"BonsaiParser did not raise an exception when there was no 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