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

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: Updated with Johns comments 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 get_chromedriver_platform(self, is_android):
jbudorick 2016/06/24 13:31:09 This entire function seems unnecessary at the mome
mikecase (-- gone --) 2016/06/24 18:57:50 Yeah, and now that I think about it, maybe we shou
21 """Gets the platform name for Chromedriver."""
22 if is_android:
23 return 'android'
24 else: # pragma: no cover
25 raise NotImplementedError('Only Android is currently supported for '
26 'Chromedriver recipes.')
27
28 def download_prebuilts(self):
29 """Downloads the most recent prebuilts from Google storage."""
30 with self.m.step.nest('Download Prebuilts'):
31 prebuilt_dir = self.m.path.mkdtemp('prebuilt')
32 zipfile = prebuilt_dir.join('build.zip')
33 unzip_dir = prebuilt_dir.join('unzipped')
34 try:
35 self.m.gsutil.download_latest_file(base_url=GS_PREBUILTS_URL,
36 partial_name=GS_PREBUILTS_URL + '/r',
37 destination=zipfile,
38 name='download latest prebuilt')
39 self.m.zip.unzip(step_name='unzip prebuilt',
40 zip_file=zipfile,
41 output=unzip_dir)
42 self.m.file.move(name='move prebuilt',
43 source=unzip_dir.join('chromedriver'),
44 dest=self.m.chromium.output_dir,
45 infra_step=False)
46 finally:
47 self.m.file.rmtree(name='remove temp dir', path=prebuilt_dir)
48
49 def archive_server_logs(self, chromedriver_log_dir):
50 """Uploads chromedriver server logs to Google storage.
51
52 Args:
53 chromedriver_log_dir: Directory containing the Chromedriver server logs.
54 """
55 with self.m.step.nest('Upload Chromedriver Server Logs'):
56 server_logs = self.m.file.glob(
57 name='glob search for server logs',
58 pattern=chromedriver_log_dir.join('*'),
59 test_data=[chromedriver_log_dir.join('chromedriver_123'),
60 chromedriver_log_dir.join('chromedriver_456'),
61 chromedriver_log_dir.join('chromedriver_789')])
62 for server_log in server_logs:
63 self.m.gsutil.upload(name='uploading %s' % server_log,
64 source=server_log,
65 bucket=GS_SERVER_LOGS_URL,
66 dest=self.m.path.basename(server_log),
67 link_name='server log %s' % server_log)
68
69 def download_test_results_log(self, chromedriver_platform):
70 """Downloads the test results log for the given Chromedriver platform.
71
72 Args:
73 chromedriver_platform: The platform of the test results log.
74
75 Returns:
76 A dictionary where the keys are commit positions and the values are
77 booleans indicating whether the tests passed.
78 """
79 with self.m.step.nest('Download Test Results Log'):
80 log_name = TEST_LOG_FORMAT % chromedriver_platform
81 temp_log_dir = self.m.path.mkdtemp('results_log')
82 temp_log_file = temp_log_dir.join(log_name)
83 try:
84 self.m.gsutil.download(name='download results log',
85 source=log_name,
86 bucket=GS_CHROMEDRIVER_DATA_BUCKET,
87 dest=temp_log_file)
88 json_data = self.m.file.read(name='read results log file',
89 path=temp_log_file,
90 test_data='{}')
91 json_dict = self.m.json.loads(json_data)
92 except self.m.step.StepFailure:
93 json_dict = {}
94 finally:
95 self.m.file.rmtree(name='remove temp dir', path=temp_log_dir)
96 return {int(k): v for k, v in json_dict.iteritems()}
97
98 def upload_test_results_log(self, chromedriver_platform, test_results_log):
99 """Uploads the given test results log to Google storage."""
100 with self.m.step.nest('Upload Test Results Log'):
101 log_name = TEST_LOG_FORMAT % chromedriver_platform
102 temp_log_dir = self.m.path.mkdtemp('results_log')
103 temp_log_file = temp_log_dir.join(log_name)
104 try:
105 self.m.file.write(name='write results log to file %s' % log_name,
106 path=temp_log_file,
107 data=self.m.json.dumps(test_results_log))
108 self.m.gsutil.upload(name='upload results log %s' % log_name,
109 source=temp_log_file,
110 bucket=GS_CHROMEDRIVER_DATA_BUCKET,
111 dest=log_name,
112 link_name='results log')
113 finally:
114 self.m.file.rmtree(name='remove temp dir', path=temp_log_dir)
115
116 def update_test_results_log(self, chromedriver_platform,
117 commit_position, passed):
118 """Updates the test results log stored in GS for the given platform.
119
120 Args:
121 chromedriver_platform: The platform name.
122 commit_position: The commit position number.
123 passed: Boolean indicating whether the tests passed at this
124 commit position.
125 """
126 log = self.download_test_results_log(chromedriver_platform)
127 while len(log) > TEST_LOG_MAX_LENGTH: # pragma: no cover
128 del log[min(log.keys())]
129 if commit_position not in log:
130 log[commit_position] = bool(passed)
131 self.upload_test_results_log(chromedriver_platform, log)
132 else:
133 raise self.m.step.StepFailure(
134 'Results already exist for commit position %s' % commit_position)
135
136 def _generate_test_command(self, script, chromedriver, test_log_dir,
137 ref_chromedriver=None, android_package=None,
138 build_type=None, verbose=None):
139 cmd = [
140 script,
141 '--chromedriver', chromedriver,
142 '--log-dir', str(test_log_dir)
samuong 2016/06/24 16:40:57 run_py_tests.py and run_java_tests.py have a --log
mikecase (-- gone --) 2016/06/24 18:57:50 ahh. Thanks for catching this. I had to make some
143 ]
144 if ref_chromedriver:
145 cmd.extend(['--reference-chromedriver', ref_chromedriver])
146 if build_type:
147 cmd.extend(['--build-type', build_type])
148 if verbose:
149 cmd.extend(['--verbose'])
150 if android_package:
samuong 2016/06/24 16:40:56 i think this should say "if self.m.platform.is_lin
mikecase (-- gone --) 2016/06/24 18:57:50 Done. Now I add the xvfb-run command if the platfo
151 cmd = ['xvfb-run', '-a'] + cmd
152 cmd.extend(['--android-package', android_package])
153 return cmd
154
155 def run_python_tests(self, chromedriver, test_log_dir, ref_chromedriver,
156 chrome=None, chrome_version_name=None,
157 android_package=None, build_type=None, **kwargs):
158 """Run the Chromedriver Python tests."""
159 version_info = ''
160 if chrome_version_name:
161 version_info = '(%s)' % chrome_version_name
162 self.m.step('python_tests%s' % version_info,
163 self._generate_test_command('run_py_tests.py', chromedriver,
164 test_log_dir,
165 ref_chromedriver=ref_chromedriver,
166 android_package=android_package,
167 build_type=build_type),
168 **kwargs)
169
170 def run_java_tests(self, chromedriver, test_log_dir, chrome=None,
171 chrome_version_name=None,
172 android_package=None, build_type=None, verbose=False,
173 **kwargs):
174 """Run the Chromedriver Java tests."""
175 version_info = ''
176 if chrome_version_name:
177 version_info = '(%s)' % chrome_version_name
178 self.m.step('java_tests%s' % version_info,
179 self._generate_test_command('run_java_tests.py', chromedriver,
180 test_log_dir,
181 ref_chromedriver=None,
182 android_package=android_package,
183 build_type=build_type,
184 verbose=verbose),
185 **kwargs)
186
187 def run_all_tests(self, android_packages=None, archive_server_logs=True):
188 """Run all Chromedriver tests."""
189 server_name = 'chromedriver'
190 chromedriver = self.m.chromium.output_dir.join(server_name)
191 build_type = self.m.path.basename(self.m.chromium.output_dir)
192
193 platform_name = self.m.platform.name
194 if self.m.platform.is_linux and self.m.platform.bits == 64:
195 platform_name = 'linux64'
196 ref_chromedriver = self.m.path.join(
197 self.m.path['checkout'],
198 'chrome', 'test', 'chromedriver', 'third_party', 'java_tests',
199 'reference_builds', 'chromedriver_%s' % platform_name)
200
201 test_env = {'PATH': '%(PATH)s'}
202 test_env['PATH'] = self.m.path.pathsep.join([
203 test_env['PATH'],
204 str(self.m.path['checkout'].join(
205 'chrome', 'test', 'chromedriver', 'chrome'))])
206 try:
207 temp_log_dir = self.m.path.mkdtemp('results_log')
208 with self.m.step.defer_results():
209 for package in android_packages:
210 self.run_python_tests(chromedriver,
211 temp_log_dir,
212 ref_chromedriver,
213 chrome_version_name=package,
214 android_package=package,
215 build_type=build_type,
216 env=test_env)
217 self.run_java_tests(chromedriver,
218 temp_log_dir,
219 chrome_version_name=package,
220 android_package=package,
221 build_type=build_type,
222 verbose=True,
223 env=test_env)
224 if archive_server_logs:
225 self.archive_server_logs(temp_log_dir)
226 finally:
227 self.m.file.rmtree(name='Remove Temp Log Dir', path=temp_log_dir)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698