Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/buildbot/buildbot/status/tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildbot/buildbot/status/tests.py')
-rw-r--r--buildbot/buildbot/status/tests.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/buildbot/buildbot/status/tests.py b/buildbot/buildbot/status/tests.py
new file mode 100644
index 0000000..4c4c894
--- /dev/null
+++ b/buildbot/buildbot/status/tests.py
@@ -0,0 +1,73 @@
+
+from twisted.web import resource
+from twisted.web.error import NoResource
+
+# these are our test result types. Steps are responsible for mapping results
+# into these values.
+SKIP, EXPECTED_FAILURE, FAILURE, ERROR, UNEXPECTED_SUCCESS, SUCCESS = \
+ "skip", "expected failure", "failure", "error", "unexpected success", \
+ "success"
+UNKNOWN = "unknown" # catch-all
+
+
+class OneTest(resource.Resource):
+ isLeaf = 1
+ def __init__(self, parent, testName, results):
+ self.parent = parent
+ self.testName = testName
+ self.resultType, self.results = results
+
+ def render(self, request):
+ request.setHeader("content-type", "text/html")
+ if request.method == "HEAD":
+ request.setHeader("content-length", len(self.html(request)))
+ return ''
+ return self.html(request)
+
+ def html(self, request):
+ # turn ourselves into HTML
+ raise NotImplementedError
+
+class TestResults(resource.Resource):
+ oneTestClass = OneTest
+ def __init__(self):
+ resource.Resource.__init__(self)
+ self.tests = {}
+ def addTest(self, testName, resultType, results=None):
+ self.tests[testName] = (resultType, results)
+ # TODO: .setName and .delete should be used on our Swappable
+ def countTests(self):
+ return len(self.tests)
+ def countFailures(self):
+ failures = 0
+ for t in self.tests.values():
+ if t[0] in (FAILURE, ERROR):
+ failures += 1
+ return failures
+ def summary(self):
+ """Return a short list of text strings as a summary, suitable for
+ inclusion in an Event"""
+ return ["some", "tests"]
+ def describeOneTest(self, testname):
+ return "%s: %s\n" % (testname, self.tests[testname][0])
+ def html(self):
+ data = "<html>\n<head><title>Test Results</title></head>\n"
+ data += "<body>\n"
+ data += "<pre>\n"
+ tests = self.tests.keys()
+ tests.sort()
+ for testname in tests:
+ data += self.describeOneTest(testname)
+ data += "</pre>\n"
+ data += "</body></html>\n"
+ return data
+ def render(self, request):
+ request.setHeader("content-type", "text/html")
+ if request.method == "HEAD":
+ request.setHeader("content-length", len(self.html()))
+ return ''
+ return self.html()
+ def getChild(self, path, request):
+ if self.tests.has_key(path):
+ return self.oneTestClass(self, path, self.tests[path])
+ return NoResource("No such test '%s'" % path)