|  | # Copyright 2022 The Chromium Authors | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  | """This presubmit ensures that all known test suites in the current component | 
|  | are included in the launcher filter file.""" | 
|  |  | 
|  | from typing import Dict, List | 
|  |  | 
|  | USE_PYTHON3 = True | 
|  |  | 
|  | TOOL_PATH = 'tools/testing/launcher_filter_file.py' | 
|  |  | 
|  |  | 
|  | def GetToolPathRelativeToRepositoryRoot(input_api) -> str: | 
|  | # Returns the path to the launcher_filter_file.py tool, relative to the | 
|  | # chromium src directory to simplify copy-paste of a command on errors. | 
|  | presubmit_local_path = input_api.PresubmitLocalPath() | 
|  | repository_root = input_api.change.RepositoryRoot() | 
|  | common_path = input_api.os_path.commonpath( | 
|  | [repository_root, presubmit_local_path]) | 
|  | component_relative_path = presubmit_local_path[len(common_path) + 1:] | 
|  | return input_api.os_path.join(component_relative_path, TOOL_PATH) | 
|  |  | 
|  |  | 
|  | def FetchLauncherFilterFileData(input_api, cwd: str) -> Dict[str, str]: | 
|  | # Fetches the actual and expected filter file content so they can be | 
|  | # compared. Returns a dictionary that contains 'expected' and 'actual' as | 
|  | # comparable strings. | 
|  | try: | 
|  | old_sys_path = input_api.sys.path | 
|  | cwd = input_api.PresubmitLocalPath() | 
|  | input_api.sys.path += [input_api.os_path.join(cwd, 'tools')] | 
|  | from testing import launcher_filter_file as lff | 
|  | ret = {} | 
|  | ret['expected'] = lff.GetExpectedLauncherFilterFileContent() | 
|  | ret['actual'] = lff.GetActualLauncherFilterFileContent() | 
|  | return ret | 
|  | finally: | 
|  | input_api.sys.path = old_sys_path | 
|  |  | 
|  |  | 
|  | def GetPylintConfiguration(input_api, output_api) -> List: | 
|  | disabled_warnings = [ | 
|  | 'C0415',  # import-outside-toplevel | 
|  | ] | 
|  | return input_api.canned_checks.RunPylint( | 
|  | input_api, | 
|  | output_api, | 
|  | version='2.7', | 
|  | disabled_warnings=disabled_warnings) | 
|  |  | 
|  |  | 
|  | def _CommonChecks(input_api, output_api): | 
|  | output = GetPylintConfiguration(input_api, output_api) | 
|  | cwd = input_api.PresubmitLocalPath() | 
|  | tool_help_path = GetToolPathRelativeToRepositoryRoot(input_api) | 
|  |  | 
|  | filter_file_data = FetchLauncherFilterFileData(input_api, cwd) | 
|  |  | 
|  | if filter_file_data['expected'] == filter_file_data['actual']: | 
|  | return output | 
|  |  | 
|  | output.append( | 
|  | output_api.PresubmitPromptWarning( | 
|  | 'The test launcher filter file does not match the ' + | 
|  | f'available tests.\n\nPlease run:\n{tool_help_path}', [])) | 
|  | return output | 
|  |  | 
|  |  | 
|  | def CheckChangeOnUpload(*args): | 
|  | return _CommonChecks(*args) | 
|  |  | 
|  |  | 
|  | def CheckChangeOnCommit(*args): | 
|  | return _CommonChecks(*args) |