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 TEST(XcodeSDKTest, SDKSupportsModules) { 63 std::string base = "/Applications/Xcode.app/Contents/Developer/Platforms/"; 64 EXPECT_TRUE(XcodeSDK::SDKSupportsModules( 65 XcodeSDK::Type::iPhoneSimulator, 66 FileSpec( 67 base + 68 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk"))); 69 EXPECT_TRUE(XcodeSDK::SDKSupportsModules( 70 XcodeSDK::Type::iPhoneSimulator, 71 FileSpec(base + "iPhoneSimulator.platform/Developer/SDKs/" 72 "iPhoneSimulator12.0.Internal.sdk"))); 73 EXPECT_FALSE(XcodeSDK::SDKSupportsModules( 74 XcodeSDK::Type::iPhoneSimulator, 75 FileSpec( 76 base + 77 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk"))); 78 EXPECT_TRUE(XcodeSDK::SDKSupportsModules( 79 XcodeSDK::Type::MacOSX, 80 FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk"))); 81 EXPECT_FALSE(XcodeSDK::SDKSupportsModules( 82 XcodeSDK::Type::MacOSX, 83 FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk"))); 84 } 85 86 TEST(XcodeSDKTest, GetCanonicalName) { 87 XcodeSDK::Info info; 88 info.type = XcodeSDK::Type::MacOSX; 89 EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info)); 90 91 info.type = XcodeSDK::Type::iPhoneSimulator; 92 EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info)); 93 94 info.type = XcodeSDK::Type::iPhoneOS; 95 EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info)); 96 97 info.type = XcodeSDK::Type::AppleTVSimulator; 98 EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info)); 99 100 info.type = XcodeSDK::Type::AppleTVOS; 101 EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info)); 102 103 info.type = XcodeSDK::Type::WatchSimulator; 104 EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info)); 105 106 info.type = XcodeSDK::Type::watchOS; 107 EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info)); 108 109 info.type = XcodeSDK::Type::Linux; 110 EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info)); 111 112 info.type = XcodeSDK::Type::numSDKTypes; 113 EXPECT_EQ("", XcodeSDK::GetCanonicalName(info)); 114 115 info.type = XcodeSDK::Type::unknown; 116 EXPECT_EQ("", XcodeSDK::GetCanonicalName(info)); 117 118 info.internal = true; 119 info.type = XcodeSDK::Type::MacOSX; 120 EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info)); 121 122 info.type = XcodeSDK::Type::iPhoneSimulator; 123 EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info)); 124 125 info.type = XcodeSDK::Type::iPhoneOS; 126 EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info)); 127 128 info.type = XcodeSDK::Type::AppleTVSimulator; 129 EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info)); 130 131 info.type = XcodeSDK::Type::AppleTVOS; 132 EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info)); 133 134 info.type = XcodeSDK::Type::WatchSimulator; 135 EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info)); 136 137 info.type = XcodeSDK::Type::watchOS; 138 EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info)); 139 140 info.type = XcodeSDK::Type::MacOSX; 141 info.version = llvm::VersionTuple(10, 9); 142 EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info)); 143 144 info.type = XcodeSDK::Type::iPhoneOS; 145 info.version = llvm::VersionTuple(7, 0); 146 EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info)); 147 } 148