blob: c738e49afe9451d80dc34c9d81196d485ce89af3 [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 datetime
import os
import StringIO
import unittest
from telemetry import benchmark
from telemetry import story
from telemetry.internal.results import html_output_formatter
from telemetry.internal.results import page_test_results
from telemetry import page as page_module
from telemetry.value import improvement_direction
from telemetry.value import scalar
def _MakeStorySet():
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))
story_set.AddStory(
page_module.Page('http://www.baz.com/', story_set, story_set.base_dir))
return story_set
class DeterministicHtmlOutputFormatter(
html_output_formatter.HtmlOutputFormatter):
def _GetBuildTime(self):
return datetime.datetime(1998, 9, 4, 13, 0, 0, 7777)
def _GetRevision(self):
return 'revision'
class FakeMetadataForTest(benchmark.BenchmarkMetadata):
def __init__(self):
super(FakeMetadataForTest, self).__init__('test_name')
# Wrap string IO with a .name property so that it behaves more like a file.
class StringIOFile(StringIO.StringIO):
name = 'fake_output_file'
class HtmlOutputFormatterTest(unittest.TestCase):
def setUp(self):
self.maxDiff = 100000
def test_basic_summary(self):
test_story_set = _MakeStorySet()
output_file = StringIOFile()
# Run the first time and verify the results are written to the HTML file.
results = page_test_results.PageTestResults()
results.WillRunPage(test_story_set.stories[0])
results.AddValue(scalar.ScalarValue(
test_story_set.stories[0], 'a', 'seconds', 3,
improvement_direction=improvement_direction.DOWN))
results.DidRunPage(test_story_set.stories[0])
results.WillRunPage(test_story_set.stories[1])
results.AddValue(scalar.ScalarValue(
test_story_set.stories[1], 'a', 'seconds', 7,
improvement_direction=improvement_direction.DOWN))
results.DidRunPage(test_story_set.stories[1])
formatter = DeterministicHtmlOutputFormatter(
output_file, FakeMetadataForTest(), False, False, 'browser_type')
formatter.Format(results)
expected = {
"platform": "browser_type",
"buildTime": "1998-09-04T13:00:00.007777",
"label": 'test_name (1998-09-04 13:00:00)',
"tests": {
"test_name": {
"metrics": {
"a": {
"current": [3, 7],
"std": 2.8284271247461903,
"units": "seconds",
"important": True
},
"telemetry_page_measurement_results.num_failed": {
"current": [0],
"units": "count",
"important": False
},
"a.http://www.bar.com/": {
"current": [7],
"std": 0.0,
"units": "seconds",
"important": False
},
"a.http://www.foo.com/": {
"current": [3],
"std": 0.0,
"units": "seconds",
"important": False
}
}
}
},
}
self.assertEquals(expected, formatter.GetResults())
# Run the second time and verify the results are appended to the HTML file.
output_file.seek(0)
results = page_test_results.PageTestResults()
results.WillRunPage(test_story_set.stories[0])
results.AddValue(scalar.ScalarValue(
test_story_set.stories[0], 'a', 'seconds', 4,
improvement_direction=improvement_direction.DOWN))
results.DidRunPage(test_story_set.stories[0])
results.WillRunPage(test_story_set.stories[1])
results.AddValue(scalar.ScalarValue(
test_story_set.stories[1], 'a', 'seconds', 8,
improvement_direction=improvement_direction.DOWN))
results.DidRunPage(test_story_set.stories[1])
formatter = DeterministicHtmlOutputFormatter(
output_file, FakeMetadataForTest(), False, False, 'browser_type')
formatter.Format(results)
expected = [
{
"platform": "browser_type",
"buildTime": "1998-09-04T13:00:00.007777",
"label": 'test_name (1998-09-04 13:00:00)',
"tests": {
"test_name": {
"metrics": {
"a": {
"current": [3, 7],
"units": "seconds",
"std": 2.8284271247461903,
"important": True
},
"telemetry_page_measurement_results.num_failed": {
"current": [0],
"units": "count",
"important": False
},
"a.http://www.bar.com/": {
"current": [7],
"std": 0.0,
"units": "seconds",
"important": False
},
"a.http://www.foo.com/": {
"current": [3],
"std": 0.0,
"units": "seconds",
"important": False
}
}
}
},
},
{
"platform": "browser_type",
"buildTime": "1998-09-04T13:00:00.007777",
"label": 'test_name (1998-09-04 13:00:00)',
"tests": {
"test_name": {
"metrics": {
"a": {
"current": [4, 8],
'std': 2.8284271247461903,
"units": "seconds",
"important": True
},
"telemetry_page_measurement_results.num_failed": {
"current": [0],
"units": "count",
"important": False,
},
"a.http://www.bar.com/": {
"current": [8],
"std": 0.0,
"units": "seconds",
"important": False
},
"a.http://www.foo.com/": {
"current": [4],
"std": 0.0,
"units": "seconds",
"important": False
}
}
}
},
}]
self.assertEquals(expected, formatter.GetCombinedResults())
last_output_len = len(output_file.getvalue())
# Now reset the results and verify the old ones are gone.
output_file.seek(0)
results = page_test_results.PageTestResults()
results.WillRunPage(test_story_set.stories[0])
results.AddValue(scalar.ScalarValue(
test_story_set.stories[0], 'a', 'seconds', 5,
improvement_direction=improvement_direction.DOWN))
results.DidRunPage(test_story_set.stories[0])
results.WillRunPage(test_story_set.stories[1])
results.AddValue(scalar.ScalarValue(
test_story_set.stories[1], 'a', 'seconds', 9,
improvement_direction=improvement_direction.DOWN))
results.AddValue(scalar.ScalarValue(
test_story_set.stories[1], 'b', 'seconds', 20, tir_label='foo'))
results.DidRunPage(test_story_set.stories[1])
formatter = DeterministicHtmlOutputFormatter(
output_file, FakeMetadataForTest(), True, False, 'browser_type')
formatter.Format(results)
expected = [{
"platform": "browser_type",
"buildTime": "1998-09-04T13:00:00.007777",
"label": 'test_name (1998-09-04 13:00:00)',
"tests": {
"test_name": {
"metrics": {
"a": {
"current": [5, 9],
'std': 2.8284271247461903,
"units": "seconds",
"important": True
},
"telemetry_page_measurement_results.num_failed": {
"current": [0],
"units": "count",
"important": False
},
"a.http://www.bar.com/": {
"current": [9],
"std": 0.0,
"units": "seconds",
"important": False
},
"a.http://www.foo.com/": {
"current": [5],
"std": 0.0,
"units": "seconds",
"important": False
},
"foo-b.http://www.bar.com/": {
"current": [20],
"std": 0.0,
"units": "seconds",
"important": False
},
"foo-b": {
"current": [20],
"std": 0.0,
"units": "seconds",
"important": True
}
}
}
},
}]
self.assertEquals(expected, formatter.GetCombinedResults())
self.assertTrue(len(output_file.getvalue()) < last_output_len)