Commit 7571798a authored by chrishenry@google.com's avatar chrishenry@google.com

Wire FailureValue in PageTestResults (try 2).

Previous patch failed because of GC issue (GC for the first test
only happens after the second test started, and it turns out
that we rely on __del__ in that test -- not good!). This is fixed in:

https://codereview.chromium.org/409113006/

BUG=392901

Review URL: https://codereview.chromium.org/408913002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285078 0039d316-1c4b-4281-b951-d872f2087c98
parent 5b676c4e
...@@ -28,7 +28,7 @@ class SkpicturePrinterUnitTest( ...@@ -28,7 +28,7 @@ class SkpicturePrinterUnitTest(
# Picture printing is not supported on all platforms. # Picture printing is not supported on all platforms.
if results.failures: if results.failures:
assert 'not supported' in results.failures[0][1] assert 'not supported' in results.failures[0].exc_info[1].message
return return
saved_picture_count = results.FindAllPageSpecificValuesNamed( saved_picture_count = results.FindAllPageSpecificValuesNamed(
......
...@@ -27,7 +27,7 @@ from telemetry.page.actions import page_action ...@@ -27,7 +27,7 @@ from telemetry.page.actions import page_action
from telemetry.results import results_options from telemetry.results import results_options
from telemetry.util import cloud_storage from telemetry.util import cloud_storage
from telemetry.util import exception_formatter from telemetry.util import exception_formatter
from telemetry.value import failure
class _RunState(object): class _RunState(object):
def __init__(self): def __init__(self):
...@@ -498,7 +498,8 @@ def _CheckArchives(page_set, pages, results): ...@@ -498,7 +498,8 @@ def _CheckArchives(page_set, pages, results):
for page in pages_missing_archive_path + pages_missing_archive_data: for page in pages_missing_archive_path + pages_missing_archive_data:
results.StartTest(page) results.StartTest(page)
results.AddFailureMessage(page, 'Page set archive doesn\'t exist.') results.AddValue(failure.FailureValue.FromMessage(
page, 'Page set archive doesn\'t exist.'))
results.StopTest(page) results.StopTest(page)
return [page for page in pages if page not in return [page for page in pages if page not in
...@@ -521,7 +522,7 @@ def _RunPage(test, page, state, expectation, results, finder_options): ...@@ -521,7 +522,7 @@ def _RunPage(test, page, state, expectation, results, finder_options):
results.AddSuccess(page) results.AddSuccess(page)
else: else:
msg = 'Exception while running %s' % page.url msg = 'Exception while running %s' % page.url
results.AddFailure(page, sys.exc_info()) results.AddValue(failure.FailureValue(page, sys.exc_info()))
exception_formatter.PrintFormattedException(msg=msg) exception_formatter.PrintFormattedException(msg=msg)
try: try:
...@@ -541,7 +542,7 @@ def _RunPage(test, page, state, expectation, results, finder_options): ...@@ -541,7 +542,7 @@ def _RunPage(test, page, state, expectation, results, finder_options):
else: else:
exception_formatter.PrintFormattedException( exception_formatter.PrintFormattedException(
msg='Failure while running %s' % page.url) msg='Failure while running %s' % page.url)
results.AddFailure(page, sys.exc_info()) results.AddValue(failure.FailureValue(page, sys.exc_info()))
except (util.TimeoutException, exceptions.LoginException, except (util.TimeoutException, exceptions.LoginException,
exceptions.ProfilingException): exceptions.ProfilingException):
ProcessError() ProcessError()
...@@ -554,7 +555,7 @@ def _RunPage(test, page, state, expectation, results, finder_options): ...@@ -554,7 +555,7 @@ def _RunPage(test, page, state, expectation, results, finder_options):
except Exception: except Exception:
exception_formatter.PrintFormattedException( exception_formatter.PrintFormattedException(
msg='Unhandled exception while running %s' % page.url) msg='Unhandled exception while running %s' % page.url)
results.AddFailure(page, sys.exc_info()) results.AddValue(failure.FailureValue(page, sys.exc_info()))
else: else:
if expectation == 'fail': if expectation == 'fail':
logging.warning('%s was expected to fail, but passed.\n', page.url) logging.warning('%s was expected to fail, but passed.\n', page.url)
......
...@@ -5,11 +5,12 @@ import os ...@@ -5,11 +5,12 @@ import os
from telemetry import perf_tests_helper from telemetry import perf_tests_helper
from telemetry.page import page_set from telemetry.page import page_set
from telemetry.results import base_test_results_unittest
from telemetry.results import buildbot_page_measurement_results
from telemetry.value import failure
from telemetry.value import histogram from telemetry.value import histogram
from telemetry.value import list_of_scalar_values from telemetry.value import list_of_scalar_values
from telemetry.value import scalar from telemetry.value import scalar
from telemetry.results import base_test_results_unittest
from telemetry.results import buildbot_page_measurement_results
def _MakePageSet(): def _MakePageSet():
...@@ -130,7 +131,8 @@ class BuildbotPageMeasurementResultsTest( ...@@ -130,7 +131,8 @@ class BuildbotPageMeasurementResultsTest(
measurement_results.AddValue(scalar.ScalarValue( measurement_results.AddValue(scalar.ScalarValue(
test_page_set.pages[0], 'a', 'seconds', 3)) test_page_set.pages[0], 'a', 'seconds', 3))
measurement_results.DidMeasurePage() measurement_results.DidMeasurePage()
measurement_results.AddFailureMessage(test_page_set.pages[0], 'message') measurement_results.AddValue(
failure.FailureValue.FromMessage(test_page_set.pages[0], 'message'))
measurement_results.WillMeasurePage(test_page_set.pages[1]) measurement_results.WillMeasurePage(test_page_set.pages[1])
measurement_results.AddValue(scalar.ScalarValue( measurement_results.AddValue(scalar.ScalarValue(
...@@ -161,7 +163,8 @@ class BuildbotPageMeasurementResultsTest( ...@@ -161,7 +163,8 @@ class BuildbotPageMeasurementResultsTest(
measurement_results.AddValue(scalar.ScalarValue( measurement_results.AddValue(scalar.ScalarValue(
test_page_set.pages[1], 'a', 'seconds', 7)) test_page_set.pages[1], 'a', 'seconds', 7))
measurement_results.DidMeasurePage() measurement_results.DidMeasurePage()
measurement_results.AddFailureMessage(test_page_set.pages[1], 'message') measurement_results.AddValue(
failure.FailureValue.FromMessage(test_page_set.pages[1], 'message'))
measurement_results.WillMeasurePage(test_page_set.pages[0]) measurement_results.WillMeasurePage(test_page_set.pages[0])
measurement_results.AddValue(scalar.ScalarValue( measurement_results.AddValue(scalar.ScalarValue(
......
...@@ -6,6 +6,7 @@ import logging ...@@ -6,6 +6,7 @@ import logging
import time import time
from telemetry.results import page_test_results from telemetry.results import page_test_results
from telemetry.value import failure
class GTestTestResults(page_test_results.PageTestResults): class GTestTestResults(page_test_results.PageTestResults):
...@@ -16,20 +17,19 @@ class GTestTestResults(page_test_results.PageTestResults): ...@@ -16,20 +17,19 @@ class GTestTestResults(page_test_results.PageTestResults):
def _GetMs(self): def _GetMs(self):
return (time.time() - self._timestamp) * 1000 return (time.time() - self._timestamp) * 1000
def _emitFailure(self, page, err): def _emitFailure(self, failure_value):
print >> self._output_stream, self._GetStringFromExcInfo(err) print >> self._output_stream, failure.GetStringFromExcInfo(
print >> self._output_stream, '[ FAILED ]', page.display_name, ( failure_value.exc_info)
display_name = failure_value.page.display_name
print >> self._output_stream, '[ FAILED ]', display_name, (
'(%0.f ms)' % self._GetMs()) '(%0.f ms)' % self._GetMs())
self._output_stream.flush() self._output_stream.flush()
def AddValue(self, value): def AddValue(self, value):
# TODO(chrishenry): When FailureValue is added, this should instead assert isinstance(value, failure.FailureValue), (
# validate that isinstance(value, FailureValue) is true. 'GTestTestResults only accepts FailureValue.')
raise Exception('GTestTestResults does not support AddValue().') super(GTestTestResults, self).AddValue(value)
self._emitFailure(value)
def AddFailure(self, page, err):
super(GTestTestResults, self).AddFailure(page, err)
self._emitFailure(page, err)
def StartTest(self, page): def StartTest(self, page):
super(GTestTestResults, self).StartTest(page) super(GTestTestResults, self).StartTest(page)
...@@ -61,9 +61,9 @@ class GTestTestResults(page_test_results.PageTestResults): ...@@ -61,9 +61,9 @@ class GTestTestResults(page_test_results.PageTestResults):
unit = 'test' if len(self.failures) == 1 else 'tests' unit = 'test' if len(self.failures) == 1 else 'tests'
print >> self._output_stream, '[ FAILED ]', ( print >> self._output_stream, '[ FAILED ]', (
'%d %s, listed below:' % (len(self.failures), unit)) '%d %s, listed below:' % (len(self.failures), unit))
for page, _ in self.failures: for failure_value in self.failures:
print >> self._output_stream, '[ FAILED ] ', ( print >> self._output_stream, '[ FAILED ] ', (
page.display_name) failure_value.page.display_name)
print >> self._output_stream print >> self._output_stream
count = len(self.failures) count = len(self.failures)
unit = 'TEST' if count == 1 else 'TESTS' unit = 'TEST' if count == 1 else 'TESTS'
......
...@@ -8,6 +8,7 @@ from telemetry.page import page_set ...@@ -8,6 +8,7 @@ from telemetry.page import page_set
from telemetry.results import base_test_results_unittest from telemetry.results import base_test_results_unittest
from telemetry.results import gtest_test_results from telemetry.results import gtest_test_results
from telemetry.unittest import simple_mock from telemetry.unittest import simple_mock
from telemetry.value import failure
def _MakePageSet(): def _MakePageSet():
...@@ -56,10 +57,10 @@ class GTestTestResultsTest( ...@@ -56,10 +57,10 @@ class GTestTestResultsTest(
results = SummaryGtestTestResults() results = SummaryGtestTestResults()
results.StartTest(test_page_set.pages[0]) results.StartTest(test_page_set.pages[0])
exception = self.CreateException() exc_info = self.CreateException()
results.AddFailure(test_page_set.pages[0], exception) results.AddValue(failure.FailureValue(test_page_set.pages[0], exc_info))
results.PrintSummary() results.PrintSummary()
exception_trace = ''.join(traceback.format_exception(*exception)) exception_trace = ''.join(traceback.format_exception(*exc_info))
expected = ('[ RUN ] http://www.foo.com/\n' expected = ('[ RUN ] http://www.foo.com/\n'
'%s\n' '%s\n'
'[ FAILED ] http://www.foo.com/ (0 ms)\n' '[ FAILED ] http://www.foo.com/ (0 ms)\n'
...@@ -84,7 +85,7 @@ class GTestTestResultsTest( ...@@ -84,7 +85,7 @@ class GTestTestResultsTest(
def testPassAndFailedPages(self): def testPassAndFailedPages(self):
test_page_set = _MakePageSet() test_page_set = _MakePageSet()
results = SummaryGtestTestResults() results = SummaryGtestTestResults()
exception = self.CreateException() exc_info = self.CreateException()
results.StartTest(test_page_set.pages[0]) results.StartTest(test_page_set.pages[0])
self._mock_timer.SetTime(0.007) self._mock_timer.SetTime(0.007)
...@@ -92,18 +93,18 @@ class GTestTestResultsTest( ...@@ -92,18 +93,18 @@ class GTestTestResultsTest(
results.StartTest(test_page_set.pages[1]) results.StartTest(test_page_set.pages[1])
self._mock_timer.SetTime(0.009) self._mock_timer.SetTime(0.009)
results.AddFailure(test_page_set.pages[1], exception) results.AddValue(failure.FailureValue(test_page_set.pages[1], exc_info))
results.StartTest(test_page_set.pages[2]) results.StartTest(test_page_set.pages[2])
self._mock_timer.SetTime(0.015) self._mock_timer.SetTime(0.015)
results.AddFailure(test_page_set.pages[2], exception) results.AddValue(failure.FailureValue(test_page_set.pages[2], exc_info))
results.StartTest(test_page_set.pages[3]) results.StartTest(test_page_set.pages[3])
self._mock_timer.SetTime(0.020) self._mock_timer.SetTime(0.020)
results.AddSuccess(test_page_set.pages[3]) results.AddSuccess(test_page_set.pages[3])
results.PrintSummary() results.PrintSummary()
exception_trace = ''.join(traceback.format_exception(*exception)) exception_trace = ''.join(traceback.format_exception(*exc_info))
expected = ('[ RUN ] http://www.foo.com/\n' expected = ('[ RUN ] http://www.foo.com/\n'
'[ OK ] http://www.foo.com/ (7 ms)\n' '[ OK ] http://www.foo.com/ (7 ms)\n'
'[ RUN ] http://www.bar.com/\n' '[ RUN ] http://www.bar.com/\n'
...@@ -124,7 +125,7 @@ class GTestTestResultsTest( ...@@ -124,7 +125,7 @@ class GTestTestResultsTest(
def testStreamingResults(self): def testStreamingResults(self):
test_page_set = _MakePageSet() test_page_set = _MakePageSet()
results = SummaryGtestTestResults() results = SummaryGtestTestResults()
exception = self.CreateException() exc_info = self.CreateException()
results.StartTest(test_page_set.pages[0]) results.StartTest(test_page_set.pages[0])
self._mock_timer.SetTime(0.007) self._mock_timer.SetTime(0.007)
...@@ -135,8 +136,8 @@ class GTestTestResultsTest( ...@@ -135,8 +136,8 @@ class GTestTestResultsTest(
results.StartTest(test_page_set.pages[1]) results.StartTest(test_page_set.pages[1])
self._mock_timer.SetTime(0.009) self._mock_timer.SetTime(0.009)
exception_trace = ''.join(traceback.format_exception(*exception)) exception_trace = ''.join(traceback.format_exception(*exc_info))
results.AddFailure(test_page_set.pages[1], exception) results.AddValue(failure.FailureValue(test_page_set.pages[1], exc_info))
expected = ('[ RUN ] http://www.foo.com/\n' expected = ('[ RUN ] http://www.foo.com/\n'
'[ OK ] http://www.foo.com/ (7 ms)\n' '[ OK ] http://www.foo.com/ (7 ms)\n'
'[ RUN ] http://www.bar.com/\n' '[ RUN ] http://www.bar.com/\n'
......
...@@ -7,6 +7,7 @@ import unittest ...@@ -7,6 +7,7 @@ import unittest
from telemetry import perf_tests_helper from telemetry import perf_tests_helper
from telemetry.page import page_set from telemetry.page import page_set
from telemetry.results import page_measurement_results from telemetry.results import page_measurement_results
from telemetry.value import failure
from telemetry.value import histogram from telemetry.value import histogram
from telemetry.value import scalar from telemetry.value import scalar
...@@ -112,12 +113,12 @@ class PageMeasurementResultsTest(unittest.TestCase): ...@@ -112,12 +113,12 @@ class PageMeasurementResultsTest(unittest.TestCase):
results.WillMeasurePage(self.pages[0]) results.WillMeasurePage(self.pages[0])
results.AddValue(scalar.ScalarValue(self.pages[0], 'a', 'seconds', 3)) results.AddValue(scalar.ScalarValue(self.pages[0], 'a', 'seconds', 3))
results.DidMeasurePage() results.DidMeasurePage()
results.AddFailureMessage(self.pages[0], 'message') results.AddValue(failure.FailureValue.FromMessage(self.pages[0], 'message'))
results.WillMeasurePage(self.pages[1]) results.WillMeasurePage(self.pages[1])
results.AddValue(scalar.ScalarValue(self.pages[1], 'a', 'seconds', 7)) results.AddValue(scalar.ScalarValue(self.pages[1], 'a', 'seconds', 7))
results.DidMeasurePage() results.DidMeasurePage()
results.AddFailureMessage(self.pages[1], 'message') results.AddValue(failure.FailureValue.FromMessage(self.pages[1], 'message'))
results.PrintSummary() results.PrintSummary()
self.assertEquals(results.results, []) self.assertEquals(results.results, [])
...@@ -135,37 +136,39 @@ class PageMeasurementResultsTest(unittest.TestCase): ...@@ -135,37 +136,39 @@ class PageMeasurementResultsTest(unittest.TestCase):
def test_get_all_values_for_successful_pages(self): def test_get_all_values_for_successful_pages(self):
results = SummarySavingPageMeasurementResults() results = SummarySavingPageMeasurementResults()
results.WillMeasurePage(self.pages[0]) results.WillMeasurePage(self.pages[0])
results.AddValue(scalar.ScalarValue(self.pages[0], 'a', 'seconds', 3)) value1 = scalar.ScalarValue(self.pages[0], 'a', 'seconds', 3)
results.AddValue(value1)
results.DidMeasurePage() results.DidMeasurePage()
results.WillMeasurePage(self.pages[1]) results.WillMeasurePage(self.pages[1])
results.AddValue(scalar.ScalarValue(self.pages[1], 'a', 'seconds', 3)) value2 = scalar.ScalarValue(self.pages[1], 'a', 'seconds', 3)
results.AddValue(value2)
results.DidMeasurePage() results.DidMeasurePage()
results.WillMeasurePage(self.pages[2]) results.WillMeasurePage(self.pages[2])
results.AddValue(scalar.ScalarValue(self.pages[2], 'a', 'seconds', 3)) value3 = scalar.ScalarValue(self.pages[2], 'a', 'seconds', 3)
results.AddValue(value3)
results.DidMeasurePage() results.DidMeasurePage()
values = results.all_page_specific_values self.assertEquals(
self.assertEquals(3, len(values)) [value1, value2, value3], results.all_page_specific_values)
self.assertEquals([self.pages[0], self.pages[1], self.pages[2]],
[v.page for v in values])
def test_get_all_values_for_successful_pages_one_page_fails(self): def test_get_all_values_for_successful_pages_one_page_fails(self):
results = SummarySavingPageMeasurementResults() results = SummarySavingPageMeasurementResults()
results.WillMeasurePage(self.pages[0]) results.WillMeasurePage(self.pages[0])
results.AddValue(scalar.ScalarValue(self.pages[0], 'a', 'seconds', 3)) value1 = scalar.ScalarValue(self.pages[0], 'a', 'seconds', 3)
results.AddValue(value1)
results.DidMeasurePage() results.DidMeasurePage()
results.WillMeasurePage(self.pages[1]) results.WillMeasurePage(self.pages[1])
results.AddFailureMessage(self.pages[1], "Failure") value2 = failure.FailureValue.FromMessage(self.pages[1], 'Failure')
results.AddValue(value2)
results.DidMeasurePage() results.DidMeasurePage()
results.WillMeasurePage(self.pages[2]) results.WillMeasurePage(self.pages[2])
results.AddValue(scalar.ScalarValue(self.pages[2], 'a', 'seconds', 3)) value3 = scalar.ScalarValue(self.pages[2], 'a', 'seconds', 3)
results.AddValue(value3)
results.DidMeasurePage() results.DidMeasurePage()
values = results.all_page_specific_values self.assertEquals(
self.assertEquals(2, len(values)) [value1, value2, value3], results.all_page_specific_values)
self.assertEquals([self.pages[0], self.pages[2]],
[v.page for v in values])
...@@ -5,18 +5,18 @@ ...@@ -5,18 +5,18 @@
import collections import collections
import copy import copy
import logging import logging
import sys
import traceback import traceback
from telemetry import value as value_module from telemetry import value as value_module
from telemetry.value import failure
class PageTestResults(object): class PageTestResults(object):
def __init__(self, output_stream=None): def __init__(self, output_stream=None):
super(PageTestResults, self).__init__() super(PageTestResults, self).__init__()
self._output_stream = output_stream self._output_stream = output_stream
self.pages_that_had_failures = set() # TODO(chrishenry,eakuefner): Remove self.successes once they can
# be inferred.
self.successes = [] self.successes = []
self.failures = []
self.skipped = [] self.skipped = []
self._representative_value_for_each_value_name = {} self._representative_value_for_each_value_name = {}
...@@ -42,10 +42,21 @@ class PageTestResults(object): ...@@ -42,10 +42,21 @@ class PageTestResults(object):
@property @property
def pages_that_succeeded(self): def pages_that_succeeded(self):
pages = set([value.page for value in self._all_page_specific_values]) """Returns the set of pages that succeeded."""
pages = set(value.page for value in self._all_page_specific_values)
pages.difference_update(self.pages_that_had_failures) pages.difference_update(self.pages_that_had_failures)
return pages return pages
@property
def pages_that_had_failures(self):
"""Returns the set of failed pages."""
return set(v.page for v in self.failures)
@property
def failures(self):
values = self._all_page_specific_values
return [v for v in values if isinstance(v, failure.FailureValue)]
def _GetStringFromExcInfo(self, err): def _GetStringFromExcInfo(self, err):
return ''.join(traceback.format_exception(*err)) return ''.join(traceback.format_exception(*err))
...@@ -72,26 +83,16 @@ class PageTestResults(object): ...@@ -72,26 +83,16 @@ class PageTestResults(object):
value.name] value.name]
assert value.IsMergableWith(representative_value) assert value.IsMergableWith(representative_value)
def AddFailure(self, page, err):
self.pages_that_had_failures.add(page)
self.failures.append((page, self._GetStringFromExcInfo(err)))
def AddSkip(self, page, reason): def AddSkip(self, page, reason):
self.skipped.append((page, reason)) self.skipped.append((page, reason))
def AddSuccess(self, page): def AddSuccess(self, page):
self.successes.append(page) self.successes.append(page)
def AddFailureMessage(self, page, message):
try:
raise Exception(message)
except Exception:
self.AddFailure(page, sys.exc_info())
def PrintSummary(self): def PrintSummary(self):
if self.failures: if self.failures:
logging.error('Failed pages:\n%s', '\n'.join( logging.error('Failed pages:\n%s', '\n'.join(
p.display_name for p in zip(*self.failures)[0])) p.display_name for p in self.pages_that_had_failures))
if self.skipped: if self.skipped:
logging.warning('Skipped pages:\n%s', '\n'.join( logging.warning('Skipped pages:\n%s', '\n'.join(
......
...@@ -6,6 +6,7 @@ from telemetry.results import base_test_results_unittest ...@@ -6,6 +6,7 @@ from telemetry.results import base_test_results_unittest
from telemetry.page import page_set from telemetry.page import page_set
from telemetry.results import page_test_results from telemetry.results import page_test_results
from telemetry.value import failure
class NonPrintingPageTestResults( class NonPrintingPageTestResults(
page_test_results.PageTestResults): page_test_results.PageTestResults):
...@@ -28,8 +29,8 @@ class PageTestResultsTest(base_test_results_unittest.BaseTestResultsUnittest): ...@@ -28,8 +29,8 @@ class PageTestResultsTest(base_test_results_unittest.BaseTestResultsUnittest):
def test_failures(self): def test_failures(self):
results = NonPrintingPageTestResults() results = NonPrintingPageTestResults()
results.AddFailure(self.pages[0], self.CreateException()) results.AddValue(
failure.FailureValue(self.pages[0], self.CreateException()))
results.AddSuccess(self.pages[1]) results.AddSuccess(self.pages[1])
self.assertEquals(results.pages_that_had_failures, self.assertEquals(results.pages_that_had_failures, set([self.pages[0]]))
set([self.pages[0]]))
self.assertEquals(results.successes, [self.pages[1]]) self.assertEquals(results.successes, [self.pages[1]])
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment