"""
Test that plugins that load commands work correctly.
"""

import os, time
import re
import unittest2
import lldb
from lldbtest import *
import lldbutil

class PluginCommandTestCase(TestBase):

    mydir = TestBase.compute_mydir(__file__)

    def setUp(self):
        # Call super's setUp().
        TestBase.setUp(self)
        self.lib_dir = os.environ["LLDB_LIB_DIR"]

    @expectedFailureFreeBSD('llvm.org/pr17430')
    @skipIfi386 # This test links against liblldb.so. Thus, the test requires a 32-bit liblldb.so.
    def test_load_plugin(self):
        """Test that plugins that load commands work correctly."""

        plugin_name = "plugin"
        if sys.platform.startswith("darwin"):
            plugin_lib_name = "lib%s.dylib" % plugin_name
        else:
            plugin_lib_name = "lib%s.so" % plugin_name

        # Invoke the library build rule.
        self.buildLibrary("plugin.cpp", plugin_name)

        debugger = lldb.SBDebugger.Create()

        retobj = lldb.SBCommandReturnObject()

        retval = debugger.GetCommandInterpreter().HandleCommand("plugin load %s" % plugin_lib_name, retobj)

        retobj.Clear()

        retval = debugger.GetCommandInterpreter().HandleCommand("plugin_loaded_command child abc def ghi",retobj)

        if self.TraceOn():
            print retobj.GetOutput()

        self.expect(retobj,substrs = ['abc def ghi'], exe=False)

        retobj.Clear()

        # check that abbreviations work correctly in plugin commands.
        retval = debugger.GetCommandInterpreter().HandleCommand("plugin_loaded_ ch abc def ghi",retobj)

        if self.TraceOn():
            print retobj.GetOutput()

        self.expect(retobj,substrs = ['abc def ghi'], exe=False)


if __name__ == '__main__':
    import atexit
    lldb.SBDebugger.Initialize()
    atexit.register(lambda: lldb.SBDebugger.Terminate())
    unittest2.main()
