Files
clang-p2996/lldb/unittests/Host/HostInfoTest.cpp
Adrian Prantl 33cbda4cac Improve error logging when xcrun fails to execute successfully
Because Host::RunShellCommand runs commands through $SHELL there is an
opportunity for this to fail spectacularly on systems that use custom
shells with odd behaviors. This patch makes these situations easier to
debug by at least logging the result of the failed xcrun invocation.

It also doesn't run xcrun through a shell any more.

rdar://102389438

Differential Revision: https://reviews.llvm.org/D138060
2022-12-01 16:22:14 -08:00

89 lines
3.0 KiB
C++

//===-- HostInfoTest.cpp --------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "lldb/Host/HostInfo.h"
#include "TestingSupport/SubsystemRAII.h"
#include "TestingSupport/TestUtilities.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/lldb-defines.h"
#include "llvm/Support/Host.h"
#include "gtest/gtest.h"
using namespace lldb_private;
using namespace llvm;
namespace {
class HostInfoTest : public ::testing::Test {
SubsystemRAII<FileSystem, HostInfo> subsystems;
};
} // namespace
TEST_F(HostInfoTest, GetAugmentedArchSpec) {
// Fully specified triple should not be changed.
ArchSpec spec = HostInfo::GetAugmentedArchSpec("x86_64-pc-linux-gnu");
EXPECT_EQ(spec.GetTriple().getTriple(), "x86_64-pc-linux-gnu");
// Same goes if we specify at least one of (os, vendor, env).
spec = HostInfo::GetAugmentedArchSpec("x86_64-pc");
EXPECT_EQ(spec.GetTriple().getTriple(), "x86_64-pc");
// But if we specify only an arch, we should fill in the rest from the host.
spec = HostInfo::GetAugmentedArchSpec("x86_64");
Triple triple(sys::getDefaultTargetTriple());
EXPECT_EQ(spec.GetTriple().getArch(), Triple::x86_64);
EXPECT_EQ(spec.GetTriple().getOS(), triple.getOS());
EXPECT_EQ(spec.GetTriple().getVendor(), triple.getVendor());
EXPECT_EQ(spec.GetTriple().getEnvironment(), triple.getEnvironment());
// Test LLDB_ARCH_DEFAULT
EXPECT_EQ(HostInfo::GetAugmentedArchSpec(LLDB_ARCH_DEFAULT).GetTriple(),
HostInfo::GetArchitecture(HostInfo::eArchKindDefault).GetTriple());
EXPECT_NE(
HostInfo::GetAugmentedArchSpec("armv7k").GetTriple().getEnvironmentName(),
"unknown");
}
TEST_F(HostInfoTest, GetHostname) {
// Check non-empty string input works correctly.
std::string s("abc");
EXPECT_TRUE(HostInfo::GetHostname(s));
}
#if defined(__APPLE__)
TEST_F(HostInfoTest, GetXcodeSDK) {
auto get_sdk = [](std::string sdk, bool error = false) -> llvm::StringRef {
auto sdk_path_or_err = HostInfo::GetXcodeSDKPath(XcodeSDK(std::move(sdk)));
if (!error) {
EXPECT_TRUE((bool)sdk_path_or_err);
return *sdk_path_or_err;
}
EXPECT_FALSE((bool)sdk_path_or_err);
llvm::consumeError(sdk_path_or_err.takeError());
return {};
};
EXPECT_FALSE(get_sdk("MacOSX.sdk").empty());
// These are expected to fall back to an available version.
EXPECT_FALSE(get_sdk("MacOSX9999.sdk").empty());
// This is expected to fail.
EXPECT_TRUE(get_sdk("CeciNestPasUnOS.sdk", true).empty());
}
#endif
TEST(HostInfoTestInitialization, InitTwice) {
llvm::VersionTuple Version;
{
SubsystemRAII<FileSystem, HostInfo> subsystems;
Version = HostInfo::GetOSVersion();
}
{
SubsystemRAII<FileSystem, HostInfo> subsystems;
EXPECT_EQ(Version, HostInfo::GetOSVersion());
}
}