1cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Copyright 2014 The Chromium Authors. All rights reserved.
2cef7893435aa41160dd1255c43cb8498279738ccChris Craik# Use of this source code is governed by a BSD-style license that can be
3cef7893435aa41160dd1255c43cb8498279738ccChris Craik# found in the LICENSE file.
4cef7893435aa41160dd1255c43cb8498279738ccChris Craik
5cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport os
6cef7893435aa41160dd1255c43cb8498279738ccChris Craikimport unittest
7cef7893435aa41160dd1255c43cb8498279738ccChris Craik
8cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry import story
9cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.internal.results import page_test_results
10cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry import page as page_module
11cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import failure
12cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import histogram
13cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import improvement_direction
14cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import list_of_scalar_values
15cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import scalar
16cef7893435aa41160dd1255c43cb8498279738ccChris Craikfrom telemetry.value import summary as summary_module
17cef7893435aa41160dd1255c43cb8498279738ccChris Craik
18cef7893435aa41160dd1255c43cb8498279738ccChris Craik
19cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass TestBase(unittest.TestCase):
20cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def setUp(self):
21cef7893435aa41160dd1255c43cb8498279738ccChris Craik    story_set = story.StorySet(base_dir=os.path.dirname(__file__))
22cef7893435aa41160dd1255c43cb8498279738ccChris Craik    story_set.AddStory(
23cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page_module.Page('http://www.bar.com/', story_set, story_set.base_dir))
24cef7893435aa41160dd1255c43cb8498279738ccChris Craik    story_set.AddStory(
25cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page_module.Page('http://www.baz.com/', story_set, story_set.base_dir))
26cef7893435aa41160dd1255c43cb8498279738ccChris Craik    story_set.AddStory(
27cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page_module.Page('http://www.foo.com/', story_set, story_set.base_dir))
28cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.story_set = story_set
29cef7893435aa41160dd1255c43cb8498279738ccChris Craik
30cef7893435aa41160dd1255c43cb8498279738ccChris Craik  @property
31cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def pages(self):
32cef7893435aa41160dd1255c43cb8498279738ccChris Craik    return self.story_set.stories
33cef7893435aa41160dd1255c43cb8498279738ccChris Craik
34cef7893435aa41160dd1255c43cb8498279738ccChris Craik
35cef7893435aa41160dd1255c43cb8498279738ccChris Craikclass SummaryTest(TestBase):
36cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testBasicSummary(self):
37cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
38cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
39cef7893435aa41160dd1255c43cb8498279738ccChris Craik
40cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
41cef7893435aa41160dd1255c43cb8498279738ccChris Craik
42cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
43cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 3,
44cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
45cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
46cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
47cef7893435aa41160dd1255c43cb8498279738ccChris Craik
48cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
49cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = scalar.ScalarValue(page1, 'a', 'seconds', 7,
50cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
51cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
52cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
53cef7893435aa41160dd1255c43cb8498279738ccChris Craik
54cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
55cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
56cef7893435aa41160dd1255c43cb8498279738ccChris Craik
57cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0_list = list_of_scalar_values.ListOfScalarValues(
58cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [3],
59cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
60cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1_list = list_of_scalar_values.ListOfScalarValues(
61cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'seconds', [7],
62cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
63cef7893435aa41160dd1255c43cb8498279738ccChris Craik    merged_value = list_of_scalar_values.ListOfScalarValues(
64cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'a', 'seconds', [3, 7],
65cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
66cef7893435aa41160dd1255c43cb8498279738ccChris Craik
67cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(3, len(values))
68cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0_list, values)
69cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v1_list, values)
70cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(merged_value, values)
71cef7893435aa41160dd1255c43cb8498279738ccChris Craik
72cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testBasicSummaryWithOnlyOnePage(self):
73cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
74cef7893435aa41160dd1255c43cb8498279738ccChris Craik
75cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
76cef7893435aa41160dd1255c43cb8498279738ccChris Craik
77cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
78cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 3,
79cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
80cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
81cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
82cef7893435aa41160dd1255c43cb8498279738ccChris Craik
83cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
84cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
85cef7893435aa41160dd1255c43cb8498279738ccChris Craik
86cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0_list = list_of_scalar_values.ListOfScalarValues(
87cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [3],
88cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
89cef7893435aa41160dd1255c43cb8498279738ccChris Craik    merged_list = list_of_scalar_values.ListOfScalarValues(
90cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'a', 'seconds', [3],
91cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
92cef7893435aa41160dd1255c43cb8498279738ccChris Craik
93cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(2, len(values))
94cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0_list, values)
95cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(merged_list, values)
96cef7893435aa41160dd1255c43cb8498279738ccChris Craik
97cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testBasicSummaryNonuniformResults(self):
98cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
99cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
100cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page2 = self.pages[2]
101cef7893435aa41160dd1255c43cb8498279738ccChris Craik
102cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
103cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
104cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 3,
105cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
106cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
107cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = scalar.ScalarValue(page0, 'b', 'seconds', 10,
108cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
109cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
110cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
111cef7893435aa41160dd1255c43cb8498279738ccChris Craik
112cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
113cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2 = scalar.ScalarValue(page1, 'a', 'seconds', 3,
114cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
115cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v2)
116cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v3 = scalar.ScalarValue(page1, 'b', 'seconds', 10,
117cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
118cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v3)
119cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
120cef7893435aa41160dd1255c43cb8498279738ccChris Craik
121cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page2)
122cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v4 = scalar.ScalarValue(page2, 'a', 'seconds', 7,
123cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
124cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v4)
125cef7893435aa41160dd1255c43cb8498279738ccChris Craik    # Note, page[2] does not report a 'b' metric.
126cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page2)
127cef7893435aa41160dd1255c43cb8498279738ccChris Craik
128cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
129cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
130cef7893435aa41160dd1255c43cb8498279738ccChris Craik
131cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0_list = list_of_scalar_values.ListOfScalarValues(
132cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [3],
133cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
134cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1_list = list_of_scalar_values.ListOfScalarValues(
135cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'b', 'seconds', [10],
136cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
137cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2_list = list_of_scalar_values.ListOfScalarValues(
138cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'seconds', [3],
139cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
140cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v3_list = list_of_scalar_values.ListOfScalarValues(
141cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'b', 'seconds', [10],
142cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
143cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v4_list = list_of_scalar_values.ListOfScalarValues(
144cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page2, 'a', 'seconds', [7],
145cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
146cef7893435aa41160dd1255c43cb8498279738ccChris Craik
147cef7893435aa41160dd1255c43cb8498279738ccChris Craik    a_summary = list_of_scalar_values.ListOfScalarValues(
148cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'a', 'seconds', [3, 3, 7],
149cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
150cef7893435aa41160dd1255c43cb8498279738ccChris Craik    b_summary = list_of_scalar_values.ListOfScalarValues(
151cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'b', 'seconds', [10, 10],
152cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
153cef7893435aa41160dd1255c43cb8498279738ccChris Craik
154cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(7, len(values))
155cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0_list, values)
156cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v1_list, values)
157cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v2_list, values)
158cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v3_list, values)
159cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v4_list, values)
160cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(a_summary, values)
161cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(b_summary, values)
162cef7893435aa41160dd1255c43cb8498279738ccChris Craik
163cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testBasicSummaryPassAndFailPage(self):
164cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """If a page failed, only print summary for individual pages."""
165cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
166cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
167cef7893435aa41160dd1255c43cb8498279738ccChris Craik
168cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
169cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
170cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 3,
171cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
172cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
173cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = failure.FailureValue.FromMessage(page0, 'message')
174cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
175cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
176cef7893435aa41160dd1255c43cb8498279738ccChris Craik
177cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
178cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2 = scalar.ScalarValue(page1, 'a', 'seconds', 7,
179cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
180cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v2)
181cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
182cef7893435aa41160dd1255c43cb8498279738ccChris Craik
183cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
184cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
185cef7893435aa41160dd1255c43cb8498279738ccChris Craik
186cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0_list = list_of_scalar_values.ListOfScalarValues(
187cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [3],
188cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
189cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2_list = list_of_scalar_values.ListOfScalarValues(
190cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'seconds', [7],
191cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
192cef7893435aa41160dd1255c43cb8498279738ccChris Craik
193cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(2, len(values))
194cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0_list, values)
195cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v2_list, values)
196cef7893435aa41160dd1255c43cb8498279738ccChris Craik
197cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testRepeatedPagesetOneIterationOnePageFails(self):
198cef7893435aa41160dd1255c43cb8498279738ccChris Craik    """Page fails on one iteration, no averaged results should print."""
199cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
200cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
201cef7893435aa41160dd1255c43cb8498279738ccChris Craik
202cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
203cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
204cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 3,
205cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
206cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
207cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
208cef7893435aa41160dd1255c43cb8498279738ccChris Craik
209cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
210cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = scalar.ScalarValue(page1, 'a', 'seconds', 7,
211cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
212cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
213cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2 = failure.FailureValue.FromMessage(page1, 'message')
214cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v2)
215cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
216cef7893435aa41160dd1255c43cb8498279738ccChris Craik
217cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
218cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v3 = scalar.ScalarValue(page0, 'a', 'seconds', 4,
219cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
220cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v3)
221cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
222cef7893435aa41160dd1255c43cb8498279738ccChris Craik
223cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
224cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v4 = scalar.ScalarValue(page1, 'a', 'seconds', 8,
225cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
226cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v4)
227cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
228cef7893435aa41160dd1255c43cb8498279738ccChris Craik
229cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
230cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
231cef7893435aa41160dd1255c43cb8498279738ccChris Craik
232cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0_aggregated = list_of_scalar_values.ListOfScalarValues(
233cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [3, 4],
234cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
235cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1_aggregated = list_of_scalar_values.ListOfScalarValues(
236cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'seconds', [7, 8],
237cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
238cef7893435aa41160dd1255c43cb8498279738ccChris Craik
239cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(2, len(values))
240cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(page0_aggregated, values)
241cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(page1_aggregated, values)
242cef7893435aa41160dd1255c43cb8498279738ccChris Craik
243cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testRepeatedPages(self):
244cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
245cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
246cef7893435aa41160dd1255c43cb8498279738ccChris Craik
247cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
248cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
249cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 3,
250cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
251cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
252cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
253cef7893435aa41160dd1255c43cb8498279738ccChris Craik
254cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
255cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2 = scalar.ScalarValue(page0, 'a', 'seconds', 4,
256cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
257cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v2)
258cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
259cef7893435aa41160dd1255c43cb8498279738ccChris Craik
260cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
261cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = scalar.ScalarValue(page1, 'a', 'seconds', 7,
262cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
263cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
264cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
265cef7893435aa41160dd1255c43cb8498279738ccChris Craik
266cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
267cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v3 = scalar.ScalarValue(page1, 'a', 'seconds', 8,
268cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
269cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v3)
270cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
271cef7893435aa41160dd1255c43cb8498279738ccChris Craik
272cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
273cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
274cef7893435aa41160dd1255c43cb8498279738ccChris Craik
275cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0_aggregated = list_of_scalar_values.ListOfScalarValues(
276cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [3, 4],
277cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
278cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1_aggregated = list_of_scalar_values.ListOfScalarValues(
279cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'seconds', [7, 8],
280cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
281cef7893435aa41160dd1255c43cb8498279738ccChris Craik    a_summary = list_of_scalar_values.ListOfScalarValues(
282cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'a', 'seconds', [3, 4, 7, 8],
283cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
284cef7893435aa41160dd1255c43cb8498279738ccChris Craik
285cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(3, len(values))
286cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(page0_aggregated, values)
287cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(page1_aggregated, values)
288cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(a_summary, values)
289cef7893435aa41160dd1255c43cb8498279738ccChris Craik
290cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testPageRunsTwice(self):
291cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
292cef7893435aa41160dd1255c43cb8498279738ccChris Craik
293cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
294cef7893435aa41160dd1255c43cb8498279738ccChris Craik
295cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
296cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'b', 'seconds', 2,
297cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
298cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
299cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
300cef7893435aa41160dd1255c43cb8498279738ccChris Craik
301cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
302cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = scalar.ScalarValue(page0, 'b', 'seconds', 3,
303cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
304cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
305cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
306cef7893435aa41160dd1255c43cb8498279738ccChris Craik
307cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
308cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
309cef7893435aa41160dd1255c43cb8498279738ccChris Craik
310cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0_aggregated = list_of_scalar_values.ListOfScalarValues(
311cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'b', 'seconds', [2, 3],
312cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
313cef7893435aa41160dd1255c43cb8498279738ccChris Craik    b_summary = list_of_scalar_values.ListOfScalarValues(
314cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'b', 'seconds', [2, 3],
315cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
316cef7893435aa41160dd1255c43cb8498279738ccChris Craik
317cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(2, len(values))
318cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(page0_aggregated, values)
319cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(b_summary, values)
320cef7893435aa41160dd1255c43cb8498279738ccChris Craik
321cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testListValue(self):
322cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
323cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
324cef7893435aa41160dd1255c43cb8498279738ccChris Craik
325cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
326cef7893435aa41160dd1255c43cb8498279738ccChris Craik
327cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
328cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = list_of_scalar_values.ListOfScalarValues(
329cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'b', 'seconds', [2, 2],
330cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
331cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
332cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
333cef7893435aa41160dd1255c43cb8498279738ccChris Craik
334cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
335cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = list_of_scalar_values.ListOfScalarValues(
336cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'b', 'seconds', [3, 3],
337cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
338cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
339cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
340cef7893435aa41160dd1255c43cb8498279738ccChris Craik
341cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
342cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
343cef7893435aa41160dd1255c43cb8498279738ccChris Craik
344cef7893435aa41160dd1255c43cb8498279738ccChris Craik    b_summary = list_of_scalar_values.ListOfScalarValues(
345cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'b', 'seconds', [2, 2, 3, 3], std=0.0,
346cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
347cef7893435aa41160dd1255c43cb8498279738ccChris Craik
348cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(3, len(values))
349cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0, values)
350cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v1, values)
351cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(b_summary, values)
352cef7893435aa41160dd1255c43cb8498279738ccChris Craik
353cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testHistogram(self):
354cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
355cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
356cef7893435aa41160dd1255c43cb8498279738ccChris Craik
357cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
358cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
359cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = histogram.HistogramValue(
360cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'units',
361cef7893435aa41160dd1255c43cb8498279738ccChris Craik        raw_value_json='{"buckets": [{"low": 1, "high": 2, "count": 1}]}',
362cef7893435aa41160dd1255c43cb8498279738ccChris Craik        important=False, improvement_direction=improvement_direction.UP)
363cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
364cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
365cef7893435aa41160dd1255c43cb8498279738ccChris Craik
366cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
367cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = histogram.HistogramValue(
368cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'units',
369cef7893435aa41160dd1255c43cb8498279738ccChris Craik        raw_value_json='{"buckets": [{"low": 2, "high": 3, "count": 1}]}',
370cef7893435aa41160dd1255c43cb8498279738ccChris Craik        important=False, improvement_direction=improvement_direction.UP)
371cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
372cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
373cef7893435aa41160dd1255c43cb8498279738ccChris Craik
374cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(results.all_page_specific_values)
375cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
376cef7893435aa41160dd1255c43cb8498279738ccChris Craik
377cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(2, len(values))
378cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0, values)
379cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v1, values)
380cef7893435aa41160dd1255c43cb8498279738ccChris Craik
381cef7893435aa41160dd1255c43cb8498279738ccChris Craik  def testSummaryUsesKeyFunc(self):
382cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page0 = self.pages[0]
383cef7893435aa41160dd1255c43cb8498279738ccChris Craik    page1 = self.pages[1]
384cef7893435aa41160dd1255c43cb8498279738ccChris Craik
385cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results = page_test_results.PageTestResults()
386cef7893435aa41160dd1255c43cb8498279738ccChris Craik
387cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page0)
388cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0 = scalar.ScalarValue(page0, 'a', 'seconds', 20,
389cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
390cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v0)
391cef7893435aa41160dd1255c43cb8498279738ccChris Craik
392cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v1 = scalar.ScalarValue(page0, 'b', 'seconds', 42,
393cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
394cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v1)
395cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page0)
396cef7893435aa41160dd1255c43cb8498279738ccChris Craik
397cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.WillRunPage(page1)
398cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2 = scalar.ScalarValue(page1, 'a', 'seconds', 20,
399cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
400cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v2)
401cef7893435aa41160dd1255c43cb8498279738ccChris Craik
402cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v3 = scalar.ScalarValue(page1, 'b', 'seconds', 42,
403cef7893435aa41160dd1255c43cb8498279738ccChris Craik                            improvement_direction=improvement_direction.UP)
404cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.AddValue(v3)
405cef7893435aa41160dd1255c43cb8498279738ccChris Craik    results.DidRunPage(page1)
406cef7893435aa41160dd1255c43cb8498279738ccChris Craik
407cef7893435aa41160dd1255c43cb8498279738ccChris Craik    summary = summary_module.Summary(
408cef7893435aa41160dd1255c43cb8498279738ccChris Craik        results.all_page_specific_values,
409cef7893435aa41160dd1255c43cb8498279738ccChris Craik        key_func=lambda v: True)
410cef7893435aa41160dd1255c43cb8498279738ccChris Craik    values = summary.interleaved_computed_per_page_values_and_summaries
411cef7893435aa41160dd1255c43cb8498279738ccChris Craik
412cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v0_list = list_of_scalar_values.ListOfScalarValues(
413cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page0, 'a', 'seconds', [20, 42],
414cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
415cef7893435aa41160dd1255c43cb8498279738ccChris Craik    v2_list = list_of_scalar_values.ListOfScalarValues(
416cef7893435aa41160dd1255c43cb8498279738ccChris Craik        page1, 'a', 'seconds', [20, 42],
417cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
418cef7893435aa41160dd1255c43cb8498279738ccChris Craik    merged_value = list_of_scalar_values.ListOfScalarValues(
419cef7893435aa41160dd1255c43cb8498279738ccChris Craik        None, 'a', 'seconds', [20, 42, 20, 42],
420cef7893435aa41160dd1255c43cb8498279738ccChris Craik        improvement_direction=improvement_direction.UP)
421cef7893435aa41160dd1255c43cb8498279738ccChris Craik
422cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertEquals(3, len(values))
423cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v0_list, values)
424cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(v2_list, values)
425cef7893435aa41160dd1255c43cb8498279738ccChris Craik    self.assertIn(merged_value, values)
426