199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that plugins that load commands work correctly.
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprechtfrom __future__ import print_function
699451b44SJordan Rupprecht
799451b44SJordan Rupprecht
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
1099451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1199451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprechtclass PluginCommandTestCase(TestBase):
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def setUp(self):
1799451b44SJordan Rupprecht        TestBase.setUp(self)
1899451b44SJordan Rupprecht        self.generateSource('plugin.cpp')
1999451b44SJordan Rupprecht
2099451b44SJordan Rupprecht    @skipIfNoSBHeaders
2199451b44SJordan Rupprecht    # Requires a compatible arch and platform to link against the host's built
2299451b44SJordan Rupprecht    # lldb lib.
2399451b44SJordan Rupprecht    @skipIfHostIncompatibleWithRemote
2499451b44SJordan Rupprecht    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24778")
2599451b44SJordan Rupprecht    @no_debug_info_test
2699451b44SJordan Rupprecht    def test_load_plugin(self):
2799451b44SJordan Rupprecht        """Test that plugins that load commands work correctly."""
2899451b44SJordan Rupprecht
2999451b44SJordan Rupprecht        plugin_name = "plugin"
3099451b44SJordan Rupprecht        if sys.platform.startswith("darwin"):
3199451b44SJordan Rupprecht            plugin_lib_name = "lib%s.dylib" % plugin_name
3299451b44SJordan Rupprecht        else:
3399451b44SJordan Rupprecht            plugin_lib_name = "lib%s.so" % plugin_name
3499451b44SJordan Rupprecht
3599451b44SJordan Rupprecht        # Invoke the library build rule.
3699451b44SJordan Rupprecht        self.buildLibrary("plugin.cpp", plugin_name)
3799451b44SJordan Rupprecht
3899451b44SJordan Rupprecht        retobj = lldb.SBCommandReturnObject()
3999451b44SJordan Rupprecht
40*a31130f6STatyana Krasnukha        retval = self.dbg.GetCommandInterpreter().HandleCommand(
4199451b44SJordan Rupprecht            "plugin load %s" % self.getBuildArtifact(plugin_lib_name), retobj)
4299451b44SJordan Rupprecht
4399451b44SJordan Rupprecht        retobj.Clear()
4499451b44SJordan Rupprecht
45*a31130f6STatyana Krasnukha        retval = self.dbg.GetCommandInterpreter().HandleCommand(
4699451b44SJordan Rupprecht            "plugin_loaded_command child abc def ghi", retobj)
4799451b44SJordan Rupprecht
4899451b44SJordan Rupprecht        if self.TraceOn():
4999451b44SJordan Rupprecht            print(retobj.GetOutput())
5099451b44SJordan Rupprecht
5199451b44SJordan Rupprecht        self.expect(retobj, substrs=['abc def ghi'], exe=False)
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        retobj.Clear()
5499451b44SJordan Rupprecht
5599451b44SJordan Rupprecht        # check that abbreviations work correctly in plugin commands.
56*a31130f6STatyana Krasnukha        retval = self.dbg.GetCommandInterpreter().HandleCommand(
5799451b44SJordan Rupprecht            "plugin_loaded_ ch abc def ghi", retobj)
5899451b44SJordan Rupprecht
5999451b44SJordan Rupprecht        if self.TraceOn():
6099451b44SJordan Rupprecht            print(retobj.GetOutput())
6199451b44SJordan Rupprecht
6299451b44SJordan Rupprecht        self.expect(retobj, substrs=['abc def ghi'], exe=False)
6399451b44SJordan Rupprecht
6499451b44SJordan Rupprecht    @no_debug_info_test
6599451b44SJordan Rupprecht    def test_invalid_plugin_invocation(self):
6699451b44SJordan Rupprecht        self.expect("plugin load a b",
6799451b44SJordan Rupprecht                    error=True, startstr="error: 'plugin load' requires one argument")
6899451b44SJordan Rupprecht        self.expect("plugin load",
6999451b44SJordan Rupprecht                    error=True, startstr="error: 'plugin load' requires one argument")
7099451b44SJordan Rupprecht
7199451b44SJordan Rupprecht    @no_debug_info_test
7299451b44SJordan Rupprecht    def test_invalid_plugin_target(self):
7399451b44SJordan Rupprecht        self.expect("plugin load ThisIsNotAValidPluginName",
7499451b44SJordan Rupprecht                    error=True, startstr="error: no such file")
75