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 Mozilla's Kraken JavaScript benchmark."""
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)import os
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)from metrics import power
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry import benchmark
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)from telemetry.page import page_set
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)from telemetry.page import page_test
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import list_of_scalar_values
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochfrom telemetry.value import scalar
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)DESCRIPTIONS = {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'ai-astar':
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark uses the [A* search algorithm]'
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://en.wikipedia.org/wiki/A*_search_algorithm) to automatically '
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'plot an efficient path between two points, in the presence of '
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'obstacles. Adapted from code by [Brian Gringstead]'
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://www.briangrinstead.com/blog/astar-search-algorithm-in-'
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'javascript).',
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'audio-beat-detection':
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark performs [beat detection]'
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://en.wikipedia.org/wiki/Beat_detection) on an Audio sample '
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'using [code](http://beatdetektor.svn.sourceforge.net/viewvc'
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '/beatdetektor/trunk/core/js/beatdetektor.js?revision=18&view=markup) '
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'from [BeatDetektor](http://www.cubicproductions.com/index.php'
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '?option=com_content&view=article&id=67&Itemid=82) and '
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '[DSP.js](http://github.com/corbanbrook/dsp.js/).',
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'audio-dft':
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark performs a [Discrete Fourier Transform]'
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://en.wikipedia.org/wiki/Discrete_Fourier_transform) on an '
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Audio sample using code from [DSP.js]'
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://github.com/corbanbrook/dsp.js).',
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'audio-fft':
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark performs a [Fast Fourier Transform]'
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://en.wikipedia.org/wiki/Fast_Fourier_transform) on an Audio '
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'sample using code from [DSP.js]'
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://github.com/corbanbrook/dsp.js/).',
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'audio-oscillator':
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark generates a soundwave using code from [DSP.js]'
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://github.com/corbanbrook/dsp.js/).',
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'imaging-darkroom':
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark performs a variety of photo manipulations such as '
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'Fill, Brightness, Contrast, Saturation, and Temperature.',
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'imaging-desaturate':
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark [desaturates]'
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://en.wikipedia.org/wiki/Colorfulness) a photo using code from '
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '[Pixastic](http://www.pixastic.com/).',
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'imaging-gaussian-blur':
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark performs a [Gaussian blur]'
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://en.wikipedia.org/wiki/Gaussian_blur) on a photo.',
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'json-parse-financial':
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark parses [JSON](http://www.json.org) records.',
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    'json-stringify-tinderbox':
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'This benchmark serializes [Tinderbox]'
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        '(http://tests.themasta.com/tinderboxpushlog/?tree=Firefox) build '
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        'data to [JSON](http://www.json.org).',
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
639ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _Mean(l):
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return float(sum(l)) / len(l) if len(l) > 0 else 0.0
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class _KrakenMeasurement(page_test.PageTest):
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def __init__(self):
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    super(_KrakenMeasurement, self).__init__()
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    self._power_metric = None
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def CustomizeBrowserOptions(self, options):
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    power.PowerMetric.CustomizeBrowserOptions(options)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def WillStartBrowser(self, platform):
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._power_metric = power.PowerMetric(platform)
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def DidNavigateToPage(self, page, tab):
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self._power_metric.Start(page, tab)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    tab.WaitForJavaScriptExpression(
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'document.title.indexOf("Results") != -1', 700)
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    tab.WaitForDocumentReadyStateToBeComplete()
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self._power_metric.Stop(page, tab)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self._power_metric.AddResults(tab, results)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    js_get_results = """
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        var formElement = document.getElementsByTagName("input")[0];
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        decodeURIComponent(formElement.value.split("?")[1]);
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        """
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result_dict = eval(tab.EvaluateJavaScript(js_get_results))
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    total = 0
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for key in result_dict:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if key == 'v':
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        continue
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      results.AddValue(list_of_scalar_values.ListOfScalarValues(
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          results.current_page, key, 'ms', result_dict[key], important=False,
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          description=DESCRIPTIONS.get(key)))
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      total += _Mean(result_dict[key])
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # TODO(tonyg/nednguyen): This measurement shouldn't calculate Total. The
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    # results system should do that for us.
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    results.AddValue(scalar.ScalarValue(
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        results.current_page, 'Total', 'ms', total,
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        description='Total of the means of the results for each type '
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    'of benchmark in [Mozilla\'s Kraken JavaScript benchmark]'
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    '(http://krakenbenchmark.mozilla.org/)'))
1119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1129ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Kraken(benchmark.Benchmark):
1149ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  """Mozilla's Kraken JavaScript benchmark."""
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  test = _KrakenMeasurement
1169ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch
1179ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  def CreatePageSet(self, options):
1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps = page_set.PageSet(
1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      archive_data_file='../page_sets/data/kraken.json',
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      file_path=os.path.abspath(__file__))
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ps.AddPageWithDefaultRunNavigate(
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      'http://krakenbenchmark.mozilla.org/kraken-1.1/driver.html')
1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return ps
124