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
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