1d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea"""Test the lldb public C++ api breakpoint callbacks.  """
2d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
3d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaimport os, re, StringIO
4d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaimport unittest2
5d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleafrom lldbtest import *
6d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaimport lldbutil
7d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaimport subprocess
8d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
9d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaclass SBBreakpointCallbackCase(TestBase):
10d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
11d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    mydir = os.path.join("api", "multithreaded")
12d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
13d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def setUp(self):
14d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        TestBase.setUp(self)
15d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.lib_dir = os.environ["LLDB_LIB_DIR"]
16d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.inferior = 'inferior_program'
17d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        if self.getArchitecture() != "i386":
18d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea          self.buildProgram('inferior.cpp', self.inferior)
19d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea          self.addTearDownHook(lambda: os.remove(self.inferior))
20d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
210440b1115c17608233595090148d02124d61d170Daniel Malea    @unittest2.expectedFailure # llvm.org/pr16000: SBBreakpoint.SetCallback() does nothing
22d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    @skipIfi386
23156d8e04b9434923ab8e1bf9d3e81c0e71fccd36Daniel Malea    @skipIfLinuxClang # buildbot clang version unable to use libstdc++ with c++11
24d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def test_breakpoint_callback(self):
25d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        """Test the that SBBreakpoint callback is invoked when a breakpoint is hit. """
26d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.build_and_test('driver.cpp test_breakpoint_callback.cpp',
27d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                            'test_breakpoint_callback')
28d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
29d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    @skipIfi386
30156d8e04b9434923ab8e1bf9d3e81c0e71fccd36Daniel Malea    @skipIfLinuxClang # buildbot clang version unable to use libstdc++ with c++11
31d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def test_sb_api_listener_event_description(self):
32d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        """ Test the description of an SBListener breakpoint event is valid."""
33d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.build_and_test('driver.cpp listener_test.cpp test_listener_event_description.cpp',
34d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                            'test_listener_event_description')
35d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        pass
36d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
37d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    @skipIfi386
38156d8e04b9434923ab8e1bf9d3e81c0e71fccd36Daniel Malea    @skipIfLinuxClang # buildbot clang version unable to use libstdc++ with c++11
39d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def test_sb_api_listener_event_process_state(self):
40d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        """ Test that a registered SBListener receives events when a process
41d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea            changes state.
42d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        """
43d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.build_and_test('driver.cpp listener_test.cpp test_listener_event_process_state.cpp',
44d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                            'test_listener_event_process_state')
45d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        pass
46d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
47d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
48d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    @skipIfi386
49156d8e04b9434923ab8e1bf9d3e81c0e71fccd36Daniel Malea    @skipIfLinuxClang # buildbot clang version unable to use libstdc++ with c++11
500440b1115c17608233595090148d02124d61d170Daniel Malea    @skipIfLinux # llvm.org/pr16016 assertion failure in ProcessPOSIX.cpp.
51d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def test_sb_api_listener_resume(self):
52d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        """ Test that a process can be resumed from a non-main thread. """
53d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.build_and_test('driver.cpp listener_test.cpp test_listener_resume.cpp',
54d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea                            'test_listener_resume')
55d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        pass
56d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
57d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def build_and_test(self, sources, test_name, args = None):
58d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        """ Build LLDB test from sources, and run expecting 0 exit code """
59d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        self.buildDriver(sources, test_name)
60bd58742be3a38e7f272765ae43dc3061d209dc06Jim Ingham        self.addTearDownHook(lambda: os.remove(test_name))
61d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
62d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        exe = [os.path.join(os.getcwd(), test_name), self.inferior]
63d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
64d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        if self.TraceOn():
65d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea            print "Running test %s" % " ".join(exe)
66d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
67d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        check_call(exe, env={self.dylibPath : self.getLLDBLibraryEnvVal()})
68d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
69d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
70d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
71d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    def build_program(self, sources, program):
72d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea        return self.buildDriver(sources, program)
73d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea
74d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Maleaif __name__ == '__main__':
75d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    import atexit
76d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    lldb.SBDebugger.Initialize()
77d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    atexit.register(lambda: lldb.SBDebugger.Terminate())
78d2771ed2249c645019b7b1e46bdd677d2ed1cfe1Daniel Malea    unittest2.main()
79