# Copyright (C) 2016 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import re REDUCE_ITERATIONS = 128 # This is in MainActivity.java REDUCE_STARTVAL = 10 # This is in MainActivity.java REDUCE_AUTO_COMB_SCRIPT = "reduce_common.rsh" REDUCE_SCRIPT = "reduce_common.rsh" X_TESTS = 100 Y_TESTS = 2 Z_TESTS = 2 class ReductionMixin(object): def _test_func_role_combinations(self, func_role_combinations): """ Assert that when a reduction breakpoint is conditional on a function role, that breakpoints are only set on the the given functions. We do this by setting breakpoints on all possible pairs of functions and check that the resolved breakpoints are on functions that are part of the given pair """ for combination in func_role_combinations: self._delete_breakpoints() self.try_command( 'language renderscript reduction breakpoint set ' 'find_min_user_type --function-role %s' % ( ','.join(combination) ), [r'Breakpoint(s) created'] ) func_suffixes = [combination[0][:4], combination[1][:4]] # just match the first 4 chars of the roles prefix funcs_match = 'find_min_user_type_((%s|%s))' % tuple(func_suffixes) # now check we stop on both functions for each coordinate in the # allocation for x in range(REDUCE_ITERATIONS): output = self.try_command( 'process continue', expected_regex=[ r'resuming', r'Process \d+ stopped', r'frame #0: (0x[0-9a-fA-F]+ )?librs.reduce.so`%s' % funcs_match ] ) for line in output.splitlines(): match = re.search(funcs_match, line) if match: try: func_suffixes.remove(match.group(1)) except ValueError: # The outconverter may only be called in the final # step but the accumulator will be called for every # input index continue break if len(func_suffixes) == 0: # We've popped the functions we're interested in off the list break else: raise self.TestFail( "unable to match function roles for " + repr(combination)) def _reduction_breakpoint_set_single_type( self, script_soname, script_basename, reduce_name, funcname_types): """ Assert - for each function role - that the correct symbol is resolved and trapped by the debugger. """ for func, typename in funcname_types: self._delete_breakpoints() breakpoint_match = r'Breakpoint \d+: where = librs.%s.so`%s' # Autogenerated combiners don't have a filename in the debugger if not func.endswith(".combiner"): breakpoint_match = r'%s (\+ \d+ )?at %s' % ( breakpoint_match, script_basename) self.try_command( 'language renderscript reduction breakpoint set %s' ' --function-role %s' % (reduce_name, typename), expected_regex=[breakpoint_match % (script_soname, func)] ) self.try_command( 'process continue', expected_regex=[ r'resuming', r'Process \d+ stopped', r'frame #0: (0x[0-9a-fA-F]+ )?librs.%s.so`%s' % ( script_soname, func) ] )