1 //===-- XcodeSDKTest.cpp --------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "gtest/gtest.h"
11 #include "lldb/Utility/FileSpec.h"
12 #include "lldb/Utility/XcodeSDK.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/TargetParser/Triple.h"
19 using namespace lldb_private
;
21 TEST(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("Linux.sdk").GetType(), XcodeSDK::Linux
);
31 EXPECT_EQ(XcodeSDK("MacOSX.sdk").GetVersion(), llvm::VersionTuple());
32 EXPECT_EQ(XcodeSDK("MacOSX10.9.sdk").GetVersion(), llvm::VersionTuple(10, 9));
33 EXPECT_EQ(XcodeSDK("MacOSX10.15.4.sdk").GetVersion(), llvm::VersionTuple(10, 15));
34 EXPECT_EQ(XcodeSDK("MacOSX.sdk").IsAppleInternalSDK(), false);
35 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetType(), XcodeSDK::MacOSX
);
36 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").GetVersion(),
37 llvm::VersionTuple(10, 15));
38 EXPECT_EQ(XcodeSDK("MacOSX10.15.Internal.sdk").IsAppleInternalSDK(), true);
39 EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown
);
40 EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple());
43 TEST(XcodeSDKTest
, MergeTest
) {
44 XcodeSDK
sdk("MacOSX.sdk");
45 sdk
.Merge(XcodeSDK("WatchOS.sdk"));
46 // This doesn't make any particular sense and shouldn't happen in practice, we
47 // just want to guarantee a well-defined behavior when choosing one
48 // SDK to fit all CUs in an lldb::Module.
49 // -> The higher number wins.
50 EXPECT_EQ(sdk
.GetType(), XcodeSDK::watchOS
);
51 sdk
.Merge(XcodeSDK("WatchOS1.1.sdk"));
52 EXPECT_EQ(sdk
.GetVersion(), llvm::VersionTuple(1, 1));
53 sdk
.Merge(XcodeSDK("WatchOS2.0.sdk"));
54 EXPECT_EQ(sdk
.GetVersion(), llvm::VersionTuple(2, 0));
55 sdk
.Merge(XcodeSDK("WatchOS1.1.Internal.sdk"));
56 EXPECT_EQ(sdk
.GetVersion(), llvm::VersionTuple(2, 0));
57 EXPECT_EQ(sdk
.IsAppleInternalSDK(), true);
59 empty
.Merge(XcodeSDK("MacOSX10.14.Internal.sdk"));
60 EXPECT_EQ(empty
.GetString(), llvm::StringRef("MacOSX10.14.Internal.sdk"));
64 TEST(XcodeSDKTest
, SDKSupportsModules
) {
65 std::string base
= "/Applications/Xcode.app/Contents/Developer/Platforms/";
66 EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
67 XcodeSDK::Type::iPhoneSimulator
,
70 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator12.0.sdk")));
71 EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
72 XcodeSDK::Type::iPhoneSimulator
,
73 FileSpec(base
+ "iPhoneSimulator.platform/Developer/SDKs/"
74 "iPhoneSimulator12.0.Internal.sdk")));
75 EXPECT_FALSE(XcodeSDK::SDKSupportsModules(
76 XcodeSDK::Type::iPhoneSimulator
,
79 "iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.2.sdk")));
80 EXPECT_TRUE(XcodeSDK::SDKSupportsModules(
81 XcodeSDK::Type::MacOSX
,
82 FileSpec(base
+ "MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk")));
83 EXPECT_FALSE(XcodeSDK::SDKSupportsModules(
84 XcodeSDK::Type::MacOSX
,
85 FileSpec(base
+ "MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk")));
89 TEST(XcodeSDKTest
, SDKSupportsSwift
) {
90 EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.sdk").SupportsSwift());
91 EXPECT_TRUE(XcodeSDK("iPhoneSimulator12.0.Internal.sdk").SupportsSwift());
92 EXPECT_FALSE(XcodeSDK("iPhoneSimulator7.2.sdk").SupportsSwift());
93 EXPECT_TRUE(XcodeSDK("MacOSX10.10.sdk").SupportsSwift());
94 EXPECT_FALSE(XcodeSDK("MacOSX10.9.sdk").SupportsSwift());
95 EXPECT_TRUE(XcodeSDK("Linux.sdk").SupportsSwift());
96 EXPECT_TRUE(XcodeSDK("MacOSX.sdk").SupportsSwift());
97 EXPECT_FALSE(XcodeSDK("EverythingElse.sdk").SupportsSwift());
100 TEST(XcodeSDKTest
, GetCanonicalNameAndConstruct
) {
102 info
.type
= XcodeSDK::Type::MacOSX
;
103 EXPECT_EQ("macosx", XcodeSDK::GetCanonicalName(info
));
104 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
106 info
.type
= XcodeSDK::Type::iPhoneSimulator
;
107 EXPECT_EQ("iphonesimulator", XcodeSDK::GetCanonicalName(info
));
108 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
110 info
.type
= XcodeSDK::Type::iPhoneOS
;
111 EXPECT_EQ("iphoneos", XcodeSDK::GetCanonicalName(info
));
112 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
114 info
.type
= XcodeSDK::Type::AppleTVSimulator
;
115 EXPECT_EQ("appletvsimulator", XcodeSDK::GetCanonicalName(info
));
116 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
118 info
.type
= XcodeSDK::Type::AppleTVOS
;
119 EXPECT_EQ("appletvos", XcodeSDK::GetCanonicalName(info
));
120 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
122 info
.type
= XcodeSDK::Type::WatchSimulator
;
123 EXPECT_EQ("watchsimulator", XcodeSDK::GetCanonicalName(info
));
124 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
126 info
.type
= XcodeSDK::Type::watchOS
;
127 EXPECT_EQ("watchos", XcodeSDK::GetCanonicalName(info
));
128 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
130 info
.type
= XcodeSDK::Type::Linux
;
131 EXPECT_EQ("linux", XcodeSDK::GetCanonicalName(info
));
132 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
134 info
.type
= XcodeSDK::Type::unknown
;
135 EXPECT_EQ("", XcodeSDK::GetCanonicalName(info
));
136 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
138 info
.internal
= true;
139 info
.type
= XcodeSDK::Type::MacOSX
;
140 EXPECT_EQ("macosx.internal", XcodeSDK::GetCanonicalName(info
));
141 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
143 info
.type
= XcodeSDK::Type::iPhoneSimulator
;
144 EXPECT_EQ("iphonesimulator.internal", XcodeSDK::GetCanonicalName(info
));
145 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
147 info
.type
= XcodeSDK::Type::iPhoneOS
;
148 EXPECT_EQ("iphoneos.internal", XcodeSDK::GetCanonicalName(info
));
149 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
151 info
.type
= XcodeSDK::Type::AppleTVSimulator
;
152 EXPECT_EQ("appletvsimulator.internal", XcodeSDK::GetCanonicalName(info
));
153 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
155 info
.type
= XcodeSDK::Type::AppleTVOS
;
156 EXPECT_EQ("appletvos.internal", XcodeSDK::GetCanonicalName(info
));
157 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
159 info
.type
= XcodeSDK::Type::WatchSimulator
;
160 EXPECT_EQ("watchsimulator.internal", XcodeSDK::GetCanonicalName(info
));
161 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
163 info
.type
= XcodeSDK::Type::watchOS
;
164 EXPECT_EQ("watchos.internal", XcodeSDK::GetCanonicalName(info
));
165 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
167 info
.type
= XcodeSDK::Type::MacOSX
;
168 info
.version
= llvm::VersionTuple(10, 9);
169 EXPECT_EQ("macosx10.9.internal", XcodeSDK::GetCanonicalName(info
));
170 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
172 info
.type
= XcodeSDK::Type::iPhoneOS
;
173 info
.version
= llvm::VersionTuple(7, 0);
174 EXPECT_EQ("iphoneos7.0.internal", XcodeSDK::GetCanonicalName(info
));
175 EXPECT_EQ(XcodeSDK(info
).Parse(), info
);
178 TEST(XcodeSDKTest
, GetSDKTypeForTriple
) {
180 XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-macosx10.14")),
181 XcodeSDK::Type::MacOSX
);
182 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-apple-darwin")),
183 XcodeSDK::Type::MacOSX
);
184 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
185 llvm::Triple("x86_64-apple-ios13.4-simulator")),
186 XcodeSDK::Type::iPhoneSimulator
);
187 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-ios13.4")),
188 XcodeSDK::Type::iPhoneOS
);
189 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
190 llvm::Triple("x86_64-apple-ios13.4-macabi")),
191 XcodeSDK::Type::MacOSX
);
192 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
193 llvm::Triple("x86_64-apple-tvos-simulator")),
194 XcodeSDK::Type::AppleTVSimulator
);
195 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-tvos")),
196 XcodeSDK::Type::AppleTVOS
);
197 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(
198 llvm::Triple("x86_64-apple-watchos-simulator")),
199 XcodeSDK::Type::WatchSimulator
);
200 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64-apple-watchos")),
201 XcodeSDK::Type::watchOS
);
202 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("x86_64-unknown-linux")),
203 XcodeSDK::Type::Linux
);
204 EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("i386-unknown-netbsd")),
205 XcodeSDK::Type::unknown
);
208 TEST(XcodeSDKTest
, FindXcodeContentsDirectoryInPath
) {
209 std::string standard
=
210 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
211 "Developer/SDKs/MacOSX.sdk";
212 EXPECT_EQ("/Applications/Xcode.app/Contents",
213 XcodeSDK::FindXcodeContentsDirectoryInPath(standard
));
215 std::string standard_version
=
216 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/"
217 "Developer/SDKs/MacOSX10.15.sdk";
218 EXPECT_EQ("/Applications/Xcode.app/Contents",
219 XcodeSDK::FindXcodeContentsDirectoryInPath(standard_version
));
221 std::string beta
= "/Applications/Xcode-beta.app/Contents/Developer/"
222 "Platforms/MacOSX.platform/"
223 "Developer/SDKs/MacOSX10.15.sdk";
224 EXPECT_EQ("/Applications/Xcode-beta.app/Contents",
225 XcodeSDK::FindXcodeContentsDirectoryInPath(beta
));
228 "/Applications/Xcode/Contents/Developer/Platforms/MacOSX.platform/"
229 "Developer/SDKs/MacOSX10.15.sdk";
230 EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_app
));
232 std::string no_contents
=
233 "/Applications/Xcode.app/Developer/Platforms/MacOSX.platform/"
234 "Developer/SDKs/MacOSX10.15.sdk";
235 EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_contents
));
237 std::string no_capitalization
=
238 "/Applications/Xcode.app/contents/Developer/Platforms/MacOSX.platform/"
239 "Developer/SDKs/MacOSX10.15.sdk";
240 EXPECT_EQ("", XcodeSDK::FindXcodeContentsDirectoryInPath(no_capitalization
));