| """ | |
| Test lldb-dap source request | |
| """ | |
| import os | |
| import lldbdap_testcase | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| class TestDAP_source(lldbdap_testcase.DAPTestCaseBase): | |
| @skipIfWindows | |
| def test_source(self): | |
| """ | |
| Tests the 'source' packet. | |
| """ | |
| program = self.getBuildArtifact("a.out") | |
| self.build_and_launch(program) | |
| source = self.getSourcePath("main.c") | |
| breakpoint_line = line_number(source, "breakpoint") | |
| lines = [breakpoint_line] | |
| breakpoint_ids = self.set_source_breakpoints(source, lines) | |
| self.assertEqual( | |
| len(breakpoint_ids), len(lines), "expect correct number of breakpoints" | |
| ) | |
| self.continue_to_breakpoints(breakpoint_ids) | |
| response = self.dap_server.request_source(sourceReference=0) | |
| self.assertFalse(response["success"], "verify invalid sourceReference fails") | |
| # Check only source reference in the arguments field. | |
| response = self.dap_server.request_custom("source", {"sourceReference": 0}) | |
| self.assertFalse(response["success"], "expected failed response") | |
| error_format = self.get_dict_value(response, ["body", "error", "format"]) | |
| self.assertIn("unknown source reference", error_format) | |
| (stackFrames, totalFrames) = self.get_stackFrames_and_totalFramesCount() | |
| frameCount = len(stackFrames) | |
| self.assertGreaterEqual(frameCount, 3, "verify we got up to main at least") | |
| self.assertEqual( | |
| totalFrames, | |
| frameCount, | |
| "verify total frames returns a speculative page size", | |
| ) | |
| wantFrames = [ | |
| { | |
| "name": "handler", | |
| "line": 8, | |
| "source": { | |
| "name": "main.c", | |
| "path": source, | |
| "containsSourceReference": False, | |
| }, | |
| }, | |
| { | |
| "name": "add", | |
| "source": { | |
| "name": "add", | |
| "path": program + "`add", | |
| "containsSourceReference": True, | |
| }, | |
| }, | |
| { | |
| "name": "main", | |
| "line": 12, | |
| "source": { | |
| "name": "main.c", | |
| "path": source, | |
| "containsSourceReference": False, | |
| }, | |
| }, | |
| ] | |
| for idx, want in enumerate(wantFrames): | |
| got = stackFrames[idx] | |
| name = self.get_dict_value(got, ["name"]) | |
| self.assertEqual(name, want["name"]) | |
| if "line" in want: | |
| line = self.get_dict_value(got, ["line"]) | |
| self.assertEqual(line, want["line"]) | |
| wantSource = want["source"] | |
| source_name = self.get_dict_value(got, ["source", "name"]) | |
| self.assertEqual(source_name, wantSource["name"]) | |
| source_path = self.get_dict_value(got, ["source", "path"]) | |
| self.assertEqual(source_path, wantSource["path"]) | |
| if wantSource["containsSourceReference"]: | |
| sourceReference = self.get_dict_value( | |
| got, ["source", "sourceReference"] | |
| ) | |
| response = self.dap_server.request_source( | |
| sourceReference=sourceReference | |
| ) | |
| self.assertTrue(response["success"]) | |
| self.assertGreater( | |
| len(self.get_dict_value(response, ["body", "content"])), | |
| 0, | |
| "verify content returned disassembly", | |
| ) | |
| self.assertEqual( | |
| self.get_dict_value(response, ["body", "mimeType"]), | |
| "text/x-lldb.disassembly", | |
| "verify mime type returned", | |
| ) | |
| else: | |
| self.assertNotIn("sourceReference", got["source"]) |