[llvm-commits] [zorg] r172327 - in /zorg/trunk/zorg/buildbot: builders/ClangBuilder.py commands/LitTestCommand.py
David Dean
david_dean at apple.com
Thu Jan 17 16:32:52 PST 2013
I'm seeing one more bit of fallout from this change.
When lnt tests fail, we don't have individual test logs, but we used to get a link on the build page with a list of the actually failing tests e.g. http://lab.llvm.org:8011/builders/clang-x86_64-darwin10-nt-O3-vectorize/builds/2250/steps/lnt.nightly-test/logs/tests.FAIL
I'm not seeing this on any of my masters any more.
Could you please investigate?
On 12 Jan 2013, at 12:50 PM, David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Sat Jan 12 14:50:32 2013
> New Revision: 172327
>
> URL: http://llvm.org/viewvc/llvm-project?rev=172327&view=rev
> Log:
> Improve LitTestCommand
>
> * use a LogObserver to provide dynamic results
> * display specific result types rather than warn/pass/fail
>
> Modified:
> zorg/trunk/zorg/buildbot/builders/ClangBuilder.py
> zorg/trunk/zorg/buildbot/commands/LitTestCommand.py
>
> Modified: zorg/trunk/zorg/buildbot/builders/ClangBuilder.py
> URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/zorg/buildbot/builders/ClangBuilder.py?rev=172327&r1=172326&r2=172327&view=diff
> ==============================================================================
> --- zorg/trunk/zorg/buildbot/builders/ClangBuilder.py (original)
> +++ zorg/trunk/zorg/buildbot/builders/ClangBuilder.py Sat Jan 12 14:50:32 2013
> @@ -211,7 +211,7 @@
> if run_cxx_tests:
> extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
> if test:
> - f.addStep(ClangTestCommand(name='check-all',
> + f.addStep(LitTestCommand(name='check-all',
> command=[make, "check-all", "VERBOSE=1",
> WithProperties("LIT_ARGS=%s" % llvmTestArgs),
> WithProperties("TESTARGS=%s" % clangTestArgs),
>
> Modified: zorg/trunk/zorg/buildbot/commands/LitTestCommand.py
> URL: http://llvm.org/viewvc/llvm-project/zorg/trunk/zorg/buildbot/commands/LitTestCommand.py?rev=172327&r1=172326&r2=172327&view=diff
> ==============================================================================
> --- zorg/trunk/zorg/buildbot/commands/LitTestCommand.py (original)
> +++ zorg/trunk/zorg/buildbot/commands/LitTestCommand.py Sat Jan 12 14:50:32 2013
> @@ -1,50 +1,73 @@
> import re
> -import StandardizedTest
> -
> -class LitTestCommand(StandardizedTest.StandardizedTest):
> - kTestLineRE = re.compile(r'([^ ]*): (.*) \(.*.*\)')
> - kTestFailureLogStartRE = re.compile(r"""\*{4,80} TEST '(.*)' .*""")
> - kTestFailureLogStopRE = re.compile(r"""\*{10,80}""")
> -
> - def parseLog(self, lines):
> - results = []
> - results_by_name = {}
> - failureLogs = []
> - lines = self.getLog('stdio').readlines()
> -
> - it = iter(lines)
> - inFailure = None
> - for ln in it:
> +import urllib
> +import buildbot
> +import buildbot.status.builder
> +from buildbot.status.results import FAILURE, SUCCESS
> +import buildbot.steps.shell
> +from buildbot.process.buildstep import LogLineObserver
> +from buildbot.steps.shell import Test
> +
> +class LitLogObserver(LogLineObserver):
> + kTestLineRE = re.compile(r'([^ ]*): (.*) \(.*.*\)')
> + kTestFailureLogStartRE = re.compile(r"""\*{4,80} TEST '(.*)' .*""")
> + kTestFailureLogStopRE = re.compile(r"""\*{10,80}""")
> + def __init__(self):
> + LogLineObserver.__init__(self)
> + self.resultCounts = {}
> + self.inFailure = None
> + def outLineReceived(self, line):
> # See if we are inside a failure log.
> - if inFailure:
> - inFailure[1].append(ln)
> - if self.kTestFailureLogStopRE.match(ln):
> - name,log = inFailure
> - if name not in results_by_name:
> - raise ValueError,'Invalid log result with no status line!'
> - results_by_name[name][2] = ''.join(log) + '\n'
> - inFailure = None
> - continue
> -
> - ln = ln.strip()
> - if not ln:
> - continue
> + if self.inFailure:
> + self.inFailure[1].append(line)
> + if self.kTestFailureLogStopRE.match(line):
> + name,log = self.inFailure
> + self.step.addCompleteLog(name.replace('/', '__'), '\n'.join(log))
> + self.inFailure = None
> + return
> +
> + line = line.strip()
> + if not line:
> + return
>
> # Check for test failure logs.
> - m = self.kTestFailureLogStartRE.match(ln)
> + m = self.kTestFailureLogStartRE.match(line)
> if m:
> - inFailure = (m.group(1), [ln])
> - continue
> + self.inFailure = (m.group(1), [line])
> + return
>
> # Otherwise expect a test status line.
> - m = self.kTestLineRE.match(ln)
> + m = self.kTestLineRE.match(line)
> if m:
> - code, name = m.group(1),m.group(2)
> - results.append( [code, name, None] )
> - results_by_name[name] = results[-1]
> -
> - if inFailure:
> - raise ValueError,("Unexpected clang test running output, "
> - "unterminated failure log!")
> -
> - return results
> + code, name = m.groups()
> + if not code in self.resultCounts:
> + self.resultCounts[code] = 0
> + self.resultCounts[code] += 1
> +
> +class LitTestCommand(Test):
> + resultNames = {'FAIL':'unexpected failures',
> + 'PASS':'expected passes',
> + 'XFAIL':'expected failures',
> + 'XPASS':'unexpected passes',
> + 'KFAIL':'known failures',
> + 'KPASS':'unknown passes',
> + 'UNRESOLVED':'unresolved testcases',
> + 'UNTESTED':'untested testcases',
> + 'UNSUPPORTED':'unsupported tests'}
> + failingCodes = set(['FAIL', 'XPASS', 'KPASS', 'UNRESOLVED'])
> +
> + def __init__(self, ignore=[], flaky=[], max_logs=20,
> + *args, **kwargs):
> + Test.__init__(self, *args, **kwargs)
> + self.logObserver = LitLogObserver()
> + self.addLogObserver('stdio', self.logObserver)
> +
> + def evaluateCommand(self, cmd):
> + if any([r in self.logObserver.resultCounts for r in self.failingCodes]):
> + return FAILURE
> + return SUCCESS
> +
> + def describe(self, done=False):
> + description = Test.describe(self, done)
> + for name, count in self.logObserver.resultCounts.iteritems():
> + description.append('{0} {1}'.format(count, self.resultNames[name]))
> + return description
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-David
More information about the llvm-commits
mailing list