All pastes #231682 Raw Edit

Something

public text v1 · immutable
#231682 ·published 2006-10-31 23:24 UTC
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