| # 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. |
| |
| """ |
| Set of mixins for asserting common RenderScript lldb interactions |
| That should cut down boilerplate |
| To use these assertions simply inherit from them along with your |
| `TestBase`: |
| |
| >>> class MyLLDBRenderScriptTest(TestBaseRemote, CoordinateAssertionsMixin): |
| >>> pass |
| |
| This will give you access to the useful assertion methods related to Coordinates |
| |
| NOTE: These are strictly clean mixins for `TestBase`. All classes here should |
| strictly inherit only from `object` |
| """ |
| |
| |
| class CoordinateAssertionsMixin(object): |
| def assert_coord_bp_set( |
| self, breakpoint_expr, x, y=None, z=None, kernel_type='kernel' |
| ): |
| ''' |
| Assert that a breakpoint conditional on a given coordinate is confirmed |
| by the renderscript breakpoint resolver. |
| This does not assert test the breakpoint is hit, only registered. |
| breakpoint_expr: the expression (e.g. the name of a function, or a |
| file and line). |
| kernel_type: The breakpoint resolver to use: |
| (reduction|kernel|scriptgroup) |
| default='kernel' |
| x: x coordinate: required |
| y, z: optional y, and z coordinates |
| ''' |
| |
| y = 0 if z is not None and y is None else y |
| coord_text = ','.join(map(str, filter(lambda p: p is not None, (x, y, z)))) |
| self.try_command( |
| 'language renderscript %s breakpoint set %s -c %s' % ( |
| kernel_type, breakpoint_expr, coord_text |
| ), |
| [r'Breakpoint(s) created'], |
| expected_regex=[ |
| r'Conditional kernel breakpoint on coordinate.+%d,\s*%d,\s*%d' % ( |
| x or 0, y or 0, z or 0 |
| ) |
| ] |
| ) |
| |
| def assert_coord_stop( |
| self, soname, func_name, x, y=None, z=None, stopped=True |
| ): |
| '''Run lldb commands to check that coordinates match expected values. |
| |
| Args: |
| (x, y, z): The expected coordinates. |
| soname: The name of the renderscript script module e.g. 'allocs' |
| for librs.allocs.so |
| func_name: String that is the name of the kernel function |
| |
| Raises: |
| TestFail: One of the lldb commands did not provide the expected |
| output. |
| ''' |
| |
| if stopped: |
| self.try_command( |
| 'process continue', |
| expected_regex=[ |
| r'resuming', |
| r'Process \d+ stopped', |
| r'stop reason = breakpoint', |
| r'frame #0: (0x[0-9a-fA-F]+ )?librs.%s.so`%s' % ( |
| soname, func_name) |
| ] |
| ) |
| else: |
| self.try_command( |
| 'bt', |
| expected_regex=[ |
| 'stop reason = breakpoint', |
| 'frame #0:', |
| 'librs.*\.so`%s' % kernel |
| ] |
| ) |
| |
| self.try_command( |
| 'language renderscript kernel coordinate', |
| '(%d, %d, %d)' % (x, y or 0, z or 0) |
| ) |