Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(559)

Unified Diff: scripts/slave/recipe_modules/chromedriver/api.py

Issue 1274723004: Converted Android Chromedriver buildbot scripts to recipes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Fixed nits. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: scripts/slave/recipe_modules/chromedriver/api.py
diff --git a/scripts/slave/recipe_modules/chromedriver/api.py b/scripts/slave/recipe_modules/chromedriver/api.py
new file mode 100644
index 0000000000000000000000000000000000000000..c4ecfcf96c2618692bd369b95645f9c811a765f7
--- /dev/null
+++ b/scripts/slave/recipe_modules/chromedriver/api.py
@@ -0,0 +1,211 @@
+# Copyright 2016 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 recipe_engine import recipe_api
+
+GS_CHROMEDRIVER_DATA_BUCKET = 'chromedriver-data'
+GS_PREBUILTS_URL = GS_CHROMEDRIVER_DATA_BUCKET + '/prebuilts'
+GS_SERVER_LOGS_URL = GS_CHROMEDRIVER_DATA_BUCKET + '/server_logs'
+
+TEST_LOG_FORMAT = '%s_log.json'
+TEST_LOG_MAX_LENGTH = 500
+
+class ChromedriverApi(recipe_api.RecipeApi):
+
+ def __init__(self, *args, **kwargs):
+ super(ChromedriverApi, self).__init__(*args, **kwargs)
+ self._chromedriver_log_dir = None
+
+ def download_prebuilts(self):
+ """Downloads the most recent prebuilts from Google storage."""
+ with self.m.step.nest('Download Prebuilts'):
+ try:
+ prebuilt_dir = self.m.path.mkdtemp('prebuilt')
+ zipfile = prebuilt_dir.join('build.zip')
+ unzip_dir = prebuilt_dir.join('unzipped')
+ self.m.gsutil.download_latest_file(base_url=GS_PREBUILTS_URL,
+ partial_name=GS_PREBUILTS_URL + '/r',
+ destination=zipfile,
+ name='download latest prebuilt')
+ self.m.zip.unzip(step_name='unzip prebuilt',
+ zip_file=zipfile,
+ output=unzip_dir)
+ self.m.file.move(name='move prebuilt',
+ source=unzip_dir.join('chromedriver'),
+ dest=self.m.chromium.output_dir,
+ infra_step=False)
+ finally:
+ self.m.file.rmtree(name='remove temp dir', path=prebuilt_dir)
+
+ def archive_server_log(self, server_log):
+ """Uploads chromedriver server log to Google storage.
+
+ Args:
+ chromedriver_log: Path to the Chromedriver server log.
+ """
+ self.m.gsutil.upload(name='Upload Server Log, %s' % server_log,
+ source=server_log,
+ bucket=GS_SERVER_LOGS_URL,
+ dest=self.m.path.basename(server_log),
+ link_name='server log %s' % server_log)
+
+ def download_test_results_log(self, chromedriver_platform):
+ """Downloads the test results log for the given Chromedriver platform.
+
+ Args:
+ chromedriver_platform: The platform of the test results log.
+
+ Returns:
+ A dictionary where the keys are commit positions and the values are
+ booleans indicating whether the tests passed.
+ """
+ with self.m.step.nest('Download Test Results Log'):
+ try:
+ log_name = TEST_LOG_FORMAT % chromedriver_platform
+ temp_log_dir = self.m.path.mkdtemp('results_log')
+ temp_log_file = temp_log_dir.join(log_name)
+ self.m.gsutil.download(name='download results log',
+ source=log_name,
+ bucket=GS_CHROMEDRIVER_DATA_BUCKET,
+ dest=temp_log_file)
+ json_data = self.m.file.read(name='read results log file',
+ path=temp_log_file,
+ test_data='{}')
+ json_dict = self.m.json.loads(json_data)
+ except self.m.step.StepFailure:
+ json_dict = {}
+ finally:
+ self.m.file.rmtree(name='remove temp dir', path=temp_log_dir)
+ return {int(k): v for k, v in json_dict.iteritems()}
+
+ def upload_test_results_log(self, chromedriver_platform, test_results_log):
+ """Uploads the given test results log to Google storage."""
+ with self.m.step.nest('Upload Test Results Log'):
+ try:
+ log_name = TEST_LOG_FORMAT % chromedriver_platform
+ temp_log_dir = self.m.path.mkdtemp('results_log')
+ temp_log_file = temp_log_dir.join(log_name)
+ self.m.file.write(name='write results log to file %s' % log_name,
+ path=temp_log_file,
+ data=self.m.json.dumps(test_results_log))
+ self.m.gsutil.upload(name='upload results log %s' % log_name,
+ source=temp_log_file,
+ bucket=GS_CHROMEDRIVER_DATA_BUCKET,
+ dest=log_name,
+ link_name='results log')
+ finally:
+ self.m.file.rmtree(name='remove temp dir', path=temp_log_dir)
+
+ def update_test_results_log(self, chromedriver_platform,
+ commit_position, passed):
+ """Updates the test results log stored in GS for the given platform.
+
+ Args:
+ chromedriver_platform: The platform name.
+ commit_position: The commit position number.
+ passed: Boolean indicating whether the tests passed at this
+ commit position.
+ """
+ log = self.download_test_results_log(chromedriver_platform)
+ while len(log) > TEST_LOG_MAX_LENGTH: # pragma: no cover
+ del log[min(log.keys())]
+ if commit_position not in log:
+ log[commit_position] = bool(passed)
+ self.upload_test_results_log(chromedriver_platform, log)
+ else:
+ raise self.m.step.StepFailure(
+ 'Results already exist for commit position %s' % commit_position)
+
+ def _generate_test_command(self, script, chromedriver, log_path,
+ ref_chromedriver=None, android_package=None,
+ build_type=None, verbose=None):
+ cmd = [
+ script,
+ '--chromedriver', chromedriver,
+ '--log-path', str(log_path)
+ ]
+ if ref_chromedriver:
+ cmd.extend(['--reference-chromedriver', ref_chromedriver])
+ if build_type:
+ cmd.extend(['--build-type', build_type])
+ if verbose:
+ cmd.extend(['--verbose'])
+ if self.m.platform.is_linux:
+ cmd = ['xvfb-run', '-a'] + cmd
+ if android_package:
+ cmd.extend(['--android-package', android_package])
+ return cmd
+
+ def run_python_tests(self, chromedriver, ref_chromedriver, chrome=None,
+ chrome_version_name=None, android_package=None,
+ build_type=None, archive_server_log=True, **kwargs):
+ """Run the Chromedriver Python tests."""
+ version_info = ''
+ if chrome_version_name:
+ version_info = '(%s)' % chrome_version_name
+ with self.m.tempfile.temp_dir('server_log') as log_dir:
+ server_log = log_dir.join('server_log')
+ self.m.step('python_tests%s' % version_info,
+ self._generate_test_command(
+ 'run_py_tests.py', chromedriver, server_log,
+ ref_chromedriver=ref_chromedriver,
+ android_package=android_package,
+ build_type=build_type),
+ **kwargs)
+ if archive_server_log:
+ self.archive_server_log(server_log)
+
+ def run_java_tests(self, chromedriver, chrome=None, chrome_version_name=None,
+ android_package=None, build_type=None, verbose=False,
+ archive_server_log=True, **kwargs):
+ """Run the Chromedriver Java tests."""
+ version_info = ''
+ if chrome_version_name:
+ version_info = '(%s)' % chrome_version_name
+ with self.m.tempfile.temp_dir('server_log') as log_dir:
+ server_log = log_dir.join('server_log')
+ self.m.step('java_tests%s' % version_info,
+ self._generate_test_command(
+ 'run_java_tests.py', chromedriver, server_log,
+ ref_chromedriver=None, android_package=android_package,
+ build_type=build_type, verbose=verbose),
+ **kwargs)
+ if archive_server_log:
+ self.archive_server_log(server_log)
+
+ def run_all_tests(self, android_packages=None, archive_server_logs=True):
+ """Run all Chromedriver tests."""
+ server_name = 'chromedriver'
+ chromedriver = self.m.chromium.output_dir.join(server_name)
+ build_type = self.m.path.basename(self.m.chromium.output_dir)
+
+ platform_name = self.m.platform.name
+ if self.m.platform.is_linux and self.m.platform.bits == 64:
+ platform_name = 'linux64'
+ ref_chromedriver = self.m.path.join(
+ self.m.path['checkout'],
+ 'chrome', 'test', 'chromedriver', 'third_party', 'java_tests',
+ 'reference_builds', 'chromedriver_%s' % platform_name)
+
+ test_env = {'PATH': '%(PATH)s'}
+ test_env['PATH'] = self.m.path.pathsep.join([
+ test_env['PATH'],
+ str(self.m.path['checkout'].join(
+ 'chrome', 'test', 'chromedriver', 'chrome'))])
+ with self.m.step.defer_results():
+ for package in android_packages or []:
+ self.run_python_tests(chromedriver,
+ ref_chromedriver,
+ chrome_version_name=package,
+ android_package=package,
+ build_type=build_type,
+ env=test_env,
+ archive_server_log=archive_server_logs)
+ self.run_java_tests(chromedriver,
+ chrome_version_name=package,
+ android_package=package,
+ build_type=build_type,
+ verbose=True,
+ env=test_env,
+ archive_server_log=archive_server_logs)
« no previous file with comments | « scripts/slave/recipe_modules/chromedriver/__init__.py ('k') | scripts/slave/recipe_modules/chromedriver/example.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698