Make Sky's test_perf actually test performance

This CL teaches test_perf how to walk the benchmarks directory to find the
benchmarks and how to actually run them. We're still not uploading results to
the server yet, however.

R=eseidel@chromium.org

Review URL: https://codereview.chromium.org/710133002
This commit is contained in:
Adam Barth 2014-11-10 10:30:54 -08:00
parent 6b138596a4
commit 58030f3a78
2 changed files with 54 additions and 12 deletions

View File

@ -0,0 +1,20 @@
# 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.
import os
IGNORED_DIRECTORIES = ['resources']
TEST_EXTENSIONS = ['sky']
def find_tests(directory):
for root, dirs, files in os.walk(directory):
for file_name in files:
extension = os.path.splitext(file_name)[1]
if extension.lstrip('.') in TEST_EXTENSIONS:
yield os.path.join(root, file_name)
for ignored_directory in IGNORED_DIRECTORIES:
if ignored_directory in dirs:
dirs.remove(ignored_directory)

View File

@ -3,11 +3,14 @@
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
from skypy.find_tests import find_tests
from skypy.paths import Paths
import argparse
import os import os
import re import re
from skypy.paths import Paths
import subprocess
import requests import requests
import skypy.configuration as configuration
import subprocess
SUPPORTED_MIME_TYPES = [ SUPPORTED_MIME_TYPES = [
@ -16,8 +19,9 @@ SUPPORTED_MIME_TYPES = [
'text/plain', 'text/plain',
] ]
HTTP_PORT = 9999 HTTP_PORT = 9999
URL_ROOT = 'http://localhost:%s/' % HTTP_PORT
DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point' DASHBOARD_URL = 'https://chromeperf.appspot.com/add_point'
BENCHMARKS_DIR = 'benchmarks'
def values_from_output(output): def values_from_output(output):
@ -59,15 +63,17 @@ def send_json_to_dashboard(json):
class PerfHarness(object): class PerfHarness(object):
def __init__(self): def __init__(self, args):
self._sky_server = None self._sky_server = None
self.paths = Paths(os.path.join('out', 'Debug')) self.paths = Paths(os.path.join('out', 'Debug'))
self.args = args
def _start_server(self): def _start_server(self):
return subprocess.Popen([ return subprocess.Popen([
os.path.join(self.paths.sky_tools_directory, 'sky_server'), os.path.join(self.paths.sky_tools_directory, 'sky_server'),
self.paths.src_root, self.paths.src_root,
str(HTTP_PORT), str(HTTP_PORT),
'-t', self.args.configuration
]) ])
def _sky_tester_command(self, url): def _sky_tester_command(self, url):
@ -82,26 +88,42 @@ class PerfHarness(object):
'mojo:window_manager', '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): def main(self):
test = 'http://localhost:9999/sky/benchmarks/layout/simple-blocks.sky'
self._start_server() self._start_server()
output = subprocess.check_output(self._sky_tester_command(test)) map(self._run_tests, find_tests(os.path.join(self.paths.sky_root, BENCHMARKS_DIR)))
values = values_from_output(output)
json = create_json_blob(values)
send_json_to_dashboard(json)
def shutdown(self): def shutdown(self):
if self._sky_server: if self._sky_server:
self._sky_server.terminate() self._sky_server.terminate()
if __name__ == '__main__': def main():
harness = PerfHarness() parser = argparse.ArgumentParser(description='Sky performance tester')
configuration.add_arguments(parser)
args = parser.parse_args()
harness = PerfHarness(args)
try: try:
harness.main() harness.main()
except (KeyboardInterrupt, SystemExit): except (KeyboardInterrupt, SystemExit):
pass pass
finally: finally:
harness.shutdown() harness.shutdown()
if __name__ == '__main__':
main()