146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)# Copyright 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)"""Runs spaceport.io's PerfMarks benchmark."""
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import logging
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import os
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)from telemetry.core import util
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)from telemetry.page import page_set
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_test
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import list_of_scalar_values
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import scalar
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DESCRIPTIONS = {
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'canvasDrawImageFullClear':
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Using a canvas element to render. Bitmaps are blitted to the canvas '
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'using the "drawImage" function and the canvas is fully cleared at '
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'the beginning of each frame.',
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'canvasDrawImageFullClearAlign':
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Same as canvasDrawImageFullClear except all "x" and "y" values are '
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'rounded to the nearest integer. This can be more efficient on '
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'translate on certain browsers.',
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'canvasDrawImagePartialClear':
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Using a canvas element to render. Bitmaps are blitted to the canvas '
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'using the "drawImage" function and pixels drawn in the last frame '
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'are cleared to the clear color at the beginning of each frame. '
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This is generally slower on hardware accelerated implementations, '
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'but sometimes faster on CPU-based implementations.',
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'canvasDrawImagePartialClearAlign':
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Same as canvasDrawImageFullClearAlign but only partially clearing '
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'the canvas each frame.',
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'css2dBackground':
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Using div elements that have a background image specified using CSS '
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'styles. These div elements are translated, scaled, and rotated using '
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'CSS-2D transforms.',
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'css2dImg':
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Same as css2dBackground, but using img elements instead of div '
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'elements.',
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'css3dBackground':
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Same as css2dBackground, but using CSS-3D transforms.',
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'css3dImg':
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Same as css2dImage but using CSS-3D tranforms.',
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class _SpaceportMeasurement(page_test.PageTest):
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def __init__(self):
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    super(_SpaceportMeasurement, self).__init__()
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def CustomizeBrowserOptions(self, options):
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    options.AppendExtraBrowserArgs('--disable-gpu-vsync')
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    tab.WaitForJavaScriptExpression(
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        '!document.getElementById("start-performance-tests").disabled', 60)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    tab.ExecuteJavaScript("""
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window.__results = {};
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        window.console.log = function(str) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!str) return;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            var key_val = str.split(': ');
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (!key_val.length == 2) return;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            __results[key_val[0]] = key_val[1];
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        };
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById('start-performance-tests').click();
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    num_results = 0
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    num_tests_in_spaceport = 24
731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    while num_results < num_tests_in_spaceport:
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      tab.WaitForJavaScriptExpression(
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          'Object.keys(window.__results).length > %d' % num_results, 180)
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      num_results = tab.EvaluateJavaScript(
771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          'Object.keys(window.__results).length')
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      logging.info('Completed test %d of %d' %
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                   (num_results, num_tests_in_spaceport))
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    result_dict = eval(tab.EvaluateJavaScript(
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        'JSON.stringify(window.__results)'))
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for key in result_dict:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chart, trace = key.split('.', 1)
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      results.AddValue(scalar.ScalarValue(
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          results.current_page, '%s.%s'% (chart, trace),
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          'objects (bigger is better)', float(result_dict[key]),
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          important=False, description=DESCRIPTIONS.get(chart)))
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(list_of_scalar_values.ListOfScalarValues(
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        results.current_page, 'Score', 'objects (bigger is better)',
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        [float(x) for x in result_dict.values()],
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        description='Combined score for all parts of the spaceport benchmark.'))
939ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
949ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)# crbug.com/166703: This test frequently times out on Windows.
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@benchmark.Disabled('mac', 'win')
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Spaceport(benchmark.Benchmark):
989ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  """spaceport.io's PerfMarks benchmark."""
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test = _SpaceportMeasurement
1009ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1019ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  def CreatePageSet(self, options):
1029ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch    spaceport_dir = os.path.join(util.GetChromiumSrcDir(), 'chrome', 'test',
1039ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch        'data', 'third_party', 'spaceport')
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps = page_set.PageSet(file_path=spaceport_dir)
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps.AddPageWithDefaultRunNavigate('file://index.html')
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ps
107