""" Make sure the plugin list, enable, and disable commands work. """ from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * class TestFrameVar(TestBase): # If your test case doesn't stress debug info, then # set this to true. That way it won't be run once for # each debug info format. NO_DEBUG_INFO_TESTCASE = True def test_plugin_list_enable_disable_commands(self): for plugin_namespace in [ "abi", "architecture", "disassembler", "dynamic-loader", "emulate-instruction", "instrumentation-runtime", "jit-loader", "language", "language-runtime", "memory-history", "object-container", "object-file", "operating-system", "platform", "process", "repl", "register-type-builder", "script-interpreter", "scripted-interface", "structured-data", "symbol-file", "symbol-locator", "symbol-vendor", "system-runtime", # 'trace', # No trace plugin is registered by default. "trace-exporter", "type-system", "unwind-assembly", ]: self.do_list_disable_enable_test(plugin_namespace) def do_list_disable_enable_test(self, plugin_namespace): # Plugins are enabled by default. self.expect( f"plugin list {plugin_namespace}", substrs=[plugin_namespace, "[+]"] ) # Plugins can be disabled. self.expect( f"plugin disable {plugin_namespace}", substrs=[plugin_namespace, "[-]"] ) # Plugins can be enabled. self.expect( f"plugin enable {plugin_namespace}", substrs=[plugin_namespace, "[+]"] ) def test_completions(self): # Make sure completions work for the plugin list, enable, and disable commands. # We just check a few of the expected plugins to make sure the completion works. self.completions_contain( "plugin list ", ["abi", "architecture", "disassembler"] ) self.completions_contain( "plugin enable ", ["abi", "architecture", "disassembler"] ) self.completions_contain( "plugin disable ", ["abi", "architecture", "disassembler"] ) # A completion for a partial namespace should be the full namespace. # This allows the user to run the command on the full namespace. self.completions_match("plugin list ab", ["abi"]) self.completions_contain( "plugin list object", ["object-container", "object-file"] ) # A completion for a full namespace should contain the plugins in that namespace. self.completions_contain("plugin list object-file", ["object-file.JSON"]) self.completions_contain("plugin list object-file.", ["object-file.JSON"]) self.completions_contain("plugin list object-file.J", ["object-file.JSON"]) self.completions_contain("plugin list object-file.JS", ["object-file.JSON"]) # Check for a completion that is a both a complete namespace and a prefix of # another namespace. It should return the completions for the plugins in the completed # namespace as well as the completion for the partial namespace. self.completions_contain( "plugin list language", ["language.cplusplus", "language-runtime"] ) # When the namespace is a prefix of another namespace and the user types a dot, the # completion should not include the match for the partial namespace. self.completions_contain( "plugin list language.", ["language.cplusplus"], match=True ) self.completions_contain( "plugin list language.", ["language-runtime"], match=False ) # Check for an empty completion list when the names is invalid. # See docs for `complete_from_to` for how this checks for an empty list. self.complete_from_to("plugin list abi.foo", ["plugin list abi.foo"])