268 lines · cpp
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-exception6//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#include "llvm/TargetParser/Triple.h"16 17#include <tuple>18 19using namespace lldb_private;20 21TEST(XcodeSDKTest, ParseTest) {22 EXPECT_EQ(XcodeSDK::GetAnyMacOS().GetType(), XcodeSDK::MacOSX);23 EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetType(), XcodeSDK::MacOSX);24 EXPECT_EQ(XcodeSDK("iPhoneSimulator.sdk").GetType(), XcodeSDK::iPhoneSimulator);25 EXPECT_EQ(XcodeSDK("iPhoneOS.sdk").GetType(), XcodeSDK::iPhoneOS);26 EXPECT_EQ(XcodeSDK("AppleTVSimulator.sdk").GetType(), XcodeSDK::AppleTVSimulator);27 EXPECT_EQ(XcodeSDK("AppleTVOS.sdk").GetType(), XcodeSDK::AppleTVOS);28 EXPECT_EQ(XcodeSDK("WatchSimulator.sdk").GetType(), XcodeSDK::WatchSimulator);29 EXPECT_EQ(XcodeSDK("WatchOS.sdk").GetType(), XcodeSDK::watchOS);30 EXPECT_EQ(XcodeSDK("BridgeOS.sdk").GetType(), XcodeSDK::BridgeOS);31 EXPECT_EQ(XcodeSDK("XRSimulator.sdk").GetType(), XcodeSDK::XRSimulator);32 EXPECT_EQ(XcodeSDK("XROS.sdk").GetType(), XcodeSDK::XROS);33 EXPECT_EQ(XcodeSDK("Linux.sdk").GetType(), XcodeSDK::Linux);34 EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetVersion(), llvm::VersionTuple());35 EXPECT_EQ(XcodeSDK("MacOSX10.9.sdk").GetVersion(), llvm::VersionTuple(10, 9));36 EXPECT_EQ(XcodeSDK("MacOSX10.15.4.sdk").GetVersion(), llvm::VersionTuple(10, 15));37 EXPECT_EQ(XcodeSDK("MacOSX.sdk").IsAppleInternalSDK(), false);38 EXPECT_EQ(39 XcodeSDK("MacOSX.sdk", FileSpec{"/Path/To/MacOSX.sdk"}).GetSysroot(),40 FileSpec("/Path/To/MacOSX.sdk"));41 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetType(), XcodeSDK::MacOSX);42 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetVersion(),43 llvm::VersionTuple(10, 15));44 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").IsAppleInternalSDK(), true);45 EXPECT_FALSE(XcodeSDK("MacOSX10.15.Internal.sdk").GetSysroot());46 EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown);47 EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple());48 EXPECT_FALSE(XcodeSDK().GetSysroot());49}50 51TEST(XcodeSDKTest, MergeTest) {52 XcodeSDK sdk("MacOSX.sdk");53 sdk.Merge(XcodeSDK("WatchOS.sdk"));54 // This doesn't make any particular sense and shouldn't happen in practice, we55 // just want to guarantee a well-defined behavior when choosing one56 // SDK to fit all CUs in an lldb::Module.57 // -> The higher number wins.58 EXPECT_EQ(sdk.GetType(), XcodeSDK::watchOS);59 sdk.Merge(XcodeSDK("WatchOS1.1.sdk"));60 EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(1, 1));61 sdk.Merge(XcodeSDK("WatchOS2.0.sdk"));62 EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0));63 sdk.Merge(XcodeSDK("WatchOS1.1.Internal.sdk"));64 EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0));65 EXPECT_EQ(sdk.IsAppleInternalSDK(), true);66 XcodeSDK empty;67 empty.Merge(XcodeSDK("MacOSX10.14.Internal.sdk"));68 EXPECT_EQ(empty.GetString(), llvm::StringRef("MacOSX10.14.Internal.sdk"));69 EXPECT_FALSE(empty.GetSysroot());70 empty.Merge(XcodeSDK("MacOSX9.5.Internal.sdk",71 FileSpec{"/Path/To/MacOSX9.5.Internal.sdk"}));72 EXPECT_FALSE(empty.GetSysroot());73 empty.Merge(XcodeSDK("MacOSX12.5.sdk", FileSpec{"/Path/To/MacOSX12.5.sdk"}));74 EXPECT_EQ(empty.GetSysroot(), FileSpec{"/Path/To/MacOSX12.5.sdk"});75 empty.Merge(XcodeSDK("MacOSX11.5.Internal.sdk",76 FileSpec{"/Path/To/MacOSX11.5.Internal.sdk"}));77 EXPECT_EQ(empty.GetSysroot(), FileSpec{"/Path/To/MacOSX12.5.Internal.sdk"});78}79 80#ifndef _WIN3281TEST(XcodeSDKTest, SDKSupportsModules) {82 std::string base = "/Applications/Xcode.app/Contents/Developer/Platforms/";83 EXPECT_TRUE(XcodeSDK::SDKSupportsModules(84 XcodeSDK::Type::iPhoneSimulator,85 FileSpec(86 base +87 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk")));88 EXPECT_TRUE(XcodeSDK::SDKSupportsModules(89 XcodeSDK::Type::iPhoneSimulator,90 FileSpec(base + "iPhoneSimulator.platform/Developer/SDKs/"91 "iPhoneSimulator12.0.Internal.sdk")));92 EXPECT_FALSE(XcodeSDK::SDKSupportsModules(93 XcodeSDK::Type::iPhoneSimulator,94 FileSpec(95 base +96 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk")));97 EXPECT_TRUE(XcodeSDK::SDKSupportsModules(98 XcodeSDK::Type::MacOSX,99 FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk")));100 EXPECT_FALSE(XcodeSDK::SDKSupportsModules(101 XcodeSDK::Type::MacOSX,102 FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk")));103}104#endif105 106TEST(XcodeSDKTest, GetCanonicalNameAndConstruct) {107 XcodeSDK::Info info;108 info.type = XcodeSDK::Type::MacOSX;109 EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info));110 EXPECT_EQ(XcodeSDK(info).Parse(), info);111 112 info.type = XcodeSDK::Type::iPhoneSimulator;113 EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info));114 EXPECT_EQ(XcodeSDK(info).Parse(), info);115 116 info.type = XcodeSDK::Type::iPhoneOS;117 EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info));118 EXPECT_EQ(XcodeSDK(info).Parse(), info);119 120 info.type = XcodeSDK::Type::AppleTVSimulator;121 EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info));122 EXPECT_EQ(XcodeSDK(info).Parse(), info);123 124 info.type = XcodeSDK::Type::AppleTVOS;125 EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info));126 EXPECT_EQ(XcodeSDK(info).Parse(), info);127 128 info.type = XcodeSDK::Type::WatchSimulator;129 EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info));130 EXPECT_EQ(XcodeSDK(info).Parse(), info);131 132 info.type = XcodeSDK::Type::watchOS;133 EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info));134 EXPECT_EQ(XcodeSDK(info).Parse(), info);135 136 info.type = XcodeSDK::Type::XRSimulator;137 EXPECT_EQ("xrsimulator", XcodeSDK::GetCanonicalName(info));138 EXPECT_EQ(XcodeSDK(info).Parse(), info);139 140 info.type = XcodeSDK::Type::XROS;141 EXPECT_EQ("xros", XcodeSDK::GetCanonicalName(info));142 EXPECT_EQ(XcodeSDK(info).Parse(), info);143 144 info.type = XcodeSDK::Type::Linux;145 EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info));146 EXPECT_EQ(XcodeSDK(info).Parse(), info);147 148 info.type = XcodeSDK::Type::unknown;149 EXPECT_EQ("", XcodeSDK::GetCanonicalName(info));150 EXPECT_EQ(XcodeSDK(info).Parse(), info);151 152 info.internal = true;153 info.type = XcodeSDK::Type::MacOSX;154 EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info));155 EXPECT_EQ(XcodeSDK(info).Parse(), info);156 157 info.type = XcodeSDK::Type::iPhoneSimulator;158 EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info));159 EXPECT_EQ(XcodeSDK(info).Parse(), info);160 161 info.type = XcodeSDK::Type::iPhoneOS;162 EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info));163 EXPECT_EQ(XcodeSDK(info).Parse(), info);164 165 info.type = XcodeSDK::Type::AppleTVSimulator;166 EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info));167 EXPECT_EQ(XcodeSDK(info).Parse(), info);168 169 info.type = XcodeSDK::Type::AppleTVOS;170 EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info));171 EXPECT_EQ(XcodeSDK(info).Parse(), info);172 173 info.type = XcodeSDK::Type::WatchSimulator;174 EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info));175 EXPECT_EQ(XcodeSDK(info).Parse(), info);176 177 info.type = XcodeSDK::Type::watchOS;178 EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info));179 EXPECT_EQ(XcodeSDK(info).Parse(), info);180 181 info.type = XcodeSDK::Type::XRSimulator;182 EXPECT_EQ("xrsimulator.internal", XcodeSDK::GetCanonicalName(info));183 EXPECT_EQ(XcodeSDK(info).Parse(), info);184 185 info.type = XcodeSDK::Type::XROS;186 EXPECT_EQ("xros.internal", XcodeSDK::GetCanonicalName(info));187 EXPECT_EQ(XcodeSDK(info).Parse(), info);188 info.type = XcodeSDK::Type::MacOSX;189 info.version = llvm::VersionTuple(10, 9);190 EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info));191 EXPECT_EQ(XcodeSDK(info).Parse(), info);192 193 info.type = XcodeSDK::Type::iPhoneOS;194 info.version = llvm::VersionTuple(7, 0);195 EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info));196 EXPECT_EQ(XcodeSDK(info).Parse(), info);197}198 199TEST(XcodeSDKTest, GetSDKTypeForTriple) {200 EXPECT_EQ(201 XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")),202 XcodeSDK::Type::MacOSX);203 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")),204 XcodeSDK::Type::MacOSX);205 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(206 llvm::Triple("x86_64-apple-ios13.4-simulator")),207 XcodeSDK::Type::iPhoneSimulator);208 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")),209 XcodeSDK::Type::iPhoneOS);210 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(211 llvm::Triple("x86_64-apple-ios13.4-macabi")),212 XcodeSDK::Type::MacOSX);213 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(214 llvm::Triple("x86_64-apple-tvos-simulator")),215 XcodeSDK::Type::AppleTVSimulator);216 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")),217 XcodeSDK::Type::AppleTVOS);218 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(219 llvm::Triple("x86_64-apple-watchos-simulator")),220 XcodeSDK::Type::WatchSimulator);221 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")),222 XcodeSDK::Type::watchOS);223 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(224 llvm::Triple("arm64e-apple-xros-simulator")),225 XcodeSDK::Type::XRSimulator);226 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64e-apple-xros")),227 XcodeSDK::Type::XROS);228 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")),229 XcodeSDK::Type::Linux);230 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")),231 XcodeSDK::Type::unknown);232}233 234TEST(XcodeSDKTest, FindXcodeContentsDirectoryInPath) {235 std::string standard =236 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"237 "Developer/SDKs/MacOSX.sdk";238 EXPECT_EQ("/Applications/Xcode.app/Contents",239 XcodeSDK::FindXcodeContentsDirectoryInPath(standard));240 241 std::string standard_version =242 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"243 "Developer/SDKs/MacOSX10.15.sdk";244 EXPECT_EQ("/Applications/Xcode.app/Contents",245 XcodeSDK::FindXcodeContentsDirectoryInPath(standard_version));246 247 std::string beta = "/Applications/Xcode-beta.app/Contents/Developer/"248 "Platforms/MacOSX.platform/"249 "Developer/SDKs/MacOSX10.15.sdk";250 EXPECT_EQ("/Applications/Xcode-beta.app/Contents",251 XcodeSDK::FindXcodeContentsDirectoryInPath(beta));252 253 std::string no_app =254 "/Applications/Xcode/Contents/Developer/Platforms/MacOSX.platform/"255 "Developer/SDKs/MacOSX10.15.sdk";256 EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_app));257 258 std::string no_contents =259 "/Applications/Xcode.app/Developer/Platforms/MacOSX.platform/"260 "Developer/SDKs/MacOSX10.15.sdk";261 EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_contents));262 263 std::string no_capitalization =264 "/Applications/Xcode.app/contents/Developer/Platforms/MacOSX.platform/"265 "Developer/SDKs/MacOSX10.15.sdk";266 EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_capitalization));267}268