brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 25834ba Raw
160 lines · cpp
1//===-- ProcessEventDataTest.cpp ------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "Plugins/Platform/MacOSX/PlatformMacOSX.h"10#include "Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h"11#include "lldb/Core/Debugger.h"12#include "lldb/Host/FileSystem.h"13#include "lldb/Host/HostInfo.h"14#include "lldb/Interpreter/CommandInterpreter.h"15#include "lldb/Interpreter/CommandObject.h"16#include "lldb/Interpreter/CommandObjectMultiword.h"17#include "lldb/Interpreter/CommandReturnObject.h"18#include "lldb/Utility/Args.h"19#include "lldb/Utility/Status.h"20 21#include "gtest/gtest.h"22 23using namespace lldb_private;24using namespace lldb;25 26namespace {27class VerifyUserMultiwordCmdPathTest : public ::testing::Test {28  void SetUp() override {29    FileSystem::Initialize();30    HostInfo::Initialize();31    PlatformMacOSX::Initialize();32  }33  void TearDown() override {34    PlatformMacOSX::Terminate();35    HostInfo::Terminate();36    FileSystem::Terminate();37  }38};39} // namespace40 41class CommandObjectLeaf : public CommandObjectParsed {42public:43  CommandObjectLeaf(CommandInterpreter &interpreter)44      : CommandObjectParsed(interpreter, "dummy subcommand leaf",45                            "Does nothing", "dummy subcommand leaf") {46    SetIsUserCommand(true);47  }48 49protected:50  void DoExecute(Args &command, CommandReturnObject &result) override {51    result.SetStatus(eReturnStatusSuccessFinishResult);52    result.AppendMessage("I did nothing");53  }54};55 56class CommandObjectMultiwordSubDummy : public CommandObjectMultiword {57public:58  CommandObjectMultiwordSubDummy(CommandInterpreter &interpreter)59      : CommandObjectMultiword(interpreter, "dummy subcommand", "Does nothing",60                               "dummy subcommand") {61    SetIsUserCommand(true);62    LoadSubCommand("leaf", CommandObjectSP(new CommandObjectLeaf(interpreter)));63  }64 65  ~CommandObjectMultiwordSubDummy() override = default;66};67 68class CommandObjectMultiwordDummy : public CommandObjectMultiword {69public:70  CommandObjectMultiwordDummy(CommandInterpreter &interpreter)71      : CommandObjectMultiword(interpreter, "dummy", "Does nothing", "dummy") {72    SetIsUserCommand(true);73    LoadSubCommand(74        "subcommand",75        CommandObjectSP(new CommandObjectMultiwordSubDummy(interpreter)));76  }77 78  ~CommandObjectMultiwordDummy() override = default;79};80 81// Pass in the command path to args.  If success is true, we make sure the MWC82// returned matches the test string.  If success is false, we make sure the83// lookup error matches test_str.84void RunTest(CommandInterpreter &interp, const char *args, bool is_leaf,85             bool success, const char *test_str) {86  CommandObjectMultiword *multi_word_cmd = nullptr;87  Args test_args(args);88  Status error;89  multi_word_cmd =90      interp.VerifyUserMultiwordCmdPath(test_args, is_leaf, error);91  if (success) {92    ASSERT_NE(multi_word_cmd, nullptr);93    ASSERT_TRUE(error.Success());94    ASSERT_STREQ(multi_word_cmd->GetCommandName().str().c_str(), test_str);95  } else {96    ASSERT_EQ(multi_word_cmd, nullptr);97    ASSERT_TRUE(error.Fail());98    ASSERT_STREQ(error.AsCString(), test_str);99  }100}101 102TEST_F(VerifyUserMultiwordCmdPathTest, TestErrors) {103  ArchSpec arch("x86_64-apple-macosx-");104 105  Platform::SetHostPlatform(PlatformRemoteMacOSX::CreateInstance(true, &arch));106                            107  DebuggerSP debugger_sp = Debugger::CreateInstance();108  ASSERT_TRUE(debugger_sp);109 110  CommandInterpreter &interp = debugger_sp->GetCommandInterpreter();111 112  Status error;113  bool success;114  bool is_leaf;115 116  // Test that we reject non-user path components:117  success = false;118  is_leaf = true;119  RunTest(interp, "process launch", is_leaf, success,120          "Path component: 'process' is not a user command");121 122  // Test that we reject non-existent commands:123  is_leaf = true;124  success = false;125  RunTest(interp, "wewouldnevernameacommandthis subcommand", is_leaf, success,126          "Path component: 'wewouldnevernameacommandthis' not found");127 128  // Now we have to add a multiword command, and then probe it.129  error = interp.AddUserCommand(130      "dummy", CommandObjectSP(new CommandObjectMultiwordDummy(interp)), true);131  ASSERT_TRUE(error.Success());132 133  // Now pass the correct path, and make sure we get back the right MWC.134  is_leaf = false;135  success = true;136  RunTest(interp, "dummy subcommand", is_leaf, success, "dummy subcommand");137 138  is_leaf = true;139  RunTest(interp, "dummy subcommand", is_leaf, success, "dummy");140 141  // If you tell us the last node is a leaf, we don't check that.  Make sure142  // that is true:143  is_leaf = true;144  success = true;145  RunTest(interp, "dummy subcommand leaf", is_leaf, success,146          "dummy subcommand");147  // But we should fail if we say the last component is a multiword:148 149  is_leaf = false;150  success = false;151  RunTest(interp, "dummy subcommand leaf", is_leaf, success,152          "Path component: 'leaf' is not a container command");153 154  // We should fail if we get the second path component wrong:155  is_leaf = false;156  success = false;157  RunTest(interp, "dummy not-subcommand", is_leaf, success,158          "Path component: 'not-subcommand' not found");159}160