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

Side by Side 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: Moved some mkdirs inside try blocks they should have been in Created 4 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 from recipe_engine import recipe_api
6
7 GS_CHROMEDRIVER_DATA_BUCKET = 'chromedriver-data'
8 GS_PREBUILTS_URL = GS_CHROMEDRIVER_DATA_BUCKET + '/prebuilts'
9 GS_SERVER_LOGS_URL = GS_CHROMEDRIVER_DATA_BUCKET + '/server_logs'
10
11 TEST_LOG_FORMAT = '%s_log.json'
12 TEST_LOG_MAX_LENGTH = 500
13
14 class ChromedriverApi(recipe_api.RecipeApi):
15
16 def __init__(self, *args, **kwargs):
17 super(ChromedriverApi, self).__init__(*args, **kwargs)
18 self._chromedriver_log_dir = None
19
20 def download_prebuilts(self):
21 """Downloads the most recent prebuilts from Google storage."""
22 with self.m.step.nest('Download Prebuilts'):
23 try:
24 prebuilt_dir = self.m.path.mkdtemp('prebuilt')
25 zipfile = prebuilt_dir.join('build.zip')
26 unzip_dir = prebuilt_dir.join('unzipped')
27 self.m.gsutil.download_latest_file(base_url=GS_PREBUILTS_URL,
28 partial_name=GS_PREBUILTS_URL + '/r',
29 destination=zipfile,
30 name='download latest prebuilt')
31 self.m.zip.unzip(step_name='unzip prebuilt',
32 zip_file=zipfile,
33 output=unzip_dir)
34 self.m.file.move(name='move prebuilt',
35 source=unzip_dir.join('chromedriver'),
36 dest=self.m.chromium.output_dir,
37 infra_step=False)
38 finally:
39 self.m.file.rmtree(name='remove temp dir', path=prebuilt_dir)
40
41 def archive_server_log(self, server_log):
42 """Uploads chromedriver server log to Google storage.
43
44 Args:
45 chromedriver_log: Path to the Chromedriver server log.
46 """
47 self.m.gsutil.upload(name='Upload Server Log, %s' % server_log,
48 source=server_log,
49 bucket=GS_SERVER_LOGS_URL,
50 dest=self.m.path.basename(server_log),
51 link_name='server log %s' % server_log)
52
53 def download_test_results_log(self, chromedriver_platform):
54 """Downloads the test results log for the given Chromedriver platform.
55
56 Args:
57 chromedriver_platform: The platform of the test results log.
58
59 Returns:
60 A dictionary where the keys are commit positions and the values are
61 booleans indicating whether the tests passed.
62 """
63 with self.m.step.nest('Download Test Results Log'):
64 try:
65 log_name = TEST_LOG_FORMAT % chromedriver_platform
66 temp_log_dir = self.m.path.mkdtemp('results_log')
67 temp_log_file = temp_log_dir.join(log_name)
68 self.m.gsutil.download(name='download results log',
69 source=log_name,
70 bucket=GS_CHROMEDRIVER_DATA_BUCKET,
71 dest=temp_log_file)
72 json_data = self.m.file.read(name='read results log file',
73 path=temp_log_file,
74 test_data='{}')
75 json_dict = self.m.json.loads(json_data)
76 except self.m.step.StepFailure:
77 json_dict = {}
78 finally:
79 self.m.file.rmtree(name='remove temp dir', path=temp_log_dir)
80 return {int(k): v for k, v in json_dict.iteritems()}
81
82 def upload_test_results_log(self, chromedriver_platform, test_results_log):
83 """Uploads the given test results log to Google storage."""
84 with self.m.step.nest('Upload Test Results Log'):
85 try:
86 log_name = TEST_LOG_FORMAT % chromedriver_platform
87 temp_log_dir = self.m.path.mkdtemp('results_log')
88 temp_log_file = temp_log_dir.join(log_name)
89 self.m.file.write(name='write results log to file %s' % log_name,
90 path=temp_log_file,
91 data=self.m.json.dumps(test_results_log))
92 self.m.gsutil.upload(name='upload results log %s' % log_name,
93 source=temp_log_file,
94 bucket=GS_CHROMEDRIVER_DATA_BUCKET,
95 dest=log_name,
96 link_name='results log')
97 finally:
98 self.m.file.rmtree(name='remove temp dir', path=temp_log_dir)
99
100 def update_test_results_log(self, chromedriver_platform,
101 commit_position, passed):
102 """Updates the test results log stored in GS for the given platform.
103
104 Args:
105 chromedriver_platform: The platform name.
106 commit_position: The commit position number.
107 passed: Boolean indicating whether the tests passed at this
108 commit position.
109 """
110 log = self.download_test_results_log(chromedriver_platform)
111 while len(log) > TEST_LOG_MAX_LENGTH: # pragma: no cover
112 del log[min(log.keys())]
113 if commit_position not in log:
114 log[commit_position] = bool(passed)
115 self.upload_test_results_log(chromedriver_platform, log)
116 else:
117 raise self.m.step.StepFailure(
118 'Results already exist for commit position %s' % commit_position)
119
120 def _generate_test_command(self, script, chromedriver, log_path,
121 ref_chromedriver=None, android_package=None,
122 build_type=None, verbose=None):
123 cmd = [
124 script,
125 '--chromedriver', chromedriver,
126 '--log-path', str(log_path)
127 ]
128 if ref_chromedriver:
129 cmd.extend(['--reference-chromedriver', ref_chromedriver])
130 if build_type:
131 cmd.extend(['--build-type', build_type])
132 if verbose:
133 cmd.extend(['--verbose'])
134 if self.m.platform.is_linux:
135 cmd = ['xvfb-run', '-a'] + cmd
136 if android_package:
137 cmd.extend(['--android-package', android_package])
138 return cmd
139
140 def run_python_tests(self, chromedriver, ref_chromedriver, chrome=None,
141 chrome_version_name=None, android_package=None,
142 build_type=None, archive_server_log=True, **kwargs):
143 """Run the Chromedriver Python tests."""
144 version_info = ''
145 if chrome_version_name:
146 version_info = '(%s)' % chrome_version_name
147 with self.m.tempfile.temp_dir('server_log') as log_dir:
148 server_log = log_dir.join('server_log')
149 self.m.step('python_tests%s' % version_info,
150 self._generate_test_command(
jbudorick 2016/07/11 17:53:48 nit: indentation is off here.
mikecase (-- gone --) 2016/07/11 22:39:44 Done
151 'run_py_tests.py', chromedriver, server_log,
152 ref_chromedriver=ref_chromedriver,
153 android_package=android_package,
154 build_type=build_type),
155 **kwargs)
156 if archive_server_log:
157 self.archive_server_log(server_log)
158
159 def run_java_tests(self, chromedriver, chrome=None, chrome_version_name=None,
160 android_package=None, build_type=None, verbose=False,
161 archive_server_log=True, **kwargs):
162 """Run the Chromedriver Java tests."""
163 version_info = ''
164 if chrome_version_name:
165 version_info = '(%s)' % chrome_version_name
166 with self.m.tempfile.temp_dir('server_log') as log_dir:
167 server_log = log_dir.join('server_log')
168 self.m.step('java_tests%s' % version_info,
169 self._generate_test_command(
jbudorick 2016/07/11 17:53:48 nit: indentation is also off here.
mikecase (-- gone --) 2016/07/11 22:39:44 Done
170 'run_java_tests.py', chromedriver, server_log,
171 ref_chromedriver=None, android_package=android_package,
172 build_type=build_type, verbose=verbose),
173 **kwargs)
174 if archive_server_log:
175 self.archive_server_log(server_log)
176
177 def run_all_tests(self, android_packages=None, archive_server_logs=True):
178 """Run all Chromedriver tests."""
179 server_name = 'chromedriver'
180 chromedriver = self.m.chromium.output_dir.join(server_name)
181 build_type = self.m.path.basename(self.m.chromium.output_dir)
182
183 platform_name = self.m.platform.name
184 if self.m.platform.is_linux and self.m.platform.bits == 64:
185 platform_name = 'linux64'
186 ref_chromedriver = self.m.path.join(
187 self.m.path['checkout'],
188 'chrome', 'test', 'chromedriver', 'third_party', 'java_tests',
189 'reference_builds', 'chromedriver_%s' % platform_name)
190
191 test_env = {'PATH': '%(PATH)s'}
192 test_env['PATH'] = self.m.path.pathsep.join([
193 test_env['PATH'],
194 str(self.m.path['checkout'].join(
195 'chrome', 'test', 'chromedriver', 'chrome'))])
196 with self.m.step.defer_results():
197 for package in android_packages:
jbudorick 2016/07/11 17:53:48 This part seems oddly android-specific given how t
mikecase (-- gone --) 2016/07/11 22:39:44 Ack and Done
198 self.run_python_tests(chromedriver,
199 ref_chromedriver,
200 chrome_version_name=package,
201 android_package=package,
202 build_type=build_type,
203 env=test_env,
204 archive_server_log=archive_server_logs)
205 self.run_java_tests(chromedriver,
206 chrome_version_name=package,
207 android_package=package,
208 build_type=build_type,
209 verbose=True,
210 env=test_env,
211 archive_server_log=archive_server_logs)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698