xref: /llvm-project/lldb/unittests/Host/HostInfoTest.cpp (revision 7de43526e3cc07a02d01a0c4bf0670900495b938)
1 //===-- HostInfoTest.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "lldb/Host/HostInfo.h"
10 #include "TestingSupport/SubsystemRAII.h"
11 #include "TestingSupport/TestUtilities.h"
12 #include "lldb/Host/FileSystem.h"
13 #include "lldb/lldb-defines.h"
14 #include "llvm/TargetParser/Host.h"
15 #include "gtest/gtest.h"
16 
17 using namespace lldb_private;
18 using namespace llvm;
19 
20 namespace {
21 class HostInfoTest : public ::testing::Test {
22   SubsystemRAII<FileSystem, HostInfo> subsystems;
23 };
24 } // namespace
25 
TEST_F(HostInfoTest,GetAugmentedArchSpec)26 TEST_F(HostInfoTest, GetAugmentedArchSpec) {
27   // Fully specified triple should not be changed.
28   ArchSpec spec = HostInfo::GetAugmentedArchSpec("x86_64-pc-linux-gnu");
29   EXPECT_EQ(spec.GetTriple().getTriple(), "x86_64-pc-linux-gnu");
30 
31   // Same goes if we specify at least one of (os, vendor, env).
32   spec = HostInfo::GetAugmentedArchSpec("x86_64-pc");
33   EXPECT_EQ(spec.GetTriple().getTriple(), "x86_64-pc");
34 
35   // But if we specify only an arch, we should fill in the rest from the host.
36   spec = HostInfo::GetAugmentedArchSpec("x86_64");
37   Triple triple(sys::getDefaultTargetTriple());
38   EXPECT_EQ(spec.GetTriple().getArch(), Triple::x86_64);
39   EXPECT_EQ(spec.GetTriple().getOS(), triple.getOS());
40   EXPECT_EQ(spec.GetTriple().getVendor(), triple.getVendor());
41   EXPECT_EQ(spec.GetTriple().getEnvironment(), triple.getEnvironment());
42 
43   // Test LLDB_ARCH_DEFAULT
44   EXPECT_EQ(HostInfo::GetAugmentedArchSpec(LLDB_ARCH_DEFAULT).GetTriple(),
45             HostInfo::GetArchitecture(HostInfo::eArchKindDefault).GetTriple());
46   EXPECT_NE(
47       HostInfo::GetAugmentedArchSpec("armv7k").GetTriple().getEnvironmentName(),
48       "unknown");
49 }
50 
TEST_F(HostInfoTest,GetHostname)51 TEST_F(HostInfoTest, GetHostname) {
52   // Check non-empty string input works correctly.
53   std::string s("abc");
54   EXPECT_TRUE(HostInfo::GetHostname(s));
55 }
56 
57 #if defined(__APPLE__)
TEST_F(HostInfoTest,GetXcodeSDK)58 TEST_F(HostInfoTest, GetXcodeSDK) {
59   auto get_sdk = [](std::string sdk, bool error = false) -> llvm::StringRef {
60     auto sdk_path_or_err =
61         HostInfo::GetSDKRoot(HostInfo::SDKOptions{XcodeSDK(std::move(sdk))});
62     if (!error) {
63       EXPECT_TRUE((bool)sdk_path_or_err);
64       return *sdk_path_or_err;
65     }
66     EXPECT_FALSE((bool)sdk_path_or_err);
67     llvm::consumeError(sdk_path_or_err.takeError());
68     return {};
69   };
70   EXPECT_FALSE(get_sdk("MacOSX.sdk").empty());
71   // These are expected to fall back to an available version.
72   EXPECT_FALSE(get_sdk("MacOSX9999.sdk").empty());
73   // This is expected to fail.
74   EXPECT_TRUE(get_sdk("CeciNestPasUnOS.sdk", true).empty());
75 }
76 
TEST_F(HostInfoTest,FindSDKTool)77 TEST_F(HostInfoTest, FindSDKTool) {
78   auto find_tool = [](std::string sdk, llvm::StringRef tool,
79                       bool error = false) -> llvm::StringRef {
80     auto sdk_path_or_err =
81         HostInfo::FindSDKTool(XcodeSDK(std::move(sdk)), tool);
82     if (!error) {
83       EXPECT_TRUE((bool)sdk_path_or_err);
84       return *sdk_path_or_err;
85     }
86     EXPECT_FALSE((bool)sdk_path_or_err);
87     llvm::consumeError(sdk_path_or_err.takeError());
88     return {};
89   };
90   EXPECT_FALSE(find_tool("MacOSX.sdk", "clang").empty());
91   EXPECT_TRUE(find_tool("MacOSX.sdk", "CeciNestPasUnOutil").empty());
92 }
93 #endif
94 
TEST(HostInfoTestInitialization,InitTwice)95 TEST(HostInfoTestInitialization, InitTwice) {
96   llvm::VersionTuple Version;
97   {
98     SubsystemRAII<FileSystem, HostInfo> subsystems;
99     Version = HostInfo::GetOSVersion();
100   }
101 
102   {
103     SubsystemRAII<FileSystem, HostInfo> subsystems;
104     EXPECT_EQ(Version, HostInfo::GetOSVersion());
105   }
106 }
107