133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Copyright 2012 the V8 project authors. All rights reserved.
233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# Redistribution and use in source and binary forms, with or without
333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# modification, are permitted provided that the following conditions are
433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# met:
533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#
633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#     * Redistributions of source code must retain the above copyright
733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       notice, this list of conditions and the following disclaimer.
833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#     * Redistributions in binary form must reproduce the above
933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       copyright notice, this list of conditions and the following
1033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       disclaimer in the documentation and/or other materials provided
1133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       with the distribution.
1233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#     * Neither the name of Google Inc. nor the names of its
1333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       contributors may be used to endorse or promote products derived
1433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#       from this software without specific prior written permission.
1533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org#
1633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
2933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport sys
3033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgimport time
3133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgfrom . import statusfile
3333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
3533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgREPORT_TEMPLATE = (
3633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org"""Total: %(total)i tests
3733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * %(skipped)4d tests will be skipped
3833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * %(timeout)4d tests are expected to timeout sometimes
3933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * %(nocrash)4d tests are expected to be flaky but not crash
4033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * %(pass)4d tests are expected to pass
4133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * %(fail_ok)4d tests are expected to fail that we won't fix
4233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org * %(fail)4d tests are expected to fail that we should fix""")
4333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
4533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef PrintReport(tests):
4633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  total = len(tests)
4733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  skipped = timeout = nocrash = passes = fail_ok = fail = 0
4833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for t in tests:
4933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if "outcomes" not in dir(t) or not t.outcomes:
5033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      passes += 1
5133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      continue
5233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    o = t.outcomes
5333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if statusfile.DoSkip(o):
5433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      skipped += 1
5533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      continue
5633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if statusfile.TIMEOUT in o: timeout += 1
57594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    if statusfile.IsPassOrFail(o): nocrash += 1
5833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if list(o) == [statusfile.PASS]: passes += 1
5933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if statusfile.IsFailOk(o): fail_ok += 1
6033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if list(o) == [statusfile.FAIL]: fail += 1
6133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  print REPORT_TEMPLATE % {
6233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "total": total,
6333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "skipped": skipped,
6433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "timeout": timeout,
6533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "nocrash": nocrash,
6633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "pass": passes,
6733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "fail_ok": fail_ok,
6833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    "fail": fail
6933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  }
7033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
7133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
7233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef PrintTestSource(tests):
7333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  for test in tests:
7433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    suite = test.suite
7533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    source = suite.GetSourceForTest(test).strip()
7633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    if len(source) > 0:
7733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print "--- begin source: %s/%s ---" % (suite.name, test.path)
7833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print source
7933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      print "--- end source: %s/%s ---" % (suite.name, test.path)
8033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef FormatTime(d):
8333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  millis = round(d * 1000) % 1000
8433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org  return time.strftime("%M:%S.", time.gmtime(d)) + ("%03i" % millis)
8533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org
8733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.orgdef PrintTestDurations(suites, overall_time):
8833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    # Write the times to stderr to make it easy to separate from the
8933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    # test output.
9033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    print
9133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    sys.stderr.write("--- Total time: %s ---\n" % FormatTime(overall_time))
9233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    timed_tests = [ t for s in suites for t in s.tests
9333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org                    if t.duration is not None ]
9433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    timed_tests.sort(lambda a, b: cmp(b.duration, a.duration))
9533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    index = 1
9633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    for entry in timed_tests[:20]:
9733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      t = FormatTime(entry.duration)
9833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      sys.stderr.write("%4i (%s) %s\n" % (index, t, entry.GetLabel()))
9933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org      index += 1
100