diff options
-rw-r--r-- | lldb/test/python_api/event/Makefile | 5 | ||||
-rw-r--r-- | lldb/test/python_api/event/TestEvents.py | 100 | ||||
-rw-r--r-- | lldb/test/python_api/event/main.c | 49 |
3 files changed, 154 insertions, 0 deletions
diff --git a/lldb/test/python_api/event/Makefile b/lldb/test/python_api/event/Makefile new file mode 100644 index 00000000000..0d70f259501 --- /dev/null +++ b/lldb/test/python_api/event/Makefile @@ -0,0 +1,5 @@ +LEVEL = ../../make + +C_SOURCES := main.c + +include $(LEVEL)/Makefile.rules diff --git a/lldb/test/python_api/event/TestEvents.py b/lldb/test/python_api/event/TestEvents.py new file mode 100644 index 00000000000..1b1962f866f --- /dev/null +++ b/lldb/test/python_api/event/TestEvents.py @@ -0,0 +1,100 @@ +""" +Test lldb Python event APIs. +""" + +import os, time +import re +import unittest2 +import lldb, lldbutil +from lldbtest import * + +class EventAPITestCase(TestBase): + + mydir = os.path.join("python_api", "event") + + @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") + @python_api_test + def test_with_dsym(self): + """Exercise SBEvent APIs.""" + self.buildDsym() + self.do_events() + + @python_api_test + def test_with_dwarf(self): + """Exercise SBEvent APIs.""" + self.buildDwarf() + self.do_events() + + def setUp(self): + # Call super's setUp(). + TestBase.setUp(self) + # Find the line number to of function 'c'. + self.line = line_number('main.c', '// Find the line number of function "c" here.') + + def do_events(self): + """Get the listener associated with the debugger and exercise some event APIs.""" + exe = os.path.join(os.getcwd(), "a.out") + + # Create a target by the debugger. + target = self.dbg.CreateTarget(exe) + self.assertTrue(target.IsValid(), VALID_TARGET) + + # Now create a breakpoint on main.c by name 'c'. + breakpoint = target.BreakpointCreateByName('c', 'a.out') + #print "breakpoint:", breakpoint + self.assertTrue(breakpoint.IsValid() and + breakpoint.GetNumLocations() == 1, + VALID_BREAKPOINT) + + # Now launch the process, and do not stop at entry point. + self.process = target.LaunchProcess([''], [''], os.ctermid(), 0, False) + + self.process = target.GetProcess() + self.assertTrue(self.process.IsValid(), PROCESS_IS_VALID) + + # Get a handle on the process's broadcaster. + broadcaster = self.process.GetBroadcaster() + self.assertTrue(broadcaster.IsValid(), "Process with valid broadcaster") + + # Create an empty event object. + event = lldb.SBEvent() + self.assertFalse(event.IsValid(), "Event should not be valid initially") + + # Get the debugger listenr. + listener = self.dbg.GetListener() + + # Create MyListeningThread to wait for any kind of event. + import threading + class MyListeningThread(threading.Thread): + def run(self): + print "Running MyListeningThread:", self + count = 0 + # Let's only try at most 3 times to retrieve any kind of event. + while not count > 3: + if listener.WaitForEvent(5, event): + print "Got a valid event:", event + print "Event type:", event.GetType() + print "Event broadcaster:", event.GetBroadcaster().GetName() + return + count = count + 1 + print "Timeout: listener.WaitForEvent" + + return + + # Let's start the listening thread before we launch the inferior process. + my_thread = MyListeningThread() + my_thread.start() + + # Use Python API to continue the process. The listening thread should be + # able to receive a state changed event. + self.process.Continue() + + my_thread.join() + self.assertTrue(event.IsValid()) + + +if __name__ == '__main__': + import atexit + lldb.SBDebugger.Initialize() + atexit.register(lambda: lldb.SBDebugger.Terminate()) + unittest2.main() diff --git a/lldb/test/python_api/event/main.c b/lldb/test/python_api/event/main.c new file mode 100644 index 00000000000..343526542d7 --- /dev/null +++ b/lldb/test/python_api/event/main.c @@ -0,0 +1,49 @@ +//===-- main.c --------------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include <stdio.h> + +// This simple program is to test the lldb Python API related to events. + +int a(int); +int b(int); +int c(int); + +int a(int val) +{ + if (val <= 1) + return b(val); + else if (val >= 3) + return c(val); + + return val; +} + +int b(int val) +{ + return c(val); +} + +int c(int val) +{ + return val + 3; // Find the line number of function "c" here. +} + +int main (int argc, char const *argv[]) +{ + int A1 = a(1); // a(1) -> b(1) -> c(1) + printf("a(1) returns %d\n", A1); + + int B2 = b(2); // b(2) -> c(2) + printf("b(2) returns %d\n", B2); + + int A3 = a(3); // a(3) -> c(3) + printf("a(3) returns %d\n", A3); + + return 0; +} |