Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(37)

Side by Side Diff: content/test/gpu/gpu_tests/context_lost.py

Issue 560023002: gpu: Add test for losing a context in a background tab (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/test/data/gpu/webgl.html ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 import os 4 import os
5 import time 5 import time
6 6
7 import context_lost_expectations 7 import context_lost_expectations
8 8
9 from telemetry import benchmark as benchmark_module 9 from telemetry import benchmark as benchmark_module
10 from telemetry.core import exceptions 10 from telemetry.core import exceptions
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 def CustomizeBrowserOptions(self, options): 60 def CustomizeBrowserOptions(self, options):
61 options.AppendExtraBrowserArgs( 61 options.AppendExtraBrowserArgs(
62 '--disable-domain-blocking-for-3d-apis') 62 '--disable-domain-blocking-for-3d-apis')
63 options.AppendExtraBrowserArgs( 63 options.AppendExtraBrowserArgs(
64 '--disable-gpu-process-crash-limit') 64 '--disable-gpu-process-crash-limit')
65 # Required for about:gpucrash handling from Telemetry. 65 # Required for about:gpucrash handling from Telemetry.
66 options.AppendExtraBrowserArgs('--enable-gpu-benchmarking') 66 options.AppendExtraBrowserArgs('--enable-gpu-benchmarking')
67 67
68 def ValidateAndMeasurePage(self, page, tab, results): 68 def ValidateAndMeasurePage(self, page, tab, results):
69 def WaitForPageToFinish():
70 print "Waiting for page to finish."
71 try:
72 util.WaitFor(lambda: tab.EvaluateJavaScript(
73 'window.domAutomationController._finished'), wait_timeout)
74 return True
75 except util.TimeoutException:
76 return False
77
69 if page.kill_gpu_process: 78 if page.kill_gpu_process:
70 # Doing the GPU process kill operation cooperatively -- in the 79 # Doing the GPU process kill operation cooperatively -- in the
71 # same page's context -- is much more stressful than restarting 80 # same page's context -- is much more stressful than restarting
72 # the browser every time. 81 # the browser every time.
73 for x in range(page.number_of_gpu_process_kills): 82 for x in range(page.number_of_gpu_process_kills):
74 if not tab.browser.supports_tab_control: 83 if not tab.browser.supports_tab_control:
75 raise page_test.Failure('Browser must support tab control') 84 raise page_test.Failure('Browser must support tab control')
76 85
77 expected_kills = x + 1 86 expected_kills = x + 1
78 87
(...skipping 11 matching lines...) Expand all
90 gpucrash_tab = tab.browser.tabs.New() 99 gpucrash_tab = tab.browser.tabs.New()
91 # To access these debug URLs from Telemetry, they have to be 100 # To access these debug URLs from Telemetry, they have to be
92 # written using the chrome:// scheme. 101 # written using the chrome:// scheme.
93 # The try/except is a workaround for crbug.com/368107. 102 # The try/except is a workaround for crbug.com/368107.
94 try: 103 try:
95 gpucrash_tab.Navigate('chrome://gpucrash') 104 gpucrash_tab.Navigate('chrome://gpucrash')
96 except (exceptions.TabCrashException, Exception): 105 except (exceptions.TabCrashException, Exception):
97 print 'Tab crashed while navigating to chrome://gpucrash' 106 print 'Tab crashed while navigating to chrome://gpucrash'
98 # Activate the original tab and wait for completion. 107 # Activate the original tab and wait for completion.
99 tab.Activate() 108 tab.Activate()
100 completed = False 109 completed = WaitForPageToFinish()
101 try:
102 util.WaitFor(lambda: tab.EvaluateJavaScript(
103 'window.domAutomationController._finished'), wait_timeout)
104 completed = True
105 except util.TimeoutException:
106 pass
107 110
108 if page.check_crash_count: 111 if page.check_crash_count:
109 if not tab.browser.supports_system_info: 112 if not tab.browser.supports_system_info:
110 raise page_test.Failure('Browser must support system info') 113 raise page_test.Failure('Browser must support system info')
111 114
112 if not tab.EvaluateJavaScript( 115 if not tab.EvaluateJavaScript(
113 'window.domAutomationController._succeeded'): 116 'window.domAutomationController._succeeded'):
114 raise page_test.Failure( 117 raise page_test.Failure(
115 'Test failed (didn\'t render content properly?)') 118 'Test failed (didn\'t render content properly?)')
116 119
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 'Test didn\'t complete (no context lost event?)') 156 'Test didn\'t complete (no context lost event?)')
154 if not tab.EvaluateJavaScript( 157 if not tab.EvaluateJavaScript(
155 'window.domAutomationController._succeeded'): 158 'window.domAutomationController._succeeded'):
156 raise page_test.Failure( 159 raise page_test.Failure(
157 'Test failed (context not restored properly?)') 160 'Test failed (context not restored properly?)')
158 elif page.force_garbage_collection: 161 elif page.force_garbage_collection:
159 # Try to corce GC to clean up any contexts not attached to the page. 162 # Try to corce GC to clean up any contexts not attached to the page.
160 # This method seem unreliable, so the page will also attempt to force 163 # This method seem unreliable, so the page will also attempt to force
161 # GC through excessive allocations. 164 # GC through excessive allocations.
162 tab.CollectGarbage() 165 tab.CollectGarbage()
163 completed = False 166 completed = WaitForPageToFinish()
164 try:
165 print "Waiting for page to finish."
166 util.WaitFor(lambda: tab.EvaluateJavaScript(
167 'window.domAutomationController._finished'), wait_timeout)
168 completed = True
169 except util.TimeoutException:
170 pass
171 167
172 if not completed: 168 if not completed:
173 raise page_test.Failure( 169 raise page_test.Failure(
174 'Test didn\'t complete (no context restored event?)') 170 'Test didn\'t complete (no context restored event?)')
175 if not tab.EvaluateJavaScript( 171 if not tab.EvaluateJavaScript(
176 'window.domAutomationController._succeeded'): 172 'window.domAutomationController._succeeded'):
177 raise page_test.Failure( 173 raise page_test.Failure(
178 'Test failed (context not restored properly?)') 174 'Test failed (context not restored properly?)')
179 else: 175 elif page.hide_tab_and_lose_context:
180 completed = False 176 if not tab.browser.supports_tab_control:
181 try: 177 raise page_test.Failure('Browser must support tab control')
182 print "Waiting for page to finish." 178
183 util.WaitFor(lambda: tab.EvaluateJavaScript( 179 # Test losing a context in a hidden tab. This test passes if the tab
184 'window.domAutomationController._finished'), wait_timeout) 180 # doesn't crash.
185 completed = True 181 dummy_tab = tab.browser.tabs.New()
186 except util.TimeoutException: 182 tab.EvaluateJavaScript('loseContextUsingExtension()')
187 pass 183 tab.Activate()
184
185 completed = WaitForPageToFinish()
188 186
189 if not completed: 187 if not completed:
190 raise page_test.Failure('Test didn\'t complete') 188 raise page_test.Failure('Test didn\'t complete')
189 if not tab.EvaluateJavaScript(
190 'window.domAutomationController._succeeded'):
191 raise page_test.Failure('Test failed')
192 else:
193 completed = WaitForPageToFinish()
194
195 if not completed:
196 raise page_test.Failure('Test didn\'t complete')
191 if not tab.EvaluateJavaScript( 197 if not tab.EvaluateJavaScript(
192 'window.domAutomationController._succeeded'): 198 'window.domAutomationController._succeeded'):
193 raise page_test.Failure('Test failed') 199 raise page_test.Failure('Test failed')
194 200
195 # Test that navigating to chrome://gpucrash causes the GPU process to crash 201 # Test that navigating to chrome://gpucrash causes the GPU process to crash
196 # exactly one time per navigation. 202 # exactly one time per navigation.
197 class GPUProcessCrashesExactlyOnce(page.Page): 203 class GPUProcessCrashesExactlyOnce(page.Page):
198 def __init__(self, page_set, base_dir): 204 def __init__(self, page_set, base_dir):
199 super(GPUProcessCrashesExactlyOnce, self).__init__( 205 super(GPUProcessCrashesExactlyOnce, self).__init__(
200 url='file://gpu_process_crash.html', 206 url='file://gpu_process_crash.html',
201 page_set=page_set, 207 page_set=page_set,
202 base_dir=base_dir, 208 base_dir=base_dir,
203 name='GpuCrash.GPUProcessCrashesExactlyOnce') 209 name='GpuCrash.GPUProcessCrashesExactlyOnce')
204 self.script_to_evaluate_on_commit = harness_script 210 self.script_to_evaluate_on_commit = harness_script
205 self.kill_gpu_process = True 211 self.kill_gpu_process = True
206 self.number_of_gpu_process_kills = 2 212 self.number_of_gpu_process_kills = 2
207 self.check_crash_count = True 213 self.check_crash_count = True
208 self.force_garbage_collection = False 214 self.force_garbage_collection = False
215 self.hide_tab_and_lose_context = False
picksi1 2014/09/12 09:05:25 It looks like this has already landed, but as an o
Sami 2014/09/12 09:56:28 Right, what I'd really want to do here is have a c
209 216
210 def RunNavigateSteps(self, action_runner): 217 def RunNavigateSteps(self, action_runner):
211 action_runner.NavigateToPage(self) 218 action_runner.NavigateToPage(self)
212 action_runner.WaitForJavaScriptCondition( 219 action_runner.WaitForJavaScriptCondition(
213 'window.domAutomationController._loaded') 220 'window.domAutomationController._loaded')
214 221
215 class WebGLContextLostFromGPUProcessExitPage(page.Page): 222 class WebGLContextLostFromGPUProcessExitPage(page.Page):
216 def __init__(self, page_set, base_dir): 223 def __init__(self, page_set, base_dir):
217 super(WebGLContextLostFromGPUProcessExitPage, self).__init__( 224 super(WebGLContextLostFromGPUProcessExitPage, self).__init__(
218 url='file://webgl.html?query=kill_after_notification', 225 url='file://webgl.html?query=kill_after_notification',
219 page_set=page_set, 226 page_set=page_set,
220 base_dir=base_dir, 227 base_dir=base_dir,
221 name='ContextLost.WebGLContextLostFromGPUProcessExit') 228 name='ContextLost.WebGLContextLostFromGPUProcessExit')
222 self.script_to_evaluate_on_commit = harness_script 229 self.script_to_evaluate_on_commit = harness_script
223 self.kill_gpu_process = True 230 self.kill_gpu_process = True
224 self.check_crash_count = False 231 self.check_crash_count = False
225 self.number_of_gpu_process_kills = 1 232 self.number_of_gpu_process_kills = 1
226 self.force_garbage_collection = False 233 self.force_garbage_collection = False
234 self.hide_tab_and_lose_context = False
227 235
228 def RunNavigateSteps(self, action_runner): 236 def RunNavigateSteps(self, action_runner):
229 action_runner.NavigateToPage(self) 237 action_runner.NavigateToPage(self)
230 action_runner.WaitForJavaScriptCondition( 238 action_runner.WaitForJavaScriptCondition(
231 'window.domAutomationController._loaded') 239 'window.domAutomationController._loaded')
232 240
233 241
234 class WebGLContextLostFromLoseContextExtensionPage(page.Page): 242 class WebGLContextLostFromLoseContextExtensionPage(page.Page):
235 def __init__(self, page_set, base_dir): 243 def __init__(self, page_set, base_dir):
236 super(WebGLContextLostFromLoseContextExtensionPage, self).__init__( 244 super(WebGLContextLostFromLoseContextExtensionPage, self).__init__(
237 url='file://webgl.html?query=WEBGL_lose_context', 245 url='file://webgl.html?query=WEBGL_lose_context',
238 page_set=page_set, 246 page_set=page_set,
239 base_dir=base_dir, 247 base_dir=base_dir,
240 name='ContextLost.WebGLContextLostFromLoseContextExtension') 248 name='ContextLost.WebGLContextLostFromLoseContextExtension')
241 self.script_to_evaluate_on_commit = harness_script 249 self.script_to_evaluate_on_commit = harness_script
242 self.kill_gpu_process = False 250 self.kill_gpu_process = False
243 self.check_crash_count = False 251 self.check_crash_count = False
244 self.force_garbage_collection = False 252 self.force_garbage_collection = False
253 self.hide_tab_and_lose_context = False
245 254
246 def RunNavigateSteps(self, action_runner): 255 def RunNavigateSteps(self, action_runner):
247 action_runner.NavigateToPage(self) 256 action_runner.NavigateToPage(self)
248 action_runner.WaitForJavaScriptCondition( 257 action_runner.WaitForJavaScriptCondition(
249 'window.domAutomationController._finished') 258 'window.domAutomationController._finished')
250 259
260
261 class WebGLContextLostInHiddenTabPage(page.Page):
262 def __init__(self, page_set, base_dir):
263 super(WebGLContextLostInHiddenTabPage, self).__init__(
264 url='file://webgl.html?query=kill_after_notification',
265 page_set=page_set,
266 base_dir=base_dir,
267 name='ContextLost.WebGLContextLostInHiddenTab')
268 self.script_to_evaluate_on_commit = harness_script
269 self.kill_gpu_process = False
270 self.check_crash_count = False
271 self.force_garbage_collection = False
272 self.hide_tab_and_lose_context = True
273
274 def RunNavigateSteps(self, action_runner):
275 action_runner.NavigateToPage(self)
276 action_runner.WaitForJavaScriptCondition(
277 'window.domAutomationController._loaded')
278
279
251 class WebGLContextLostFromQuantityPage(page.Page): 280 class WebGLContextLostFromQuantityPage(page.Page):
252 def __init__(self, page_set, base_dir): 281 def __init__(self, page_set, base_dir):
253 super(WebGLContextLostFromQuantityPage, self).__init__( 282 super(WebGLContextLostFromQuantityPage, self).__init__(
254 url='file://webgl.html?query=forced_quantity_loss', 283 url='file://webgl.html?query=forced_quantity_loss',
255 page_set=page_set, 284 page_set=page_set,
256 base_dir=base_dir, 285 base_dir=base_dir,
257 name='ContextLost.WebGLContextLostFromQuantity') 286 name='ContextLost.WebGLContextLostFromQuantity')
258 self.script_to_evaluate_on_commit = harness_script 287 self.script_to_evaluate_on_commit = harness_script
259 self.kill_gpu_process = False 288 self.kill_gpu_process = False
260 self.check_crash_count = False 289 self.check_crash_count = False
261 self.force_garbage_collection = True 290 self.force_garbage_collection = True
291 self.hide_tab_and_lose_context = False
262 292
263 def RunNavigateSteps(self, action_runner): 293 def RunNavigateSteps(self, action_runner):
264 action_runner.NavigateToPage(self) 294 action_runner.NavigateToPage(self)
265 action_runner.WaitForJavaScriptCondition( 295 action_runner.WaitForJavaScriptCondition(
266 'window.domAutomationController._loaded') 296 'window.domAutomationController._loaded')
267 297
268 class WebGLContextLostFromSelectElementPage(page.Page): 298 class WebGLContextLostFromSelectElementPage(page.Page):
269 def __init__(self, page_set, base_dir): 299 def __init__(self, page_set, base_dir):
270 super(WebGLContextLostFromSelectElementPage, self).__init__( 300 super(WebGLContextLostFromSelectElementPage, self).__init__(
271 url='file://webgl_with_select_element.html', 301 url='file://webgl_with_select_element.html',
272 page_set=page_set, 302 page_set=page_set,
273 base_dir=base_dir, 303 base_dir=base_dir,
274 name='ContextLost.WebGLContextLostFromSelectElement') 304 name='ContextLost.WebGLContextLostFromSelectElement')
275 self.script_to_evaluate_on_commit = harness_script 305 self.script_to_evaluate_on_commit = harness_script
276 self.kill_gpu_process = False 306 self.kill_gpu_process = False
277 self.check_crash_count = False 307 self.check_crash_count = False
278 self.force_garbage_collection = False 308 self.force_garbage_collection = False
309 self.hide_tab_and_lose_context = False
279 310
280 def RunNavigateSteps(self, action_runner): 311 def RunNavigateSteps(self, action_runner):
281 action_runner.NavigateToPage(self) 312 action_runner.NavigateToPage(self)
282 action_runner.WaitForJavaScriptCondition( 313 action_runner.WaitForJavaScriptCondition(
283 'window.domAutomationController._loaded') 314 'window.domAutomationController._loaded')
284 315
285 class ContextLost(benchmark_module.Benchmark): 316 class ContextLost(benchmark_module.Benchmark):
286 enabled = True 317 enabled = True
287 test = _ContextLostValidator 318 test = _ContextLostValidator
288 319
289 def CreateExpectations(self, page_set): 320 def CreateExpectations(self, page_set):
290 return context_lost_expectations.ContextLostExpectations() 321 return context_lost_expectations.ContextLostExpectations()
291 322
292 # For the record, this would have been another way to get the pages 323 # For the record, this would have been another way to get the pages
293 # to repeat. pageset_repeat would be another option. 324 # to repeat. pageset_repeat would be another option.
294 # options = {'page_repeat': 5} 325 # options = {'page_repeat': 5}
295 def CreatePageSet(self, options): 326 def CreatePageSet(self, options):
296 ps = page_set.PageSet( 327 ps = page_set.PageSet(
297 file_path=data_path, 328 file_path=data_path,
298 user_agent_type='desktop', 329 user_agent_type='desktop',
299 serving_dirs=set([''])) 330 serving_dirs=set(['']))
300 ps.AddPage(GPUProcessCrashesExactlyOnce(ps, ps.base_dir)) 331 ps.AddPage(GPUProcessCrashesExactlyOnce(ps, ps.base_dir))
301 ps.AddPage(WebGLContextLostFromGPUProcessExitPage(ps, ps.base_dir)) 332 ps.AddPage(WebGLContextLostFromGPUProcessExitPage(ps, ps.base_dir))
302 ps.AddPage(WebGLContextLostFromLoseContextExtensionPage(ps, ps.base_dir)) 333 ps.AddPage(WebGLContextLostFromLoseContextExtensionPage(ps, ps.base_dir))
303 ps.AddPage(WebGLContextLostFromQuantityPage(ps, ps.base_dir)) 334 ps.AddPage(WebGLContextLostFromQuantityPage(ps, ps.base_dir))
304 ps.AddPage(WebGLContextLostFromSelectElementPage(ps, ps.base_dir)) 335 ps.AddPage(WebGLContextLostFromSelectElementPage(ps, ps.base_dir))
336 ps.AddPage(WebGLContextLostInHiddenTabPage(ps, ps.base_dir))
305 return ps 337 return ps
OLDNEW
« no previous file with comments | « content/test/data/gpu/webgl.html ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698