1# Copyright (C) 2016 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15""" 16Set of mixins for asserting common RenderScript lldb interactions 17That should cut down boilerplate 18To use these assertions simply inherit from them along with your 19`TestBase`: 20 21 >>> class MyLLDBRenderScriptTest(TestBaseRemote, CoordinateAssertionsMixin): 22 >>> pass 23 24This will give you access to the useful assertion methods related to Coordinates 25 26NOTE: These are strictly clean mixins for `TestBase`. All classes here should 27strictly inherit only from `object` 28""" 29 30 31class CoordinateAssertionsMixin(object): 32 def assert_coord_bp_set( 33 self, breakpoint_expr, x, y=None, z=None, kernel_type='kernel' 34 ): 35 ''' 36 Assert that a breakpoint conditional on a given coordinate is confirmed 37 by the renderscript breakpoint resolver. 38 This does not assert test the breakpoint is hit, only registered. 39 breakpoint_expr: the expression (e.g. the name of a function, or a 40 file and line). 41 kernel_type: The breakpoint resolver to use: 42 (reduction|kernel|scriptgroup) 43 default='kernel' 44 x: x coordinate: required 45 y, z: optional y, and z coordinates 46 ''' 47 48 y = 0 if z is not None and y is None else y 49 coord_text = ','.join(map(str, filter(lambda p: p is not None, (x, y, z)))) 50 self.try_command( 51 'language renderscript %s breakpoint set %s -c %s' % ( 52 kernel_type, breakpoint_expr, coord_text 53 ), 54 [r'Breakpoint(s) created'], 55 expected_regex=[ 56 r'Conditional kernel breakpoint on coordinate.+%d,\s*%d,\s*%d' % ( 57 x or 0, y or 0, z or 0 58 ) 59 ] 60 ) 61 62 def assert_coord_stop( 63 self, soname, func_name, x, y=None, z=None, stopped=True 64 ): 65 '''Run lldb commands to check that coordinates match expected values. 66 67 Args: 68 (x, y, z): The expected coordinates. 69 soname: The name of the renderscript script module e.g. 'allocs' 70 for librs.allocs.so 71 func_name: String that is the name of the kernel function 72 73 Raises: 74 TestFail: One of the lldb commands did not provide the expected 75 output. 76 ''' 77 78 if stopped: 79 self.try_command( 80 'process continue', 81 expected_regex=[ 82 r'resuming', 83 r'Process \d+ stopped', 84 r'stop reason = breakpoint', 85 r'frame #0: (0x[0-9a-fA-F]+ )?librs.%s.so`%s' % ( 86 soname, func_name) 87 ] 88 ) 89 else: 90 self.try_command( 91 'bt', 92 expected_regex=[ 93 'stop reason = breakpoint', 94 'frame #0:', 95 'librs.*\.so`%s' % kernel 96 ] 97 ) 98 99 self.try_command( 100 'language renderscript kernel coordinate', 101 '(%d, %d, %d)' % (x, y or 0, z or 0) 102 ) 103