================
@@ -2,88 +2,94 @@
 Test lldb-dap module request
 """
 
-from lldbsuite.test.decorators import *
-from lldbsuite.test.lldbtest import *
-import lldbdap_testcase
+import platform
 import re
 
+from lldbsuite.test.decorators import skipIfWindows, skipUnlessDarwin
+from lldbsuite.test.lldbtest import line_number
+from lldbsuite.test.tools.lldb_dap.dap_types import (
+    CompileUnitsArgs,
+    LaunchArgs,
+    ModuleEvent,
+    ModuleReason,
+)
+from lldbsuite.test.tools.lldb_dap.lldb_dap_testcase import DAPTestCaseBase
 
-@skipIfTargetDoesNotSupportSharedLibraries()
-class TestDAP_module(lldbdap_testcase.DAPTestCaseBase):
-    def run_test(self, symbol_basename, expect_debug_info_size):
+
+class TestDAP_module(DAPTestCaseBase):
+    def run_test(self, symbol_basename: str, expect_debug_info_size: bool):
+        session = self.build_and_create_session()
         program_basename = "a.out.stripped"
         program = self.getBuildArtifact(program_basename)
-        self.build_and_launch(program)
-        functions = ["foo"]
 
-        # This breakpoint will be resolved only when the libfoo module is 
loaded
-        breakpoint_ids = self.set_function_breakpoints(
-            functions, wait_for_resolve=False
-        )
-        self.assertEqual(len(breakpoint_ids), len(functions), "expect one 
breakpoint")
-        self.continue_to_breakpoints(breakpoint_ids)
-        active_modules = self.dap_server.get_modules()
+        with session.configure(LaunchArgs(program)) as ctx:
+            # This breakpoint will be resolved only when the libfoo module is 
loaded.
+            breakpoints = 
session.set_function_breakpoints(["foo"]).body.breakpoints
+            self.assertEqual(len(breakpoints), 1, "expect one breakpoint.")
+            foo_bp_id = self.expect_not_none(breakpoints[0].id)
+
+        session.verify_stopped_on_breakpoint(foo_bp_id, 
after=ctx.process_event)
+        active_modules = session.get_modules()
         program_module = active_modules[program_basename]
         self.assertIn(
             program_basename,
             active_modules,
-            "%s module is in active modules" % (program_basename),
+            f"{program_basename} module is in active modules",
         )
-        self.assertIn("name", program_module, "make sure name is in module")
-        self.assertEqual(program_basename, program_module["name"])
-        self.assertIn("path", program_module, "make sure path is in module")
-        self.assertEqual(program, program_module["path"])
-        self.assertNotIn(
-            "symbolFilePath",
-            program_module,
-            "Make sure a.out.stripped has no debug info",
+        self.assertEqual(program_basename, program_module.name)
+        self.assertIsNotNone(program_module.path, "make sure path is in 
module")
+        self.assertEqual(program, program_module.path)
+        self.assertIsNone(
+            program_module.symbolFilePath, "Make sure a.out.stripped has no 
debug info"
         )
         symbols_path = self.getBuildArtifact(symbol_basename)
-        self.dap_server.request_evaluate(
-            "`%s" % ('target symbols add -s "%s" "%s"' % (program, 
symbols_path)),
-            context="repl",
+        event_before_mod_change = session.last_event()
+        session.evaluate(
+            f'''`target symbols add -s "{program}" "{symbols_path}"''', 
context="repl"
         )
 
-        def check_symbols_loaded_with_size():
-            active_modules = self.dap_server.get_modules()
-            program_module = active_modules[program_basename]
-            self.assertIn("symbolFilePath", program_module)
-            self.assertIn(symbols_path, program_module["symbolFilePath"])
-            size_regex = re.compile(r"[0-9]+(\.[0-9]*)?[KMG]?B")
-            return size_regex.match(program_module["debugInfoSize"])
+        # Make sure we got an update event for the program module when the
+        # symbols got added.
+        changed_event = session.verify_next_module_event(
+            ModuleReason.CHANGED, after=event_before_mod_change
+        )
+        changed_module = changed_event.body.module
+        self.assertEqual(program_module.name, changed_module.name)
+        self.assertIsNotNone(changed_module.symbolFilePath)
+        changed_symbols_path = 
self.expect_not_none(changed_module.symbolFilePath)
+        self.assertIn(symbols_path, changed_symbols_path)
 
         if expect_debug_info_size:
-            self.assertTrue(
-                self.wait_until(check_symbols_loaded_with_size),
-                "expect has debug info size",
+            changed_debug_size = 
self.expect_not_none(changed_module.debugInfoSize)
+            size_regex = re.compile(r"[0-9]+(\.[0-9]*)?[KMG]?B")
+            self.assertRegex(
+                changed_debug_size, size_regex, "expect has debug info size"
             )
 
-        active_modules = self.dap_server.get_modules()
+        active_modules = session.get_modules()
         program_module = active_modules[program_basename]
-        self.assertEqual(program_basename, program_module["name"])
-        self.assertEqual(program, program_module["path"])
-        self.assertIn("addressRange", program_module)
-
-        # Collect all the module names we saw as events.
-        module_new_names = []
-        module_changed_names = []
-        for module_event in self.dap_server.wait_for_module_events():
-            reason = module_event["body"]["reason"]
-            if reason == "new":
-                module_new_names.append(module_event["body"]["module"]["name"])
-            elif reason == "changed":
-                
module_changed_names.append(module_event["body"]["module"]["name"])
+        self.assertEqual(program_basename, program_module.name)
+        self.assertEqual(program, program_module.path)
+        self.assertIsNotNone(program_module.addressRange)
+
+        # Collect all the modules added before we changed the program module.
+        new_module_names = []
+
+        def seen_module_changed_event(event: ModuleEvent):
+            if event.body.reason == ModuleReason.NEW:
+                new_module_names.append(event.body.module.name)
+
+            return event.seq == changed_event.seq
+
+        init_resp = ctx.init_response
+        session.wait_for_module_event(after=init_resp, 
until=seen_module_changed_event)
 
         # Make sure we got an event for every active module.
-        self.assertNotEqual(len(module_new_names), 0)
+        self.assertNotEqual(len(new_module_names), 0)
         for module in active_modules:
-            self.assertIn(module, module_new_names)
+            self.assertIn(module, new_module_names)
 
-        # Make sure we got an update event for the program module when the
-        # symbols got added.
-        self.assertNotEqual(len(module_changed_names), 0)
-        self.assertIn(program_module["name"], module_changed_names)
----------------
da-viper wrote:

It is above. we can now check for the module event immediately after adding the 
symbols. 

https://github.com/da-viper/llvm-project/blob/1760c25edb6d79ded84d5d8a433d67987f09a3eb/lldb/test/API/tools/lldb-dap/module/TestDAP_module.py#L51-L57

https://github.com/llvm/llvm-project/pull/207869
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to