xref: /llvm-project/lldb/test/API/api/listeners/TestListener.py (revision 2e7aa2ee34eb53347396731dc8a3b2dbc6a3df45)
1"""
2Test that we can listen to modules loaded events.
3"""
4
5import lldb
6from lldbsuite.test.decorators import *
7from lldbsuite.test.lldbtest import *
8from lldbsuite.test import lldbutil
9
10
11class ListenToModuleLoadedEvents(TestBase):
12    NO_DEBUG_INFO_TESTCASE = True
13
14    def test_clearing_listener(self):
15        """Make sure we also clear listerers from the hook up for event type manager"""
16        self.build()
17
18        my_first_listener = lldb.SBListener("bonus_listener")
19        my_listener = lldb.SBListener("test_listener")
20        my_third_listener = lldb.SBListener("extra_bonus_listener")
21
22        my_listener.StartListeningForEventClass(
23            self.dbg,
24            lldb.SBTarget.GetBroadcasterClassName(),
25            lldb.SBTarget.eBroadcastBitBreakpointChanged,
26        )
27        my_first_listener.StartListeningForEventClass(
28            self.dbg,
29            lldb.SBTarget.GetBroadcasterClassName(),
30            lldb.SBTarget.eBroadcastBitWatchpointChanged,
31        )
32        my_third_listener.StartListeningForEventClass(
33            self.dbg,
34            lldb.SBTarget.GetBroadcasterClassName(),
35            lldb.SBTarget.eBroadcastBitModulesUnloaded,
36        )
37
38        my_listener.Clear()
39
40        target = self.createTestTarget()
41
42        bkpt = target.BreakpointCreateByName("main")
43
44        event = lldb.SBEvent()
45        my_listener.WaitForEvent(1, event)
46        self.assertTrue(
47            not event.IsValid(), "We don't get events we aren't listening to."
48        )
49
50    def test_receiving_breakpoint_added_from_debugger(self):
51        """Test that we get breakpoint added events, waiting on event classes on the debugger"""
52        self.build()
53
54        my_listener = lldb.SBListener("test_listener")
55        my_listener.StartListeningForEventClass(
56            self.dbg,
57            lldb.SBTarget.GetBroadcasterClassName(),
58            lldb.SBTarget.eBroadcastBitBreakpointChanged,
59        )
60
61        target = self.createTestTarget()
62
63        bkpt = target.BreakpointCreateByName("main")
64
65        event = lldb.SBEvent()
66        my_listener.WaitForEvent(1, event)
67
68        self.assertTrue(event.IsValid(), "Got a valid event.")
69        self.assertTrue(
70            lldb.SBBreakpoint.EventIsBreakpointEvent(event), "It is a breakpoint event."
71        )
72        self.assertEqual(
73            lldb.SBBreakpoint.GetBreakpointEventTypeFromEvent(event),
74            lldb.eBreakpointEventTypeAdded,
75            "It is a breakpoint added event.",
76        )
77        self.assertEqual(
78            bkpt,
79            lldb.SBBreakpoint.GetBreakpointFromEvent(event),
80            "It is our breakpoint.",
81        )
82
83        # Now make sure if we stop listening for events we don't get them:
84        my_listener.StopListeningForEventClass(
85            self.dbg,
86            lldb.SBTarget.GetBroadcasterClassName(),
87            lldb.SBTarget.eBroadcastBitBreakpointChanged,
88        )
89        my_listener.StopListeningForEvents(
90            target.GetBroadcaster(), lldb.SBTarget.eBroadcastBitBreakpointChanged
91        )
92
93        bkpt2 = target.BreakpointCreateByName("main")
94        my_listener.WaitForEvent(1, event)
95        self.assertTrue(
96            not event.IsValid(), "We don't get events we aren't listening to."
97        )
98
99    def test_recieving_breakpoint_added_from_target(self):
100        """Test that we get breakpoint added events, waiting on event classes on the debugger"""
101        self.build()
102
103        my_listener = lldb.SBListener("test_listener")
104        my_listener.StartListeningForEventClass(
105            self.dbg,
106            lldb.SBTarget.GetBroadcasterClassName(),
107            lldb.SBTarget.eBroadcastBitBreakpointChanged,
108        )
109
110        target = self.createTestTarget()
111        result = target.GetBroadcaster().AddListener(
112            my_listener, lldb.SBTarget.eBroadcastBitBreakpointChanged
113        )
114        self.assertEqual(
115            result, lldb.SBTarget.eBroadcastBitBreakpointChanged, "Got our bit"
116        )
117
118        bkpt = target.BreakpointCreateByName("main")
119
120        event = lldb.SBEvent()
121        my_listener.WaitForEvent(1, event)
122
123        self.assertTrue(event.IsValid(), "Got a valid event.")
124        self.assertTrue(
125            lldb.SBBreakpoint.EventIsBreakpointEvent(event), "It is a breakpoint event."
126        )
127        self.assertEqual(
128            lldb.SBBreakpoint.GetBreakpointEventTypeFromEvent(event),
129            lldb.eBreakpointEventTypeAdded,
130            "It is a breakpoint added event.",
131        )
132        self.assertEqual(
133            bkpt,
134            lldb.SBBreakpoint.GetBreakpointFromEvent(event),
135            "It is our breakpoint.",
136        )
137
138        # Now make sure if we stop listening for events we don't get them:
139        target.GetBroadcaster().RemoveListener(my_listener)
140
141        bkpt2 = target.BreakpointCreateByName("main")
142        my_listener.WaitForEvent(1, event)
143        self.assertTrue(
144            not event.IsValid(), "We don't get events we aren't listening to."
145        )
146