1 # Copyright 2013 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. 4 import sys 5 6 from measurements import smoothness 7 from telemetry.core import wpr_modes 8 from telemetry.page import page 9 from telemetry.page import page_measurement_unittest_base 10 # pylint: disable=W0401,W0614 11 from telemetry.page.actions.all_page_actions import * 12 from telemetry.unittest import options_for_unittests 13 14 class FakePlatform(object): 15 def IsRawDisplayFrameRateSupported(self): 16 return False 17 def CanMonitorPower(self): 18 return False 19 20 21 class FakeBrowser(object): 22 def __init__(self): 23 self.platform = FakePlatform() 24 self.category_filter = None 25 26 def StartTracing(self, category_filter, _): 27 self.category_filter = category_filter 28 29 30 class AnimatedPage(page.Page): 31 def __init__(self, page_set): 32 super(AnimatedPage, self).__init__( 33 url='file://animated_page.html', 34 page_set=page_set, base_dir=page_set.base_dir) 35 36 def RunSmoothness(self, action_runner): 37 action_runner.Wait(1) 38 39 40 class FakeTab(object): 41 def __init__(self): 42 self.browser = FakeBrowser() 43 44 def ExecuteJavaScript(self, js): 45 pass 46 47 class SmoothnessUnitTest( 48 page_measurement_unittest_base.PageMeasurementUnitTestBase): 49 """Smoke test for smoothness measurement 50 51 Runs smoothness measurement on a simple page and verifies 52 that all metrics were added to the results. The test is purely functional, 53 i.e. it only checks if the metrics are present and non-zero. 54 """ 55 def testSyntheticDelayConfiguration(self): 56 test_page = page.Page('http://dummy', None) 57 test_page.synthetic_delays = { 58 'cc.BeginMainFrame': { 'target_duration': 0.012 }, 59 'cc.DrawAndSwap': { 'target_duration': 0.012, 'mode': 'alternating' }, 60 'gpu.PresentingFrame': { 'target_duration': 0.012 } 61 } 62 63 tab = FakeTab() 64 measurement = smoothness.Smoothness() 65 measurement.WillRunActions(test_page, tab) 66 67 expected_category_filter = [ 68 'DELAY(cc.BeginMainFrame;0.012000;static)', 69 'DELAY(cc.DrawAndSwap;0.012000;alternating)', 70 'DELAY(gpu.PresentingFrame;0.012000;static)', 71 'benchmark' 72 ] 73 actual_category_filter = tab.browser.category_filter.split(',') 74 actual_category_filter.sort() 75 76 # FIXME: Put blink.console into the expected above and remove these two 77 # remove entries when the blink.console change has rolled into chromium. 78 actual_category_filter.remove('webkit.console') 79 actual_category_filter.remove('blink.console') 80 81 if expected_category_filter != actual_category_filter: 82 sys.stderr.write("Expected category filter: %s\n" % 83 repr(expected_category_filter)) 84 sys.stderr.write("Actual category filter filter: %s\n" % 85 repr(actual_category_filter)) 86 self.assertEquals(expected_category_filter, actual_category_filter) 87 88 def setUp(self): 89 self._options = options_for_unittests.GetCopy() 90 self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF 91 92 def testSmoothness(self): 93 ps = self.CreatePageSetFromFileInUnittestDataDir('scrollable_page.html') 94 measurement = smoothness.Smoothness() 95 results = self.RunMeasurement(measurement, ps, options=self._options) 96 self.assertEquals(0, len(results.failures)) 97 98 frame_times = results.FindAllPageSpecificValuesNamed('frame_times') 99 self.assertEquals(len(frame_times), 1) 100 self.assertGreater(frame_times[0].GetRepresentativeNumber(), 0) 101 102 mean_frame_time = results.FindAllPageSpecificValuesNamed('mean_frame_time') 103 self.assertEquals(len(mean_frame_time), 1) 104 self.assertGreater(mean_frame_time[0].GetRepresentativeNumber(), 0) 105 106 jank = results.FindAllPageSpecificValuesNamed('jank') 107 self.assertEquals(len(jank), 1) 108 self.assertGreater(jank[0].GetRepresentativeNumber(), 0) 109 110 mostly_smooth = results.FindAllPageSpecificValuesNamed('mostly_smooth') 111 self.assertEquals(len(mostly_smooth), 1) 112 self.assertGreaterEqual(mostly_smooth[0].GetRepresentativeNumber(), 0) 113 114 mean_input_event_latency = results.FindAllPageSpecificValuesNamed( 115 'mean_input_event_latency') 116 if mean_input_event_latency: 117 self.assertEquals(len(mean_input_event_latency), 1) 118 self.assertGreater( 119 mean_input_event_latency[0].GetRepresentativeNumber(), 0) 120 121 def testSmoothnessForPageWithNoGesture(self): 122 ps = self.CreateEmptyPageSet() 123 ps.AddPage(AnimatedPage(ps)) 124 125 measurement = smoothness.Smoothness() 126 results = self.RunMeasurement(measurement, ps, options=self._options) 127 self.assertEquals(0, len(results.failures)) 128 129 mostly_smooth = results.FindAllPageSpecificValuesNamed('mostly_smooth') 130 self.assertEquals(len(mostly_smooth), 1) 131 self.assertGreaterEqual(mostly_smooth[0].GetRepresentativeNumber(), 0) 132 133 def testCleanUpTrace(self): 134 self.TestTracingCleanedUp(smoothness.Smoothness, self._options) 135