1 //===-- XcodeSDKTest.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 "gtest/gtest.h" 10 11 #include "lldb/Utility/FileSpec.h" 12 #include "lldb/Utility/XcodeSDK.h" 13 14 #include "llvm/ADT/StringRef.h" 15 16 #include <tuple> 17 18 using namespace lldb_private; 19 20 TEST(XcodeSDKTest, ParseTest) { 21 EXPECT_EQ(XcodeSDK::GetAnyMacOS().GetType(), XcodeSDK::MacOSX); 22 EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetType(), XcodeSDK::MacOSX); 23 EXPECT_EQ(XcodeSDK("iPhoneSimulator.sdk").GetType(), XcodeSDK::iPhoneSimulator); 24 EXPECT_EQ(XcodeSDK("iPhoneOS.sdk").GetType(), XcodeSDK::iPhoneOS); 25 EXPECT_EQ(XcodeSDK("AppleTVSimulator.sdk").GetType(), XcodeSDK::AppleTVSimulator); 26 EXPECT_EQ(XcodeSDK("AppleTVOS.sdk").GetType(), XcodeSDK::AppleTVOS); 27 EXPECT_EQ(XcodeSDK("WatchSimulator.sdk").GetType(), XcodeSDK::WatchSimulator); 28 EXPECT_EQ(XcodeSDK("WatchOS.sdk").GetType(), XcodeSDK::watchOS); 29 EXPECT_EQ(XcodeSDK("Linux.sdk").GetType(), XcodeSDK::Linux); 30 EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetVersion(), llvm::VersionTuple()); 31 EXPECT_EQ(XcodeSDK("MacOSX10.9.sdk").GetVersion(), llvm::VersionTuple(10, 9)); 32 EXPECT_EQ(XcodeSDK("MacOSX10.15.4.sdk").GetVersion(), llvm::VersionTuple(10, 15)); 33 EXPECT_EQ(XcodeSDK("MacOSX.sdk").IsAppleInternalSDK(), false); 34 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetType(), XcodeSDK::MacOSX); 35 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetVersion(), 36 llvm::VersionTuple(10, 15)); 37 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").IsAppleInternalSDK(), true); 38 EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown); 39 EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple()); 40 } 41 42 TEST(XcodeSDKTest, MergeTest) { 43 XcodeSDK sdk("MacOSX.sdk"); 44 sdk.Merge(XcodeSDK("WatchOS.sdk")); 45 // This doesn't make any particular sense and shouldn't happen in practice, we 46 // just want to guarantee a well-defined behavior when choosing one 47 // SDK to fit all CUs in an lldb::Module. 48 // -> The higher number wins. 49 EXPECT_EQ(sdk.GetType(), XcodeSDK::watchOS); 50 sdk.Merge(XcodeSDK("WatchOS1.1.sdk")); 51 EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(1, 1)); 52 sdk.Merge(XcodeSDK("WatchOS2.0.sdk")); 53 EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0)); 54 sdk.Merge(XcodeSDK("WatchOS1.1.Internal.sdk")); 55 EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0)); 56 EXPECT_EQ(sdk.IsAppleInternalSDK(), true); 57 XcodeSDK empty; 58 empty.Merge(XcodeSDK("MacOSX10.14.Internal.sdk")); 59 EXPECT_EQ(empty.GetString(), llvm::StringRef("MacOSX10.14.Internal.sdk")); 60 } 61 62 #ifndef _WIN32 63 TEST(XcodeSDKTest, SDKSupportsModules) { 64 std::string base = "/Applications/Xcode.app/Contents/Developer/Platforms/"; 65 EXPECT_TRUE(XcodeSDK::SDKSupportsModules( 66 XcodeSDK::Type::iPhoneSimulator, 67 FileSpec( 68 base + 69 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk"))); 70 EXPECT_TRUE(XcodeSDK::SDKSupportsModules( 71 XcodeSDK::Type::iPhoneSimulator, 72 FileSpec(base + "iPhoneSimulator.platform/Developer/SDKs/" 73 "iPhoneSimulator12.0.Internal.sdk"))); 74 EXPECT_FALSE(XcodeSDK::SDKSupportsModules( 75 XcodeSDK::Type::iPhoneSimulator, 76 FileSpec( 77 base + 78 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk"))); 79 EXPECT_TRUE(XcodeSDK::SDKSupportsModules( 80 XcodeSDK::Type::MacOSX, 81 FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk"))); 82 EXPECT_FALSE(XcodeSDK::SDKSupportsModules( 83 XcodeSDK::Type::MacOSX, 84 FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk"))); 85 } 86 #endif 87 88 TEST(XcodeSDKTest, GetCanonicalName) { 89 XcodeSDK::Info info; 90 info.type = XcodeSDK::Type::MacOSX; 91 EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info)); 92 93 info.type = XcodeSDK::Type::iPhoneSimulator; 94 EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info)); 95 96 info.type = XcodeSDK::Type::iPhoneOS; 97 EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info)); 98 99 info.type = XcodeSDK::Type::AppleTVSimulator; 100 EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info)); 101 102 info.type = XcodeSDK::Type::AppleTVOS; 103 EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info)); 104 105 info.type = XcodeSDK::Type::WatchSimulator; 106 EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info)); 107 108 info.type = XcodeSDK::Type::watchOS; 109 EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info)); 110 111 info.type = XcodeSDK::Type::Linux; 112 EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info)); 113 114 info.type = XcodeSDK::Type::numSDKTypes; 115 EXPECT_EQ("", XcodeSDK::GetCanonicalName(info)); 116 117 info.type = XcodeSDK::Type::unknown; 118 EXPECT_EQ("", XcodeSDK::GetCanonicalName(info)); 119 120 info.internal = true; 121 info.type = XcodeSDK::Type::MacOSX; 122 EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info)); 123 124 info.type = XcodeSDK::Type::iPhoneSimulator; 125 EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info)); 126 127 info.type = XcodeSDK::Type::iPhoneOS; 128 EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info)); 129 130 info.type = XcodeSDK::Type::AppleTVSimulator; 131 EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info)); 132 133 info.type = XcodeSDK::Type::AppleTVOS; 134 EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info)); 135 136 info.type = XcodeSDK::Type::WatchSimulator; 137 EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info)); 138 139 info.type = XcodeSDK::Type::watchOS; 140 EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info)); 141 142 info.type = XcodeSDK::Type::MacOSX; 143 info.version = llvm::VersionTuple(10, 9); 144 EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info)); 145 146 info.type = XcodeSDK::Type::iPhoneOS; 147 info.version = llvm::VersionTuple(7, 0); 148 EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info)); 149 } 150