html_output_formatter_unittest.py revision cef7893435aa41160dd1255c43cb8498279738cc
1# Copyright 2014 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4import datetime 5import os 6import StringIO 7import unittest 8 9from telemetry import benchmark 10from telemetry import story 11from telemetry.internal.results import html_output_formatter 12from telemetry.internal.results import page_test_results 13from telemetry import page as page_module 14from telemetry.value import improvement_direction 15from telemetry.value import scalar 16 17 18def _MakeStorySet(): 19 story_set = story.StorySet(base_dir=os.path.dirname(__file__)) 20 story_set.AddStory( 21 page_module.Page('http://www.foo.com/', story_set, story_set.base_dir)) 22 story_set.AddStory( 23 page_module.Page('http://www.bar.com/', story_set, story_set.base_dir)) 24 story_set.AddStory( 25 page_module.Page('http://www.baz.com/', story_set, story_set.base_dir)) 26 return story_set 27 28 29class DeterministicHtmlOutputFormatter( 30 html_output_formatter.HtmlOutputFormatter): 31 def _GetBuildTime(self): 32 return datetime.datetime(1998, 9, 4, 13, 0, 0, 7777) 33 34 def _GetRevision(self): 35 return 'revision' 36 37class FakeMetadataForTest(benchmark.BenchmarkMetadata): 38 def __init__(self): 39 super(FakeMetadataForTest, self).__init__('test_name') 40 41# Wrap string IO with a .name property so that it behaves more like a file. 42class StringIOFile(StringIO.StringIO): 43 name = 'fake_output_file' 44 45 46class HtmlOutputFormatterTest(unittest.TestCase): 47 48 def setUp(self): 49 self.maxDiff = 100000 50 51 def test_basic_summary(self): 52 test_story_set = _MakeStorySet() 53 output_file = StringIOFile() 54 55 # Run the first time and verify the results are written to the HTML file. 56 results = page_test_results.PageTestResults() 57 results.WillRunPage(test_story_set.stories[0]) 58 results.AddValue(scalar.ScalarValue( 59 test_story_set.stories[0], 'a', 'seconds', 3, 60 improvement_direction=improvement_direction.DOWN)) 61 results.DidRunPage(test_story_set.stories[0]) 62 63 results.WillRunPage(test_story_set.stories[1]) 64 results.AddValue(scalar.ScalarValue( 65 test_story_set.stories[1], 'a', 'seconds', 7, 66 improvement_direction=improvement_direction.DOWN)) 67 results.DidRunPage(test_story_set.stories[1]) 68 69 formatter = DeterministicHtmlOutputFormatter( 70 output_file, FakeMetadataForTest(), False, False, 'browser_type') 71 formatter.Format(results) 72 expected = { 73 "platform": "browser_type", 74 "buildTime": "1998-09-04T13:00:00.007777", 75 "label": 'test_name (1998-09-04 13:00:00)', 76 "tests": { 77 "test_name": { 78 "metrics": { 79 "a": { 80 "current": [3, 7], 81 "std": 2.8284271247461903, 82 "units": "seconds", 83 "important": True 84 }, 85 "telemetry_page_measurement_results.num_failed": { 86 "current": [0], 87 "units": "count", 88 "important": False 89 }, 90 "a.http://www.bar.com/": { 91 "current": [7], 92 "std": 0.0, 93 "units": "seconds", 94 "important": False 95 }, 96 "a.http://www.foo.com/": { 97 "current": [3], 98 "std": 0.0, 99 "units": "seconds", 100 "important": False 101 } 102 } 103 } 104 }, 105 } 106 self.assertEquals(expected, formatter.GetResults()) 107 108 # Run the second time and verify the results are appended to the HTML file. 109 output_file.seek(0) 110 results = page_test_results.PageTestResults() 111 results.WillRunPage(test_story_set.stories[0]) 112 results.AddValue(scalar.ScalarValue( 113 test_story_set.stories[0], 'a', 'seconds', 4, 114 improvement_direction=improvement_direction.DOWN)) 115 results.DidRunPage(test_story_set.stories[0]) 116 117 results.WillRunPage(test_story_set.stories[1]) 118 results.AddValue(scalar.ScalarValue( 119 test_story_set.stories[1], 'a', 'seconds', 8, 120 improvement_direction=improvement_direction.DOWN)) 121 results.DidRunPage(test_story_set.stories[1]) 122 123 formatter = DeterministicHtmlOutputFormatter( 124 output_file, FakeMetadataForTest(), False, False, 'browser_type') 125 formatter.Format(results) 126 expected = [ 127 { 128 "platform": "browser_type", 129 "buildTime": "1998-09-04T13:00:00.007777", 130 "label": 'test_name (1998-09-04 13:00:00)', 131 "tests": { 132 "test_name": { 133 "metrics": { 134 "a": { 135 "current": [3, 7], 136 "units": "seconds", 137 "std": 2.8284271247461903, 138 "important": True 139 }, 140 "telemetry_page_measurement_results.num_failed": { 141 "current": [0], 142 "units": "count", 143 "important": False 144 }, 145 "a.http://www.bar.com/": { 146 "current": [7], 147 "std": 0.0, 148 "units": "seconds", 149 "important": False 150 }, 151 "a.http://www.foo.com/": { 152 "current": [3], 153 "std": 0.0, 154 "units": "seconds", 155 "important": False 156 } 157 } 158 } 159 }, 160 }, 161 { 162 "platform": "browser_type", 163 "buildTime": "1998-09-04T13:00:00.007777", 164 "label": 'test_name (1998-09-04 13:00:00)', 165 "tests": { 166 "test_name": { 167 "metrics": { 168 "a": { 169 "current": [4, 8], 170 'std': 2.8284271247461903, 171 "units": "seconds", 172 "important": True 173 }, 174 "telemetry_page_measurement_results.num_failed": { 175 "current": [0], 176 "units": "count", 177 "important": False, 178 }, 179 "a.http://www.bar.com/": { 180 "current": [8], 181 "std": 0.0, 182 "units": "seconds", 183 "important": False 184 }, 185 "a.http://www.foo.com/": { 186 "current": [4], 187 "std": 0.0, 188 "units": "seconds", 189 "important": False 190 } 191 } 192 } 193 }, 194 }] 195 self.assertEquals(expected, formatter.GetCombinedResults()) 196 last_output_len = len(output_file.getvalue()) 197 198 # Now reset the results and verify the old ones are gone. 199 output_file.seek(0) 200 results = page_test_results.PageTestResults() 201 results.WillRunPage(test_story_set.stories[0]) 202 results.AddValue(scalar.ScalarValue( 203 test_story_set.stories[0], 'a', 'seconds', 5, 204 improvement_direction=improvement_direction.DOWN)) 205 results.DidRunPage(test_story_set.stories[0]) 206 207 results.WillRunPage(test_story_set.stories[1]) 208 results.AddValue(scalar.ScalarValue( 209 test_story_set.stories[1], 'a', 'seconds', 9, 210 improvement_direction=improvement_direction.DOWN)) 211 results.AddValue(scalar.ScalarValue( 212 test_story_set.stories[1], 'b', 'seconds', 20, tir_label='foo')) 213 results.DidRunPage(test_story_set.stories[1]) 214 215 formatter = DeterministicHtmlOutputFormatter( 216 output_file, FakeMetadataForTest(), True, False, 'browser_type') 217 formatter.Format(results) 218 expected = [{ 219 "platform": "browser_type", 220 "buildTime": "1998-09-04T13:00:00.007777", 221 "label": 'test_name (1998-09-04 13:00:00)', 222 "tests": { 223 "test_name": { 224 "metrics": { 225 "a": { 226 "current": [5, 9], 227 'std': 2.8284271247461903, 228 "units": "seconds", 229 "important": True 230 }, 231 "telemetry_page_measurement_results.num_failed": { 232 "current": [0], 233 "units": "count", 234 "important": False 235 }, 236 "a.http://www.bar.com/": { 237 "current": [9], 238 "std": 0.0, 239 "units": "seconds", 240 "important": False 241 }, 242 "a.http://www.foo.com/": { 243 "current": [5], 244 "std": 0.0, 245 "units": "seconds", 246 "important": False 247 }, 248 "foo-b.http://www.bar.com/": { 249 "current": [20], 250 "std": 0.0, 251 "units": "seconds", 252 "important": False 253 }, 254 "foo-b": { 255 "current": [20], 256 "std": 0.0, 257 "units": "seconds", 258 "important": True 259 } 260 } 261 } 262 }, 263 }] 264 self.assertEquals(expected, formatter.GetCombinedResults()) 265 self.assertTrue(len(output_file.getvalue()) < last_output_len) 266