""" 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") (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"])