|  | # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  | from telemetry import multi_page_benchmark | 
|  | from telemetry import multi_page_benchmark_unittest_base | 
|  | from telemetry import page | 
|  | from perf_tools import smoothness_benchmark | 
|  |  | 
|  | from telemetry import browser_finder | 
|  | from telemetry import options_for_unittests | 
|  |  | 
|  | import os | 
|  | import urlparse | 
|  |  | 
|  | class SmoothnessBenchmarkUnitTest( | 
|  | multi_page_benchmark_unittest_base.MultiPageBenchmarkUnitTestBase): | 
|  |  | 
|  | def testFirstPaintTimeMeasurement(self): | 
|  | ps = self.CreatePageSetFromFileInUnittestDataDir('scrollable_page.html') | 
|  |  | 
|  | benchmark = smoothness_benchmark.SmoothnessBenchmark() | 
|  | all_results = self.RunBenchmark(benchmark, ps) | 
|  |  | 
|  | self.assertEqual(0, len(all_results.page_failures)) | 
|  | self.assertEqual(1, len(all_results.page_results)) | 
|  |  | 
|  | results0 = all_results.page_results[0] | 
|  | if results0['first_paint'] == 'unsupported': | 
|  | # This test can't run on content_shell. | 
|  | return | 
|  | self.assertTrue(results0['first_paint'] > 0) | 
|  |  | 
|  | def testScrollingWithGpuBenchmarkingExtension(self): | 
|  | ps = self.CreatePageSetFromFileInUnittestDataDir('scrollable_page.html') | 
|  |  | 
|  | benchmark = smoothness_benchmark.SmoothnessBenchmark() | 
|  | all_results = self.RunBenchmark(benchmark, ps) | 
|  |  | 
|  | self.assertEqual(0, len(all_results.page_failures)) | 
|  | self.assertEqual(1, len(all_results.page_results)) | 
|  | results0 = all_results.page_results[0] | 
|  |  | 
|  | self.assertTrue('dropped_percent' in results0) | 
|  | self.assertTrue('mean_frame_time' in results0) | 
|  |  | 
|  | def testCalcResultsFromRAFRenderStats(self): | 
|  | rendering_stats = {'droppedFrameCount': 5, | 
|  | 'totalTimeInSeconds': 1, | 
|  | 'numAnimationFrames': 10, | 
|  | 'numFramesSentToScreen': 10} | 
|  | res = multi_page_benchmark.BenchmarkResults() | 
|  | res.WillMeasurePage(page.Page('http://foo.com/')) | 
|  | smoothness_benchmark.CalcScrollResults(rendering_stats, res) | 
|  | res.DidMeasurePage() | 
|  | self.assertEquals(50, res.page_results[0]['dropped_percent']) | 
|  | self.assertAlmostEquals(100, res.page_results[0]['mean_frame_time'], 2) | 
|  |  | 
|  | def testCalcResultsRealRenderStats(self): | 
|  | rendering_stats = {'numFramesSentToScreen': 60, | 
|  | 'globalTotalTextureUploadTimeInSeconds': 0, | 
|  | 'totalProcessingCommandsTimeInSeconds': 0, | 
|  | 'globalTextureUploadCount': 0, | 
|  | 'droppedFrameCount': 0, | 
|  | 'textureUploadCount': 0, | 
|  | 'numAnimationFrames': 10, | 
|  | 'totalPaintTimeInSeconds': 0.35374299999999986, | 
|  | 'globalTotalProcessingCommandsTimeInSeconds': 0, | 
|  | 'totalTextureUploadTimeInSeconds': 0, | 
|  | 'totalRasterizeTimeInSeconds': 0, | 
|  | 'totalTimeInSeconds': 1.0} | 
|  | res = multi_page_benchmark.BenchmarkResults() | 
|  | res.WillMeasurePage(page.Page('http://foo.com/')) | 
|  | smoothness_benchmark.CalcScrollResults(rendering_stats, res) | 
|  | res.DidMeasurePage() | 
|  | self.assertEquals(0, res.page_results[0]['dropped_percent']) | 
|  | self.assertAlmostEquals(1000/60., res.page_results[0]['mean_frame_time'], 2) | 
|  |  | 
|  | def testBoundingClientRect(self): | 
|  | options = options_for_unittests.GetCopy() | 
|  | browser_to_create = browser_finder.FindBrowser(options) | 
|  | if not browser_to_create: | 
|  | raise Exception('No browser found, cannot continue test.') | 
|  |  | 
|  | with browser_to_create.Create() as browser: | 
|  | tab = browser.tabs[0] | 
|  | ps = self.CreatePageSetFromFileInUnittestDataDir('blank.html') | 
|  | parsed_url = urlparse.urlparse(ps.pages[0].url) | 
|  | path = os.path.join(parsed_url.netloc, parsed_url.path) | 
|  | dirname, filename = os.path.split(path) | 
|  | dirname = os.path.join(ps.base_dir, dirname[1:]) | 
|  | browser.SetHTTPServerDirectory(dirname) | 
|  | target_side_url = browser.http_server.UrlOf(filename) | 
|  | tab.page.Navigate(target_side_url) | 
|  |  | 
|  | # Verify that the rect returned by getBoundingVisibleRect() in | 
|  | # scroll.js is completely contained within the viewport. Scroll | 
|  | # events dispatched by the benchmarks use the center of this rect | 
|  | # as their location, and this location needs to be within the | 
|  | # viewport bounds to correctly decide between main-thread and | 
|  | # impl-thread scrolling. If the scrollable area were not clipped | 
|  | # to the viewport bounds, then the instance used here (the scrollable | 
|  | # area being more than twice as tall as the viewport) would | 
|  | # result in a scroll location outside of the viewport bounds. | 
|  | tab.runtime.Execute("""document.body.style.height = | 
|  | (2 * window.innerHeight + 1) + 'px';""") | 
|  | scroll_js_path = os.path.join(os.path.dirname(__file__), '..', '..', | 
|  | 'telemetry', 'telemetry', 'scroll.js') | 
|  | scroll_js = open(scroll_js_path, 'r').read() | 
|  | tab.runtime.Evaluate(scroll_js) | 
|  |  | 
|  | rect_bottom = int(tab.runtime.Evaluate(""" | 
|  | __ScrollTest_GetBoundingVisibleRect(document.body).top + | 
|  | __ScrollTest_GetBoundingVisibleRect(document.body).height""")) | 
|  | rect_right = int(tab.runtime.Evaluate(""" | 
|  | __ScrollTest_GetBoundingVisibleRect(document.body).left + | 
|  | __ScrollTest_GetBoundingVisibleRect(document.body).width""")) | 
|  | viewport_width = int(tab.runtime.Evaluate('window.innerWidth')) | 
|  | viewport_height = int(tab.runtime.Evaluate('window.innerHeight')) | 
|  |  | 
|  | self.assertTrue(rect_bottom <= viewport_height) | 
|  | self.assertTrue(rect_right <= viewport_width) | 
|  |  | 
|  | def testDoesImplThreadScroll(self): | 
|  | ps = self.CreatePageSetFromFileInUnittestDataDir('scrollable_page.html') | 
|  |  | 
|  | benchmark = smoothness_benchmark.SmoothnessBenchmark() | 
|  | benchmark.force_enable_threaded_compositing = True | 
|  | all_results = self.RunBenchmark(benchmark, ps) | 
|  |  | 
|  | results0 = all_results.page_results[0] | 
|  | self.assertTrue(results0['percent_impl_scrolled'] > 0) | 
|  |  | 
|  | def testScrollingWithoutGpuBenchmarkingExtension(self): | 
|  | ps = self.CreatePageSetFromFileInUnittestDataDir('scrollable_page.html') | 
|  |  | 
|  | benchmark = smoothness_benchmark.SmoothnessBenchmark() | 
|  | benchmark.use_gpu_benchmarking_extension = False | 
|  | all_results = self.RunBenchmark(benchmark, ps) | 
|  |  | 
|  | self.assertEqual(0, len(all_results.page_failures)) | 
|  | self.assertEqual(1, len(all_results.page_results)) | 
|  | results0 = all_results.page_results[0] | 
|  |  | 
|  | self.assertTrue('dropped_percent' in results0) | 
|  | self.assertTrue('mean_frame_time' in results0) |