[llvm-commits] [zorg] r82961 - /zorg/trunk/zorg/buildbot/commands/ClangTestCommand.py

Daniel Dunbar daniel at zuster.org
Sun Sep 27 20:55:44 CDT 2009


Author: ddunbar
Date: Sun Sep 27 20:55:43 2009
New Revision: 82961

URL: http://llvm.org/viewvc/llvm-project?rev=82961&view=rev
Log:
Improve Clang (now 'lit') test parser to extract failure logs into
individual reports.

Modified:
    zorg/trunk/zorg/buildbot/commands/ClangTestCommand.py

Modified: zorg/trunk/zorg/buildbot/commands/ClangTestCommand.py
URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/zorg/buildbot/commands/ClangTestCommand.py?rev=82961&r1=82960&r2=82961&view=diff

==============================================================================
--- zorg/trunk/zorg/buildbot/commands/ClangTestCommand.py (original)
+++ zorg/trunk/zorg/buildbot/commands/ClangTestCommand.py Sun Sep 27 20:55:43 2009
@@ -1,5 +1,6 @@
 import itertools
 import re
+import os
 
 import buildbot
 import buildbot.steps.shell
@@ -7,19 +8,42 @@
 class ClangTestCommand(buildbot.steps.shell.Test):
   description = "testing clang"
   descriptionDone = "test clang"
+
   kTestLineRE = re.compile(r'([^ ]*): (.*) \(.*.*\)')
+  kTestFailureLogStartRE = re.compile(r"""\*{4,80} TEST '(.*)' .*""")
+  kTestFailureLogStopRE = re.compile(r"""\*{10,80}""")
+
+  # Show a maximum of 20 individual failure logs.
+  kMaxFailureLogs = 20
+
   def evaluateCommand(self, cmd):
     rc = 0
     grouped = {}
-    failureLog = []
+    failureLogs = []
     lines = self.getLog('stdio').readlines()
 
     it = iter(lines)
+    inFailure = None
     for ln in it:
+      # See if we are inside a failure log.
+      if inFailure:
+        inFailure[1].append(ln)
+        if ClangTestCommand.kTestFailureLogStopRE.match(ln):
+          failureLogs.append(tuple(inFailure))
+          inFailure = None
+        continue
+
       ln = ln.strip()
       if not ln:
         continue
-      
+
+      # Check for test failure logs.
+      m = ClangTestCommand.kTestFailureLogStartRE.match(ln)
+      if m:
+        inFailure = (m.group(1), [ln])
+        continue
+
+      # Otherwise expect a test status line.
       m = ClangTestCommand.kTestLineRE.match(ln)
       if m:
         groupName = m.group(1)
@@ -28,10 +52,17 @@
           grouped[groupName] = []
         grouped[groupName].append(testName)
 
-    # FIXME: Get logs for failures.
+    if inFailure:
+      # FIXME: Different error?
+      raise ValueError,"Unexpected clang test running output, unterminated failure log!"
+
     for name,items in grouped.items():
       if name != 'PASS' and items:
         self.addCompleteLog(name.lower(), '\n'.join(items) + '\n')
+    for name,items in failureLogs[:self.kMaxFailureLogs]:
+      self.addCompleteLog(os.path.basename(name.lower()),
+                          ''.join(items) + '\n')
+      
     numPass = len(grouped.get('PASS',()))
     numFail = len(grouped.get('FAIL',()))
     numXFail = len(grouped.get('XFAIL',()))





More information about the llvm-commits mailing list