11e05d7b3SAdrian Prantl //===-- XcodeSDKTest.cpp --------------------------------------------------===//
21e05d7b3SAdrian Prantl //
31e05d7b3SAdrian Prantl // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41e05d7b3SAdrian Prantl // See https://llvm.org/LICENSE.txt for license information.
51e05d7b3SAdrian Prantl // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61e05d7b3SAdrian Prantl //
71e05d7b3SAdrian Prantl //===----------------------------------------------------------------------===//
81e05d7b3SAdrian Prantl 
91e05d7b3SAdrian Prantl #include "gtest/gtest.h"
101e05d7b3SAdrian Prantl 
111e05d7b3SAdrian Prantl #include "lldb/Utility/FileSpec.h"
121e05d7b3SAdrian Prantl #include "lldb/Utility/XcodeSDK.h"
131e05d7b3SAdrian Prantl 
141e05d7b3SAdrian Prantl #include "llvm/ADT/StringRef.h"
156e95d51eSAdrian Prantl #include "llvm/ADT/Triple.h"
161e05d7b3SAdrian Prantl 
171e05d7b3SAdrian Prantl #include <tuple>
181e05d7b3SAdrian Prantl 
191e05d7b3SAdrian Prantl using namespace lldb_private;
201e05d7b3SAdrian Prantl 
TEST(XcodeSDKTest,ParseTest)211e05d7b3SAdrian Prantl TEST(XcodeSDKTest, ParseTest) {
221e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK::GetAnyMacOS().GetType(), XcodeSDK::MacOSX);
231e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetType(), XcodeSDK::MacOSX);
241e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("iPhoneSimulator.sdk").GetType(), XcodeSDK::iPhoneSimulator);
251e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("iPhoneOS.sdk").GetType(), XcodeSDK::iPhoneOS);
261e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("AppleTVSimulator.sdk").GetType(), XcodeSDK::AppleTVSimulator);
271e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("AppleTVOS.sdk").GetType(), XcodeSDK::AppleTVOS);
281e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("WatchSimulator.sdk").GetType(), XcodeSDK::WatchSimulator);
291e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("WatchOS.sdk").GetType(), XcodeSDK::watchOS);
301e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("Linux.sdk").GetType(), XcodeSDK::Linux);
311e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetVersion(), llvm::VersionTuple());
321e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX10.9.sdk").GetVersion(), llvm::VersionTuple(10, 9));
331e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX10.15.4.sdk").GetVersion(), llvm::VersionTuple(10, 15));
3479feafa5SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX.sdk").IsAppleInternalSDK(), false);
3579feafa5SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetType(), XcodeSDK::MacOSX);
3679feafa5SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetVersion(),
3779feafa5SAdrian Prantl             llvm::VersionTuple(10, 15));
3879feafa5SAdrian Prantl   EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").IsAppleInternalSDK(), true);
391e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown);
401e05d7b3SAdrian Prantl   EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple());
411e05d7b3SAdrian Prantl }
421e05d7b3SAdrian Prantl 
TEST(XcodeSDKTest,MergeTest)431e05d7b3SAdrian Prantl TEST(XcodeSDKTest, MergeTest) {
441e05d7b3SAdrian Prantl   XcodeSDK sdk("MacOSX.sdk");
451e05d7b3SAdrian Prantl   sdk.Merge(XcodeSDK("WatchOS.sdk"));
461e05d7b3SAdrian Prantl   // This doesn't make any particular sense and shouldn't happen in practice, we
471e05d7b3SAdrian Prantl   // just want to guarantee a well-defined behavior when choosing one
481e05d7b3SAdrian Prantl   // SDK to fit all CUs in an lldb::Module.
491e05d7b3SAdrian Prantl   // -> The higher number wins.
501e05d7b3SAdrian Prantl   EXPECT_EQ(sdk.GetType(), XcodeSDK::watchOS);
511e05d7b3SAdrian Prantl   sdk.Merge(XcodeSDK("WatchOS1.1.sdk"));
521e05d7b3SAdrian Prantl   EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(1, 1));
531e05d7b3SAdrian Prantl   sdk.Merge(XcodeSDK("WatchOS2.0.sdk"));
541e05d7b3SAdrian Prantl   EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0));
5579feafa5SAdrian Prantl   sdk.Merge(XcodeSDK("WatchOS1.1.Internal.sdk"));
5679feafa5SAdrian Prantl   EXPECT_EQ(sdk.GetVersion(), llvm::VersionTuple(2, 0));
5779feafa5SAdrian Prantl   EXPECT_EQ(sdk.IsAppleInternalSDK(), true);
5879feafa5SAdrian Prantl   XcodeSDK empty;
5979feafa5SAdrian Prantl   empty.Merge(XcodeSDK("MacOSX10.14.Internal.sdk"));
6079feafa5SAdrian Prantl   EXPECT_EQ(empty.GetString(), llvm::StringRef("MacOSX10.14.Internal.sdk"));
611e05d7b3SAdrian Prantl }
621e05d7b3SAdrian Prantl 
63b9c7e276SAdrian Prantl #ifndef _WIN32
TEST(XcodeSDKTest,SDKSupportsModules)641e05d7b3SAdrian Prantl TEST(XcodeSDKTest, SDKSupportsModules) {
651e05d7b3SAdrian Prantl   std::string base = "/Applications/Xcode.app/Contents/Developer/Platforms/";
661e05d7b3SAdrian Prantl   EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
671e05d7b3SAdrian Prantl       XcodeSDK::Type::iPhoneSimulator,
681e05d7b3SAdrian Prantl       FileSpec(
691e05d7b3SAdrian Prantl           base +
701e05d7b3SAdrian Prantl           "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk")));
7179feafa5SAdrian Prantl   EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
7279feafa5SAdrian Prantl       XcodeSDK::Type::iPhoneSimulator,
7379feafa5SAdrian Prantl       FileSpec(base + "iPhoneSimulator.platform/Developer/SDKs/"
7479feafa5SAdrian Prantl                       "iPhoneSimulator12.0.Internal.sdk")));
751e05d7b3SAdrian Prantl   EXPECT_FALSE(XcodeSDK::SDKSupportsModules(
761e05d7b3SAdrian Prantl       XcodeSDK::Type::iPhoneSimulator,
771e05d7b3SAdrian Prantl       FileSpec(
781e05d7b3SAdrian Prantl           base +
791e05d7b3SAdrian Prantl           "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk")));
801e05d7b3SAdrian Prantl   EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
811e05d7b3SAdrian Prantl       XcodeSDK::Type::MacOSX,
821e05d7b3SAdrian Prantl       FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk")));
831e05d7b3SAdrian Prantl   EXPECT_FALSE(XcodeSDK::SDKSupportsModules(
841e05d7b3SAdrian Prantl       XcodeSDK::Type::MacOSX,
851e05d7b3SAdrian Prantl       FileSpec(base + "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk")));
861e05d7b3SAdrian Prantl }
87b9c7e276SAdrian Prantl #endif
881e05d7b3SAdrian Prantl 
TEST(XcodeSDKTest,SDKSupportsSwift)89dec1c94eSAdrian Prantl TEST(XcodeSDKTest, SDKSupportsSwift) {
90dec1c94eSAdrian Prantl   EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.sdk").SupportsSwift());
91dec1c94eSAdrian Prantl   EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.Internal.sdk").SupportsSwift());
92dec1c94eSAdrian Prantl   EXPECT_FALSE(XcodeSDK("iPhoneSimulator7.2.sdk").SupportsSwift());
93dec1c94eSAdrian Prantl   EXPECT_TRUE(XcodeSDK("MacOSX10.10.sdk").SupportsSwift());
94dec1c94eSAdrian Prantl   EXPECT_FALSE(XcodeSDK("MacOSX10.9.sdk").SupportsSwift());
95dec1c94eSAdrian Prantl   EXPECT_TRUE(XcodeSDK("Linux.sdk").SupportsSwift());
96dec1c94eSAdrian Prantl   EXPECT_TRUE(XcodeSDK("MacOSX.sdk").SupportsSwift());
97dec1c94eSAdrian Prantl   EXPECT_FALSE(XcodeSDK("EverythingElse.sdk").SupportsSwift());
98dec1c94eSAdrian Prantl }
99dec1c94eSAdrian Prantl 
TEST(XcodeSDKTest,GetCanonicalNameAndConstruct)100ae920a81SAdrian Prantl TEST(XcodeSDKTest, GetCanonicalNameAndConstruct) {
10179feafa5SAdrian Prantl   XcodeSDK::Info info;
10279feafa5SAdrian Prantl   info.type = XcodeSDK::Type::MacOSX;
10379feafa5SAdrian Prantl   EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info));
104ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
10579feafa5SAdrian Prantl 
10679feafa5SAdrian Prantl   info.type = XcodeSDK::Type::iPhoneSimulator;
10779feafa5SAdrian Prantl   EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info));
108ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
10979feafa5SAdrian Prantl 
11079feafa5SAdrian Prantl   info.type = XcodeSDK::Type::iPhoneOS;
11179feafa5SAdrian Prantl   EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info));
112ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
11379feafa5SAdrian Prantl 
11479feafa5SAdrian Prantl   info.type = XcodeSDK::Type::AppleTVSimulator;
11579feafa5SAdrian Prantl   EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info));
116ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
11779feafa5SAdrian Prantl 
11879feafa5SAdrian Prantl   info.type = XcodeSDK::Type::AppleTVOS;
11979feafa5SAdrian Prantl   EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info));
120ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
12179feafa5SAdrian Prantl 
12279feafa5SAdrian Prantl   info.type = XcodeSDK::Type::WatchSimulator;
12379feafa5SAdrian Prantl   EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info));
124ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
12579feafa5SAdrian Prantl 
12679feafa5SAdrian Prantl   info.type = XcodeSDK::Type::watchOS;
12779feafa5SAdrian Prantl   EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info));
128ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
12979feafa5SAdrian Prantl 
13079feafa5SAdrian Prantl   info.type = XcodeSDK::Type::Linux;
13179feafa5SAdrian Prantl   EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info));
132ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
13379feafa5SAdrian Prantl 
13479feafa5SAdrian Prantl   info.type = XcodeSDK::Type::unknown;
13579feafa5SAdrian Prantl   EXPECT_EQ("", XcodeSDK::GetCanonicalName(info));
136ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
13779feafa5SAdrian Prantl 
13879feafa5SAdrian Prantl   info.internal = true;
13979feafa5SAdrian Prantl   info.type = XcodeSDK::Type::MacOSX;
14079feafa5SAdrian Prantl   EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info));
141ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
14279feafa5SAdrian Prantl 
14379feafa5SAdrian Prantl   info.type = XcodeSDK::Type::iPhoneSimulator;
14479feafa5SAdrian Prantl   EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info));
145ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
14679feafa5SAdrian Prantl 
14779feafa5SAdrian Prantl   info.type = XcodeSDK::Type::iPhoneOS;
14879feafa5SAdrian Prantl   EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info));
149ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
15079feafa5SAdrian Prantl 
15179feafa5SAdrian Prantl   info.type = XcodeSDK::Type::AppleTVSimulator;
15279feafa5SAdrian Prantl   EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info));
153ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
15479feafa5SAdrian Prantl 
15579feafa5SAdrian Prantl   info.type = XcodeSDK::Type::AppleTVOS;
15679feafa5SAdrian Prantl   EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info));
157ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
15879feafa5SAdrian Prantl 
15979feafa5SAdrian Prantl   info.type = XcodeSDK::Type::WatchSimulator;
16079feafa5SAdrian Prantl   EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info));
161ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
16279feafa5SAdrian Prantl 
16379feafa5SAdrian Prantl   info.type = XcodeSDK::Type::watchOS;
16479feafa5SAdrian Prantl   EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info));
165ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
16679feafa5SAdrian Prantl 
16779feafa5SAdrian Prantl   info.type = XcodeSDK::Type::MacOSX;
16879feafa5SAdrian Prantl   info.version = llvm::VersionTuple(10, 9);
16979feafa5SAdrian Prantl   EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info));
170ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
17179feafa5SAdrian Prantl 
17279feafa5SAdrian Prantl   info.type = XcodeSDK::Type::iPhoneOS;
17379feafa5SAdrian Prantl   info.version = llvm::VersionTuple(7, 0);
17479feafa5SAdrian Prantl   EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info));
175ae920a81SAdrian Prantl   EXPECT_EQ(XcodeSDK(info).Parse(), info);
1761e05d7b3SAdrian Prantl }
1776e95d51eSAdrian Prantl 
TEST(XcodeSDKTest,GetSDKTypeForTriple)1786e95d51eSAdrian Prantl TEST(XcodeSDKTest, GetSDKTypeForTriple) {
1796e95d51eSAdrian Prantl   EXPECT_EQ(
1806e95d51eSAdrian Prantl       XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")),
1816e95d51eSAdrian Prantl       XcodeSDK::Type::MacOSX);
1826e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")),
1836e95d51eSAdrian Prantl             XcodeSDK::Type::MacOSX);
1846e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
1856e95d51eSAdrian Prantl                 llvm::Triple("x86_64-apple-ios13.4-simulator")),
1866e95d51eSAdrian Prantl             XcodeSDK::Type::iPhoneSimulator);
1876e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")),
1886e95d51eSAdrian Prantl             XcodeSDK::Type::iPhoneOS);
1896e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
1906e95d51eSAdrian Prantl                 llvm::Triple("x86_64-apple-ios13.4-macabi")),
1916e95d51eSAdrian Prantl             XcodeSDK::Type::MacOSX);
1926e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
1936e95d51eSAdrian Prantl                 llvm::Triple("x86_64-apple-tvos-simulator")),
1946e95d51eSAdrian Prantl             XcodeSDK::Type::AppleTVSimulator);
1956e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")),
1966e95d51eSAdrian Prantl             XcodeSDK::Type::AppleTVOS);
1976e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
1986e95d51eSAdrian Prantl                 llvm::Triple("x86_64-apple-watchos-simulator")),
1996e95d51eSAdrian Prantl             XcodeSDK::Type::WatchSimulator);
2006e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")),
2016e95d51eSAdrian Prantl             XcodeSDK::Type::watchOS);
2026e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")),
2036e95d51eSAdrian Prantl             XcodeSDK::Type::Linux);
2046e95d51eSAdrian Prantl   EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")),
2056e95d51eSAdrian Prantl             XcodeSDK::Type::unknown);
2066e95d51eSAdrian Prantl }
207*3d7b926dSAdrian Prantl 
TEST(XcodeSDKTest,FindXcodeContentsDirectoryInPath)208*3d7b926dSAdrian Prantl TEST(XcodeSDKTest, FindXcodeContentsDirectoryInPath) {
209*3d7b926dSAdrian Prantl   std::string standard =
210*3d7b926dSAdrian Prantl       "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
211*3d7b926dSAdrian Prantl       "Developer/SDKs/MacOSX.sdk";
212*3d7b926dSAdrian Prantl   EXPECT_EQ("/Applications/Xcode.app/Contents",
213*3d7b926dSAdrian Prantl             XcodeSDK::FindXcodeContentsDirectoryInPath(standard));
214*3d7b926dSAdrian Prantl 
215*3d7b926dSAdrian Prantl   std::string standard_version =
216*3d7b926dSAdrian Prantl       "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
217*3d7b926dSAdrian Prantl       "Developer/SDKs/MacOSX10.15.sdk";
218*3d7b926dSAdrian Prantl   EXPECT_EQ("/Applications/Xcode.app/Contents",
219*3d7b926dSAdrian Prantl             XcodeSDK::FindXcodeContentsDirectoryInPath(standard_version));
220*3d7b926dSAdrian Prantl 
221*3d7b926dSAdrian Prantl   std::string beta = "/Applications/Xcode-beta.app/Contents/Developer/"
222*3d7b926dSAdrian Prantl                      "Platforms/MacOSX.platform/"
223*3d7b926dSAdrian Prantl                      "Developer/SDKs/MacOSX10.15.sdk";
224*3d7b926dSAdrian Prantl   EXPECT_EQ("/Applications/Xcode-beta.app/Contents",
225*3d7b926dSAdrian Prantl             XcodeSDK::FindXcodeContentsDirectoryInPath(beta));
226*3d7b926dSAdrian Prantl 
227*3d7b926dSAdrian Prantl   std::string no_app =
228*3d7b926dSAdrian Prantl       "/Applications/Xcode/Contents/Developer/Platforms/MacOSX.platform/"
229*3d7b926dSAdrian Prantl       "Developer/SDKs/MacOSX10.15.sdk";
230*3d7b926dSAdrian Prantl   EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_app));
231*3d7b926dSAdrian Prantl 
232*3d7b926dSAdrian Prantl   std::string no_contents =
233*3d7b926dSAdrian Prantl       "/Applications/Xcode.app/Developer/Platforms/MacOSX.platform/"
234*3d7b926dSAdrian Prantl       "Developer/SDKs/MacOSX10.15.sdk";
235*3d7b926dSAdrian Prantl   EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_contents));
236*3d7b926dSAdrian Prantl 
237*3d7b926dSAdrian Prantl   std::string no_capitalization =
238*3d7b926dSAdrian Prantl       "/Applications/Xcode.app/contents/Developer/Platforms/MacOSX.platform/"
239*3d7b926dSAdrian Prantl       "Developer/SDKs/MacOSX10.15.sdk";
240*3d7b926dSAdrian Prantl   EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_capitalization));
241*3d7b926dSAdrian Prantl }
242