| OLD | NEW |
| 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 Loading... |
| 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) |
| OLD | NEW |