1*3ac0a46fSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*3ac0a46fSAndroid Build Coastguard Worker# Copyright 2015 The PDFium Authors 3*3ac0a46fSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*3ac0a46fSAndroid Build Coastguard Worker# found in the LICENSE file. 5*3ac0a46fSAndroid Build Coastguard Worker 6*3ac0a46fSAndroid Build Coastguard Workerimport os 7*3ac0a46fSAndroid Build Coastguard Worker 8*3ac0a46fSAndroid Build Coastguard Workerimport common 9*3ac0a46fSAndroid Build Coastguard Workerimport pngdiffer 10*3ac0a46fSAndroid Build Coastguard Worker 11*3ac0a46fSAndroid Build Coastguard Worker 12*3ac0a46fSAndroid Build Coastguard Workerclass Suppressor: 13*3ac0a46fSAndroid Build Coastguard Worker 14*3ac0a46fSAndroid Build Coastguard Worker def __init__(self, finder, features, js_disabled, xfa_disabled, 15*3ac0a46fSAndroid Build Coastguard Worker rendering_option): 16*3ac0a46fSAndroid Build Coastguard Worker self.has_v8 = not js_disabled and 'V8' in features 17*3ac0a46fSAndroid Build Coastguard Worker self.has_xfa = not js_disabled and not xfa_disabled and 'XFA' in features 18*3ac0a46fSAndroid Build Coastguard Worker self.rendering_option = rendering_option 19*3ac0a46fSAndroid Build Coastguard Worker self.suppression_set = self._LoadSuppressedSet('SUPPRESSIONS', finder) 20*3ac0a46fSAndroid Build Coastguard Worker self.image_suppression_set = self._LoadSuppressedSet( 21*3ac0a46fSAndroid Build Coastguard Worker 'SUPPRESSIONS_IMAGE_DIFF', finder) 22*3ac0a46fSAndroid Build Coastguard Worker self.exact_matching_suppression_set = self._LoadSuppressedSet( 23*3ac0a46fSAndroid Build Coastguard Worker 'SUPPRESSIONS_EXACT_MATCHING', finder) 24*3ac0a46fSAndroid Build Coastguard Worker 25*3ac0a46fSAndroid Build Coastguard Worker def _LoadSuppressedSet(self, suppressions_filename, finder): 26*3ac0a46fSAndroid Build Coastguard Worker v8_option = "v8" if self.has_v8 else "nov8" 27*3ac0a46fSAndroid Build Coastguard Worker xfa_option = "xfa" if self.has_xfa else "noxfa" 28*3ac0a46fSAndroid Build Coastguard Worker with open(os.path.join(finder.TestingDir(), suppressions_filename)) as f: 29*3ac0a46fSAndroid Build Coastguard Worker return set( 30*3ac0a46fSAndroid Build Coastguard Worker self._FilterSuppressions(common.os_name(), v8_option, xfa_option, 31*3ac0a46fSAndroid Build Coastguard Worker self.rendering_option, 32*3ac0a46fSAndroid Build Coastguard Worker self._ExtractSuppressions(f))) 33*3ac0a46fSAndroid Build Coastguard Worker 34*3ac0a46fSAndroid Build Coastguard Worker def _ExtractSuppressions(self, f): 35*3ac0a46fSAndroid Build Coastguard Worker return [ 36*3ac0a46fSAndroid Build Coastguard Worker y.split(' ') for y in [x.split('#')[0].strip() 37*3ac0a46fSAndroid Build Coastguard Worker for x in f.readlines()] if y 38*3ac0a46fSAndroid Build Coastguard Worker ] 39*3ac0a46fSAndroid Build Coastguard Worker 40*3ac0a46fSAndroid Build Coastguard Worker def _FilterSuppressions(self, os_name, js, xfa, rendering_option, 41*3ac0a46fSAndroid Build Coastguard Worker unfiltered_list): 42*3ac0a46fSAndroid Build Coastguard Worker return [ 43*3ac0a46fSAndroid Build Coastguard Worker x[0] 44*3ac0a46fSAndroid Build Coastguard Worker for x in unfiltered_list 45*3ac0a46fSAndroid Build Coastguard Worker if self._MatchSuppression(x, os_name, js, xfa, rendering_option) 46*3ac0a46fSAndroid Build Coastguard Worker ] 47*3ac0a46fSAndroid Build Coastguard Worker 48*3ac0a46fSAndroid Build Coastguard Worker def _MatchSuppression(self, item, os_name, js, xfa, rendering_option): 49*3ac0a46fSAndroid Build Coastguard Worker os_column = item[1].split(",") 50*3ac0a46fSAndroid Build Coastguard Worker js_column = item[2].split(",") 51*3ac0a46fSAndroid Build Coastguard Worker xfa_column = item[3].split(",") 52*3ac0a46fSAndroid Build Coastguard Worker rendering_option_column = item[4].split(",") 53*3ac0a46fSAndroid Build Coastguard Worker return (('*' in os_column or os_name in os_column) and 54*3ac0a46fSAndroid Build Coastguard Worker ('*' in js_column or js in js_column) and 55*3ac0a46fSAndroid Build Coastguard Worker ('*' in xfa_column or xfa in xfa_column) and 56*3ac0a46fSAndroid Build Coastguard Worker ('*' in rendering_option_column or 57*3ac0a46fSAndroid Build Coastguard Worker rendering_option in rendering_option_column)) 58*3ac0a46fSAndroid Build Coastguard Worker 59*3ac0a46fSAndroid Build Coastguard Worker def IsResultSuppressed(self, input_filename): 60*3ac0a46fSAndroid Build Coastguard Worker if input_filename in self.suppression_set: 61*3ac0a46fSAndroid Build Coastguard Worker print("%s result is suppressed" % input_filename) 62*3ac0a46fSAndroid Build Coastguard Worker return True 63*3ac0a46fSAndroid Build Coastguard Worker return False 64*3ac0a46fSAndroid Build Coastguard Worker 65*3ac0a46fSAndroid Build Coastguard Worker def IsExecutionSuppressed(self, input_filepath): 66*3ac0a46fSAndroid Build Coastguard Worker if "xfa_specific" in input_filepath and not self.has_xfa: 67*3ac0a46fSAndroid Build Coastguard Worker print("%s execution is suppressed" % input_filepath) 68*3ac0a46fSAndroid Build Coastguard Worker return True 69*3ac0a46fSAndroid Build Coastguard Worker return False 70*3ac0a46fSAndroid Build Coastguard Worker 71*3ac0a46fSAndroid Build Coastguard Worker def IsImageDiffSuppressed(self, input_filename): 72*3ac0a46fSAndroid Build Coastguard Worker if input_filename in self.image_suppression_set: 73*3ac0a46fSAndroid Build Coastguard Worker print("%s image diff comparison is suppressed" % input_filename) 74*3ac0a46fSAndroid Build Coastguard Worker return True 75*3ac0a46fSAndroid Build Coastguard Worker return False 76*3ac0a46fSAndroid Build Coastguard Worker 77*3ac0a46fSAndroid Build Coastguard Worker def GetImageMatchingAlgorithm(self, input_filename): 78*3ac0a46fSAndroid Build Coastguard Worker if input_filename in self.exact_matching_suppression_set: 79*3ac0a46fSAndroid Build Coastguard Worker print(f"{input_filename} image diff comparison is fuzzy") 80*3ac0a46fSAndroid Build Coastguard Worker return pngdiffer.FUZZY_MATCHING 81*3ac0a46fSAndroid Build Coastguard Worker return pngdiffer.EXACT_MATCHING 82