class NetworkTrafficAnnotationChecker():
    EXTENSIONS = ['.cc', '.mm', '.java']
    ANNOTATIONS_FILE = 'annotations.xml'

    def __init__(self, build_path=None):
        """Initializes a NetworkTrafficAnnotationChecker object.

    Args:
      build_path: str Absolute or relative path to a fully compiled build
          directory. If not specified, the script tries to find it based on
          relative position of this file (src/tools/traffic_annotation).
    """
        self.tools = NetworkTrafficAnnotationTools(build_path)

    def IsAnnotationsFile(self, file_path):
        """Returns true if the given file is the annotations file."""
        return os.path.basename(file_path) == self.ANNOTATIONS_FILE

    def ShouldCheckFile(self, file_path):
        """Returns true if the input file has an extension relevant to network
    traffic annotations."""
        return os.path.splitext(file_path)[1] in self.EXTENSIONS

    def GetFilePaths(self, complete_run, limit):
        if complete_run:
            return []

        # Get list of modified files. If failed, silently ignore as the test is
        # run in error resilient mode.
        file_paths = self.tools.GetModifiedFiles() or []

        annotations_file_changed = any(
            self.IsAnnotationsFile(file_path) for file_path in file_paths)

        # If the annotations file has changed, trigger a full test to avoid
        # missing a case where the annotations file has changed, but not the
        # corresponding file, causing a mismatch that is not detected by just
        # checking the changed .cc and .mm files.
        if annotations_file_changed:
            return []

        file_paths = [
            file_path for file_path in file_paths
            if self.ShouldCheckFile(file_path)
        ]
        if not file_paths:
            return None

        # If the number of changed files in the CL exceeds a threshold, trigger
        # full test to avoid sending very long list of arguments and possible
        # failure in argument buffers.
        if len(file_paths) > CHANGELIST_SIZE_TO_TRIGGER_FULL_TEST:
            file_paths = []

        return file_paths

    def CheckFiles(self, complete_run, limit, use_python_auditor):
        """Passes all given files to traffic_annotation_auditor to be checked for
    possible violations of network traffic annotation rules.

    Args:
      complete_run: bool Flag requesting to run test on all relevant files.
      use_python_auditor: bool If True, test auditor.py instead of
        t_a_auditor.exe.
      limit: int The upper threshold for number of errors and warnings. Use 0
          for unlimited.

    Returns:
      int Exit code of the network traffic annotation auditor.
    """
        if not self.tools.CanRunAuditor(use_python_auditor):
            print(
                "Network traffic annotation presubmit check was not performed. A "
                "compiled build directory and traffic_annotation_auditor binary "
                "are required to do it.")
            return 0

        file_paths = self.GetFilePaths(complete_run, limit)
        if file_paths is None:
            return 0

        args = ["--test-only", "--limit=%i" % limit, "--error-resilient"] + \
               file_paths

        stdout_text, stderr_text, return_code = self.tools.RunAuditor(
            args, use_python_auditor)

        if stdout_text:
            print(stdout_text)
        if stderr_text:
            print("\n[Runtime Messages]:\n%s" % stderr_text)

        if self.tools.GetCurrentPlatform() == "android":
            # For now, always mark the android bot as green. This acts as a sort of
            # "FYI" mode.
            #
            # TODO(crbug.com/1254719): Once the Android presubmit bot is stable, turn
            # this into a CQ-blocking failure.
            return 0

        return return_code
Exemple #2
0
class NetworkTrafficAnnotationChecker():
    EXTENSIONS = [
        '.cc',
        '.mm',
    ]

    def __init__(self, build_path=None):
        """Initializes a NetworkTrafficAnnotationChecker object.

    Args:
      build_path: str Absolute or relative path to a fully compiled build
          directory. If not specified, the script tries to find it based on
          relative position of this file (src/tools/traffic_annotation).
    """
        self.tools = NetworkTrafficAnnotationTools(build_path)

    def ShouldCheckFile(self, file_path):
        """Returns true if the input file has an extension relevant to network
    traffic annotations."""
        return os.path.splitext(file_path)[1] in self.EXTENSIONS

    def CheckFiles(self, complete_run, limit):
        """Passes all given files to traffic_annotation_auditor to be checked for
    possible violations of network traffic annotation rules.

    Args:
      complete_run: bool Flag requesting to run test on all relevant files.
      limit: int The upper threshold for number of errors and warnings. Use 0
          for unlimited.

    Returns:
      int Exit code of the network traffic annotation auditor.
    """
        if not self.tools.CanRunAuditor():
            print(
                "Network traffic annotation presubmit check was not performed. A "
                "compiled build directory and traffic_annotation_auditor binary "
                "are required to do it.")
            return 0

        if complete_run:
            file_paths = []
        else:
            # Get list of modified files. If failed, silently ignore as the test is
            # run in error resilient mode.
            file_paths = self.tools.GetModifiedFiles() or []
            file_paths = [
                file_path for file_path in file_paths
                if self.ShouldCheckFile(file_path)
            ]
            if not file_paths:
                return 0

        args = ["--test-only", "--limit=%i" % limit, "--error-resilient"] + \
               file_paths

        stdout_text, stderr_text, return_code = self.tools.RunAuditor(args)

        if stdout_text:
            print(stdout_text)
        if stderr_text:
            print("\n[Runtime Messages]:\n%s" % stderr_text)
        return return_code