268 lines · python
1"""2Test user added container commands3"""4 5 6import sys7import lldb8from lldbsuite.test.decorators import *9from lldbsuite.test.lldbtest import *10 11 12class TestCmdContainer(TestBase):13 NO_DEBUG_INFO_TESTCASE = True14 15 def test_container_add(self):16 self.container_add()17 18 def check_command_tree_exists(self):19 """This makes sure we can still run the command tree we added."""20 self.runCmd("test-multi")21 self.runCmd("test-multi test-multi-sub")22 self.runCmd("test-multi test-multi-sub welcome")23 24 def container_add(self):25 # Make sure we can't overwrite built-in commands:26 self.expect(27 "command container add process",28 "Can't replace builtin container command",29 substrs=["can't replace builtin command"],30 error=True,31 )32 self.expect(33 "command container add process non_such_subcommand",34 "Can't add to built-in subcommand",35 substrs=["Path component: 'process' is not a user command"],36 error=True,37 )38 self.expect(39 "command container add process launch",40 "Can't replace builtin subcommand",41 substrs=["Path component: 'process' is not a user command"],42 error=True,43 )44 45 # Now lets make a container command:46 self.runCmd("command container add -h 'A test container command' test-multi")47 # Make sure the help works:48 self.expect(49 "help test-multi",50 "Help works for top-level multi",51 substrs=["A test container command"],52 )53 # Add a subcommand:54 self.runCmd(55 "command container add -h 'A test container sub-command' test-multi test-multi-sub"56 )57 # Make sure the help works:58 self.expect(59 "help test-multi",60 "Help shows sub-multi",61 substrs=[62 "A test container command",63 "test-multi-sub -- A test container sub-command",64 ],65 )66 self.expect(67 "help test-multi test-multi-sub",68 "Help shows sub-multi",69 substrs=["A test container sub-command"],70 )71 72 # Now add a script based command to the container command:73 self.runCmd("command script import welcome.py")74 self.runCmd(75 "command script add -c welcome.WelcomeCommand test-multi test-multi-sub welcome"76 )77 # Make sure the help still works:78 self.expect(79 "help test-multi test-multi-sub",80 "Listing subcommands works",81 substrs=[82 "A test container sub-command",83 "welcome -- Just a docstring for Welcome",84 ],85 )86 self.expect(87 "help test-multi test-multi-sub welcome",88 "Subcommand help works",89 substrs=["Just a docstring for Welcome"],90 )91 # And make sure it actually works:92 self.expect(93 "test-multi test-multi-sub welcome friend",94 "Test command works",95 substrs=["Hello friend, welcome to LLDB"],96 )97 98 # Make sure we can make an alias to this:99 self.runCmd(100 "command alias my-welcome test-multi test-multi-sub welcome",101 "We can make an alias to multi-word",102 )103 self.expect(104 "my-welcome friend",105 "Test command works",106 substrs=["Hello friend, welcome to LLDB"],107 )108 self.runCmd("command unalias my-welcome")109 110 # Make sure overwriting works on the leaf command. First using the111 # explicit option so we should not be able to remove extant commands by default:112 113 self.expect(114 "command script add -c welcome.WelcomeCommand2 test-multi test-multi-sub welcome",115 "overwrite command w/o -o",116 substrs=["cannot add command: sub-command already exists"],117 error=True,118 )119 # But we can with the -o option:120 self.runCmd(121 "command script add -c welcome.WelcomeCommand2 -o test-multi test-multi-sub welcome"122 )123 # Make sure we really did overwrite:124 self.expect(125 "test-multi test-multi-sub welcome friend",126 "Used the new command class",127 substrs=["Hello friend, welcome again to LLDB"],128 )129 self.expect(130 "apropos welcome",131 "welcome should show up in apropos",132 substrs=["A docstring for the second Welcome"],133 )134 self.expect(135 "help test-multi test-multi-sub welcome",136 "welcome should show up in help",137 substrs=["A docstring for the second Welcome"],138 )139 self.expect("help", "test-multi should show up in help", substrs=["test-multi"])140 141 # Now switch the default and make sure we can now delete w/o the overwrite option:142 self.runCmd("settings set interpreter.require-overwrite 0")143 self.runCmd(144 "command script add -c welcome.WelcomeCommand test-multi test-multi-sub welcome"145 )146 # Make sure we really did overwrite:147 self.expect(148 "test-multi test-multi-sub welcome friend",149 "Used the new command class",150 substrs=["Hello friend, welcome to LLDB"],151 )152 153 # Make sure we give good errors when the input is wrong:154 self.expect(155 "command script delete test-mult test-multi-sub welcome",156 "Delete script command - wrong first path component",157 substrs=["'test-mult' not found"],158 error=True,159 )160 161 self.expect(162 "command script delete test-multi test-multi-su welcome",163 "Delete script command - wrong second path component",164 substrs=["'test-multi-su' not found"],165 error=True,166 )167 self.check_command_tree_exists()168 169 self.expect(170 "command script delete test-multi test-multi-sub welcom",171 "Delete script command - wrong leaf component",172 substrs=["'welcom' not found"],173 error=True,174 )175 self.check_command_tree_exists()176 177 self.expect(178 "command script delete test-multi test-multi-sub",179 "Delete script command - no leaf component",180 substrs=["subcommand 'test-multi-sub' is not a user command"],181 error=True,182 )183 self.check_command_tree_exists()184 185 # You can't use command script delete to delete container commands:186 self.expect(187 "command script delete test-multi",188 "Delete script - can't delete container",189 substrs=["command 'test-multi' is a multi-word command."],190 error=True,191 )192 self.expect(193 "command script delete test-multi test-multi-sub",194 "Delete script - can't delete container",195 substrs=["subcommand 'test-multi-sub' is not a user command"],196 error=True,197 )198 199 # You can't use command container delete to delete scripted commands:200 self.expect(201 "command container delete test-multi test-multi-sub welcome",202 "command container can't delete user commands",203 substrs=["subcommand 'welcome' is not a container command"],204 error=True,205 )206 207 # Also make sure you can't alias on top of container commands:208 self.expect(209 "command alias test-multi process launch",210 "Tried to alias on top of a container command",211 substrs=[212 "'test-multi' is a user container command and cannot be overwritten."213 ],214 error=True,215 )216 self.check_command_tree_exists()217 218 # Also assert that we can't delete builtin commands:219 self.expect(220 "command script delete process launch",221 "Delete builtin command fails",222 substrs=["command 'process' is not a user command"],223 error=True,224 )225 # Now let's do the version that works226 self.expect(227 "command script delete test-multi test-multi-sub welcome",228 "Delete script command by path",229 substrs=["Deleted command: test-multi test-multi-sub welcome"],230 )231 232 # Now overwrite the sub-command, it should end up empty:233 self.runCmd(234 "command container add -h 'A different help string' -o test-multi test-multi-sub"235 )236 # welcome should be gone:237 self.expect(238 "test-multi test-multi-sub welcome friend",239 "did remove subcommand",240 substrs=["'test-multi-sub' does not have any subcommands."],241 error=True,242 )243 # We should have the new help:244 self.expect(245 "help test-multi test-multi-sub",246 "help changed",247 substrs=["A different help string"],248 )249 250 # Now try deleting commands.251 self.runCmd("command container delete test-multi test-multi-sub")252 self.expect(253 "test-multi test-multi-sub",254 "Command is not active",255 error=True,256 substrs=["'test-multi' does not have any subcommands"],257 )258 self.expect("help test-multi", matching=False, substrs=["test-multi-sub"])259 260 # Next the root command:261 self.runCmd("command container delete test-multi")262 self.expect(263 "test-multi",264 "Root command gone",265 substrs=["'test-multi' is not a valid command."],266 error=True,267 )268