| #!/usr/bin/env vpython3 | 
 | # Copyright 2020 The Chromium Authors | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 | """Update CTS Tests to a new version.""" | 
 |  | 
 | from __future__ import print_function | 
 |  | 
 | import argparse | 
 | import os | 
 | import re | 
 | import sys | 
 |  | 
 | sys.path.append( | 
 |     os.path.join( | 
 |         os.path.dirname(__file__), os.pardir, os.pardir, 'third_party', | 
 |         'catapult', 'devil')) | 
 | # pylint: disable=wrong-import-position,import-error | 
 | from devil.utils import cmd_helper | 
 | from devil.utils import logging_common | 
 |  | 
 | import cts_utils | 
 |  | 
 |  | 
 | def _query_git_for_cts_tags(): | 
 |   cts_git_url = 'https://android.googlesource.com/platform/cts/' | 
 |  | 
 |   tags = cmd_helper.GetCmdOutput(['git', 'ls-remote', '--tags', | 
 |                                   cts_git_url]).splitlines() | 
 |  | 
 |   print('[Updating CTS versions] Retrieved the CTS git tags') | 
 |  | 
 |   return tags | 
 |  | 
 |  | 
 | class UpdateCTS: | 
 |   """Updates CTS archive to a new version. | 
 |  | 
 |   Performs the following tasks to simplify the CTS test update process: | 
 |   (TODO(crbug.com/40259004): - Update the CTS versions in fetch.py / install.sh) | 
 |   - Update the CTS versions in webview_cts_gcs_path.json | 
 |  | 
 |   After these steps are completed, the user can commit and upload | 
 |   the CL to Chromium Gerrit. | 
 |   """ | 
 |  | 
 |   def __init__(self, repo_root): | 
 |     """Construct UpdateCTS instance. | 
 |  | 
 |     Args: | 
 |       repo_root: Repository root (e.g. /path/to/chromium/src) to base | 
 |                  all configuration files | 
 |     """ | 
 |     self._repo_root = os.path.abspath(repo_root) | 
 |     helper = cts_utils.ChromiumRepoHelper(self._repo_root) | 
 |     self._repo_helper = helper | 
 |     self._cts_config_path = helper.rebase(cts_utils.TOOLS_DIR, | 
 |                                           cts_utils.CONFIG_FILE) | 
 |     self._CTSConfig = cts_utils.CTSConfig(self._cts_config_path) | 
 |  | 
 |   def _check_for_latest_cts_versions(self, cts_tags): | 
 |     """Query for the latest cts versions per platform | 
 |  | 
 |     We can retrieve the newest CTS versions by searching through the git tags | 
 |     for each CTS version and looking for the latest | 
 |     """ | 
 |  | 
 |     prefixes = [(platform, self._CTSConfig.get_git_tag_prefix(platform)) | 
 |                 for platform in self._CTSConfig.iter_platforms()] | 
 |     release_versions = dict() | 
 |  | 
 |     tag_prefix_regexes = { | 
 |         # Do a forward lookup for the tag prefix plus an '_r' | 
 |         # Eg: 'android-cts-7.0_r2' | 
 |         # Then retrieve the digits after this | 
 |         tag_prefix: re.compile('(?<=/%s_r)\\d*' % re.escape(tag_prefix)) | 
 |         for _, tag_prefix in prefixes | 
 |     } | 
 |  | 
 |     for tag in cts_tags: | 
 |       for platform, prefix in prefixes: | 
 |         matches = tag_prefix_regexes[prefix].search(tag) | 
 |         if matches: | 
 |           version = int(matches.group(0)) | 
 |           if release_versions.get(platform, -1) < version: | 
 |             release_versions[platform] = version | 
 |  | 
 |     print('[Updating CTS versions] Retrieved the latest CTS versions') | 
 |  | 
 |     return release_versions | 
 |  | 
 |   def _update_cts_config_file_download_origins(self, release_versions): | 
 |     """ Update the CTS release version for each architecture | 
 |     and then save the config json | 
 |     """ | 
 |     for platform, arch in self._CTSConfig.iter_platform_archs(): | 
 |       self._CTSConfig.set_release_version(platform, arch, | 
 |                                           release_versions[platform]) | 
 |  | 
 |     self._CTSConfig.save() | 
 |  | 
 |     print('[Updating CTS versions] Updated cts config') | 
 |  | 
 |   def update_cts_download_origins_cmd(self): | 
 |     """Performs the cts download origins update command""" | 
 |     tags = _query_git_for_cts_tags() | 
 |     release_versions = self._check_for_latest_cts_versions(tags) | 
 |     self._update_cts_config_file_download_origins(release_versions) | 
 |  | 
 |  | 
 | DESC = """Updates the WebView CTS tests to a new version. | 
 |  | 
 | See https://source.android.com/compatibility/cts/downloads for the latest | 
 | versions. | 
 |  | 
 | Please create a new branch, then edit the | 
 | {} | 
 | file with updated origin and file name before running this script. | 
 |  | 
 | After performing all steps, perform git add then commit.""".format( | 
 |     os.path.join(cts_utils.TOOLS_DIR, cts_utils.CONFIG_FILE)) | 
 |  | 
 | UPDATE_CONFIG = 'update-config' | 
 |  | 
 |  | 
 | def main(): | 
 |   parser = argparse.ArgumentParser( | 
 |       description=DESC, formatter_class=argparse.RawTextHelpFormatter) | 
 |  | 
 |   logging_common.AddLoggingArguments(parser) | 
 |  | 
 |   subparsers = parser.add_subparsers(dest='cmd') | 
 |  | 
 |   subparsers.add_parser( | 
 |       UPDATE_CONFIG, | 
 |       help='Update the CTS config to the newest release versions.') | 
 |  | 
 |   args = parser.parse_args() | 
 |   logging_common.InitializeLogging(args) | 
 |  | 
 |   cts_updater = UpdateCTS(repo_root=cts_utils.SRC_DIR) | 
 |  | 
 |   if args.cmd == UPDATE_CONFIG: | 
 |     cts_updater.update_cts_download_origins_cmd() | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |   main() |