'''Module that contains the test TestBreakpointCoordinate.'''

from harness.test_base_remote import TestBaseRemote


class TestBreakpointCoordinate(TestBaseRemote):
    '''Tests breaking on a specific kernel invocation.

    Uses the -c option to specify the coordinate.
    '''

    def get_bundle_target(self):
        '''Return string with name of bundle executable to run.

        Returns:
            A string containing the name of the binary that this test can be run
            with.
        '''
        return 'Allocations'

    def test_setup(self, android):
        '''This test requires to be run on one thread.

        Args:
            android: The android_util module.
        '''
        android.push_prop('debug.rs.max-threads', 1)

    def test_shutdown(self, android):
        '''Reset the number of RS threads to the previous value.

        Args:
            android: The android_util module.
        '''
        android.pop_prop('debug.rs.max-threads')

    def _check_coordinates(self, (x_coord, y_coord, z_coord), kernel):
        '''Run lldb commands to check that coordinates match expected values.

        Args:
            (x_coord, y_coord, z_coord): The expected coordinates.
            kernel: String that is the name of the kernel function.

        Raises:
            TestFail: One of the lldb commands did not provide the expected
                      output.
        '''
        self.try_command('bt',
                         ['stop reason = breakpoint',
                          'frame #0:',
                          'librs.allocs.so`%s' % kernel])

        self.try_command('language renderscript kernel coordinate',
                         ['Coordinate: (%d, %d, %d)'
                          % (x_coord, y_coord, z_coord)])

    def test_case(self, wimpy):
        '''Run the lldb commands that are being tested.

        Args:
            wimpy: Boolean to specify whether only a subset of the commands in
                   this test should be executed.

        Raises:
            TestFail: One of the lldb commands did not provide the expected
                      output.
        '''
        # pylint: disable=line-too-long
        if not wimpy:
            # Test conditional coordinate in a two dimensions
            self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 3,7',
                             ['Conditional kernel breakpoint on coordinate 3, 7, 0',
                              'Breakpoint(s) created'])

            # We will delete this breakpoint before we hit it.
            self.try_command('language renderscript kernel breakpoint set swizzle_kernel -c 199,199',
                            ['Conditional kernel breakpoint on coordinate 199, 199, 0',
                             'Breakpoint(s) created'])

            self.try_command('process continue',
                             ['resuming',
                              'stopped',
                              'stop reason = breakpoint'])

            self._check_coordinates((3, 7, 0), 'swizzle_kernel')

            # Check breakpoints that have been hit are disabled
            self.try_command('breakpoint list',
                             ["1: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1 Options: disabled",
                              "2: RenderScript kernel breakpoint for 'swizzle_kernel', locations = 1, resolved = 1"])

            # Delete breakpoint on 199,199,0
            self.try_command('breakpoint delete 2',
                             ['1 breakpoints deleted'])

            # Test conditional coordinate in a single dimension
            self.try_command('language renderscript kernel breakpoint set square_kernel -c 8',
                            ['Conditional kernel breakpoint on coordinate 8, 0, 0',
                             'Breakpoint(s) created'])

            self.try_command('process continue',
                             ['resuming',
                              'stopped',
                              'stop reason = breakpoint'])

            self._check_coordinates((8, 0, 0), 'square_kernel')

        # Test conditional coordinate in three dimensions
        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,0,1',
                        ['Conditional kernel breakpoint on coordinate 0, 0, 1',
                         'Breakpoint(s) created'])

        # Test we can set more than one conditional kernel breakpoint and both
        # will be hit
        self.try_command('language renderscript kernel breakpoint set add_half_kernel -c 0,1,2',
                        ['Conditional kernel breakpoint on coordinate 0, 1, 2',
                         'Breakpoint(s) created'])

        self.try_command('process continue',
                         ['resuming',
                          'stopped',
                          'stop reason = breakpoint'])

        self._check_coordinates((0, 0, 1), 'add_half_kernel')

        self.try_command('process continue',
                         ['resuming',
                          'stopped',
                          'stop reason = breakpoint'])

        self._check_coordinates((0, 1, 2), 'add_half_kernel')

        # Check we can see the coordinate from a function invoked by the kernel
        self.try_command('break set -n half_helper',
                         ['librs.allocs.so`half_helper'])

        self.try_command('process continue',
                         ['resuming',
                          'stopped',
                          'stop reason = breakpoint'])

        self._check_coordinates((0, 1, 2), 'half_helper')

        # Delete helper function breakpoint
        if wimpy:
            self.try_command('breakpoint delete 3',
                             ['1 breakpoints deleted'])
        else:
            self.try_command('breakpoint delete 6',
                             ['1 breakpoints deleted'])

        # Check our delete breakpoints have been removed
        if wimpy:
            self.try_command('breakpoint list',
                             ["1: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled",
                              "2: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled"])
        else:
            # Delete breakpoint which has already been disabled
            self.try_command('breakpoint delete 1',
                             ['1 breakpoints deleted'])

            self.try_command('breakpoint list',
                             ["3: RenderScript kernel breakpoint for 'square_kernel', locations = 1 Options: disabled",
                              "4: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled",
                              "5: RenderScript kernel breakpoint for 'add_half_kernel', locations = 1 Options: disabled"])
