//===-- XcodeSDKTest.cpp --------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "gtest/gtest.h" #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/XcodeSDK.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Triple.h" #include using namespace lldb_private; TEST(XcodeSDKTest, ParseTest) { EXPECT_EQ(XcodeSDK::GetAnyMacOS().GetType(), XcodeSDK::MacOSX); EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetType(), XcodeSDK::MacOSX); EXPECT_EQ(XcodeSDK("iPhoneSimulator.sdk").GetType(), XcodeSDK::iPhoneSimulator); EXPECT_EQ(XcodeSDK("iPhoneOS.sdk").GetType(), XcodeSDK::iPhoneOS); EXPECT_EQ(XcodeSDK("AppleTVSimulator.sdk").GetType(), XcodeSDK::AppleTVSimulator); EXPECT_EQ(XcodeSDK("AppleTVOS.sdk").GetType(), XcodeSDK::AppleTVOS); EXPECT_EQ(XcodeSDK("WatchSimulator.sdk").GetType(), XcodeSDK::WatchSimulator); EXPECT_EQ(XcodeSDK("WatchOS.sdk").GetType(), XcodeSDK::watchOS); EXPECT_EQ(XcodeSDK("Linux.sdk").GetType(), XcodeSDK::Linux); EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetVersion(), llvm::VersionTuple()); EXPECT_EQ(XcodeSDK("MacOSX10.9.sdk").GetVersion(), llvm::VersionTuple(10, 9)); EXPECT_EQ(XcodeSDK("MacOSX10.15.4.sdk").GetVersion(), llvm::VersionTuple(10, 15)); EXPECT_EQ(XcodeSDK("MacOSX.sdk").IsAppleInternalSDK(), false); EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetType(), XcodeSDK::MacOSX); EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetVersion(), llvm::VersionTuple(10, 15)); EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").IsAppleInternalSDK(), true); EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown); EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple()); } TEST(XcodeSDKTest, MergeTest) { XcodeSDK sdk("MacOSX.sdk"); sdk.Merge(XcodeSDK("WatchOS.sdk")); // This doesn't make any particular sense and shouldn't happen in practice, we // just want to guarantee a well-defined behavior when choosing one // SDK to fit all CUs in an lldb::Module. // -> The higher number wins. EXPECT_EQ(sdk.GetType(), XcodeSDK::watchOS); sdk.Merge(XcodeSDK("WatchOS1.1.sdk")); EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(1, 1)); sdk.Merge(XcodeSDK("WatchOS2.0.sdk")); EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0)); sdk.Merge(XcodeSDK("WatchOS1.1.Internal.sdk")); EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0)); EXPECT_EQ(sdk.IsAppleInternalSDK(), true); XcodeSDK empty; empty.Merge(XcodeSDK("MacOSX10.14.Internal.sdk")); EXPECT_EQ(empty.GetString(), llvm::StringRef("MacOSX10.14.Internal.sdk")); } #ifndef _WIN32 TEST(XcodeSDKTest, SDKSupportsModules) { std::string base = "/Applications/Xcode.app/Contents/Developer/Platforms/"; EXPECT_TRUE(XcodeSDK::SDKSupportsModules( XcodeSDK::Type::iPhoneSimulator, FileSpec( base + "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk"))); EXPECT_TRUE(XcodeSDK::SDKSupportsModules( XcodeSDK::Type::iPhoneSimulator, FileSpec(base + "iPhoneSimulator.platform/Developer/SDKs/" "iPhoneSimulator12.0.Internal.sdk"))); EXPECT_FALSE(XcodeSDK::SDKSupportsModules( XcodeSDK::Type::iPhoneSimulator, FileSpec( base + "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk"))); EXPECT_TRUE(XcodeSDK::SDKSupportsModules( XcodeSDK::Type::MacOSX, FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk"))); EXPECT_FALSE(XcodeSDK::SDKSupportsModules( XcodeSDK::Type::MacOSX, FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk"))); } #endif TEST(XcodeSDKTest, SDKSupportsSwift) { EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.sdk").SupportsSwift()); EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.Internal.sdk").SupportsSwift()); EXPECT_FALSE(XcodeSDK("iPhoneSimulator7.2.sdk").SupportsSwift()); EXPECT_TRUE(XcodeSDK("MacOSX10.10.sdk").SupportsSwift()); EXPECT_FALSE(XcodeSDK("MacOSX10.9.sdk").SupportsSwift()); EXPECT_TRUE(XcodeSDK("Linux.sdk").SupportsSwift()); EXPECT_TRUE(XcodeSDK("MacOSX.sdk").SupportsSwift()); EXPECT_FALSE(XcodeSDK("EverythingElse.sdk").SupportsSwift()); } TEST(XcodeSDKTest, GetCanonicalNameAndConstruct) { XcodeSDK::Info info; info.type = XcodeSDK::Type::MacOSX; EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::iPhoneSimulator; EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::iPhoneOS; EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::AppleTVSimulator; EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::AppleTVOS; EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::WatchSimulator; EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::watchOS; EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::Linux; EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::unknown; EXPECT_EQ("", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.internal = true; info.type = XcodeSDK::Type::MacOSX; EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::iPhoneSimulator; EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::iPhoneOS; EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::AppleTVSimulator; EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::AppleTVOS; EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::WatchSimulator; EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::watchOS; EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::MacOSX; info.version = llvm::VersionTuple(10, 9); EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); info.type = XcodeSDK::Type::iPhoneOS; info.version = llvm::VersionTuple(7, 0); EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info)); EXPECT_EQ(XcodeSDK(info).Parse(), info); } TEST(XcodeSDKTest, GetSDKTypeForTriple) { EXPECT_EQ( XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")), XcodeSDK::Type::MacOSX); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")), XcodeSDK::Type::MacOSX); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( llvm::Triple("x86_64-apple-ios13.4-simulator")), XcodeSDK::Type::iPhoneSimulator); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")), XcodeSDK::Type::iPhoneOS); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( llvm::Triple("x86_64-apple-ios13.4-macabi")), XcodeSDK::Type::MacOSX); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( llvm::Triple("x86_64-apple-tvos-simulator")), XcodeSDK::Type::AppleTVSimulator); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")), XcodeSDK::Type::AppleTVOS); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple( llvm::Triple("x86_64-apple-watchos-simulator")), XcodeSDK::Type::WatchSimulator); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")), XcodeSDK::Type::watchOS); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")), XcodeSDK::Type::Linux); EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")), XcodeSDK::Type::unknown); } TEST(XcodeSDKTest, FindXcodeContentsDirectoryInPath) { std::string standard = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/" "Developer/SDKs/MacOSX.sdk"; EXPECT_EQ("/Applications/Xcode.app/Contents", XcodeSDK::FindXcodeContentsDirectoryInPath(standard)); std::string standard_version = "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/" "Developer/SDKs/MacOSX10.15.sdk"; EXPECT_EQ("/Applications/Xcode.app/Contents", XcodeSDK::FindXcodeContentsDirectoryInPath(standard_version)); std::string beta = "/Applications/Xcode-beta.app/Contents/Developer/" "Platforms/MacOSX.platform/" "Developer/SDKs/MacOSX10.15.sdk"; EXPECT_EQ("/Applications/Xcode-beta.app/Contents", XcodeSDK::FindXcodeContentsDirectoryInPath(beta)); std::string no_app = "/Applications/Xcode/Contents/Developer/Platforms/MacOSX.platform/" "Developer/SDKs/MacOSX10.15.sdk"; EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_app)); std::string no_contents = "/Applications/Xcode.app/Developer/Platforms/MacOSX.platform/" "Developer/SDKs/MacOSX10.15.sdk"; EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_contents)); std::string no_capitalization = "/Applications/Xcode.app/contents/Developer/Platforms/MacOSX.platform/" "Developer/SDKs/MacOSX10.15.sdk"; EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_capitalization)); }