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