b82d1abe046884b658c1abca171c77bd6b963a45
[platform/framework/web/crosswalk.git] / src / tools / perf / measurements / smoothness_unittest.py
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 metrics import power
8 from telemetry.core import exceptions
9 from telemetry.core import wpr_modes
10 from telemetry.page import page
11 from telemetry.page import page_test
12 from telemetry.unittest import options_for_unittests
13 from telemetry.unittest import page_test_test_case
14 from telemetry.unittest import test
15
16 class FakeTracingController(object):
17   def __init__(self):
18     self.category_filter = None
19   def Start(self, _options, category_filter, _timeout):
20     self.category_filter = category_filter
21
22
23 class FakePlatform(object):
24   def __init__(self):
25     self.tracing_controller = FakeTracingController()
26   def IsRawDisplayFrameRateSupported(self):
27     return False
28   def CanMonitorPower(self):
29     return False
30
31
32 class FakeBrowser(object):
33   def __init__(self):
34     self.platform = FakePlatform()
35
36
37 class AnimatedPage(page.Page):
38   def __init__(self, page_set):
39     super(AnimatedPage, self).__init__(
40       url='file://animated_page.html',
41       page_set=page_set, base_dir=page_set.base_dir)
42
43   def RunSmoothness(self, action_runner):
44     action_runner.Wait(.2)
45
46
47 class FakeTab(object):
48   def __init__(self):
49     self.browser = FakeBrowser()
50
51   def ExecuteJavaScript(self, js):
52     pass
53
54 class SmoothnessUnitTest(page_test_test_case.PageTestTestCase):
55   """Smoke test for smoothness measurement
56
57      Runs smoothness measurement on a simple page and verifies
58      that all metrics were added to the results. The test is purely functional,
59      i.e. it only checks if the metrics are present and non-zero.
60   """
61   def testSyntheticDelayConfiguration(self):
62     test_page = page.Page('http://dummy', None)
63     test_page.synthetic_delays = {
64         'cc.BeginMainFrame': { 'target_duration': 0.012 },
65         'cc.DrawAndSwap': { 'target_duration': 0.012, 'mode': 'alternating' },
66         'gpu.PresentingFrame': { 'target_duration': 0.012 }
67     }
68
69     tab = FakeTab()
70     measurement = smoothness.Smoothness()
71     measurement.WillStartBrowser(tab.browser.platform)
72     measurement.WillNavigateToPage(test_page, tab)
73     measurement.WillRunActions(test_page, tab)
74
75     expected_category_filter = set([
76         'DELAY(cc.BeginMainFrame;0.012000;static)',
77         'DELAY(cc.DrawAndSwap;0.012000;alternating)',
78         'DELAY(gpu.PresentingFrame;0.012000;static)',
79         'benchmark'
80     ])
81     tracing_controller = tab.browser.platform.tracing_controller
82     actual_category_filter = (
83       tracing_controller.category_filter.included_categories)
84
85     # FIXME: Put blink.console into the expected above and remove these two
86     # remove entries when the blink.console change has rolled into chromium.
87     actual_category_filter.remove('webkit.console')
88     actual_category_filter.remove('blink.console')
89
90     if expected_category_filter != actual_category_filter:
91       sys.stderr.write("Expected category filter: %s\n" %
92                        repr(expected_category_filter))
93       sys.stderr.write("Actual category filter filter: %s\n" %
94                        repr(actual_category_filter))
95     self.assertEquals(expected_category_filter, actual_category_filter)
96
97   def setUp(self):
98     self._options = options_for_unittests.GetCopy()
99     self._options.browser_options.wpr_mode = wpr_modes.WPR_OFF
100
101   def testSmoothness(self):
102     ps = self.CreatePageSetFromFileInUnittestDataDir('scrollable_page.html')
103     measurement = smoothness.Smoothness()
104     results = self.RunMeasurement(measurement, ps, options=self._options)
105     self.assertEquals(0, len(results.failures))
106
107     frame_times = results.FindAllPageSpecificValuesNamed('frame_times')
108     self.assertEquals(len(frame_times), 1)
109     self.assertGreater(frame_times[0].GetRepresentativeNumber(), 0)
110
111     mean_frame_time = results.FindAllPageSpecificValuesNamed('mean_frame_time')
112     self.assertEquals(len(mean_frame_time), 1)
113     self.assertGreater(mean_frame_time[0].GetRepresentativeNumber(), 0)
114
115     frame_time_discrepancy = results.FindAllPageSpecificValuesNamed(
116         'frame_time_discrepancy')
117     self.assertEquals(len(frame_time_discrepancy), 1)
118     self.assertGreater(frame_time_discrepancy[0].GetRepresentativeNumber(), 0)
119
120     percentage_smooth = results.FindAllPageSpecificValuesNamed(
121         'percentage_smooth')
122     self.assertEquals(len(percentage_smooth), 1)
123     self.assertGreaterEqual(percentage_smooth[0].GetRepresentativeNumber(), 0)
124
125     mean_input_event_latency = results.FindAllPageSpecificValuesNamed(
126         'mean_input_event_latency')
127     if mean_input_event_latency:
128       self.assertEquals(len(mean_input_event_latency), 1)
129       self.assertGreater(
130           mean_input_event_latency[0].GetRepresentativeNumber(), 0)
131
132   @test.Disabled('mac', 'chromeos')  # http://crbug.com/403903
133   def testSmoothnessForPageWithNoGesture(self):
134     ps = self.CreateEmptyPageSet()
135     ps.AddPage(AnimatedPage(ps))
136
137     measurement = smoothness.Smoothness()
138     results = self.RunMeasurement(measurement, ps, options=self._options)
139     self.assertEquals(0, len(results.failures))
140
141     percentage_smooth = results.FindAllPageSpecificValuesNamed(
142         'percentage_smooth')
143     self.assertEquals(len(percentage_smooth), 1)
144     self.assertGreaterEqual(percentage_smooth[0].GetRepresentativeNumber(), 0)
145
146   def testCleanUpTrace(self):
147     self.TestTracingCleanedUp(smoothness.Smoothness, self._options)
148
149   def testCleanUpPowerMetric(self):
150     class FailPage(page.Page):
151       def __init__(self, page_set):
152         super(FailPage, self).__init__(
153             url='file://blank.html',
154             page_set=page_set, base_dir=page_set.base_dir)
155       def RunSmoothness(self, _):
156         raise exceptions.IntentionalException
157
158     class FakePowerMetric(power.PowerMetric):
159       start_called = False
160       stop_called = True
161       def Start(self, _1, _2):
162         self.start_called = True
163       def Stop(self, _1, _2):
164         self.stop_called = True
165
166     ps = self.CreateEmptyPageSet()
167     ps.AddPage(FailPage(ps))
168
169     class BuggyMeasurement(smoothness.Smoothness):
170       fake_power = None
171       # Inject fake power metric.
172       def WillStartBrowser(self, platform):
173         self.fake_power = self._power_metric = FakePowerMetric(platform)
174
175     measurement = BuggyMeasurement()
176     try:
177       self.RunMeasurement(measurement, ps)
178     except page_test.TestNotSupportedOnPlatformFailure:
179       pass
180
181     self.assertTrue(measurement.fake_power.start_called)
182     self.assertTrue(measurement.fake_power.stop_called)