blob: 3dd8abadeabd8572f2549a75124ceec16c0ce9eb [file] [log] [blame]
# Copyright 2012 Adobe Systems Inc.;
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Runs all the telemetry tests and pushes results to the server
#
# Make sure to run in from its folder!
#
# Env vars used:
# - TestHelper.CHROMIUM_SRC: path to chromium src
# - DEVICE_NAME: a label to identify the machine running the tests when submitting results
# - CEF_HOME: path to CEF binaries (needed only if USE_CEF is set to True)
# - USE_CEF: if run with CEF, set this to 'True'
#
import os
import sys
import shutil
import subprocess
import glob
import platform
import shutil
class TestHelper():
GRUNT = "grunt"
RESULTS_DIR = "/tmp/topcoat-telemetry"
BROWSER = "system"
BROWSER_EXEC = None
SUBMIT_TYPE = "SHA"
CHROMIUM_SRC = os.environ.get("CHROMIUM_SRC")
DEVICE_NAME = os.environ.get("DEVICE_NAME")
CEF_HOME = os.environ.get("CEF_HOME")
USE_CEF = os.environ.get("USE_CEF")
@staticmethod
def init(targetPlatform, targetTheme):
TestHelper._checkEnvVars()
TestHelper._prepareProperties()
TestHelper._prepareResultsDir()
TestHelper._cleanTelemetryTests()
TestHelper._prepareTelemetryTests(targetPlatform, targetTheme)
@staticmethod
def _getPlatform():
p = platform.platform().lower()
if p.find('windows') != -1: return "Win"
if p.find('darwin') != -1: return "Mac"
if p.find('linux') != -1: return "Lin"
@staticmethod
def _checkEnvVars():
if not TestHelper.DEVICE_NAME:
raise RuntimeError("Please set DEVICE_NAME env var (no spaces allowed yet)")
if not TestHelper.CHROMIUM_SRC:
raise RuntimeError("Please set CHROMIUM_SRC env var.")
if not TestHelper.USE_CEF:
raise RuntimeError("Please set USE_CEF env var.")
if (TestHelper.USE_CEF == 'True') and (not TestHelper.CEF_HOME):
raise RuntimeError("Please set CEF_HOME if you set USE_CEF to True")
@staticmethod
def _prepareProperties():
p = TestHelper._getPlatform()
if p == "Win":
TestHelper.GRUNT = "grunt.cmd"
TestHelper.RESULTS_DIR = "C:\\tmp\\topcoat-telemetry"
TestHelper.BROWSER = "exact"
TestHelper.BROWSER_EXEC = "%s\\app\\cefclient.exe" % TestHelper.CEF_HOME
if p == "Mac":
if TestHelper.USE_CEF:
TestHelper.BROWSER = "exact"
TestHelper.BROWSER_EXEC = "%s/app/cefclient.app/Contents/MacOS/cefclient" % TestHelper.CEF_HOME
if p == "Lin":
TestHelper.BROWSER = "android-chrome-beta"
@staticmethod
def _prepareResultsDir():
print "runAll.py: Preparing results dir %s" % TestHelper.RESULTS_DIR
if os.path.isdir(TestHelper.RESULTS_DIR):
shutil.rmtree(TestHelper.RESULTS_DIR)
os.makedirs(TestHelper.RESULTS_DIR)
@staticmethod
def _prepareTelemetryTests(targetPlatform, targetTheme):
print "runAll.py: Preparing telemetry tests"
subprocess.check_call([TestHelper.GRUNT, 'telemetry:'+targetPlatform+':'+targetTheme])
@staticmethod
def _cleanTelemetryTests():
print "runAll.py: clean up CHROMIUM_SRC/tools/perf/page_sets/topcoat"
path = TestHelper.CHROMIUM_SRC + "tools/perf/page_sets/topcoat"
if os.path.exists(path):
shutil.rmtree(path)
@staticmethod
def runTests(user_defined_test_list, how_many_rounds_to_run_the_test):
print "runAll.py: Running telemetry tests, results in %s" % TestHelper.RESULTS_DIR
telemetry_tests = ["loading_benchmark", "smoothness_benchmark"]
if user_defined_test_list and len(user_defined_test_list) != 0:
topcoat_test_files = user_defined_test_list
else:
topcoat_test_files = glob.glob(os.getcwd() + "/../perf/page_sets/*.json")
def genCmd():
cmd = [
"python",
TestHelper.CHROMIUM_SRC + "/tools/perf/run_multipage_benchmarks",
"--browser=" + TestHelper.BROWSER,
telemetry_test,
TestHelper.CHROMIUM_SRC + "tools/perf/page_sets/%s" % topcoat_test_file,
"-o", TestHelper.RESULTS_DIR + "/%s_%s-%s.txt" % (telemetry_test, topcoat_test_name, test_round)
]
if TestHelper.BROWSER_EXEC:
cmd.insert(3, "--browser-executable=" + TestHelper.BROWSER_EXEC)
return cmd
for tf in topcoat_test_files:
topcoat_test_file = tf.split(os.sep)[-1]
topcoat_test_name = topcoat_test_file.split(".")[0]
print "runAll.py: Running tests for %s" % topcoat_test_name
for telemetry_test in telemetry_tests:
for test_round in range(how_many_rounds_to_run_the_test):
cmd = genCmd()
subprocess.check_call(cmd)
@staticmethod
def submitResults(git_cwd):
print "runAll.py: Pushing telemetry data to the server"
result_files = glob.glob(TestHelper.RESULTS_DIR + "/*.txt")
for rf in result_files:
subprocess.check_call([
TestHelper.GRUNT,
"telemetry-submit:" + git_cwd,
"--path=" + rf,
"--device=" + TestHelper.DEVICE_NAME,
"--test=" + rf.split(os.sep)[-1][:-6],
"--type=" + TestHelper.SUBMIT_TYPE
])
if __name__ == "__main__":
# Usage:
# ./python runAll.py --platform=VALUE --theme=VALUE [--gitCWD=VALUE] [--test=VALUE] [--round=VALUE]
# --platform= desktop or mobile
# --theme= light or dark
# [optional] --gitCWD=PATH_WHERE_YOU_WANT_TO_RUN_GIT_LOG, e.g. src/skins/button
# [optional] --test=ONE_OR_MORE_TESTS_YOU_WANT_TO_RUN, e.g. topcoat_button.test.json
# [optional] --test=HOW_MANY_ROUNDS_TO_RUN_THE_TEST, default is 1.
platfrm = theme = git_cwd = test_list = None
test_round = 1
args = sys.argv[1:]
for arg in args:
arg_key, arg_val = arg.split('=')
if arg_key == '--platform':
platfrm = arg_val
elif arg_key == '--theme':
theme = arg_val
elif arg_key == '--gitCWD':
git_cwd = arg_val
elif arg_key == '--test':
test_list = arg_val.split(',')
elif arg_key == '--round':
test_round = int(arg_val)
else:
print "%s is not recognized."
if not platform or not theme:
raise RuntimeError("ERROR: --platform and --theme must be set.")
if not git_cwd:
git_cwd = ''
TestHelper.init(platfrm, theme)
TestHelper.runTests(test_list, test_round)
TestHelper.submitResults(git_cwd)