[lldb] Test 'command' commands and fix the found crashes
authorRaphael Isemann <teemperor@gmail.com>
Tue, 3 Sep 2019 09:06:12 +0000 (09:06 +0000)
committerRaphael Isemann <teemperor@gmail.com>
Tue, 3 Sep 2019 09:06:12 +0000 (09:06 +0000)
llvm-svn: 370712

lldb/packages/Python/lldbsuite/test/commands/command/invalid-args/TestInvalidArgsCommand.py [new file with mode: 0644]
lldb/source/Commands/CommandObjectCommands.cpp

diff --git a/lldb/packages/Python/lldbsuite/test/commands/command/invalid-args/TestInvalidArgsCommand.py b/lldb/packages/Python/lldbsuite/test/commands/command/invalid-args/TestInvalidArgsCommand.py
new file mode 100644 (file)
index 0000000..47d77b0
--- /dev/null
@@ -0,0 +1,58 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+
+class InvalidArgsCommandTestCase(TestBase):
+
+    mydir = TestBase.compute_mydir(__file__)
+
+    @no_debug_info_test
+    def test_script_add(self):
+        self.expect("command script add 1 2", error=True,
+                    substrs=["'command script add' requires one argument"])
+
+        self.expect("command script add", error=True,
+                    substrs=["'command script add' requires one argument"])
+
+    @no_debug_info_test
+    def test_script_clear(self):
+        self.expect("command script clear f", error=True,
+                    substrs=["'command script clear' doesn't take any arguments"])
+
+    @no_debug_info_test
+    def test_script_list(self):
+        self.expect("command script list f", error=True,
+                    substrs=["'command script list' doesn't take any arguments"])
+
+    @no_debug_info_test
+    def test_script_import(self):
+        self.expect("command script import", error=True,
+                    substrs=["command script import needs one or more arguments"])
+
+    @no_debug_info_test
+    def test_alias(self):
+        self.expect("command alias", error=True,
+                    substrs=["'command alias' requires at least two arguments"])
+
+        self.expect("command alias blub foo", error=True,
+                    substrs=["error: invalid command given to 'command alias'. 'foo' does not begin with a valid command.  No alias created."])
+
+    @no_debug_info_test
+    def test_unalias(self):
+        self.expect("command unalias", error=True,
+                    substrs=["must call 'unalias' with a valid alias"])
+
+    @no_debug_info_test
+    def test_delete(self):
+        self.expect("command delete", error=True,
+                    substrs=["must call 'command delete' with one or more valid user"])
+
+    @no_debug_info_test
+    def test_regex(self):
+        self.expect("command regex", error=True,
+                    substrs=["usage: 'command regex <command-name> "])
+
+    @no_debug_info_test
+    def test_source(self):
+        self.expect("command source", error=True,
+                    substrs=["'command source' takes exactly one executable filename argument."])
index 11fed6e..d2f4cea 100644 (file)
@@ -859,6 +859,7 @@ protected:
                                    "defined regular expression command names",
                                    GetCommandName().str().c_str());
       result.SetStatus(eReturnStatusFailed);
+      return false;
     }
 
     auto command_name = args[0].ref;
@@ -1724,6 +1725,12 @@ public:
   ~CommandObjectCommandsScriptList() override = default;
 
   bool DoExecute(Args &command, CommandReturnObject &result) override {
+    if (command.GetArgumentCount() != 0) {
+      result.AppendError("'command script list' doesn't take any arguments");
+      result.SetStatus(eReturnStatusFailed);
+      return false;
+    }
+
     m_interpreter.GetHelp(result, CommandInterpreter::eCommandTypesUserDef);
 
     result.SetStatus(eReturnStatusSuccessFinishResult);
@@ -1744,6 +1751,12 @@ public:
 
 protected:
   bool DoExecute(Args &command, CommandReturnObject &result) override {
+    if (command.GetArgumentCount() != 0) {
+      result.AppendError("'command script clear' doesn't take any arguments");
+      result.SetStatus(eReturnStatusFailed);
+      return false;
+    }
+
     m_interpreter.RemoveAllUser();
 
     result.SetStatus(eReturnStatusSuccessFinishResult);