xref: /llvm-project/lldb/unittests/Host/HostInfoTest.cpp (revision 7de43526e3cc07a02d01a0c4bf0670900495b938)
180814287SRaphael Isemann //===-- HostInfoTest.cpp --------------------------------------------------===//
27263f1bdSPavel Labath //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67263f1bdSPavel Labath //
77263f1bdSPavel Labath //===----------------------------------------------------------------------===//
87263f1bdSPavel Labath 
97263f1bdSPavel Labath #include "lldb/Host/HostInfo.h"
105dca0596SRaphael Isemann #include "TestingSupport/SubsystemRAII.h"
117d46f0e4SAdrian Prantl #include "TestingSupport/TestUtilities.h"
1246376966SJonas Devlieghere #include "lldb/Host/FileSystem.h"
1346376966SJonas Devlieghere #include "lldb/lldb-defines.h"
14d768bf99SArchibald Elliott #include "llvm/TargetParser/Host.h"
157263f1bdSPavel Labath #include "gtest/gtest.h"
167263f1bdSPavel Labath 
177263f1bdSPavel Labath using namespace lldb_private;
187263f1bdSPavel Labath using namespace llvm;
197263f1bdSPavel Labath 
207263f1bdSPavel Labath namespace {
217263f1bdSPavel Labath class HostInfoTest : public ::testing::Test {
225dca0596SRaphael Isemann   SubsystemRAII<FileSystem, HostInfo> subsystems;
2346376966SJonas Devlieghere };
2446376966SJonas Devlieghere } // namespace
257263f1bdSPavel Labath 
TEST_F(HostInfoTest,GetAugmentedArchSpec)267263f1bdSPavel Labath TEST_F(HostInfoTest, GetAugmentedArchSpec) {
277263f1bdSPavel Labath   // Fully specified triple should not be changed.
287263f1bdSPavel Labath   ArchSpec spec = HostInfo::GetAugmentedArchSpec("x86_64-pc-linux-gnu");
297263f1bdSPavel Labath   EXPECT_EQ(spec.GetTriple().getTriple(), "x86_64-pc-linux-gnu");
307263f1bdSPavel Labath 
317263f1bdSPavel Labath   // Same goes if we specify at least one of (os, vendor, env).
327263f1bdSPavel Labath   spec = HostInfo::GetAugmentedArchSpec("x86_64-pc");
337263f1bdSPavel Labath   EXPECT_EQ(spec.GetTriple().getTriple(), "x86_64-pc");
347263f1bdSPavel Labath 
357263f1bdSPavel Labath   // But if we specify only an arch, we should fill in the rest from the host.
367263f1bdSPavel Labath   spec = HostInfo::GetAugmentedArchSpec("x86_64");
377263f1bdSPavel Labath   Triple triple(sys::getDefaultTargetTriple());
387263f1bdSPavel Labath   EXPECT_EQ(spec.GetTriple().getArch(), Triple::x86_64);
397263f1bdSPavel Labath   EXPECT_EQ(spec.GetTriple().getOS(), triple.getOS());
407263f1bdSPavel Labath   EXPECT_EQ(spec.GetTriple().getVendor(), triple.getVendor());
417263f1bdSPavel Labath   EXPECT_EQ(spec.GetTriple().getEnvironment(), triple.getEnvironment());
424ebb64b9SPavel Labath 
434ebb64b9SPavel Labath   // Test LLDB_ARCH_DEFAULT
444ebb64b9SPavel Labath   EXPECT_EQ(HostInfo::GetAugmentedArchSpec(LLDB_ARCH_DEFAULT).GetTriple(),
454ebb64b9SPavel Labath             HostInfo::GetArchitecture(HostInfo::eArchKindDefault).GetTriple());
46cf3e4011SAdrian Prantl   EXPECT_NE(
47cf3e4011SAdrian Prantl       HostInfo::GetAugmentedArchSpec("armv7k").GetTriple().getEnvironmentName(),
48cf3e4011SAdrian Prantl       "unknown");
497263f1bdSPavel Labath }
50b8ec7eeeSAaron Smith 
TEST_F(HostInfoTest,GetHostname)51b8ec7eeeSAaron Smith TEST_F(HostInfoTest, GetHostname) {
52b8ec7eeeSAaron Smith   // Check non-empty string input works correctly.
53b8ec7eeeSAaron Smith   std::string s("abc");
54b8ec7eeeSAaron Smith   EXPECT_TRUE(HostInfo::GetHostname(s));
55b8ec7eeeSAaron Smith }
5679feafa5SAdrian Prantl 
5779feafa5SAdrian Prantl #if defined(__APPLE__)
TEST_F(HostInfoTest,GetXcodeSDK)5879feafa5SAdrian Prantl TEST_F(HostInfoTest, GetXcodeSDK) {
5933cbda4cSAdrian Prantl   auto get_sdk = [](std::string sdk, bool error = false) -> llvm::StringRef {
60cd21c0d3SSaleem Abdulrasool     auto sdk_path_or_err =
61cd21c0d3SSaleem Abdulrasool         HostInfo::GetSDKRoot(HostInfo::SDKOptions{XcodeSDK(std::move(sdk))});
6233cbda4cSAdrian Prantl     if (!error) {
6333cbda4cSAdrian Prantl       EXPECT_TRUE((bool)sdk_path_or_err);
6433cbda4cSAdrian Prantl       return *sdk_path_or_err;
6533cbda4cSAdrian Prantl     }
6633cbda4cSAdrian Prantl     EXPECT_FALSE((bool)sdk_path_or_err);
6733cbda4cSAdrian Prantl     llvm::consumeError(sdk_path_or_err.takeError());
6833cbda4cSAdrian Prantl     return {};
6933cbda4cSAdrian Prantl   };
7033cbda4cSAdrian Prantl   EXPECT_FALSE(get_sdk("MacOSX.sdk").empty());
7179feafa5SAdrian Prantl   // These are expected to fall back to an available version.
7233cbda4cSAdrian Prantl   EXPECT_FALSE(get_sdk("MacOSX9999.sdk").empty());
7379feafa5SAdrian Prantl   // This is expected to fail.
7433cbda4cSAdrian Prantl   EXPECT_TRUE(get_sdk("CeciNestPasUnOS.sdk", true).empty());
7579feafa5SAdrian Prantl }
76*7de43526SAdrian Prantl 
TEST_F(HostInfoTest,FindSDKTool)77*7de43526SAdrian Prantl TEST_F(HostInfoTest, FindSDKTool) {
78*7de43526SAdrian Prantl   auto find_tool = [](std::string sdk, llvm::StringRef tool,
79*7de43526SAdrian Prantl                       bool error = false) -> llvm::StringRef {
80*7de43526SAdrian Prantl     auto sdk_path_or_err =
81*7de43526SAdrian Prantl         HostInfo::FindSDKTool(XcodeSDK(std::move(sdk)), tool);
82*7de43526SAdrian Prantl     if (!error) {
83*7de43526SAdrian Prantl       EXPECT_TRUE((bool)sdk_path_or_err);
84*7de43526SAdrian Prantl       return *sdk_path_or_err;
85*7de43526SAdrian Prantl     }
86*7de43526SAdrian Prantl     EXPECT_FALSE((bool)sdk_path_or_err);
87*7de43526SAdrian Prantl     llvm::consumeError(sdk_path_or_err.takeError());
88*7de43526SAdrian Prantl     return {};
89*7de43526SAdrian Prantl   };
90*7de43526SAdrian Prantl   EXPECT_FALSE(find_tool("MacOSX.sdk", "clang").empty());
91*7de43526SAdrian Prantl   EXPECT_TRUE(find_tool("MacOSX.sdk", "CeciNestPasUnOutil").empty());
92*7de43526SAdrian Prantl }
9379feafa5SAdrian Prantl #endif
94f3f90456SVitaly Buka 
TEST(HostInfoTestInitialization,InitTwice)95f3f90456SVitaly Buka TEST(HostInfoTestInitialization, InitTwice) {
96f3f90456SVitaly Buka   llvm::VersionTuple Version;
97f3f90456SVitaly Buka   {
98f3f90456SVitaly Buka     SubsystemRAII<FileSystem, HostInfo> subsystems;
99f3f90456SVitaly Buka     Version = HostInfo::GetOSVersion();
100f3f90456SVitaly Buka   }
101f3f90456SVitaly Buka 
102f3f90456SVitaly Buka   {
103f3f90456SVitaly Buka     SubsystemRAII<FileSystem, HostInfo> subsystems;
104f3f90456SVitaly Buka     EXPECT_EQ(Version, HostInfo::GetOSVersion());
105f3f90456SVitaly Buka   }
106f3f90456SVitaly Buka }
107