aboutsummaryrefslogtreecommitdiff
path: root/lldb/test/API/commands/plugin/TestPlugin.py
blob: bd8ab9604538e774f16228ae1181a2940d0d98ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
"""
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"])