1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)# found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import os
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import unittest
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)from telemetry.core import platform
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from telemetry.core import wpr_modes
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.page import page as page_module
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from telemetry.page import page_set
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.results import page_test_results
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.timeline import model as model_module
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.timeline import async_slice
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from telemetry.unittest import options_for_unittests
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.unittest import page_test_test_case
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import scalar
19010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)from telemetry.web_perf import timeline_based_measurement as tbm_module
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.web_perf import timeline_interaction_record as tir_module
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)from telemetry.web_perf.metrics import timeline_based_metric
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FakeFastMetric(timeline_based_metric.TimelineBasedMetric):
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def AddResults(self, model, renderer_thread, interaction_records, results):
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'FakeFastMetric', 'ms', 1))
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'FastMetricRecords', 'count',
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        len(interaction_records)))
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FakeSmoothMetric(timeline_based_metric.TimelineBasedMetric):
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def AddResults(self, model, renderer_thread, interaction_records, results):
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'FakeSmoothMetric', 'ms', 1))
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'SmoothMetricRecords', 'count',
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        len(interaction_records)))
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass FakeLoadingMetric(timeline_based_metric.TimelineBasedMetric):
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def AddResults(self, model, renderer_thread, interaction_records, results):
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'FakeLoadingMetric', 'ms', 2))
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'LoadingMetricRecords', 'count',
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        len(interaction_records)))
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdochdef GetMetricFromMetricType(metric_type):
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if metric_type == tir_module.IS_FAST:
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return FakeFastMetric()
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if metric_type == tir_module.IS_SMOOTH:
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return FakeSmoothMetric()
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if metric_type == tir_module.IS_RESPONSIVE:
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return FakeLoadingMetric()
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  raise Exception('Unrecognized metric type: %s' % metric_type)
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TimelineBasedMetricTestData(object):
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def __init__(self):
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._model = model_module.TimelineModel()
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    renderer_process = self._model.GetOrCreateProcess(1)
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._renderer_thread = renderer_process.GetOrCreateThread(2)
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._renderer_thread.name = 'CrRendererMain'
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._results = page_test_results.PageTestResults()
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._metric = None
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._ps = None
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @property
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def results(self):
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._results
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @property
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def metric(self):
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return self._metric
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def AddInteraction(self, marker='', ts=0, duration=5):
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._renderer_thread.async_slices.append(async_slice.AsyncSlice(
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'category', marker, timestamp=ts, duration=duration,
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        start_thread=self._renderer_thread, end_thread=self._renderer_thread,
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        thread_start=ts, thread_duration=duration))
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def FinalizeImport(self):
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._model.FinalizeImport()
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._metric = tbm_module._TimelineBasedMetrics(  # pylint: disable=W0212
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        self._model, self._renderer_thread, GetMetricFromMetricType)
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._ps = page_set.PageSet(file_path=os.path.dirname(__file__))
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._ps.AddPageWithDefaultRunNavigate('http://www.bar.com/')
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._results.WillRunPage(self._ps.pages[0])
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def AddResults(self):
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._metric.AddResults(self._results)
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._results.DidRunPage(self._ps.pages[0])
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TimelineBasedMetricsTests(unittest.TestCase):
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testFindTimelineInteractionRecords(self):
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = TimelineBasedMetricTestData()
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=0, duration=20,
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName1/is_smooth')
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=25, duration=5,
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName2/is_responsive')
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=50, duration=15,
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName3/is_fast')
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.FinalizeImport()
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    interactions = d.metric.FindTimelineInteractionRecords()
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(3, len(interactions))
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(interactions[0].is_smooth)
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(0, interactions[0].start)
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(20, interactions[0].end)
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(interactions[1].is_responsive)
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(25, interactions[1].start)
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(30, interactions[1].end)
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertTrue(interactions[2].is_fast)
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(50, interactions[2].start)
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(65, interactions[2].end)
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testAddResults(self):
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = TimelineBasedMetricTestData()
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=0, duration=20,
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName1/is_smooth')
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=25, duration=5,
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName2/is_responsive')
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=50, duration=15,
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName3/is_fast')
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.FinalizeImport()
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddResults()
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(1, len(d.results.FindAllPageSpecificValuesNamed(
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'LogicalName1-FakeSmoothMetric')))
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(1, len(d.results.FindAllPageSpecificValuesNamed(
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'LogicalName2-FakeLoadingMetric')))
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(1, len(d.results.FindAllPageSpecificValuesNamed(
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        'LogicalName3-FakeFastMetric')))
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testNoInteractions(self):
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = TimelineBasedMetricTestData()
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.FinalizeImport()
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertRaises(tbm_module.InvalidInteractions, d.AddResults)
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testDuplicateUnrepeatableInteractions(self):
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = TimelineBasedMetricTestData()
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=10, duration=5,
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName/is_smooth')
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=20, duration=5,
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName/is_smooth')
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.FinalizeImport()
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertRaises(tbm_module.InvalidInteractions, d.AddResults)
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testDuplicateRepeatableInteractions(self):
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = TimelineBasedMetricTestData()
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=10, duration=5,
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName/is_smooth,repeatable')
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=20, duration=5,
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                     marker='Interaction.LogicalName/is_smooth,repeatable')
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.FinalizeImport()
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddResults()
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertEquals(1, len(d.results.pages_that_succeeded))
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def testDuplicateRepeatableInteractionsWithDifferentMetrics(self):
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d = TimelineBasedMetricTestData()
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    responsive_marker = 'Interaction.LogicalName/is_responsive,repeatable'
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=10, duration=5, marker=responsive_marker)
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    smooth_marker = 'Interaction.LogicalName/is_smooth,repeatable'
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.AddInteraction(ts=20, duration=5, marker=smooth_marker)
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    d.FinalizeImport()
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self.assertRaises(tbm_module.InvalidInteractions, d.AddResults)
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class TestTimelinebasedMeasurementPage(page_module.Page):
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  def __init__(self, ps, base_dir, trigger_animation=False,
18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)               trigger_jank=False, trigger_slow=False):
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    super(TestTimelinebasedMeasurementPage, self).__init__(
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'file://interaction_enabled_page.html', ps, base_dir)
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._trigger_animation = trigger_animation
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._trigger_jank = trigger_jank
18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self._trigger_slow = trigger_slow
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def RunSmoothness(self, action_runner):
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._trigger_animation:
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      action_runner.TapElement('#animating-button')
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      action_runner.WaitForJavaScriptCondition('window.animationDone')
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if self._trigger_jank:
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      action_runner.TapElement('#jank-button')
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      action_runner.WaitForJavaScriptCondition('window.jankScriptDone')
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if self._trigger_slow:
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      action_runner.TapElement('#slow-button')
19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      action_runner.WaitForJavaScriptCondition('window.slowScriptDone')
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class TimelineBasedMeasurementTest(page_test_test_case.PageTestTestCase):
20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  def setUp(self):
204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self._options = options_for_unittests.GetCopy()
205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testSmoothnessTimelineBasedMeasurementForSmoke(self):
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps = self.CreateEmptyPageSet()
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.AddPage(TestTimelinebasedMeasurementPage(
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ps, ps.base_dir, trigger_animation=True))
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    measurement = tbm_module.TimelineBasedMeasurement()
213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    results = self.RunMeasurement(measurement, ps,
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  options=self._options)
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEquals(0, len(results.failures))
21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    v = results.FindAllPageSpecificValuesNamed('CenterAnimation-jank')
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    self.assertEquals(len(v), 1)
21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    v = results.FindAllPageSpecificValuesNamed('DrawerAnimation-jank')
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    self.assertEquals(len(v), 1)
22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  def testFastTimelineBasedMeasurementForSmoke(self):
22303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ps = self.CreateEmptyPageSet()
22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ps.AddPage(TestTimelinebasedMeasurementPage(
22503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ps, ps.base_dir, trigger_slow=True))
22603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
22703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    measurement = tbm_module.TimelineBasedMeasurement()
22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    results = self.RunMeasurement(measurement, ps, options=self._options)
22903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
23003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals([], results.failures)
23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    expected_names = set([
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-duration',
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-idle_time',
23403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-incremental_marking',
23503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-incremental_marking_outside_idle',
23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-mark_compactor',
23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-mark_compactor_outside_idle',
23803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-scavenger',
23903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-scavenger_outside_idle',
24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-total_garbage_collection',
24103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        'SlowThreadJsRun-fast-total_garbage_collection_outside_idle',
24203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        ])
24303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if platform.GetHostPlatform().GetOSName() != 'win':
24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      # CPU metric is only supported non-Windows platforms.
24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      expected_names.add('SlowThreadJsRun-fast-cpu_time')
24603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertEquals(
24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        expected_names, set(v.name for v in results.all_page_specific_values))
24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # In interaction_enabled_page.html, the "slow" interaction executes
25003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # a loop with window.performance.now() to wait 200ms.
25103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # fast-duration measures wall time so its value should be at least 200ms.
25203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    v = results.FindAllPageSpecificValuesNamed('SlowThreadJsRun-fast-duration')
25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    self.assertGreaterEqual(v[0].value, 200.0)
25403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
25546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  # Disabled since mainthread_jank metric is not supported on windows platform.
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  @benchmark.Disabled('win')
25746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testMainthreadJankTimelineBasedMeasurement(self):
25846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ps = self.CreateEmptyPageSet()
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ps.AddPage(TestTimelinebasedMeasurementPage(
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ps, ps.base_dir, trigger_jank=True))
26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    measurement = tbm_module.TimelineBasedMeasurement()
26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    results = self.RunMeasurement(measurement, ps,
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  options=self._options)
26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertEquals(0, len(results.failures))
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    # In interaction_enabled_page.html, we create a jank loop based on
26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    # window.performance.now() (basically loop for x milliseconds).
26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # Since window.performance.now() uses wall-time instead of thread time,
27003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # we only assert the biggest jank > 50ms here to account for the fact
27103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    # that the browser may deschedule during the jank loop.
27246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    v = results.FindAllPageSpecificValuesNamed(
27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'JankThreadJSRun-responsive-biggest_jank_thread_time')
27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertGreaterEqual(v[0].value, 50)
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
27646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    v = results.FindAllPageSpecificValuesNamed(
27746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'JankThreadJSRun-responsive-total_big_jank_thread_time')
27846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertGreaterEqual(v[0].value, 50)
279