| """ | |
| 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"]) |