OLD | NEW |
| (Empty) |
1 # Copyright 2017 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 os | |
5 import unittest | |
6 | |
7 from telemetry import decorators | |
8 from telemetry import story | |
9 from telemetry.page import page as page_module | |
10 from telemetry.testing import options_for_unittests | |
11 from telemetry.testing import page_test_test_case | |
12 from telemetry.timeline import async_slice | |
13 from telemetry.timeline import model as model_module | |
14 | |
15 | |
16 from benchmarks import blink_perf | |
17 | |
18 | |
19 class BlinkPerfTest(page_test_test_case.PageTestTestCase): | |
20 _BLINK_PERF_TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), | |
21 '..', '..', '..', 'third_party', 'WebKit', 'PerformanceTests', | |
22 'TestData') | |
23 | |
24 _BLINK_PERF_RESOURCES_DIR = os.path.join(os.path.dirname(__file__), | |
25 '..', '..', '..', 'third_party', 'WebKit', 'PerformanceTests', | |
26 'resources') | |
27 def setUp(self): | |
28 self._options = options_for_unittests.GetCopy() | |
29 # pylint: disable=protected-access | |
30 self._measurement = blink_perf._BlinkPerfMeasurement() | |
31 # pylint: enable=protected-access | |
32 | |
33 def _CreateStorySetForTestFile(self, test_file_name): | |
34 story_set = story.StorySet(base_dir=self._BLINK_PERF_TEST_DATA_DIR, | |
35 serving_dirs={self._BLINK_PERF_TEST_DATA_DIR, | |
36 self._BLINK_PERF_RESOURCES_DIR}) | |
37 page = page_module.Page('file://' + test_file_name, story_set, | |
38 base_dir=story_set.base_dir) | |
39 story_set.AddStory(page) | |
40 return story_set | |
41 | |
42 def testBlinkPerfTracingMetricsForMeasureTime(self): | |
43 results = self.RunMeasurement(measurement=self._measurement, | |
44 ps=self._CreateStorySetForTestFile('append-child-measure-time.html'), | |
45 options=self._options) | |
46 self.assertFalse(results.failures) | |
47 self.assertEquals(len(results.FindAllTraceValues()), 1) | |
48 | |
49 frame_view_layouts = results.FindAllPageSpecificValuesNamed( | |
50 'FrameView::layout') | |
51 self.assertEquals(len(frame_view_layouts), 1) | |
52 self.assertGreater(frame_view_layouts[0].GetRepresentativeNumber, 0.1) | |
53 | |
54 update_layout_trees = results.FindAllPageSpecificValuesNamed( | |
55 'UpdateLayoutTree') | |
56 self.assertEquals(len(update_layout_trees), 1) | |
57 self.assertGreater(update_layout_trees[0].GetRepresentativeNumber, 0.1) | |
58 | |
59 @decorators.Disabled('android') # crbug.com/715685 | |
60 def testBlinkPerfTracingMetricsForMeasureFrameTime(self): | |
61 results = self.RunMeasurement(measurement=self._measurement, | |
62 ps=self._CreateStorySetForTestFile( | |
63 'color-changes-measure-frame-time.html'), | |
64 options=self._options) | |
65 self.assertFalse(results.failures) | |
66 self.assertEquals(len(results.FindAllTraceValues()), 1) | |
67 | |
68 frame_view_prepaints = results.FindAllPageSpecificValuesNamed( | |
69 'FrameView::prePaint') | |
70 self.assertEquals(len(frame_view_prepaints), 1) | |
71 self.assertGreater(frame_view_prepaints[0].GetRepresentativeNumber, 0.1) | |
72 | |
73 frame_view_painttrees = results.FindAllPageSpecificValuesNamed( | |
74 'FrameView::paintTree') | |
75 self.assertEquals(len(frame_view_painttrees), 1) | |
76 self.assertGreater(frame_view_painttrees[0].GetRepresentativeNumber, 0.1) | |
77 | |
78 | |
79 # pylint: disable=protected-access | |
80 # This is needed for testing _ComputeTraceEventsThreadTimeForBlinkPerf method. | |
81 class ComputeTraceEventsMetricsForBlinkPerfTest(unittest.TestCase): | |
82 | |
83 def _AddBlinkTestSlice(self, renderer_thread, start, end): | |
84 s = async_slice.AsyncSlice( | |
85 'blink', 'blink_perf.runTest', | |
86 timestamp=start, duration=end - start, start_thread=renderer_thread, | |
87 end_thread=renderer_thread) | |
88 renderer_thread.AddAsyncSlice(s) | |
89 | |
90 def testTraceEventMetricsSingleBlinkTest(self): | |
91 model = model_module.TimelineModel() | |
92 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | |
93 renderer_main.name = 'CrRendererMain' | |
94 | |
95 # Set up a main thread model that looks like: | |
96 # [ blink_perf.run_test ] | |
97 # | [ foo ] [ bar ] [ baz ] | |
98 # | | | | | | | | | |
99 # 100 120 140 400 420 500 550 600 | |
100 # | | | | |
101 # CPU dur: 15 18 70 | |
102 # | |
103 self._AddBlinkTestSlice(renderer_main, 100, 550) | |
104 | |
105 renderer_main.BeginSlice('blink', 'foo', 120, 122) | |
106 renderer_main.EndSlice(140, 137) | |
107 | |
108 renderer_main.BeginSlice('blink', 'bar', 400, 402) | |
109 renderer_main.EndSlice(420, 420) | |
110 | |
111 # Since this "baz" slice has CPU duration = 70ms, wall-time duration = 100ms | |
112 # & its overalapped wall-time with "blink_perf.run_test" is 50 ms, its | |
113 # overlapped CPU time with "blink_perf.run_test" is | |
114 # 50 * 70 / 100 = 35ms. | |
115 renderer_main.BeginSlice('blink', 'baz', 500, 520) | |
116 renderer_main.EndSlice(600, 590) | |
117 | |
118 self.assertEquals( | |
119 blink_perf._ComputeTraceEventsThreadTimeForBlinkPerf( | |
120 renderer_main, ['foo', 'bar', 'baz']), | |
121 {'foo': [15], 'bar': [18], 'baz': [35]}) | |
122 | |
123 | |
124 def testTraceEventMetricsMultiBlinkTest(self): | |
125 model = model_module.TimelineModel() | |
126 renderer_main = model.GetOrCreateProcess(1).GetOrCreateThread(2) | |
127 renderer_main.name = 'CrRendererMain' | |
128 | |
129 # Set up a main thread model that looks like: | |
130 # [ blink_perf.run_test ] [ blink_perf.run_test ] | |
131 # | [ foo ] [ bar ] | [ | foo ] | | |
132 # | | | | | | | | | | | | |
133 # 100 120 140 400 420 440 500 520 600 640 | |
134 # | | | | |
135 # CPU dur: 15 18 40 | |
136 # | |
137 self._AddBlinkTestSlice(renderer_main, 100, 440) | |
138 self._AddBlinkTestSlice(renderer_main, 520, 640) | |
139 | |
140 renderer_main.BeginSlice('blink', 'foo', 120, 122) | |
141 renderer_main.EndSlice(140, 137) | |
142 | |
143 renderer_main.BeginSlice('blink', 'bar', 400, 402) | |
144 renderer_main.EndSlice(420, 420) | |
145 | |
146 # Since this "foo" slice has CPU duration = 40ms, wall-time duration = 100ms | |
147 # & its overalapped wall-time with "blink_perf.run_test" is 80 ms, its | |
148 # overlapped CPU time with "blink_perf.run_test" is | |
149 # 80 * 40 / 100 = 32ms. | |
150 renderer_main.BeginSlice('blink', 'foo', 500, 520) | |
151 renderer_main.EndSlice(600, 560) | |
152 | |
153 self.assertEquals( | |
154 blink_perf._ComputeTraceEventsThreadTimeForBlinkPerf( | |
155 renderer_main, ['foo', 'bar', 'baz']), | |
156 {'foo': [15, 32], 'bar': [18, 0], 'baz': [0, 0]}) | |
OLD | NEW |