| 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 | |
| 26 | TEST_F(HostInfoTest, GetAugmentedArchSpec) { |
| 27 | // Fully specified triple should not be changed. |
| 28 | ArchSpec spec = HostInfo::GetAugmentedArchSpec(triple: "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(triple: "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(triple: "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 | |
| 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 | TEST_F(HostInfoTest, GetProgramFileSpec) { |
| 58 | FileSpec filespec = HostInfo::GetProgramFileSpec(); |
| 59 | EXPECT_TRUE(FileSystem::Instance().Exists(filespec)); |
| 60 | } |
| 61 | |
| 62 | #if defined(__APPLE__) |
| 63 | TEST_F(HostInfoTest, GetXcodeSDK) { |
| 64 | auto get_sdk = [](std::string sdk, bool error = false) -> llvm::StringRef { |
| 65 | auto sdk_path_or_err = |
| 66 | HostInfo::GetSDKRoot(HostInfo::SDKOptions{XcodeSDK(std::move(sdk))}); |
| 67 | if (!error) { |
| 68 | EXPECT_TRUE((bool)sdk_path_or_err); |
| 69 | return *sdk_path_or_err; |
| 70 | } |
| 71 | EXPECT_FALSE((bool)sdk_path_or_err); |
| 72 | llvm::consumeError(sdk_path_or_err.takeError()); |
| 73 | return {}; |
| 74 | }; |
| 75 | EXPECT_FALSE(get_sdk("MacOSX.sdk" ).empty()); |
| 76 | // These are expected to fall back to an available version. |
| 77 | EXPECT_FALSE(get_sdk("MacOSX9999.sdk" ).empty()); |
| 78 | // This is expected to fail. |
| 79 | EXPECT_TRUE(get_sdk("CeciNestPasUnOS.sdk" , true).empty()); |
| 80 | } |
| 81 | |
| 82 | TEST_F(HostInfoTest, FindSDKTool) { |
| 83 | auto find_tool = [](std::string sdk, llvm::StringRef tool, |
| 84 | bool error = false) -> llvm::StringRef { |
| 85 | auto sdk_path_or_err = |
| 86 | HostInfo::FindSDKTool(XcodeSDK(std::move(sdk)), tool); |
| 87 | if (!error) { |
| 88 | EXPECT_TRUE((bool)sdk_path_or_err); |
| 89 | return *sdk_path_or_err; |
| 90 | } |
| 91 | EXPECT_FALSE((bool)sdk_path_or_err); |
| 92 | llvm::consumeError(sdk_path_or_err.takeError()); |
| 93 | return {}; |
| 94 | }; |
| 95 | EXPECT_FALSE(find_tool("MacOSX.sdk" , "clang" ).empty()); |
| 96 | EXPECT_TRUE(find_tool("MacOSX.sdk" , "CeciNestPasUnOutil" ).empty()); |
| 97 | } |
| 98 | #endif |
| 99 | |
| 100 | TEST(HostInfoTestInitialization, InitTwice) { |
| 101 | llvm::VersionTuple Version; |
| 102 | { |
| 103 | SubsystemRAII<FileSystem, HostInfo> subsystems; |
| 104 | Version = HostInfo::GetOSVersion(); |
| 105 | } |
| 106 | |
| 107 | { |
| 108 | SubsystemRAII<FileSystem, HostInfo> subsystems; |
| 109 | EXPECT_EQ(Version, HostInfo::GetOSVersion()); |
| 110 | } |
| 111 | } |
| 112 | |
| 113 | #ifdef __APPLE__ |
| 114 | struct HostInfoTester : public HostInfoMacOSX { |
| 115 | public: |
| 116 | using HostInfoMacOSX::FindComponentInPath; |
| 117 | }; |
| 118 | |
| 119 | TEST_F(HostInfoTest, FindComponentInPath) { |
| 120 | EXPECT_EQ("/path/to/foo" , |
| 121 | HostInfoTester::FindComponentInPath("/path/to/foo/" , "foo" )); |
| 122 | |
| 123 | EXPECT_EQ("/path/to/foo" , |
| 124 | HostInfoTester::FindComponentInPath("/path/to/foo" , "foo" )); |
| 125 | |
| 126 | EXPECT_EQ("/path/to/foobar" , |
| 127 | HostInfoTester::FindComponentInPath("/path/to/foobar" , "foo" )); |
| 128 | |
| 129 | EXPECT_EQ("/path/to/foobar" , |
| 130 | HostInfoTester::FindComponentInPath("/path/to/foobar" , "bar" )); |
| 131 | |
| 132 | EXPECT_EQ("" , HostInfoTester::FindComponentInPath("/path/to/foo" , "bar" )); |
| 133 | } |
| 134 | #endif |
| 135 | |