blob: 7f02276e5575d94e6e9d0da6d1bd5c5e14c87b8b [file] [log] [blame]
# 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."""
import re
from typing import Dict, List
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 _CheckUmaMetrics(input_api, output_api):
"""Checks if the UMA metric lists are up to date."""
# Path to the directory containing segmentation platform models.
model_dir = input_api.os_path.join('components', 'segmentation_platform',
'embedder', 'default_model')
# Check if any of the affected files are relevant to the histogram check.
relevant_files_changed = False
for f in input_api.AffectedFiles():
path = f.LocalPath()
if path.startswith(model_dir) and path.endswith('.cc') and \
not path.endswith(('_unittest.cc', '_test.cc')):
relevant_files_changed = True
break
if not relevant_files_changed:
return []
# Run the full check if relevant files were changed.
cwd = input_api.PresubmitLocalPath()
try:
old_sys_path = input_api.sys.path
sys_path_to_add = input_api.os_path.join(cwd, 'tools')
input_api.sys.path.insert(0, sys_path_to_add)
import generate_histogram_list
finally:
input_api.sys.path = old_sys_path
warnings = []
expected_histograms = (
generate_histogram_list.GetExpectedHistogramsFileContent())
actual_histograms = generate_histogram_list.GetActualHistogramsFileContent(
)
expected_user_actions = (
generate_histogram_list.GetExpectedUserActionsFileContent())
actual_user_actions = (
generate_histogram_list.GetActualUserActionsFileContent())
if (expected_user_actions != actual_user_actions
or expected_histograms != actual_histograms):
error_message = (
'The Segmentation histogram list is out of date.\n\n'
'Please run:\npython3 components/segmentation_platform'
'/tools/generate_histogram_list.py')
warnings.append(output_api.PresubmitPromptWarning(error_message, []))
return 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']:
output.append(
output_api.PresubmitPromptWarning(
'The test launcher filter file does not match the ' +
f'available tests.\n\nPlease run:\n{tool_help_path}', []))
output.extend(_CheckUmaMetrics(input_api, output_api))
return output
def CheckChangeOnUpload(*args):
return _CommonChecks(*args)
def CheckChangeOnCommit(*args):
return _CommonChecks(*args)