aboutsummaryrefslogtreecommitdiff
path: root/lldb/unittests/Utility/XcodeSDKTest.cpp
blob: 4db6a50fcf860a1605921f2108647783c739a434 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
//===-- 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/TargetParser/Triple.h"

#include <tuple>

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("XRSimulator.sdk").GetType(), XcodeSDK::XRSimulator);
  EXPECT_EQ(XcodeSDK("XROS.sdk").GetType(), XcodeSDK::XROS);
  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("MacOSX.sdk", FileSpec{"/Path/To/MacOSX.sdk"}).GetSysroot(),
      FileSpec("/Path/To/MacOSX.sdk"));
  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_FALSE(XcodeSDK("MacOSX10.15.Internal.sdk").GetSysroot());
  EXPECT_EQ(XcodeSDK().GetType(), XcodeSDK::unknown);
  EXPECT_EQ(XcodeSDK().GetVersion(), llvm::VersionTuple());
  EXPECT_FALSE(XcodeSDK().GetSysroot());
}

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"));
  EXPECT_FALSE(empty.GetSysroot());
  empty.Merge(XcodeSDK("MacOSX9.5.Internal.sdk",
                       FileSpec{"/Path/To/MacOSX9.5.Internal.sdk"}));
  EXPECT_FALSE(empty.GetSysroot());
  empty.Merge(XcodeSDK("MacOSX12.5.sdk", FileSpec{"/Path/To/MacOSX12.5.sdk"}));
  EXPECT_EQ(empty.GetSysroot(), FileSpec{"/Path/To/MacOSX12.5.sdk"});
  empty.Merge(XcodeSDK("MacOSX11.5.Internal.sdk",
                       FileSpec{"/Path/To/MacOSX11.5.Internal.sdk"}));
  EXPECT_EQ(empty.GetSysroot(), FileSpec{"/Path/To/MacOSX12.5.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::XRSimulator;
  EXPECT_EQ("xrsimulator", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::XROS;
  EXPECT_EQ("xros", 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::XRSimulator;
  EXPECT_EQ("xrsimulator.internal", XcodeSDK::GetCanonicalName(info));
  EXPECT_EQ(XcodeSDK(info).Parse(), info);

  info.type = XcodeSDK::Type::XROS;
  EXPECT_EQ("xros.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("arm64e-apple-xros-simulator")),
            XcodeSDK::Type::XRSimulator);
  EXPECT_EQ(XcodeSDK::GetSDKTypeForTriple(llvm::Triple("arm64e-apple-xros")),
            XcodeSDK::Type::XROS);
  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));
}