brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.1 KiB · df029ca Raw
241 lines · python
1"""2Test lldb-dap dataBreakpointInfo and setDataBreakpoints requests3"""4 5from lldbsuite.test.decorators import *6from lldbsuite.test.lldbtest import *7import lldbdap_testcase8 9 10class TestDAP_setDataBreakpoints(lldbdap_testcase.DAPTestCaseBase):11    def setUp(self):12        lldbdap_testcase.DAPTestCaseBase.setUp(self)13        self.accessTypes = ["read", "write", "readWrite"]14 15    @skipIfWindows16    def test_duplicate_start_addresses(self):17        """Test setDataBreakpoints with multiple watchpoints starting at the same addresses."""18        program = self.getBuildArtifact("a.out")19        self.build_and_launch(program)20        source = "main.cpp"21        first_loop_break_line = line_number(source, "// first loop breakpoint")22        self.set_source_breakpoints(source, [first_loop_break_line])23        self.continue_to_next_stop()24        self.dap_server.get_stackFrame()25        # Test setting write watchpoint using expressions: &x, arr+226        response_x = self.dap_server.request_dataBreakpointInfo(0, "&x")27        response_arr_2 = self.dap_server.request_dataBreakpointInfo(0, "arr+2")28        # Test response from dataBreakpointInfo request.29        self.assertEqual(response_x["body"]["dataId"].split("/")[1], "4")30        self.assertEqual(response_x["body"]["accessTypes"], self.accessTypes)31        self.assertEqual(response_arr_2["body"]["dataId"].split("/")[1], "4")32        self.assertEqual(response_arr_2["body"]["accessTypes"], self.accessTypes)33        # The first one should be overwritten by the third one as they start at34        # the same address. This is indicated by returning {verified: False} for35        # the first one.36        dataBreakpoints = [37            {"dataId": response_x["body"]["dataId"], "accessType": "read"},38            {"dataId": response_arr_2["body"]["dataId"], "accessType": "write"},39            {"dataId": response_x["body"]["dataId"], "accessType": "write"},40        ]41        set_response = self.dap_server.request_setDataBreakpoint(dataBreakpoints)42        breakpoints = set_response["body"]["breakpoints"]43        self.assertEqual(len(breakpoints), 3)44        self.assertFalse(breakpoints[0]["verified"])45        self.assertTrue(breakpoints[1]["verified"])46        self.assertTrue(breakpoints[2]["verified"])47 48        self.dap_server.request_continue()49        self.verify_breakpoint_hit([breakpoints[2]["id"]])50        x_val = self.dap_server.get_local_variable_value("x")51        i_val = self.dap_server.get_local_variable_value("i")52        self.assertEqual(x_val, "2")53        self.assertEqual(i_val, "1")54 55        self.dap_server.request_continue()56        self.verify_breakpoint_hit([breakpoints[1]["id"]])57        arr_2 = self.dap_server.get_local_variable_child("arr", "[2]")58        i_val = self.dap_server.get_local_variable_value("i")59        self.assertEqual(arr_2["value"], "42")60        self.assertEqual(i_val, "2")61 62    @skipIfWindows63    def test_expression(self):64        """Tests setting data breakpoints on expression."""65        program = self.getBuildArtifact("a.out")66        self.build_and_launch(program)67        source = "main.cpp"68        first_loop_break_line = line_number(source, "// first loop breakpoint")69        self.set_source_breakpoints(source, [first_loop_break_line])70        self.continue_to_next_stop()71        self.dap_server.get_stackFrame()72        # Test setting write watchpoint using expressions: &x, arr+273        response_x = self.dap_server.request_dataBreakpointInfo(0, "&x")74        response_arr_2 = self.dap_server.request_dataBreakpointInfo(0, "arr+2")75        # Test response from dataBreakpointInfo request.76        self.assertEqual(response_x["body"]["dataId"].split("/")[1], "4")77        self.assertEqual(response_x["body"]["accessTypes"], self.accessTypes)78        self.assertEqual(response_arr_2["body"]["dataId"].split("/")[1], "4")79        self.assertEqual(response_arr_2["body"]["accessTypes"], self.accessTypes)80        dataBreakpoints = [81            {"dataId": response_x["body"]["dataId"], "accessType": "write"},82            {"dataId": response_arr_2["body"]["dataId"], "accessType": "write"},83        ]84        set_response = self.dap_server.request_setDataBreakpoint(dataBreakpoints)85        breakpoints = set_response["body"]["breakpoints"]86        self.assertEqual(len(breakpoints), 2)87        self.assertTrue(breakpoints[0]["verified"])88        self.assertTrue(breakpoints[1]["verified"])89 90        self.dap_server.request_continue()91        self.verify_breakpoint_hit([breakpoints[0]["id"]])92        x_val = self.dap_server.get_local_variable_value("x")93        i_val = self.dap_server.get_local_variable_value("i")94        self.assertEqual(x_val, "2")95        self.assertEqual(i_val, "1")96 97        self.dap_server.request_continue()98        self.verify_breakpoint_hit([breakpoints[1]["id"]])99        arr_2 = self.dap_server.get_local_variable_child("arr", "[2]")100        i_val = self.dap_server.get_local_variable_value("i")101        self.assertEqual(arr_2["value"], "42")102        self.assertEqual(i_val, "2")103 104    @skipIfWindows105    def test_functionality(self):106        """Tests setting data breakpoints on variable."""107        program = self.getBuildArtifact("a.out")108        self.build_and_launch(program)109        source = "main.cpp"110        first_loop_break_line = line_number(source, "// first loop breakpoint")111        self.set_source_breakpoints(source, [first_loop_break_line])112        self.continue_to_next_stop()113        self.dap_server.get_local_variables()114        # Test write watchpoints on x, arr[2]115        response_x = self.dap_server.request_dataBreakpointInfo(1, "x")116        arr = self.dap_server.get_local_variable("arr")117        response_arr_2 = self.dap_server.request_dataBreakpointInfo(118            arr["variablesReference"], "[2]"119        )120 121        # Test response from dataBreakpointInfo request.122        self.assertEqual(response_x["body"]["dataId"].split("/")[1], "4")123        self.assertEqual(response_x["body"]["accessTypes"], self.accessTypes)124        self.assertEqual(response_arr_2["body"]["dataId"].split("/")[1], "4")125        self.assertEqual(response_arr_2["body"]["accessTypes"], self.accessTypes)126        dataBreakpoints = [127            {"dataId": response_x["body"]["dataId"], "accessType": "write"},128            {"dataId": response_arr_2["body"]["dataId"], "accessType": "write"},129        ]130        set_response = self.dap_server.request_setDataBreakpoint(dataBreakpoints)131        breakpoints = set_response["body"]["breakpoints"]132        self.assertEqual(len(breakpoints), 2)133        self.assertTrue(breakpoints[0]["verified"])134        self.assertTrue(breakpoints[1]["verified"])135 136        self.dap_server.request_continue()137        self.verify_breakpoint_hit([breakpoints[0]["id"]])138        x_val = self.dap_server.get_local_variable_value("x")139        i_val = self.dap_server.get_local_variable_value("i")140        self.assertEqual(x_val, "2")141        self.assertEqual(i_val, "1")142 143        self.dap_server.request_continue()144        self.verify_breakpoint_hit([breakpoints[1]["id"]])145        arr_2 = self.dap_server.get_local_variable_child("arr", "[2]")146        i_val = self.dap_server.get_local_variable_value("i")147        self.assertEqual(arr_2["value"], "42")148        self.assertEqual(i_val, "2")149        self.dap_server.request_setDataBreakpoint([])150 151        # Test hit condition152        second_loop_break_line = line_number(source, "// second loop breakpoint")153        breakpoint_ids = self.set_source_breakpoints(source, [second_loop_break_line])154        self.continue_to_breakpoints(breakpoint_ids)155        dataBreakpoints = [156            {157                "dataId": response_x["body"]["dataId"],158                "accessType": "write",159                "hitCondition": "2",160            }161        ]162        set_response = self.dap_server.request_setDataBreakpoint(dataBreakpoints)163        breakpoints = set_response["body"]["breakpoints"]164        self.assertEqual(len(breakpoints), 1)165        self.assertTrue(breakpoints[0]["verified"])166        self.dap_server.request_continue()167        self.verify_breakpoint_hit([breakpoints[0]["id"]])168        x_val = self.dap_server.get_local_variable_value("x")169        self.assertEqual(x_val, "3")170 171        # Test condition172        dataBreakpoints = [173            {174                "dataId": response_x["body"]["dataId"],175                "accessType": "write",176                "condition": "x==10",177            }178        ]179        set_response = self.dap_server.request_setDataBreakpoint(dataBreakpoints)180        breakpoints = set_response["body"]["breakpoints"]181        self.assertEqual(len(breakpoints), 1)182        self.assertTrue(breakpoints[0]["verified"])183        self.dap_server.request_continue()184        self.verify_breakpoint_hit([breakpoints[0]["id"]])185        x_val = self.dap_server.get_local_variable_value("x")186        self.assertEqual(x_val, "10")187 188    @skipIfWindows189    def test_bytes(self):190        """Tests setting data breakpoints on memory range."""191        program = self.getBuildArtifact("a.out")192        self.build_and_launch(program)193        source = "main.cpp"194        first_loop_break_line = line_number(source, "// first loop breakpoint")195        self.set_source_breakpoints(source, [first_loop_break_line])196        self.continue_to_next_stop()197        # Test write watchpoints on x, arr[2]198        x = self.dap_server.get_local_variable("x")199        response_x = self.dap_server.request_dataBreakpointInfo(200            0, x["memoryReference"], 4201        )202        arr_2 = self.dap_server.get_local_variable_child("arr", "[2]")203        response_arr_2 = self.dap_server.request_dataBreakpointInfo(204            0, arr_2["memoryReference"], 4205        )206 207        # Test response from dataBreakpointInfo request.208        self.assertEqual(209            response_x["body"]["dataId"].split("/"), [x["memoryReference"][2:], "4"]210        )211        self.assertEqual(response_x["body"]["accessTypes"], self.accessTypes)212        self.assertEqual(213            response_arr_2["body"]["dataId"].split("/"),214            [arr_2["memoryReference"][2:], "4"],215        )216        self.assertEqual(response_arr_2["body"]["accessTypes"], self.accessTypes)217        dataBreakpoints = [218            {"dataId": response_x["body"]["dataId"], "accessType": "write"},219            {"dataId": response_arr_2["body"]["dataId"], "accessType": "write"},220        ]221        set_response = self.dap_server.request_setDataBreakpoint(dataBreakpoints)222        breakpoints = set_response["body"]["breakpoints"]223        self.assertEqual(len(breakpoints), 2)224        self.assertTrue(breakpoints[0]["verified"])225        self.assertTrue(breakpoints[1]["verified"])226 227        self.dap_server.request_continue()228        self.verify_breakpoint_hit([breakpoints[0]["id"]])229        x_val = self.dap_server.get_local_variable_value("x")230        i_val = self.dap_server.get_local_variable_value("i")231        self.assertEqual(x_val, "2")232        self.assertEqual(i_val, "1")233 234        self.dap_server.request_continue()235        self.verify_breakpoint_hit([breakpoints[1]["id"]])236        arr_2 = self.dap_server.get_local_variable_child("arr", "[2]")237        i_val = self.dap_server.get_local_variable_value("i")238        self.assertEqual(arr_2["value"], "42")239        self.assertEqual(i_val, "2")240        self.dap_server.request_setDataBreakpoint([])241