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