15f557616SAlex Lorenz //===- unittests/Basic/DarwinSDKInfoTest.cpp -- SDKSettings.json test -----===//
25f557616SAlex Lorenz //
35f557616SAlex Lorenz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f557616SAlex Lorenz // See https://llvm.org/LICENSE.txt for license information.
55f557616SAlex Lorenz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f557616SAlex Lorenz //
75f557616SAlex Lorenz //===----------------------------------------------------------------------===//
85f557616SAlex Lorenz
95f557616SAlex Lorenz #include "clang/Basic/DarwinSDKInfo.h"
105f557616SAlex Lorenz #include "llvm/Support/JSON.h"
115f557616SAlex Lorenz #include "gtest/gtest.h"
12a1580d7bSKazu Hirata #include <optional>
135f557616SAlex Lorenz
145f557616SAlex Lorenz using namespace llvm;
155f557616SAlex Lorenz using namespace clang;
165f557616SAlex Lorenz
17809c6a5aSEgor Zhdan // Check the version mapping logic in DarwinSDKInfo.
TEST(DarwinSDKInfo,VersionMapping)18809c6a5aSEgor Zhdan TEST(DarwinSDKInfo, VersionMapping) {
19809c6a5aSEgor Zhdan llvm::json::Object Obj({{"3.0", "1.0"}, {"3.1", "1.2"}});
206ad0788cSKazu Hirata std::optional<DarwinSDKInfo::RelatedTargetVersionMapping> Mapping =
21809c6a5aSEgor Zhdan DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj,
22809c6a5aSEgor Zhdan VersionTuple());
23b8df4093SKazu Hirata EXPECT_TRUE(Mapping);
24809c6a5aSEgor Zhdan EXPECT_EQ(Mapping->getMinimumValue(), VersionTuple(1));
25809c6a5aSEgor Zhdan
26809c6a5aSEgor Zhdan // Exact mapping.
27a41fbb1fSKazu Hirata EXPECT_EQ(Mapping->map(VersionTuple(3), VersionTuple(0, 1), std::nullopt),
28809c6a5aSEgor Zhdan VersionTuple(1));
29a41fbb1fSKazu Hirata EXPECT_EQ(Mapping->map(VersionTuple(3, 0), VersionTuple(0, 1), std::nullopt),
30809c6a5aSEgor Zhdan VersionTuple(1));
31a41fbb1fSKazu Hirata EXPECT_EQ(
32a41fbb1fSKazu Hirata Mapping->map(VersionTuple(3, 0, 0), VersionTuple(0, 1), std::nullopt),
33809c6a5aSEgor Zhdan VersionTuple(1));
34a41fbb1fSKazu Hirata EXPECT_EQ(Mapping->map(VersionTuple(3, 1), VersionTuple(0, 1), std::nullopt),
35809c6a5aSEgor Zhdan VersionTuple(1, 2));
36a41fbb1fSKazu Hirata EXPECT_EQ(
37a41fbb1fSKazu Hirata Mapping->map(VersionTuple(3, 1, 0), VersionTuple(0, 1), std::nullopt),
38809c6a5aSEgor Zhdan VersionTuple(1, 2));
39809c6a5aSEgor Zhdan
40809c6a5aSEgor Zhdan // Missing mapping - fallback to major.
41a41fbb1fSKazu Hirata EXPECT_EQ(
42a41fbb1fSKazu Hirata Mapping->map(VersionTuple(3, 0, 1), VersionTuple(0, 1), std::nullopt),
43809c6a5aSEgor Zhdan VersionTuple(1));
44809c6a5aSEgor Zhdan
45809c6a5aSEgor Zhdan // Minimum
46a41fbb1fSKazu Hirata EXPECT_EQ(Mapping->map(VersionTuple(2), VersionTuple(0, 1), std::nullopt),
47809c6a5aSEgor Zhdan VersionTuple(0, 1));
48809c6a5aSEgor Zhdan
49809c6a5aSEgor Zhdan // Maximum
50809c6a5aSEgor Zhdan EXPECT_EQ(
51809c6a5aSEgor Zhdan Mapping->map(VersionTuple(4), VersionTuple(0, 1), VersionTuple(100)),
52809c6a5aSEgor Zhdan VersionTuple(100));
53809c6a5aSEgor Zhdan }
54809c6a5aSEgor Zhdan
55809c6a5aSEgor Zhdan // Check the version mapping logic in DarwinSDKInfo.
TEST(DarwinSDKInfo,VersionMappingMissingKey)56809c6a5aSEgor Zhdan TEST(DarwinSDKInfo, VersionMappingMissingKey) {
57809c6a5aSEgor Zhdan llvm::json::Object Obj({{"3.0", "1.0"}, {"5.0", "1.2"}});
586ad0788cSKazu Hirata std::optional<DarwinSDKInfo::RelatedTargetVersionMapping> Mapping =
59809c6a5aSEgor Zhdan DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj,
60809c6a5aSEgor Zhdan VersionTuple());
61b8df4093SKazu Hirata EXPECT_TRUE(Mapping);
62809c6a5aSEgor Zhdan EXPECT_EQ(
63809c6a5aSEgor Zhdan Mapping->map(VersionTuple(4), VersionTuple(0, 1), VersionTuple(100)),
64a41fbb1fSKazu Hirata std::nullopt);
65809c6a5aSEgor Zhdan }
66809c6a5aSEgor Zhdan
TEST(DarwinSDKInfo,VersionMappingParseEmpty)67809c6a5aSEgor Zhdan TEST(DarwinSDKInfo, VersionMappingParseEmpty) {
68809c6a5aSEgor Zhdan llvm::json::Object Obj({});
69809c6a5aSEgor Zhdan EXPECT_FALSE(
70809c6a5aSEgor Zhdan DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj, VersionTuple())
7153daa177SKazu Hirata .has_value());
72809c6a5aSEgor Zhdan }
73809c6a5aSEgor Zhdan
TEST(DarwinSDKInfo,VersionMappingParseError)74809c6a5aSEgor Zhdan TEST(DarwinSDKInfo, VersionMappingParseError) {
75809c6a5aSEgor Zhdan llvm::json::Object Obj({{"test", "1.2"}});
76809c6a5aSEgor Zhdan EXPECT_FALSE(
77809c6a5aSEgor Zhdan DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj, VersionTuple())
7853daa177SKazu Hirata .has_value());
79809c6a5aSEgor Zhdan }
80809c6a5aSEgor Zhdan
TEST(DarwinSDKInfoTest,ParseAndTestMappingMacCatalyst)81809c6a5aSEgor Zhdan TEST(DarwinSDKInfoTest, ParseAndTestMappingMacCatalyst) {
825f557616SAlex Lorenz llvm::json::Object Obj;
835f557616SAlex Lorenz Obj["Version"] = "11.0";
845f557616SAlex Lorenz Obj["MaximumDeploymentTarget"] = "11.99";
855f557616SAlex Lorenz llvm::json::Object VersionMap;
865f557616SAlex Lorenz VersionMap["10.15"] = "13.1";
875f557616SAlex Lorenz VersionMap["11.0"] = "14.0";
885f557616SAlex Lorenz VersionMap["11.2"] = "14.2";
895f557616SAlex Lorenz llvm::json::Object MacOS2iOSMac;
905f557616SAlex Lorenz MacOS2iOSMac["macOS_iOSMac"] = std::move(VersionMap);
915f557616SAlex Lorenz Obj["VersionMap"] = std::move(MacOS2iOSMac);
925f557616SAlex Lorenz
935f557616SAlex Lorenz auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj);
945f557616SAlex Lorenz ASSERT_TRUE(SDKInfo);
955f557616SAlex Lorenz EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(11, 0));
965f557616SAlex Lorenz
975f557616SAlex Lorenz auto Mapping = SDKInfo->getVersionMapping(
985f557616SAlex Lorenz DarwinSDKInfo::OSEnvPair::macOStoMacCatalystPair());
995f557616SAlex Lorenz ASSERT_TRUE(Mapping);
1005f557616SAlex Lorenz // Verify that the macOS versions that are present in the map are translated
1015f557616SAlex Lorenz // directly to their corresponding Mac Catalyst versions.
102a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(10, 15), VersionTuple(), std::nullopt),
1035f557616SAlex Lorenz VersionTuple(13, 1));
104a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(11, 0), VersionTuple(), std::nullopt),
1055f557616SAlex Lorenz VersionTuple(14, 0));
106a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(11, 2), VersionTuple(), std::nullopt),
1075f557616SAlex Lorenz VersionTuple(14, 2));
1085f557616SAlex Lorenz
1095f557616SAlex Lorenz // Verify that a macOS version that's not present in the map is translated
1105f557616SAlex Lorenz // like the nearest major OS version.
111a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(11, 1), VersionTuple(), std::nullopt),
1125f557616SAlex Lorenz VersionTuple(14, 0));
1135f557616SAlex Lorenz
1145f557616SAlex Lorenz // Verify that the macOS versions that are outside of the mapped version
1155f557616SAlex Lorenz // range map to the min/max values passed to the `map` call.
116a41fbb1fSKazu Hirata EXPECT_EQ(
117a41fbb1fSKazu Hirata *Mapping->map(VersionTuple(10, 14), VersionTuple(99, 99), std::nullopt),
1185f557616SAlex Lorenz VersionTuple(99, 99));
1195f557616SAlex Lorenz EXPECT_EQ(
1205f557616SAlex Lorenz *Mapping->map(VersionTuple(11, 5), VersionTuple(), VersionTuple(99, 99)),
1215f557616SAlex Lorenz VersionTuple(99, 99));
1225f557616SAlex Lorenz EXPECT_EQ(*Mapping->map(VersionTuple(11, 5), VersionTuple(99, 98),
1235f557616SAlex Lorenz VersionTuple(99, 99)),
1245f557616SAlex Lorenz VersionTuple(99, 99));
1255f557616SAlex Lorenz }
1265f557616SAlex Lorenz
TEST(DarwinSDKInfoTest,ParseAndTestMappingIOSDerived)127809c6a5aSEgor Zhdan TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) {
128809c6a5aSEgor Zhdan llvm::json::Object Obj;
129809c6a5aSEgor Zhdan Obj["Version"] = "15.0";
130809c6a5aSEgor Zhdan Obj["MaximumDeploymentTarget"] = "15.0.99";
131809c6a5aSEgor Zhdan llvm::json::Object VersionMap;
132809c6a5aSEgor Zhdan VersionMap["10.0"] = "10.0";
133809c6a5aSEgor Zhdan VersionMap["10.3.1"] = "10.2";
134809c6a5aSEgor Zhdan VersionMap["11.0"] = "11.0";
135809c6a5aSEgor Zhdan llvm::json::Object IOSToTvOS;
136809c6a5aSEgor Zhdan IOSToTvOS["iOS_tvOS"] = std::move(VersionMap);
137809c6a5aSEgor Zhdan Obj["VersionMap"] = std::move(IOSToTvOS);
138809c6a5aSEgor Zhdan
139809c6a5aSEgor Zhdan auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj);
140809c6a5aSEgor Zhdan ASSERT_TRUE(SDKInfo);
141809c6a5aSEgor Zhdan EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(15, 0));
142809c6a5aSEgor Zhdan
143809c6a5aSEgor Zhdan // Verify that mapping is present for platforms that derive from iOS.
144809c6a5aSEgor Zhdan const auto *Mapping = SDKInfo->getVersionMapping(DarwinSDKInfo::OSEnvPair(
145809c6a5aSEgor Zhdan llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::TvOS,
146809c6a5aSEgor Zhdan llvm::Triple::UnknownEnvironment));
147809c6a5aSEgor Zhdan ASSERT_TRUE(Mapping);
148809c6a5aSEgor Zhdan
149809c6a5aSEgor Zhdan // Verify that the iOS versions that are present in the map are translated
150809c6a5aSEgor Zhdan // directly to their corresponding tvOS versions.
151a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(10, 0), VersionTuple(), std::nullopt),
152809c6a5aSEgor Zhdan VersionTuple(10, 0));
153a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(10, 3, 1), VersionTuple(), std::nullopt),
154809c6a5aSEgor Zhdan VersionTuple(10, 2));
155a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(11, 0), VersionTuple(), std::nullopt),
156809c6a5aSEgor Zhdan VersionTuple(11, 0));
157809c6a5aSEgor Zhdan
158809c6a5aSEgor Zhdan // Verify that an iOS version that's not present in the map is translated
159809c6a5aSEgor Zhdan // like the nearest major OS version.
160a41fbb1fSKazu Hirata EXPECT_EQ(*Mapping->map(VersionTuple(10, 1), VersionTuple(), std::nullopt),
161809c6a5aSEgor Zhdan VersionTuple(10, 0));
162809c6a5aSEgor Zhdan
163809c6a5aSEgor Zhdan // Verify that the iOS versions that are outside of the mapped version
164809c6a5aSEgor Zhdan // range map to the min/max values passed to the `map` call.
165a41fbb1fSKazu Hirata EXPECT_EQ(
166a41fbb1fSKazu Hirata *Mapping->map(VersionTuple(9, 0), VersionTuple(99, 99), std::nullopt),
167809c6a5aSEgor Zhdan VersionTuple(99, 99));
168809c6a5aSEgor Zhdan EXPECT_EQ(
169809c6a5aSEgor Zhdan *Mapping->map(VersionTuple(13, 0), VersionTuple(), VersionTuple(99, 99)),
170809c6a5aSEgor Zhdan VersionTuple(99, 99));
171*9cf9cb27SCyndy Ishida
172*9cf9cb27SCyndy Ishida // Verify introduced, deprecated, and obsoleted mappings.
173*9cf9cb27SCyndy Ishida EXPECT_EQ(Mapping->mapIntroducedAvailabilityVersion(VersionTuple(10, 1)),
174*9cf9cb27SCyndy Ishida VersionTuple(10.0));
175*9cf9cb27SCyndy Ishida EXPECT_EQ(Mapping->mapDeprecatedObsoletedAvailabilityVersion(
176*9cf9cb27SCyndy Ishida VersionTuple(100000, 0)),
177*9cf9cb27SCyndy Ishida VersionTuple(100000));
178*9cf9cb27SCyndy Ishida EXPECT_EQ(
179*9cf9cb27SCyndy Ishida Mapping->mapDeprecatedObsoletedAvailabilityVersion(VersionTuple(13.0)),
180*9cf9cb27SCyndy Ishida VersionTuple(15, 0, 99));
181809c6a5aSEgor Zhdan }
182809c6a5aSEgor Zhdan
TEST(DarwinSDKInfoTest,MissingKeys)1835f557616SAlex Lorenz TEST(DarwinSDKInfoTest, MissingKeys) {
1845f557616SAlex Lorenz llvm::json::Object Obj;
1855f557616SAlex Lorenz ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj));
1865f557616SAlex Lorenz Obj["Version"] = "11.0";
1875f557616SAlex Lorenz ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj));
1885f557616SAlex Lorenz }
189