blob: 66eb0ef0109c082953358eaf259955c2fba419c2 [file] [log] [blame]
# 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)