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