blob: 39ca0416df24bde6bd2185ed7c62f9f25e03c6ad [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import unittest
from telemetry import benchmark
from telemetry import story
from telemetry.internal.results import base_test_results_unittest
from telemetry.internal.results import chart_json_output_formatter
from telemetry.internal.results import json_output_formatter
from telemetry.internal.results import page_test_results
from telemetry import page as page_module
from telemetry.testing import stream
from telemetry.timeline import trace_data
from telemetry.value import failure
from telemetry.value import histogram
from telemetry.value import improvement_direction
from telemetry.value import scalar
from telemetry.value import skip
from telemetry.value import trace
class PageTestResultsTest(base_test_results_unittest.BaseTestResultsUnittest):
def setUp(self):
story_set = story.StorySet(base_dir=os.path.dirname(__file__))
story_set.AddStory(page_module.Page("http://www.bar.com/", story_set, story_set.base_dir))
story_set.AddStory(page_module.Page("http://www.baz.com/", story_set, story_set.base_dir))
story_set.AddStory(page_module.Page("http://www.foo.com/", story_set, story_set.base_dir))
self.story_set = story_set
@property
def pages(self):
return self.story_set.stories
def testFailures(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(
failure.FailureValue(self.pages[0], self.CreateException()))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.DidRunPage(self.pages[1])
self.assertEqual(set([self.pages[0]]), results.pages_that_failed)
self.assertEqual(set([self.pages[1]]), results.pages_that_succeeded)
self.assertEqual(2, len(results.all_page_runs))
self.assertTrue(results.all_page_runs[0].failed)
self.assertTrue(results.all_page_runs[1].ok)
def testSkips(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(skip.SkipValue(self.pages[0], 'testing reason'))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.DidRunPage(self.pages[1])
self.assertTrue(results.all_page_runs[0].skipped)
self.assertEqual(self.pages[0], results.all_page_runs[0].story)
self.assertEqual(set([self.pages[0], self.pages[1]]),
results.pages_that_succeeded)
self.assertEqual(2, len(results.all_page_runs))
self.assertTrue(results.all_page_runs[0].skipped)
self.assertTrue(results.all_page_runs[1].ok)
def testBasic(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(scalar.ScalarValue(
self.pages[1], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[1])
results.PrintSummary()
values = results.FindPageSpecificValuesForPage(self.pages[0], 'a')
self.assertEquals(1, len(values))
v = values[0]
self.assertEquals(v.name, 'a')
self.assertEquals(v.page, self.pages[0])
values = results.FindAllPageSpecificValuesNamed('a')
assert len(values) == 2
def testAddValueWithStoryGroupingKeys(self):
results = page_test_results.PageTestResults()
self.pages[0].grouping_keys['foo'] = 'bar'
self.pages[0].grouping_keys['answer'] = '42'
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.PrintSummary()
values = results.FindPageSpecificValuesForPage(self.pages[0], 'a')
v = values[0]
self.assertEquals(v.grouping_keys['foo'], 'bar')
self.assertEquals(v.grouping_keys['answer'], '42')
self.assertEquals(v.tir_label, '42_bar')
def testAddValueWithStoryGroupingKeysAndMatchingTirLabel(self):
results = page_test_results.PageTestResults()
self.pages[0].grouping_keys['foo'] = 'bar'
self.pages[0].grouping_keys['answer'] = '42'
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP,
tir_label='42_bar'))
results.DidRunPage(self.pages[0])
results.PrintSummary()
values = results.FindPageSpecificValuesForPage(self.pages[0], 'a')
v = values[0]
self.assertEquals(v.grouping_keys['foo'], 'bar')
self.assertEquals(v.grouping_keys['answer'], '42')
self.assertEquals(v.tir_label, '42_bar')
def testAddValueWithStoryGroupingKeysAndMismatchingTirLabel(self):
results = page_test_results.PageTestResults()
self.pages[0].grouping_keys['foo'] = 'bar'
self.pages[0].grouping_keys['answer'] = '42'
results.WillRunPage(self.pages[0])
with self.assertRaises(AssertionError):
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP,
tir_label='another_label'))
def testAddValueWithDuplicateStoryGroupingKeyFails(self):
results = page_test_results.PageTestResults()
self.pages[0].grouping_keys['foo'] = 'bar'
results.WillRunPage(self.pages[0])
with self.assertRaises(AssertionError):
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP,
grouping_keys={'foo': 'bar'}))
def testUrlIsInvalidValue(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
self.assertRaises(
AssertionError,
lambda: results.AddValue(scalar.ScalarValue(
self.pages[0], 'url', 'string', 'foo',
improvement_direction=improvement_direction.UP)))
def testAddSummaryValueWithPageSpecified(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
self.assertRaises(
AssertionError,
lambda: results.AddSummaryValue(scalar.ScalarValue(
self.pages[0], 'a', 'units', 3,
improvement_direction=improvement_direction.UP)))
def testUnitChange(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
self.assertRaises(
AssertionError,
lambda: results.AddValue(scalar.ScalarValue(
self.pages[1], 'a', 'foobgrobbers', 3,
improvement_direction=improvement_direction.UP)))
def testTypeChange(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
self.assertRaises(
AssertionError,
lambda: results.AddValue(histogram.HistogramValue(
self.pages[1], 'a', 'seconds',
raw_value_json='{"buckets": [{"low": 1, "high": 2, "count": 1}]}',
improvement_direction=improvement_direction.UP)))
def testGetPagesThatSucceededAllPagesFail(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.AddValue(failure.FailureValue.FromMessage(self.pages[0], 'message'))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(scalar.ScalarValue(
self.pages[1], 'a', 'seconds', 7,
improvement_direction=improvement_direction.UP))
results.AddValue(failure.FailureValue.FromMessage(self.pages[1], 'message'))
results.DidRunPage(self.pages[1])
results.PrintSummary()
self.assertEquals(0, len(results.pages_that_succeeded))
def testGetSuccessfulPageValuesMergedNoFailures(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
self.assertEquals(1, len(results.all_page_specific_values))
results.DidRunPage(self.pages[0])
def testGetAllValuesForSuccessfulPages(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
value1 = scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP)
results.AddValue(value1)
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
value2 = scalar.ScalarValue(
self.pages[1], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP)
results.AddValue(value2)
results.DidRunPage(self.pages[1])
results.WillRunPage(self.pages[2])
value3 = scalar.ScalarValue(
self.pages[2], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP)
results.AddValue(value3)
results.DidRunPage(self.pages[2])
self.assertEquals(
[value1, value2, value3], results.all_page_specific_values)
def testGetAllValuesForSuccessfulPagesOnePageFails(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
value1 = scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP)
results.AddValue(value1)
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
value2 = failure.FailureValue.FromMessage(self.pages[1], 'Failure')
results.AddValue(value2)
results.DidRunPage(self.pages[1])
results.WillRunPage(self.pages[2])
value3 = scalar.ScalarValue(
self.pages[2], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP)
results.AddValue(value3)
results.DidRunPage(self.pages[2])
self.assertEquals(
[value1, value2, value3], results.all_page_specific_values)
def testFindValues(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
v0 = scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP)
results.AddValue(v0)
v1 = scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 4,
improvement_direction=improvement_direction.UP)
results.AddValue(v1)
results.DidRunPage(self.pages[1])
values = results.FindValues(lambda v: v.value == 3)
self.assertEquals([v0], values)
def testValueWithTIRLabel(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
v0 = scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3, tir_label='foo',
improvement_direction=improvement_direction.UP)
results.AddValue(v0)
v1 = scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3, tir_label='bar',
improvement_direction=improvement_direction.UP)
results.AddValue(v1)
results.DidRunPage(self.pages[0])
values = results.FindAllPageSpecificValuesFromIRNamed('foo', 'a')
self.assertEquals([v0], values)
def testTraceValue(self):
results = page_test_results.PageTestResults()
results.WillRunPage(self.pages[0])
results.AddValue(trace.TraceValue(
None, trace_data.CreateTraceDataFromRawData([[{'test': 1}]])))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(trace.TraceValue(
None, trace_data.CreateTraceDataFromRawData([[{'test': 2}]])))
results.DidRunPage(self.pages[1])
results.PrintSummary()
values = results.FindAllTraceValues()
self.assertEquals(2, len(values))
def testCleanUpCleansUpTraceValues(self):
results = page_test_results.PageTestResults()
v0 = trace.TraceValue(
None, trace_data.CreateTraceDataFromRawData([{'test': 1}]))
v1 = trace.TraceValue(
None, trace_data.CreateTraceDataFromRawData([{'test': 2}]))
results.WillRunPage(self.pages[0])
results.AddValue(v0)
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(v1)
results.DidRunPage(self.pages[1])
results.CleanUp()
self.assertTrue(v0.cleaned_up)
self.assertTrue(v1.cleaned_up)
def testNoTracesLeftAfterCleanUp(self):
results = page_test_results.PageTestResults()
v0 = trace.TraceValue(None,
trace_data.CreateTraceDataFromRawData([{'test': 1}]))
v1 = trace.TraceValue(None,
trace_data.CreateTraceDataFromRawData([{'test': 2}]))
results.WillRunPage(self.pages[0])
results.AddValue(v0)
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(v1)
results.DidRunPage(self.pages[1])
results.CleanUp()
self.assertFalse(results.FindAllTraceValues())
def testPrintSummaryDisabledResults(self):
output_stream = stream.TestOutputStream()
output_formatters = []
benchmark_metadata = benchmark.BenchmarkMetadata(
'benchmark_name', 'benchmark_description')
output_formatters.append(
chart_json_output_formatter.ChartJsonOutputFormatter(
output_stream, benchmark_metadata))
output_formatters.append(json_output_formatter.JsonOutputFormatter(
output_stream, benchmark_metadata))
results = page_test_results.PageTestResults(
output_formatters=output_formatters, benchmark_enabled=False)
results.PrintSummary()
self.assertEquals(output_stream.output_data,
"{\n \"enabled\": false,\n \"benchmark_name\": \"benchmark_name\"\n}\n")
class PageTestResultsFilterTest(unittest.TestCase):
def setUp(self):
story_set = story.StorySet(base_dir=os.path.dirname(__file__))
story_set.AddStory(
page_module.Page('http://www.foo.com/', story_set, story_set.base_dir))
story_set.AddStory(
page_module.Page('http://www.bar.com/', story_set, story_set.base_dir))
self.story_set = story_set
@property
def pages(self):
return self.story_set.stories
def testFilterValue(self):
def AcceptValueNamed_a(value, _):
return value.name == 'a'
results = page_test_results.PageTestResults(
value_can_be_added_predicate=AcceptValueNamed_a)
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.AddValue(scalar.ScalarValue(
self.pages[0], 'b', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(scalar.ScalarValue(
self.pages[1], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.AddValue(scalar.ScalarValue(
self.pages[1], 'd', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[1])
results.PrintSummary()
self.assertEquals(
[('a', 'http://www.foo.com/'), ('a', 'http://www.bar.com/')],
[(v.name, v.page.url) for v in results.all_page_specific_values])
def testFilterIsFirstResult(self):
def AcceptSecondValues(_, is_first_result):
return not is_first_result
results = page_test_results.PageTestResults(
value_can_be_added_predicate=AcceptSecondValues)
# First results (filtered out)
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 7,
improvement_direction=improvement_direction.UP))
results.AddValue(scalar.ScalarValue(
self.pages[0], 'b', 'seconds', 8,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(scalar.ScalarValue(
self.pages[1], 'a', 'seconds', 5,
improvement_direction=improvement_direction.UP))
results.AddValue(scalar.ScalarValue(
self.pages[1], 'd', 'seconds', 6,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[1])
# Second results
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.UP))
results.AddValue(scalar.ScalarValue(
self.pages[0], 'b', 'seconds', 4,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[0])
results.WillRunPage(self.pages[1])
results.AddValue(scalar.ScalarValue(
self.pages[1], 'a', 'seconds', 1,
improvement_direction=improvement_direction.UP))
results.AddValue(scalar.ScalarValue(
self.pages[1], 'd', 'seconds', 2,
improvement_direction=improvement_direction.UP))
results.DidRunPage(self.pages[1])
results.PrintSummary()
expected_values = [
('a', 'http://www.foo.com/', 3),
('b', 'http://www.foo.com/', 4),
('a', 'http://www.bar.com/', 1),
('d', 'http://www.bar.com/', 2)]
actual_values = [(v.name, v.page.url, v.value)
for v in results.all_page_specific_values]
self.assertEquals(expected_values, actual_values)
def testFailureValueCannotBeFiltered(self):
def AcceptValueNamed_a(value, _):
return value.name == 'a'
results = page_test_results.PageTestResults(
value_can_be_added_predicate=AcceptValueNamed_a)
results.WillRunPage(self.pages[0])
results.AddValue(scalar.ScalarValue(
self.pages[0], 'b', 'seconds', 8,
improvement_direction=improvement_direction.UP))
failure_value = failure.FailureValue.FromMessage(self.pages[0], 'failure')
results.AddValue(failure_value)
results.DidRunPage(self.pages[0])
results.PrintSummary()
# Although predicate says only accept values named 'a', the failure value is
# added anyway.
self.assertEquals(len(results.all_page_specific_values), 1)
self.assertIn(failure_value, results.all_page_specific_values)
def testSkipValueCannotBeFiltered(self):
def AcceptValueNamed_a(value, _):
return value.name == 'a'
results = page_test_results.PageTestResults(
value_can_be_added_predicate=AcceptValueNamed_a)
results.WillRunPage(self.pages[0])
skip_value = skip.SkipValue(self.pages[0], 'skip for testing')
results.AddValue(scalar.ScalarValue(
self.pages[0], 'b', 'seconds', 8,
improvement_direction=improvement_direction.UP))
results.AddValue(skip_value)
results.DidRunPage(self.pages[0])
results.PrintSummary()
# Although predicate says only accept value with named 'a', skip value is
# added anyway.
self.assertEquals(len(results.all_page_specific_values), 1)
self.assertIn(skip_value, results.all_page_specific_values)