There are plenty of ways attaching can go wrong. Having the server report the exact error means we can give better feedback to the user. (This patch does not do the second part, it only makes sure the information is sent from the server.) Triggering all possible error conditions in a test would prove challenging, but there is one error that is very easy to reproduce (attempting to attach while debugging), so I write a test based on that. The test immediately exposed a bug where the m_send_error_strings field was being used uninitialized (so it was sometimes true from the get-go), so I fix that as well. llvm-svn: 329803
71 lines
2.7 KiB
C++
71 lines
2.7 KiB
C++
//===-- LLGSTest.cpp --------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "TestBase.h"
|
|
#include "lldb/Host/Host.h"
|
|
#include "llvm/Testing/Support/Error.h"
|
|
|
|
using namespace llgs_tests;
|
|
using namespace lldb_private;
|
|
using namespace llvm;
|
|
|
|
TEST_F(TestBase, LaunchModePreservesEnvironment) {
|
|
putenv(const_cast<char *>("LLDB_TEST_MAGIC_VARIABLE=LLDB_TEST_MAGIC_VALUE"));
|
|
|
|
auto ClientOr = TestClient::launch(getLogFileName(),
|
|
{getInferiorPath("environment_check")});
|
|
ASSERT_THAT_EXPECTED(ClientOr, Succeeded());
|
|
auto &Client = **ClientOr;
|
|
|
|
ASSERT_THAT_ERROR(Client.ContinueAll(), Succeeded());
|
|
ASSERT_THAT_EXPECTED(
|
|
Client.GetLatestStopReplyAs<StopReplyExit>(),
|
|
HasValue(testing::Property(&StopReply::getKind,
|
|
WaitStatus{WaitStatus::Exit, 0})));
|
|
}
|
|
|
|
TEST_F(TestBase, DS_TEST(DebugserverEnv)) {
|
|
// Test that --env takes precedence over inherited environment variables.
|
|
putenv(const_cast<char *>("LLDB_TEST_MAGIC_VARIABLE=foobar"));
|
|
|
|
auto ClientOr = TestClient::launchCustom(getLogFileName(),
|
|
{ "--env", "LLDB_TEST_MAGIC_VARIABLE=LLDB_TEST_MAGIC_VALUE" },
|
|
{getInferiorPath("environment_check")});
|
|
ASSERT_THAT_EXPECTED(ClientOr, Succeeded());
|
|
auto &Client = **ClientOr;
|
|
|
|
ASSERT_THAT_ERROR(Client.ContinueAll(), Succeeded());
|
|
ASSERT_THAT_EXPECTED(
|
|
Client.GetLatestStopReplyAs<StopReplyExit>(),
|
|
HasValue(testing::Property(&StopReply::getKind,
|
|
WaitStatus{WaitStatus::Exit, 0})));
|
|
}
|
|
|
|
TEST_F(TestBase, LLGS_TEST(vAttachRichError)) {
|
|
auto ClientOr = TestClient::launch(getLogFileName(),
|
|
{getInferiorPath("environment_check")});
|
|
ASSERT_THAT_EXPECTED(ClientOr, Succeeded());
|
|
auto &Client = **ClientOr;
|
|
|
|
// Until we enable error strings we should just get the error code.
|
|
ASSERT_THAT_ERROR(Client.SendMessage("vAttach;1"),
|
|
Failed<ErrorInfoBase>(testing::Property(
|
|
&ErrorInfoBase::message, "Error 255")));
|
|
|
|
ASSERT_THAT_ERROR(Client.SendMessage("QEnableErrorStrings"), Succeeded());
|
|
|
|
// Now, we expect the full error message.
|
|
ASSERT_THAT_ERROR(
|
|
Client.SendMessage("vAttach;1"),
|
|
Failed<ErrorInfoBase>(testing::Property(
|
|
&ErrorInfoBase::message,
|
|
testing::StartsWith(
|
|
"cannot attach to process 1 when another process with pid"))));
|
|
}
|