1*99451b44SJordan Rupprecht"""
2*99451b44SJordan RupprechtTest that plugins that load commands work correctly.
3*99451b44SJordan Rupprecht"""
4*99451b44SJordan Rupprecht
5*99451b44SJordan Rupprechtfrom __future__ import print_function
6*99451b44SJordan Rupprecht
7*99451b44SJordan Rupprecht
8*99451b44SJordan Rupprechtimport lldb
9*99451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
10*99451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
11*99451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
12*99451b44SJordan Rupprecht
13*99451b44SJordan Rupprecht
14*99451b44SJordan Rupprechtclass PluginCommandTestCase(TestBase):
15*99451b44SJordan Rupprecht
16*99451b44SJordan Rupprecht    mydir = TestBase.compute_mydir(__file__)
17*99451b44SJordan Rupprecht
18*99451b44SJordan Rupprecht    def setUp(self):
19*99451b44SJordan Rupprecht        TestBase.setUp(self)
20*99451b44SJordan Rupprecht        self.generateSource('plugin.cpp')
21*99451b44SJordan Rupprecht
22*99451b44SJordan Rupprecht    @skipIfNoSBHeaders
23*99451b44SJordan Rupprecht    # Requires a compatible arch and platform to link against the host's built
24*99451b44SJordan Rupprecht    # lldb lib.
25*99451b44SJordan Rupprecht    @skipIfHostIncompatibleWithRemote
26*99451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778")
27*99451b44SJordan Rupprecht    @no_debug_info_test
28*99451b44SJordan Rupprecht    def test_load_plugin(self):
29*99451b44SJordan Rupprecht        """Test that plugins that load commands work correctly."""
30*99451b44SJordan Rupprecht
31*99451b44SJordan Rupprecht        plugin_name = "plugin"
32*99451b44SJordan Rupprecht        if sys.platform.startswith("darwin"):
33*99451b44SJordan Rupprecht            plugin_lib_name = "lib%s.dylib" % plugin_name
34*99451b44SJordan Rupprecht        else:
35*99451b44SJordan Rupprecht            plugin_lib_name = "lib%s.so" % plugin_name
36*99451b44SJordan Rupprecht
37*99451b44SJordan Rupprecht        # Invoke the library build rule.
38*99451b44SJordan Rupprecht        self.buildLibrary("plugin.cpp", plugin_name)
39*99451b44SJordan Rupprecht
40*99451b44SJordan Rupprecht        debugger = lldb.SBDebugger.Create()
41*99451b44SJordan Rupprecht
42*99451b44SJordan Rupprecht        retobj = lldb.SBCommandReturnObject()
43*99451b44SJordan Rupprecht
44*99451b44SJordan Rupprecht        retval = debugger.GetCommandInterpreter().HandleCommand(
45*99451b44SJordan Rupprecht            "plugin load %s" % self.getBuildArtifact(plugin_lib_name), retobj)
46*99451b44SJordan Rupprecht
47*99451b44SJordan Rupprecht        retobj.Clear()
48*99451b44SJordan Rupprecht
49*99451b44SJordan Rupprecht        retval = debugger.GetCommandInterpreter().HandleCommand(
50*99451b44SJordan Rupprecht            "plugin_loaded_command child abc def ghi", retobj)
51*99451b44SJordan Rupprecht
52*99451b44SJordan Rupprecht        if self.TraceOn():
53*99451b44SJordan Rupprecht            print(retobj.GetOutput())
54*99451b44SJordan Rupprecht
55*99451b44SJordan Rupprecht        self.expect(retobj, substrs=['abc def ghi'], exe=False)
56*99451b44SJordan Rupprecht
57*99451b44SJordan Rupprecht        retobj.Clear()
58*99451b44SJordan Rupprecht
59*99451b44SJordan Rupprecht        # check that abbreviations work correctly in plugin commands.
60*99451b44SJordan Rupprecht        retval = debugger.GetCommandInterpreter().HandleCommand(
61*99451b44SJordan Rupprecht            "plugin_loaded_ ch abc def ghi", retobj)
62*99451b44SJordan Rupprecht
63*99451b44SJordan Rupprecht        if self.TraceOn():
64*99451b44SJordan Rupprecht            print(retobj.GetOutput())
65*99451b44SJordan Rupprecht
66*99451b44SJordan Rupprecht        self.expect(retobj, substrs=['abc def ghi'], exe=False)
67*99451b44SJordan Rupprecht
68*99451b44SJordan Rupprecht    @no_debug_info_test
69*99451b44SJordan Rupprecht    def test_invalid_plugin_invocation(self):
70*99451b44SJordan Rupprecht        self.expect("plugin load a b",
71*99451b44SJordan Rupprecht                    error=True, startstr="error: 'plugin load' requires one argument")
72*99451b44SJordan Rupprecht        self.expect("plugin load",
73*99451b44SJordan Rupprecht                    error=True, startstr="error: 'plugin load' requires one argument")
74*99451b44SJordan Rupprecht
75*99451b44SJordan Rupprecht    @no_debug_info_test
76*99451b44SJordan Rupprecht    def test_invalid_plugin_target(self):
77*99451b44SJordan Rupprecht        self.expect("plugin load ThisIsNotAValidPluginName",
78*99451b44SJordan Rupprecht                    error=True, startstr="error: no such file")
79