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

Side by Side Diff: scripts/slave/recipe_modules/chromedriver/api.py

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