xref: /llvm-project/clang/unittests/Basic/DarwinSDKInfoTest.cpp (revision b8df4093e4d82c67a419911a46b63482043643e5)
1 //===- unittests/Basic/DarwinSDKInfoTest.cpp -- SDKSettings.json test -----===//
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 "clang/Basic/DarwinSDKInfo.h"
10 #include "llvm/Support/JSON.h"
11 #include "gtest/gtest.h"
12 
13 using namespace llvm;
14 using namespace clang;
15 
16 // Check the version mapping logic in DarwinSDKInfo.
17 TEST(DarwinSDKInfo, VersionMapping) {
18   llvm::json::Object Obj({{"3.0", "1.0"}, {"3.1", "1.2"}});
19   Optional<DarwinSDKInfo::RelatedTargetVersionMapping> Mapping =
20       DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj,
21                                                             VersionTuple());
22   EXPECT_TRUE(Mapping);
23   EXPECT_EQ(Mapping->getMinimumValue(), VersionTuple(1));
24 
25   // Exact mapping.
26   EXPECT_EQ(Mapping->map(VersionTuple(3), VersionTuple(0, 1), None),
27             VersionTuple(1));
28   EXPECT_EQ(Mapping->map(VersionTuple(3, 0), VersionTuple(0, 1), None),
29             VersionTuple(1));
30   EXPECT_EQ(Mapping->map(VersionTuple(3, 0, 0), VersionTuple(0, 1), None),
31             VersionTuple(1));
32   EXPECT_EQ(Mapping->map(VersionTuple(3, 1), VersionTuple(0, 1), None),
33             VersionTuple(1, 2));
34   EXPECT_EQ(Mapping->map(VersionTuple(3, 1, 0), VersionTuple(0, 1), None),
35             VersionTuple(1, 2));
36 
37   // Missing mapping - fallback to major.
38   EXPECT_EQ(Mapping->map(VersionTuple(3, 0, 1), VersionTuple(0, 1), None),
39             VersionTuple(1));
40 
41   // Minimum
42   EXPECT_EQ(Mapping->map(VersionTuple(2), VersionTuple(0, 1), None),
43             VersionTuple(0, 1));
44 
45   // Maximum
46   EXPECT_EQ(
47       Mapping->map(VersionTuple(4), VersionTuple(0, 1), VersionTuple(100)),
48       VersionTuple(100));
49 }
50 
51 // Check the version mapping logic in DarwinSDKInfo.
52 TEST(DarwinSDKInfo, VersionMappingMissingKey) {
53   llvm::json::Object Obj({{"3.0", "1.0"}, {"5.0", "1.2"}});
54   Optional<DarwinSDKInfo::RelatedTargetVersionMapping> Mapping =
55       DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj,
56                                                             VersionTuple());
57   EXPECT_TRUE(Mapping);
58   EXPECT_EQ(
59       Mapping->map(VersionTuple(4), VersionTuple(0, 1), VersionTuple(100)),
60       None);
61 }
62 
63 TEST(DarwinSDKInfo, VersionMappingParseEmpty) {
64   llvm::json::Object Obj({});
65   EXPECT_FALSE(
66       DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj, VersionTuple())
67           .hasValue());
68 }
69 
70 TEST(DarwinSDKInfo, VersionMappingParseError) {
71   llvm::json::Object Obj({{"test", "1.2"}});
72   EXPECT_FALSE(
73       DarwinSDKInfo::RelatedTargetVersionMapping::parseJSON(Obj, VersionTuple())
74           .hasValue());
75 }
76 
77 TEST(DarwinSDKInfoTest, ParseAndTestMappingMacCatalyst) {
78   llvm::json::Object Obj;
79   Obj["Version"] = "11.0";
80   Obj["MaximumDeploymentTarget"] = "11.99";
81   llvm::json::Object VersionMap;
82   VersionMap["10.15"] = "13.1";
83   VersionMap["11.0"] = "14.0";
84   VersionMap["11.2"] = "14.2";
85   llvm::json::Object MacOS2iOSMac;
86   MacOS2iOSMac["macOS_iOSMac"] = std::move(VersionMap);
87   Obj["VersionMap"] = std::move(MacOS2iOSMac);
88 
89   auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj);
90   ASSERT_TRUE(SDKInfo);
91   EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(11, 0));
92 
93   auto Mapping = SDKInfo->getVersionMapping(
94       DarwinSDKInfo::OSEnvPair::macOStoMacCatalystPair());
95   ASSERT_TRUE(Mapping);
96   // Verify that the macOS versions that are present in the map are translated
97   // directly to their corresponding Mac Catalyst versions.
98   EXPECT_EQ(*Mapping->map(VersionTuple(10, 15), VersionTuple(), None),
99             VersionTuple(13, 1));
100   EXPECT_EQ(*Mapping->map(VersionTuple(11, 0), VersionTuple(), None),
101             VersionTuple(14, 0));
102   EXPECT_EQ(*Mapping->map(VersionTuple(11, 2), VersionTuple(), None),
103             VersionTuple(14, 2));
104 
105   // Verify that a macOS version that's not present in the map is translated
106   // like the nearest major OS version.
107   EXPECT_EQ(*Mapping->map(VersionTuple(11, 1), VersionTuple(), None),
108             VersionTuple(14, 0));
109 
110   // Verify that the macOS versions that are outside of the mapped version
111   // range map to the min/max values passed to the `map` call.
112   EXPECT_EQ(*Mapping->map(VersionTuple(10, 14), VersionTuple(99, 99), None),
113             VersionTuple(99, 99));
114   EXPECT_EQ(
115       *Mapping->map(VersionTuple(11, 5), VersionTuple(), VersionTuple(99, 99)),
116       VersionTuple(99, 99));
117   EXPECT_EQ(*Mapping->map(VersionTuple(11, 5), VersionTuple(99, 98),
118                           VersionTuple(99, 99)),
119             VersionTuple(99, 99));
120 }
121 
122 TEST(DarwinSDKInfoTest, ParseAndTestMappingIOSDerived) {
123   llvm::json::Object Obj;
124   Obj["Version"] = "15.0";
125   Obj["MaximumDeploymentTarget"] = "15.0.99";
126   llvm::json::Object VersionMap;
127   VersionMap["10.0"] = "10.0";
128   VersionMap["10.3.1"] = "10.2";
129   VersionMap["11.0"] = "11.0";
130   llvm::json::Object IOSToTvOS;
131   IOSToTvOS["iOS_tvOS"] = std::move(VersionMap);
132   Obj["VersionMap"] = std::move(IOSToTvOS);
133 
134   auto SDKInfo = DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj);
135   ASSERT_TRUE(SDKInfo);
136   EXPECT_EQ(SDKInfo->getVersion(), VersionTuple(15, 0));
137 
138   // Verify that mapping is present for platforms that derive from iOS.
139   const auto *Mapping = SDKInfo->getVersionMapping(DarwinSDKInfo::OSEnvPair(
140       llvm::Triple::IOS, llvm::Triple::UnknownEnvironment, llvm::Triple::TvOS,
141       llvm::Triple::UnknownEnvironment));
142   ASSERT_TRUE(Mapping);
143 
144   // Verify that the iOS versions that are present in the map are translated
145   // directly to their corresponding tvOS versions.
146   EXPECT_EQ(*Mapping->map(VersionTuple(10, 0), VersionTuple(), None),
147             VersionTuple(10, 0));
148   EXPECT_EQ(*Mapping->map(VersionTuple(10, 3, 1), VersionTuple(), None),
149             VersionTuple(10, 2));
150   EXPECT_EQ(*Mapping->map(VersionTuple(11, 0), VersionTuple(), None),
151             VersionTuple(11, 0));
152 
153   // Verify that an iOS version that's not present in the map is translated
154   // like the nearest major OS version.
155   EXPECT_EQ(*Mapping->map(VersionTuple(10, 1), VersionTuple(), None),
156             VersionTuple(10, 0));
157 
158   // Verify that the iOS versions that are outside of the mapped version
159   // range map to the min/max values passed to the `map` call.
160   EXPECT_EQ(*Mapping->map(VersionTuple(9, 0), VersionTuple(99, 99), None),
161             VersionTuple(99, 99));
162   EXPECT_EQ(
163       *Mapping->map(VersionTuple(13, 0), VersionTuple(), VersionTuple(99, 99)),
164       VersionTuple(99, 99));
165 }
166 
167 TEST(DarwinSDKInfoTest, MissingKeys) {
168   llvm::json::Object Obj;
169   ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj));
170   Obj["Version"] = "11.0";
171   ASSERT_FALSE(DarwinSDKInfo::parseDarwinSDKSettingsJSON(&Obj));
172 }
173