# -*- 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