1"""Test for the JITLoaderGDB interface"""
2
3
4import unittest2
5import os
6import lldb
7from lldbsuite.test import lldbutil
8from lldbsuite.test.decorators import *
9from lldbsuite.test.lldbtest import *
10
11
12class JITLoaderGDBTestCase(TestBase):
13
14    @skipTestIfFn(
15        lambda: "Skipped because the test crashes the test runner",
16        bugnumber="llvm.org/pr24702")
17    @expectedFailure("llvm.org/pr24702")
18    def test_bogus_values(self):
19        """Test that we handle inferior misusing the GDB JIT interface"""
20        self.build()
21        exe = self.getBuildArtifact("a.out")
22
23        # Create a target by the debugger.
24        target = self.dbg.CreateTarget(exe)
25        self.assertTrue(target, VALID_TARGET)
26
27        # Launch the process, do not stop at entry point.
28        process = target.LaunchSimple(
29            None, None, self.get_process_working_directory())
30        self.assertTrue(process, PROCESS_IS_VALID)
31
32        # The inferior will now pass bogus values over the interface. Make sure
33        # we don't crash.
34        self.assertState(process.GetState(), lldb.eStateExited)
35        self.assertEqual(process.GetExitStatus(), 0)
36
37    def gen_log_file(self):
38        logfile = self.getBuildArtifact("jitintgdb-{}.txt".format(self.getArchitecture()))
39        def cleanup():
40            if os.path.exists(logfile):
41                os.unlink(logfile)
42        self.addTearDownHook(cleanup)
43        return logfile
44
45    def test_jit_int_default(self):
46        self.expect("settings show plugin.jit-loader.gdb.enable",
47                    substrs=["plugin.jit-loader.gdb.enable (enum) = default"])
48
49    @skipIfWindows # This test fails on Windows during C code build
50    def test_jit_int_on(self):
51        """Tests interface with 'enable' settings 'on'"""
52        self.build()
53        exe = self.getBuildArtifact("simple")
54
55        logfile = self.gen_log_file()
56        self.runCmd("log enable -f %s lldb jit" % (logfile))
57        self.runCmd("settings set plugin.jit-loader.gdb.enable on")
58        def cleanup():
59            self.runCmd("log disable lldb")
60            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
61        self.addTearDownHook(cleanup)
62
63        # Launch the process.
64        target = self.dbg.CreateTarget(exe)
65        self.assertTrue(target, VALID_TARGET)
66        process = target.LaunchSimple(
67            None, None, self.get_process_working_directory())
68        self.assertTrue(process, PROCESS_IS_VALID)
69
70        self.assertState(process.GetState(), lldb.eStateExited)
71        self.assertEqual(process.GetExitStatus(), 0)
72
73        self.assertTrue(os.path.exists(logfile))
74        logcontent = open(logfile).read()
75        self.assertIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
76
77    @skipIfWindows # This test fails on Windows during C code build
78    def test_jit_int_off(self):
79        """Tests interface with 'enable' settings 'off'"""
80        self.build()
81        exe = self.getBuildArtifact("simple")
82
83        logfile = self.gen_log_file()
84        self.runCmd("log enable -f %s lldb jit" % (logfile))
85        self.runCmd("settings set plugin.jit-loader.gdb.enable off")
86        def cleanup():
87            self.runCmd("log disable lldb")
88            self.runCmd("settings set plugin.jit-loader.gdb.enable default")
89        self.addTearDownHook(cleanup)
90
91        # Launch the process.
92        target = self.dbg.CreateTarget(exe)
93        self.assertTrue(target, VALID_TARGET)
94        process = target.LaunchSimple(
95            None, None, self.get_process_working_directory())
96        self.assertTrue(process, PROCESS_IS_VALID)
97
98        self.assertState(process.GetState(), lldb.eStateExited)
99        self.assertEqual(process.GetExitStatus(), 0)
100
101        self.assertTrue(os.path.exists(logfile))
102        logcontent = open(logfile).read()
103        self.assertNotIn("SetJITBreakpoint setting JIT breakpoint", logcontent)
104