File: PRESUBMIT.py

package info (click to toggle)
chromium 144.0.7559.109-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,915,868 kB
  • sloc: cpp: 35,866,215; ansic: 7,599,035; javascript: 3,623,761; python: 1,639,407; xml: 833,084; asm: 716,173; pascal: 185,323; sh: 88,763; perl: 88,699; objc: 79,984; sql: 58,217; cs: 42,430; fortran: 24,101; makefile: 20,747; tcl: 15,277; php: 14,022; yacc: 9,059; ruby: 7,553; awk: 3,720; lisp: 3,233; lex: 1,330; ada: 727; jsp: 228; sed: 36
file content (123 lines) | stat: -rw-r--r-- 4,606 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# 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)