| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 from skypy.find_tests import find_tests |
| 7 from skypy.paths import Paths |
| 8 import argparse |
| 6 import os | 9 import os |
| 7 import re | 10 import re |
| 8 from skypy.paths import Paths | 11 import requests |
| 12 import skypy.configuration as configuration |
| 9 import subprocess | 13 import subprocess |
| 10 import requests | |
| 11 | 14 |
| 12 | 15 |
| 13 SUPPORTED_MIME_TYPES = [ | 16 SUPPORTED_MIME_TYPES = [ |
| 14 'text/html', | 17 'text/html', |
| 15 'text/sky', | 18 'text/sky', |
| 16 'text/plain', | 19 'text/plain', |
| 17 ] | 20 ] |
| 18 HTTP_PORT = 9999 | 21 HTTP_PORT = 9999 |
| 19 | 22 URL_ROOT = 'http://localhost:%s/' % HTTP_PORT |
| 20 DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point' | 23 DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point' |
| 24 BENCHMARKS_DIR = 'benchmarks' |
| 21 | 25 |
| 22 | 26 |
| 23 def values_from_output(output): | 27 def values_from_output(output): |
| 24 # Parse out the raw values from the PerfRunner output: | 28 # Parse out the raw values from the PerfRunner output: |
| 25 # values 90, 89, 93 ms | 29 # values 90, 89, 93 ms |
| 26 # We'll probably need a fancier parser at some point. | 30 # We'll probably need a fancier parser at some point. |
| 27 match = re.search(r'values (.+) ms', output, flags=re.MULTILINE) | 31 match = re.search(r'values (.+) ms', output, flags=re.MULTILINE) |
| 28 return map(float, match.group(1).split(', ')) | 32 return map(float, match.group(1).split(', ')) |
| 29 | 33 |
| 30 | 34 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 52 } | 56 } |
| 53 } | 57 } |
| 54 } | 58 } |
| 55 | 59 |
| 56 | 60 |
| 57 def send_json_to_dashboard(json): | 61 def send_json_to_dashboard(json): |
| 58 requests.post(DASHBOARD_URL, params={ 'data': json }) | 62 requests.post(DASHBOARD_URL, params={ 'data': json }) |
| 59 | 63 |
| 60 | 64 |
| 61 class PerfHarness(object): | 65 class PerfHarness(object): |
| 62 def __init__(self): | 66 def __init__(self, args): |
| 63 self._sky_server = None | 67 self._sky_server = None |
| 64 self.paths = Paths(os.path.join('out', 'Debug')) | 68 self.paths = Paths(os.path.join('out', 'Debug')) |
| 69 self.args = args |
| 65 | 70 |
| 66 def _start_server(self): | 71 def _start_server(self): |
| 67 return subprocess.Popen([ | 72 return subprocess.Popen([ |
| 68 os.path.join(self.paths.sky_tools_directory, 'sky_server'), | 73 os.path.join(self.paths.sky_tools_directory, 'sky_server'), |
| 69 self.paths.src_root, | 74 self.paths.src_root, |
| 70 str(HTTP_PORT), | 75 str(HTTP_PORT), |
| 76 '-t', self.args.configuration |
| 71 ]) | 77 ]) |
| 72 | 78 |
| 73 def _sky_tester_command(self, url): | 79 def _sky_tester_command(self, url): |
| 74 content_handlers = ['%s,%s' % (mime_type, 'mojo:sky_viewer') | 80 content_handlers = ['%s,%s' % (mime_type, 'mojo:sky_viewer') |
| 75 for mime_type in SUPPORTED_MIME_TYPES] | 81 for mime_type in SUPPORTED_MIME_TYPES] |
| 76 return [ | 82 return [ |
| 77 self.paths.mojo_shell_path, | 83 self.paths.mojo_shell_path, |
| 78 '--args-for=mojo:native_viewport_service --use-headless-config --use
-osmesa', | 84 '--args-for=mojo:native_viewport_service --use-headless-config --use
-osmesa', |
| 79 '--args-for=mojo:window_manager %s' % url, | 85 '--args-for=mojo:window_manager %s' % url, |
| 80 '--content-handlers=%s' % ','.join(content_handlers), | 86 '--content-handlers=%s' % ','.join(content_handlers), |
| 81 '--url-mappings=mojo:window_manager=mojo:sky_tester', | 87 '--url-mappings=mojo:window_manager=mojo:sky_tester', |
| 82 'mojo:window_manager', | 88 'mojo:window_manager', |
| 83 ] | 89 ] |
| 84 | 90 |
| 91 def _url_for_path(self, path): |
| 92 return URL_ROOT + os.path.relpath(path, self.paths.src_root) |
| 93 |
| 94 def _run_tests(self, path): |
| 95 url = self._url_for_path(path) |
| 96 output = subprocess.check_output( |
| 97 self._sky_tester_command(url), |
| 98 stderr=subprocess.STDOUT) |
| 99 values = values_from_output(output) |
| 100 print os.path.basename(path), "=>", values |
| 101 # FIXME: Upload JSON blob to results server: |
| 102 # json = create_json_blob(values) |
| 103 # send_json_to_dashboard(json) |
| 85 | 104 |
| 86 def main(self): | 105 def main(self): |
| 87 test = 'http://localhost:9999/sky/benchmarks/layout/simple-blocks.sky' | |
| 88 | |
| 89 self._start_server() | 106 self._start_server() |
| 90 output = subprocess.check_output(self._sky_tester_command(test)) | 107 map(self._run_tests, find_tests(os.path.join(self.paths.sky_root, BENCHM
ARKS_DIR))) |
| 91 values = values_from_output(output) | |
| 92 json = create_json_blob(values) | |
| 93 send_json_to_dashboard(json) | |
| 94 | 108 |
| 95 def shutdown(self): | 109 def shutdown(self): |
| 96 if self._sky_server: | 110 if self._sky_server: |
| 97 self._sky_server.terminate() | 111 self._sky_server.terminate() |
| 98 | 112 |
| 99 | 113 |
| 100 if __name__ == '__main__': | 114 def main(): |
| 101 harness = PerfHarness() | 115 parser = argparse.ArgumentParser(description='Sky performance tester') |
| 116 configuration.add_arguments(parser) |
| 117 args = parser.parse_args() |
| 118 |
| 119 harness = PerfHarness(args) |
| 102 try: | 120 try: |
| 103 harness.main() | 121 harness.main() |
| 104 except (KeyboardInterrupt, SystemExit): | 122 except (KeyboardInterrupt, SystemExit): |
| 105 pass | 123 pass |
| 106 finally: | 124 finally: |
| 107 harness.shutdown() | 125 harness.shutdown() |
| 126 |
| 127 |
| 128 if __name__ == '__main__': |
| 129 main() |
| OLD | NEW |