[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