[pypy-svn] r52708 - in pypy/build/bot: . test
fijal at codespeak.net
fijal at codespeak.net
Tue Mar 18 22:24:51 CET 2008
Author: fijal
Date: Tue Mar 18 22:24:49 2008
New Revision: 52708
Modified:
pypy/build/bot/pypy_status.py
pypy/build/bot/test/test_mysession.py
Log:
(exarkun, fijal) Add failure page and per-test traceback page
(not fancy enough yet)
Modified: pypy/build/bot/pypy_status.py
==============================================================================
--- pypy/build/bot/pypy_status.py (original)
+++ pypy/build/bot/pypy_status.py Tue Mar 18 22:24:49 2008
@@ -7,6 +7,11 @@
from buildbot.interfaces import LOG_CHANNEL_STDOUT
from buildbot.status.web.base import ICurrentBox, HtmlResource, map_branches, build_get_class
+from twisted.web.static import Data
+from twisted.web.error import NoResource
+from StringIO import StringIO
+from twisted.spread.jelly import unjelly
+from twisted.spread.banana import decode
class LogMixin:
def getLog(self, build, name):
@@ -99,7 +104,6 @@
legend,
testResultsTable])
-
class Summary(HtmlResource, LogMixin):
def body(self, request):
failedTests = {}
@@ -110,13 +114,33 @@
num_builds=1):
log = self.getLog(build, "failedtotal.log")
testNames = log.splitlines()
- failedTests.update(dict.fromkeys(testNames))
+ for test in testNames:
+ failedTests[test] = builderName
return flatten(tags.div[[
- tags.div[tags.a(href="faillog/" + test,
+ tags.div[tags.a(href=str(URL(None, None, pathsegs=['failures'],
+ querysegs=[('buildname', builderName),
+ ('testname', test)]))[1:],
style='color: red; font-weight: bold')['F'],
' ', test]
- for test in failedTests]])
+ for test, builderName in failedTests.iteritems()]])
+ def getChild(self, path, request):
+ if path != 'failures':
+ return NoResource()
+ status = self.getStatus(request)
+ builder = status.getBuilder(request.args['buildname'][0])
+ build = builder.generateFinishedBuilds(branches=[None],
+ num_builds=1).next()
+ testname = request.args['testname'][0]
+ log = self.getLog(build, testname)
+ stuff = unjelly(decode(log))
+ s = StringIO()
+ s.write(testname + '\n\n')
+ for item in stuff.traceback:
+ s.write(str(item))
+ s.write(item.source.splitlines()[item.relline] + '\n')
+ s.write(stuff.typename + ': ' + stuff.value + '\n')
+ return Data(s.getvalue(), 'text/plain')
class RecentlyFailingTests(HtmlResource, LogMixin):
oldBuildCount = 10
Modified: pypy/build/bot/test/test_mysession.py
==============================================================================
--- pypy/build/bot/test/test_mysession.py (original)
+++ pypy/build/bot/test/test_mysession.py Tue Mar 18 22:24:49 2008
@@ -7,6 +7,7 @@
from bot import netstring
from bot.pypybuilders import create_summary
from bot.pypy_status import Summary
+from twisted.web.test.test_web import DummyRequest
testfile = py.code.Source("""
def test_one():
@@ -63,11 +64,7 @@
class XTestReporter(MyReporter):
- def __init__(self, *args, **kwds):
- out = kwds.pop('stringio')
- super(XTestReporter, self).__init__(*args, **kwds)
- self.out = out
- out.write("\n")
+ pass
def _create_output():
tmpdir = py.test.ensuretemp('mysession')
@@ -76,7 +73,7 @@
config = py.test.config._reparse([fobj])
session = config.initsession()
stringio = StringIO()
- session.main(XTestReporter(config, [], stringio=stringio))
+ session.main(XTestReporter(config, [], out=stringio))
return stringio.getvalue()
def test_mysession():
@@ -115,4 +112,17 @@
status = MockStatus({builder.name: builder})
mocksum = MockSummary(status)
view = mocksum.body(None)
- assert view == '<div><div><a style="color: red; font-weight: bold" href="faillog/mysession.test_xxx.py.test_two">F</a> mysession.test_xxx.py.test_two</div></div>'
+ for expected in ['mysession.test_xxx.py.test_two">F</a>',
+ 'mysession.test_xxx.py.test_two</div>']:
+ assert expected in view
+ req = DummyRequest([''])
+ req.args = {'buildname': ['tests'], 'testname': ['mysession.test_xxx.py.test_two']}
+ data = mocksum.getChild('failures', req)
+ expected = ['mysession.test_xxx.py.test_two',
+ 'line 5 in ',
+ 'mysession/test_xxx.py',
+ '1/0',
+ 'ZeroDivisionError: integer division or modulo by zero']
+ for line in expected:
+ assert line in data.data
+
More information about the Pypy-commit
mailing list