| OLD | NEW |
| 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 | 4 |
| 5 """This measurement runs a blink performance test and reports the results.""" | 5 """This measurement runs a blink performance test and reports the results.""" |
| 6 | 6 |
| 7 import os | 7 import os |
| 8 import sys | 8 import sys |
| 9 | 9 |
| 10 from telemetry.core import util | 10 from telemetry.core import util |
| 11 from telemetry.page import page_measurement | 11 from telemetry.page import page_measurement |
| 12 from telemetry.page import page_set | 12 from telemetry.page import page_set |
| 13 | 13 |
| 14 | 14 |
| 15 def CreatePageSetFromPath(path): |
| 16 assert os.path.exists(path) |
| 17 |
| 18 page_set_dict = {'pages': []} |
| 19 |
| 20 def _AddPage(path): |
| 21 if not path.endswith('.html'): |
| 22 return |
| 23 if '../' in open(path, 'r').read(): |
| 24 # If the page looks like it references its parent dir, include it. |
| 25 page_set_dict['serving_dirs'] = [os.path.dirname(os.path.dirname(path))] |
| 26 page_set_dict['pages'].append({'url': |
| 27 'file://' + path.replace('\\', '/')}) |
| 28 |
| 29 def _AddDir(dir_path, skipped): |
| 30 for path in os.listdir(dir_path): |
| 31 if path == 'resources': |
| 32 continue |
| 33 path = os.path.join(dir_path, path) |
| 34 if path.startswith(tuple([os.path.join(path, s) |
| 35 for s in skipped])): |
| 36 continue |
| 37 if os.path.isdir(path): |
| 38 _AddDir(path, skipped) |
| 39 else: |
| 40 _AddPage(path) |
| 41 |
| 42 if os.path.isdir(path): |
| 43 skipped = [] |
| 44 skipped_file = os.path.join(path, 'Skipped') |
| 45 if os.path.exists(skipped_file): |
| 46 for line in open(skipped_file, 'r').readlines(): |
| 47 line = line.strip() |
| 48 if line and not line.startswith('#'): |
| 49 skipped.append(line.replace('/', os.sep)) |
| 50 _AddDir(path, skipped) |
| 51 else: |
| 52 _AddPage(path) |
| 53 return page_set.PageSet.FromDict(page_set_dict, os.getcwd() + os.sep) |
| 54 |
| 55 |
| 15 class BlinkPerf(page_measurement.PageMeasurement): | 56 class BlinkPerf(page_measurement.PageMeasurement): |
| 16 def __init__(self): | 57 def __init__(self): |
| 17 super(BlinkPerf, self).__init__('') | 58 super(BlinkPerf, self).__init__('') |
| 18 with open(os.path.join(os.path.dirname(__file__), | 59 with open(os.path.join(os.path.dirname(__file__), |
| 19 'blink_perf.js'), 'r') as f: | 60 'blink_perf.js'), 'r') as f: |
| 20 self._blink_perf_js = f.read() | 61 self._blink_perf_js = f.read() |
| 21 | 62 |
| 22 def CreatePageSet(self, args, options): | 63 def CreatePageSet(self, args, options): |
| 23 if len(args) < 2: | 64 if len(args) < 2: |
| 24 print 'Must specify a file or directory to run.' | 65 print 'Must specify a file or directory to run.' |
| 25 sys.exit(1) | 66 sys.exit(1) |
| 26 | 67 |
| 27 page_set_arg = args[1] | 68 page_set_arg = args[1] |
| 28 | 69 |
| 29 if not os.path.exists(page_set_arg): | 70 if not os.path.exists(page_set_arg): |
| 30 print '%s does not exist.' % page_set_arg | 71 print '%s does not exist.' % page_set_arg |
| 31 sys.exit(1) | 72 sys.exit(1) |
| 32 | 73 |
| 33 page_set_dict = {'pages': []} | 74 return CreatePageSetFromPath(page_set_arg) |
| 34 | |
| 35 def _AddPage(path): | |
| 36 if not path.endswith('.html'): | |
| 37 return | |
| 38 if '../' in open(path, 'r').read(): | |
| 39 # If the page looks like it references its parent dir, include it. | |
| 40 page_set_dict['serving_dirs'] = [os.path.dirname(os.path.dirname(path))] | |
| 41 page_set_dict['pages'].append({'url': | |
| 42 'file://' + path.replace('\\', '/')}) | |
| 43 | |
| 44 def _AddDir(dir_path, skipped): | |
| 45 for path in os.listdir(dir_path): | |
| 46 if path == 'resources': | |
| 47 continue | |
| 48 path = os.path.join(dir_path, path) | |
| 49 if path.startswith(tuple([os.path.join(page_set_arg, s) | |
| 50 for s in skipped])): | |
| 51 continue | |
| 52 if os.path.isdir(path): | |
| 53 _AddDir(path, skipped) | |
| 54 else: | |
| 55 _AddPage(path) | |
| 56 | |
| 57 if os.path.isdir(page_set_arg): | |
| 58 skipped = [] | |
| 59 skipped_file = os.path.join(page_set_arg, 'Skipped') | |
| 60 if os.path.exists(skipped_file): | |
| 61 for line in open(skipped_file, 'r').readlines(): | |
| 62 line = line.strip() | |
| 63 if line and not line.startswith('#'): | |
| 64 skipped.append(line.replace('/', os.sep)) | |
| 65 _AddDir(page_set_arg, skipped) | |
| 66 else: | |
| 67 _AddPage(page_set_arg) | |
| 68 return page_set.PageSet.FromDict(page_set_dict, os.getcwd() + os.sep) | |
| 69 | 75 |
| 70 @property | 76 @property |
| 71 def results_are_the_same_on_every_page(self): | 77 def results_are_the_same_on_every_page(self): |
| 72 return False | 78 return False |
| 73 | 79 |
| 74 def WillNavigateToPage(self, page, tab): | 80 def WillNavigateToPage(self, page, tab): |
| 75 page.script_to_evaluate_on_commit = self._blink_perf_js | 81 page.script_to_evaluate_on_commit = self._blink_perf_js |
| 76 | 82 |
| 77 def CustomizeBrowserOptions(self, options): | 83 def CustomizeBrowserOptions(self, options): |
| 78 options.AppendExtraBrowserArg('--js-flags=--expose_gc') | 84 options.AppendExtraBrowserArg('--js-flags=--expose_gc') |
| 79 | 85 |
| 80 def MeasurePage(self, page, tab, results): | 86 def MeasurePage(self, page, tab, results): |
| 81 def _IsDone(): | 87 def _IsDone(): |
| 82 return tab.EvaluateJavaScript('testRunner.isDone') | 88 return tab.EvaluateJavaScript('testRunner.isDone') |
| 83 util.WaitFor(_IsDone, 600) | 89 util.WaitFor(_IsDone, 600) |
| 84 | 90 |
| 85 log = tab.EvaluateJavaScript('document.getElementById("log").innerHTML') | 91 log = tab.EvaluateJavaScript('document.getElementById("log").innerHTML') |
| 86 | 92 |
| 87 for line in log.splitlines(): | 93 for line in log.splitlines(): |
| 88 if not line.startswith('values '): | 94 if not line.startswith('values '): |
| 89 continue | 95 continue |
| 90 parts = line.split() | 96 parts = line.split() |
| 91 values = [float(v.replace(',', '')) for v in parts[1:-1]] | 97 values = [float(v.replace(',', '')) for v in parts[1:-1]] |
| 92 units = parts[-1] | 98 units = parts[-1] |
| 93 metric = page.display_url.split('.')[0].replace('/', '_') | 99 metric = page.display_url.split('.')[0].replace('/', '_') |
| 94 results.Add(metric, units, values) | 100 results.Add(metric, units, values) |
| 95 break | 101 break |
| 96 | 102 |
| 97 print log | 103 print log |
| OLD | NEW |