mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
We keep seeing timeouts on the bots that seem to be due to cherrypy dropping requests on the floor, which in turn causes imports to stall, which causes the test to time out. In local testing, I was able to reproduce the timeouts and wasn't able to do so with the go-based server. R=abarth@chromium.org, eseidel@chromium.org Review URL: https://codereview.chromium.org/746373002
132 lines
3.9 KiB
Python
Executable File
132 lines
3.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Copyright 2014 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 skypy.find_tests import find_tests
|
|
from skypy.paths import Paths
|
|
import argparse
|
|
import os
|
|
import re
|
|
import requests
|
|
import skypy.configuration as configuration
|
|
import subprocess
|
|
|
|
|
|
SUPPORTED_MIME_TYPES = [
|
|
'text/html',
|
|
'text/sky',
|
|
'text/plain',
|
|
]
|
|
HTTP_PORT = 9999
|
|
URL_ROOT = 'http://localhost:%s/' % HTTP_PORT
|
|
DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point'
|
|
BENCHMARKS_DIR = 'benchmarks'
|
|
|
|
|
|
def values_from_output(output):
|
|
# Parse out the raw values from the PerfRunner output:
|
|
# values 90, 89, 93 ms
|
|
# We'll probably need a fancier parser at some point.
|
|
match = re.search(r'values (.+) ms', output, flags=re.MULTILINE)
|
|
return map(float, match.group(1).split(', '))
|
|
|
|
|
|
def create_json_blob(values):
|
|
revision = subprocess.check_output(["git", "show-ref", "HEAD", "-s"]).strip()
|
|
return {
|
|
"master": "master.mojo.perf",
|
|
"bot": "sky-release",
|
|
"point_id": 123456, # FIXME: We need to generate a monotonicly increasing number somehow.
|
|
"versions": {
|
|
"mojo": revision
|
|
},
|
|
"chart_data": {
|
|
"format_version": "1.0",
|
|
"benchmark_name": "layout.simple-blocks",
|
|
"charts": {
|
|
"warm_times": {
|
|
"traces": {
|
|
"layout.simple-blocks": {
|
|
"type": "list_of_scalar_values",
|
|
"values": values,
|
|
},
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
def send_json_to_dashboard(json):
|
|
requests.post(DASHBOARD_URL, params={ 'data': json })
|
|
|
|
|
|
class PerfHarness(object):
|
|
def __init__(self, args):
|
|
self._sky_server = None
|
|
self.paths = Paths(os.path.join('out', 'Debug'))
|
|
self.args = args
|
|
|
|
def _start_server(self):
|
|
subprocess.call(os.path.join(self.paths.sky_tools_directory,
|
|
'download_sky_server'))
|
|
return subprocess.Popen([
|
|
os.path.join(self.paths.src_root, 'out', 'downloads', 'sky_server'),
|
|
self.paths.src_root,
|
|
str(HTTP_PORT),
|
|
'-t', self.args.configuration
|
|
])
|
|
|
|
def _sky_tester_command(self, url):
|
|
content_handlers = ['%s,%s' % (mime_type, 'mojo:sky_viewer')
|
|
for mime_type in SUPPORTED_MIME_TYPES]
|
|
return [
|
|
self.paths.mojo_shell_path,
|
|
'--args-for=mojo:native_viewport_service --use-headless-config --use-osmesa',
|
|
'--args-for=mojo:window_manager %s' % url,
|
|
'--content-handlers=%s' % ','.join(content_handlers),
|
|
'--url-mappings=mojo:window_manager=mojo:sky_tester',
|
|
'mojo:window_manager',
|
|
]
|
|
|
|
def _url_for_path(self, path):
|
|
return URL_ROOT + os.path.relpath(path, self.paths.src_root)
|
|
|
|
def _run_tests(self, path):
|
|
url = self._url_for_path(path)
|
|
output = subprocess.check_output(
|
|
self._sky_tester_command(url),
|
|
stderr=subprocess.STDOUT)
|
|
values = values_from_output(output)
|
|
print os.path.basename(path), "=>", values
|
|
# FIXME: Upload JSON blob to results server:
|
|
# json = create_json_blob(values)
|
|
# send_json_to_dashboard(json)
|
|
|
|
def main(self):
|
|
self._start_server()
|
|
map(self._run_tests, find_tests(os.path.join(self.paths.sky_root, BENCHMARKS_DIR)))
|
|
|
|
def shutdown(self):
|
|
if self._sky_server:
|
|
self._sky_server.terminate()
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description='Sky performance tester')
|
|
configuration.add_arguments(parser)
|
|
args = parser.parse_args()
|
|
|
|
harness = PerfHarness(args)
|
|
try:
|
|
harness.main()
|
|
except (KeyboardInterrupt, SystemExit):
|
|
pass
|
|
finally:
|
|
harness.shutdown()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|