xref: /llvm-project/llvm/unittests/TextAPI/TextStubV4Tests.cpp (revision d9a9872ec4760762fdc467ef283cea302a3742e5)
1f9d8162bSCyndy Ishida //===-- TextStubV4Tests.cpp - TBD V4 File Test ----------------------------===//
2f9d8162bSCyndy Ishida //
3f9d8162bSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f9d8162bSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
5f9d8162bSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f9d8162bSCyndy Ishida //
7f9d8162bSCyndy Ishida //===-----------------------------------------------------------------------===/
85810ed51SJonas Devlieghere 
95810ed51SJonas Devlieghere #include "TextStubHelpers.h"
100116d04dSCyndy Ishida #include "llvm/TextAPI/InterfaceFile.h"
110116d04dSCyndy Ishida #include "llvm/TextAPI/TextAPIReader.h"
120116d04dSCyndy Ishida #include "llvm/TextAPI/TextAPIWriter.h"
13f9d8162bSCyndy Ishida #include "gtest/gtest.h"
14f9d8162bSCyndy Ishida #include <string>
15f9d8162bSCyndy Ishida #include <vector>
16f9d8162bSCyndy Ishida 
17f9d8162bSCyndy Ishida using namespace llvm;
18f9d8162bSCyndy Ishida using namespace llvm::MachO;
19f9d8162bSCyndy Ishida 
20f9d8162bSCyndy Ishida 
21f9d8162bSCyndy Ishida namespace TBDv4 {
22f9d8162bSCyndy Ishida 
TEST(TBDv4,ReadFile)23f9d8162bSCyndy Ishida TEST(TBDv4, ReadFile) {
24d26e0bcfSCyndy Ishida   static const char TBDv4File[] =
25f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
26f9d8162bSCyndy Ishida       "tbd-version: 4\n"
27f9d8162bSCyndy Ishida       "targets:  [ i386-macos, x86_64-macos, x86_64-ios ]\n"
28f9d8162bSCyndy Ishida       "uuids:\n"
29f9d8162bSCyndy Ishida       "  - target: i386-macos\n"
30f9d8162bSCyndy Ishida       "    value: 00000000-0000-0000-0000-000000000000\n"
31f9d8162bSCyndy Ishida       "  - target: x86_64-macos\n"
32f9d8162bSCyndy Ishida       "    value: 11111111-1111-1111-1111-111111111111\n"
33f9d8162bSCyndy Ishida       "  - target: x86_64-ios\n"
34f9d8162bSCyndy Ishida       "    value: 11111111-1111-1111-1111-111111111111\n"
35f9d8162bSCyndy Ishida       "flags: [ flat_namespace, installapi ]\n"
36f9d8162bSCyndy Ishida       "install-name: Umbrella.framework/Umbrella\n"
37f9d8162bSCyndy Ishida       "current-version: 1.2.3\n"
38f9d8162bSCyndy Ishida       "compatibility-version: 1.2\n"
39f9d8162bSCyndy Ishida       "swift-abi-version: 5\n"
40f9d8162bSCyndy Ishida       "parent-umbrella:\n"
41f9d8162bSCyndy Ishida       "  - targets: [ i386-macos, x86_64-macos, x86_64-ios ]\n"
42f9d8162bSCyndy Ishida       "    umbrella: System\n"
43f9d8162bSCyndy Ishida       "allowable-clients:\n"
44f9d8162bSCyndy Ishida       "  - targets: [ i386-macos, x86_64-macos, x86_64-ios ]\n"
45f9d8162bSCyndy Ishida       "    clients: [ ClientA ]\n"
46f9d8162bSCyndy Ishida       "reexported-libraries:\n"
47f9d8162bSCyndy Ishida       "  - targets: [ i386-macos ]\n"
48f9d8162bSCyndy Ishida       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
49f9d8162bSCyndy Ishida       "exports:\n"
50f9d8162bSCyndy Ishida       "  - targets: [ i386-macos ]\n"
51f9d8162bSCyndy Ishida       "    symbols: [ _symA ]\n"
52f9d8162bSCyndy Ishida       "    objc-classes: []\n"
53f9d8162bSCyndy Ishida       "    objc-eh-types: []\n"
54f9d8162bSCyndy Ishida       "    objc-ivars: []\n"
55f9d8162bSCyndy Ishida       "    weak-symbols: []\n"
56f9d8162bSCyndy Ishida       "    thread-local-symbols: []\n"
57f9d8162bSCyndy Ishida       "  - targets: [ x86_64-ios ]\n"
58f9d8162bSCyndy Ishida       "    symbols: [_symB]\n"
59f9d8162bSCyndy Ishida       "  - targets: [ x86_64-macos, x86_64-ios ]\n"
60f9d8162bSCyndy Ishida       "    symbols: [_symAB]\n"
61f9d8162bSCyndy Ishida       "reexports:\n"
62f9d8162bSCyndy Ishida       "  - targets: [ i386-macos ]\n"
63f9d8162bSCyndy Ishida       "    symbols: [_symC]\n"
64f9d8162bSCyndy Ishida       "    objc-classes: []\n"
65f9d8162bSCyndy Ishida       "    objc-eh-types: []\n"
66f9d8162bSCyndy Ishida       "    objc-ivars: []\n"
679b29de1cSCyndy Ishida       "    weak-symbols: [weakReexport]\n"
68f9d8162bSCyndy Ishida       "    thread-local-symbols: []\n"
69f9d8162bSCyndy Ishida       "undefineds:\n"
70f9d8162bSCyndy Ishida       "  - targets: [ i386-macos ]\n"
71f9d8162bSCyndy Ishida       "    symbols: [ _symD ]\n"
72f9d8162bSCyndy Ishida       "    objc-classes: []\n"
73f9d8162bSCyndy Ishida       "    objc-eh-types: []\n"
74f9d8162bSCyndy Ishida       "    objc-ivars: []\n"
759b29de1cSCyndy Ishida       "    weak-symbols: [weakReference]\n"
76f9d8162bSCyndy Ishida       "    thread-local-symbols: []\n"
77f9d8162bSCyndy Ishida       "...\n";
78f9d8162bSCyndy Ishida 
792ba32084SCyndy Ishida   Expected<TBDFile> Result =
802ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4File, "Test.tbd"));
81f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
822ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
83f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
84f9d8162bSCyndy Ishida   PlatformSet Platforms;
85c4ed142eSCyndy Ishida   Platforms.insert(getPlatformFromName("macos"));
86c4ed142eSCyndy Ishida   Platforms.insert(getPlatformFromName("ios"));
87f9d8162bSCyndy Ishida   auto Archs = AK_i386 | AK_x86_64;
88f9d8162bSCyndy Ishida   TargetList Targets = {
893025c3edSJuergen Ributzka       Target(AK_i386, PLATFORM_MACOS),
903025c3edSJuergen Ributzka       Target(AK_x86_64, PLATFORM_MACOS),
913025c3edSJuergen Ributzka       Target(AK_x86_64, PLATFORM_IOS),
92f9d8162bSCyndy Ishida   };
93f9d8162bSCyndy Ishida   EXPECT_EQ(Archs, File->getArchitectures());
94f9d8162bSCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
95f9d8162bSCyndy Ishida   for (auto Platform : File->getPlatforms())
96f9d8162bSCyndy Ishida     EXPECT_EQ(Platforms.count(Platform), 1U);
97f9d8162bSCyndy Ishida   EXPECT_EQ(std::string("Umbrella.framework/Umbrella"), File->getInstallName());
98f9d8162bSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 3), File->getCurrentVersion());
99f9d8162bSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), File->getCompatibilityVersion());
100f9d8162bSCyndy Ishida   EXPECT_EQ(5U, File->getSwiftABIVersion());
101f9d8162bSCyndy Ishida   EXPECT_FALSE(File->isTwoLevelNamespace());
102f9d8162bSCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
103e17efa60SCyndy Ishida   EXPECT_FALSE(File->isOSLibNotForSharedCache());
104f9d8162bSCyndy Ishida   InterfaceFileRef client("ClientA", Targets);
105f9d8162bSCyndy Ishida   InterfaceFileRef reexport("/System/Library/Frameworks/A.framework/A",
106f9d8162bSCyndy Ishida                             {Targets[0]});
107f9d8162bSCyndy Ishida   EXPECT_EQ(1U, File->allowableClients().size());
108f9d8162bSCyndy Ishida   EXPECT_EQ(client, File->allowableClients().front());
109f9d8162bSCyndy Ishida   EXPECT_EQ(1U, File->reexportedLibraries().size());
110f9d8162bSCyndy Ishida   EXPECT_EQ(reexport, File->reexportedLibraries().front());
111f9d8162bSCyndy Ishida 
1125810ed51SJonas Devlieghere   ExportedSymbolSeq Exports, Reexports, Undefineds;
113f9d8162bSCyndy Ishida   for (const auto *Sym : File->symbols()) {
1149b29de1cSCyndy Ishida     ExportedSymbol Temp =
1159b29de1cSCyndy Ishida         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
1169b29de1cSCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
1179b29de1cSCyndy Ishida                        Sym->isThreadLocalValue()};
1189b29de1cSCyndy Ishida     if (Sym->isUndefined()) {
1199b29de1cSCyndy Ishida       EXPECT_FALSE(Sym->isWeakDefined());
1209b29de1cSCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
1219b29de1cSCyndy Ishida     }
1229b29de1cSCyndy Ishida     // Check that defined symbols cannot be set as weak referenced.
1239b29de1cSCyndy Ishida     else if (Sym->isReexported()) {
124f9d8162bSCyndy Ishida       EXPECT_FALSE(Sym->isWeakReferenced());
1259b29de1cSCyndy Ishida       Reexports.emplace_back(std::move(Temp));
1269b29de1cSCyndy Ishida     } else {
1279b29de1cSCyndy Ishida       EXPECT_FALSE(Sym->isWeakReferenced());
1289b29de1cSCyndy Ishida       Exports.emplace_back(std::move(Temp));
1299b29de1cSCyndy Ishida     }
130f9d8162bSCyndy Ishida   }
131cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
132cd9a5cfdSDmitri Gribenko   llvm::sort(Reexports);
133cd9a5cfdSDmitri Gribenko   llvm::sort(Undefineds);
134f9d8162bSCyndy Ishida 
135fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedExportedSymbols[] = {
136*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symA", false, false},
137*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symAB", false, false},
138*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symB", false, false},
139fd4d0751SCyndy Ishida   };
140fd4d0751SCyndy Ishida 
141fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedReexportedSymbols[] = {
142*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symC", false, false},
143*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "weakReexport", true, false},
144fd4d0751SCyndy Ishida   };
145fd4d0751SCyndy Ishida 
146fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedUndefinedSymbols[] = {
147*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symD", false, false},
148*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "weakReference", true, false},
149fd4d0751SCyndy Ishida   };
150fd4d0751SCyndy Ishida 
151589725f6SKazu Hirata   EXPECT_EQ(std::size(ExpectedExportedSymbols), Exports.size());
152589725f6SKazu Hirata   EXPECT_EQ(std::size(ExpectedReexportedSymbols), Reexports.size());
153589725f6SKazu Hirata   EXPECT_EQ(std::size(ExpectedUndefinedSymbols), Undefineds.size());
154f9d8162bSCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
155fd4d0751SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
156f9d8162bSCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
157fd4d0751SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
158f9d8162bSCyndy Ishida   EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(),
159fd4d0751SCyndy Ishida                          std::begin(ExpectedUndefinedSymbols)));
160fd4d0751SCyndy Ishida }
161fd4d0751SCyndy Ishida 
TEST(TBDv4,ReadMultipleDocuments)162fd4d0751SCyndy Ishida TEST(TBDv4, ReadMultipleDocuments) {
163fd4d0751SCyndy Ishida   static const char TBDv4Inlines[] =
164fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
165fd4d0751SCyndy Ishida       "tbd-version: 4\n"
166fd4d0751SCyndy Ishida       "targets: [ i386-macos, i386-maccatalyst, x86_64-macos, "
167fd4d0751SCyndy Ishida       "x86_64-maccatalyst ]\n"
168fd4d0751SCyndy Ishida       "install-name: /System/Library/Frameworks/Umbrella.framework/Umbrella\n"
169fd4d0751SCyndy Ishida       "parent-umbrella:\n"
170fd4d0751SCyndy Ishida       "  - targets: [ i386-macos, x86_64-macos ]\n"
171fd4d0751SCyndy Ishida       "    umbrella: System\n"
172fd4d0751SCyndy Ishida       "reexported-libraries:\n"
173fd4d0751SCyndy Ishida       "  - targets: [ i386-macos, x86_64-macos ]\n"
174fd4d0751SCyndy Ishida       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
175fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
176fd4d0751SCyndy Ishida       "tbd-version: 4\n"
177fd4d0751SCyndy Ishida       "targets:  [ i386-macos, x86_64-macos ]\n"
178fd4d0751SCyndy Ishida       "uuids:\n"
179fd4d0751SCyndy Ishida       "  - target: i386-macos\n"
180fd4d0751SCyndy Ishida       "    value: 20000000-0000-0000-0000-000000000000\n"
181fd4d0751SCyndy Ishida       "  - target: x86_64-macos\n"
182fd4d0751SCyndy Ishida       "    value: 21111111-1111-1111-1111-111111111111\n"
183fd4d0751SCyndy Ishida       "flags: [ flat_namespace ]\n"
184fd4d0751SCyndy Ishida       "install-name: /System/Library/Frameworks/A.framework/A\n"
185fd4d0751SCyndy Ishida       "current-version: 1.2.3\n"
186fd4d0751SCyndy Ishida       "compatibility-version: 1.2\n"
187fd4d0751SCyndy Ishida       "swift-abi-version: 5\n"
188fd4d0751SCyndy Ishida       "exports:\n"
189fd4d0751SCyndy Ishida       "  - targets: [ i386-macos ]\n"
190fd4d0751SCyndy Ishida       "    symbols: [ _symA ]\n"
191fd4d0751SCyndy Ishida       "    objc-classes: []\n"
192fd4d0751SCyndy Ishida       "    objc-eh-types: []\n"
193fd4d0751SCyndy Ishida       "    objc-ivars: []\n"
194fd4d0751SCyndy Ishida       "    weak-symbols: []\n"
195fd4d0751SCyndy Ishida       "    thread-local-symbols: []\n"
196fd4d0751SCyndy Ishida       "  - targets: [ x86_64-macos ]\n"
197fd4d0751SCyndy Ishida       "    symbols: [_symAB]\n"
198fd4d0751SCyndy Ishida       "reexports:\n"
199fd4d0751SCyndy Ishida       "  - targets: [ i386-macos ]\n"
200fd4d0751SCyndy Ishida       "    symbols: [_symC]\n"
201fd4d0751SCyndy Ishida       "    objc-classes: []\n"
202fd4d0751SCyndy Ishida       "    objc-eh-types: []\n"
203fd4d0751SCyndy Ishida       "    objc-ivars: []\n"
204fd4d0751SCyndy Ishida       "    weak-symbols: []\n"
205fd4d0751SCyndy Ishida       "    thread-local-symbols: []\n"
206fd4d0751SCyndy Ishida       "undefineds:\n"
207fd4d0751SCyndy Ishida       "  - targets: [ i386-macos ]\n"
208fd4d0751SCyndy Ishida       "    symbols: [ _symD ]\n"
209fd4d0751SCyndy Ishida       "    objc-classes: []\n"
210fd4d0751SCyndy Ishida       "    objc-eh-types: []\n"
211fd4d0751SCyndy Ishida       "    objc-ivars: []\n"
212fd4d0751SCyndy Ishida       "    weak-symbols: []\n"
213fd4d0751SCyndy Ishida       "    thread-local-symbols: []\n"
214fd4d0751SCyndy Ishida       "...\n";
215fd4d0751SCyndy Ishida 
216fd4d0751SCyndy Ishida   PlatformSet Platforms;
2173025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACOS);
2183025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
219fd4d0751SCyndy Ishida   ArchitectureSet Archs = AK_i386 | AK_x86_64;
220fd4d0751SCyndy Ishida   TargetList Targets;
221fd4d0751SCyndy Ishida   for (auto &&Arch : Archs)
222fd4d0751SCyndy Ishida     for (auto &&Platform : Platforms)
223fd4d0751SCyndy Ishida       Targets.emplace_back(Target(Arch, Platform));
224b70d87bcSCyndy Ishida   TargetToAttr Uuids = {
225fd4d0751SCyndy Ishida       {Targets[0], "00000000-0000-0000-0000-000000000000"},
226fd4d0751SCyndy Ishida       {Targets[1], "00000000-0000-0000-0000-000000000002"},
227fd4d0751SCyndy Ishida       {Targets[2], "11111111-1111-1111-1111-111111111111"},
228fd4d0751SCyndy Ishida       {Targets[3], "11111111-1111-1111-1111-111111111112"},
229fd4d0751SCyndy Ishida   };
230fd4d0751SCyndy Ishida 
2312ba32084SCyndy Ishida   Expected<TBDFile> Result =
2322ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Inlines, "Test.tbd"));
233fd4d0751SCyndy Ishida   EXPECT_TRUE(!!Result);
2342ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
235fd4d0751SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
236fd4d0751SCyndy Ishida   EXPECT_EQ(Archs, File->getArchitectures());
237fd4d0751SCyndy Ishida   EXPECT_EQ(Platforms, File->getPlatforms());
238fd4d0751SCyndy Ishida   EXPECT_EQ(
239fd4d0751SCyndy Ishida       std::string("/System/Library/Frameworks/Umbrella.framework/Umbrella"),
240fd4d0751SCyndy Ishida       File->getInstallName());
241fd4d0751SCyndy Ishida   EXPECT_TRUE(File->isTwoLevelNamespace());
242fd4d0751SCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
243fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion());
244fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
245fd4d0751SCyndy Ishida   InterfaceFileRef reexport("/System/Library/Frameworks/A.framework/A",
246fd4d0751SCyndy Ishida                             {Targets[0], Targets[2]});
247fd4d0751SCyndy Ishida   EXPECT_EQ(1U, File->reexportedLibraries().size());
248fd4d0751SCyndy Ishida   EXPECT_EQ(reexport, File->reexportedLibraries().front());
24925fefa5aSPaul Robinson   EXPECT_TRUE(File->symbols().empty());
250fd4d0751SCyndy Ishida 
251fd4d0751SCyndy Ishida   // Check Inlined Document
252fd4d0751SCyndy Ishida   Targets.clear();
253fd4d0751SCyndy Ishida   Uuids.clear();
2543025c3edSJuergen Ributzka   PlatformType Platform = PLATFORM_MACOS;
255fd4d0751SCyndy Ishida   for (auto &&Arch : Archs)
256fd4d0751SCyndy Ishida     Targets.emplace_back(Target(Arch, Platform));
257fd4d0751SCyndy Ishida   Uuids = {
258fd4d0751SCyndy Ishida       {Targets[0], "20000000-0000-0000-0000-000000000000"},
259fd4d0751SCyndy Ishida       {Targets[1], "21111111-1111-1111-1111-111111111111"},
260fd4d0751SCyndy Ishida   };
261fd4d0751SCyndy Ishida 
2620b15cb70SCyndy Ishida   TBDReexportFile Document = File->documents().front();
263fd4d0751SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, Document->getFileType());
264fd4d0751SCyndy Ishida   EXPECT_EQ(Archs, Document->getArchitectures());
265fd4d0751SCyndy Ishida   EXPECT_EQ(1U, Document->getPlatforms().size());
266fd4d0751SCyndy Ishida   EXPECT_EQ(Platform, *(Document->getPlatforms().begin()));
267fd4d0751SCyndy Ishida   EXPECT_EQ(std::string("/System/Library/Frameworks/A.framework/A"),
268fd4d0751SCyndy Ishida             Document->getInstallName());
269fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 3), Document->getCurrentVersion());
270fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), Document->getCompatibilityVersion());
271fd4d0751SCyndy Ishida   EXPECT_EQ(5U, Document->getSwiftABIVersion());
272fd4d0751SCyndy Ishida   EXPECT_FALSE(Document->isTwoLevelNamespace());
273fd4d0751SCyndy Ishida   EXPECT_TRUE(Document->isApplicationExtensionSafe());
274fd4d0751SCyndy Ishida 
27525fefa5aSPaul Robinson   ExportedSymbolSeq Exports;
276fd4d0751SCyndy Ishida   ExportedSymbolSeq Reexports, Undefineds;
277fd4d0751SCyndy Ishida   for (const auto *Sym : Document->symbols()) {
278fd4d0751SCyndy Ishida     ExportedSymbol Temp =
279fd4d0751SCyndy Ishida         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
280fd4d0751SCyndy Ishida                        Sym->isWeakDefined(), Sym->isThreadLocalValue()};
281fd4d0751SCyndy Ishida     EXPECT_FALSE(Sym->isWeakReferenced());
282fd4d0751SCyndy Ishida     if (Sym->isUndefined())
283fd4d0751SCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
284fd4d0751SCyndy Ishida     else
285fd4d0751SCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(Temp))
286fd4d0751SCyndy Ishida                           : Exports.emplace_back(std::move(Temp));
287fd4d0751SCyndy Ishida   }
288cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
289cd9a5cfdSDmitri Gribenko   llvm::sort(Reexports);
290cd9a5cfdSDmitri Gribenko   llvm::sort(Undefineds);
291fd4d0751SCyndy Ishida 
292fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedExportedSymbols[] = {
293*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symA", false, false},
294*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symAB", false, false},
295fd4d0751SCyndy Ishida   };
296fd4d0751SCyndy Ishida 
297fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedReexportedSymbols[] = {
298*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symC", false, false},
299fd4d0751SCyndy Ishida   };
300fd4d0751SCyndy Ishida 
301fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedUndefinedSymbols[] = {
302*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_symD", false, false},
303fd4d0751SCyndy Ishida   };
304fd4d0751SCyndy Ishida 
305589725f6SKazu Hirata   EXPECT_EQ(std::size(ExpectedExportedSymbols), Exports.size());
306589725f6SKazu Hirata   EXPECT_EQ(std::size(ExpectedReexportedSymbols), Reexports.size());
307589725f6SKazu Hirata   EXPECT_EQ(std::size(ExpectedUndefinedSymbols), Undefineds.size());
308fd4d0751SCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
309fd4d0751SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
310fd4d0751SCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
311fd4d0751SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
312fd4d0751SCyndy Ishida   EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(),
313fd4d0751SCyndy Ishida                          std::begin(ExpectedUndefinedSymbols)));
314f9d8162bSCyndy Ishida }
315f9d8162bSCyndy Ishida 
TEST(TBDv4,WriteFile)316f9d8162bSCyndy Ishida TEST(TBDv4, WriteFile) {
317d26e0bcfSCyndy Ishida   static const char TBDv4File[] =
318f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
319f9d8162bSCyndy Ishida       "tbd-version:     4\n"
320f9d8162bSCyndy Ishida       "targets:         [ i386-macos, x86_64-ios-simulator ]\n"
321f9d8162bSCyndy Ishida       "install-name:    'Umbrella.framework/Umbrella'\n"
322f9d8162bSCyndy Ishida       "current-version: 1.2.3\n"
323f9d8162bSCyndy Ishida       "compatibility-version: 0\n"
324f9d8162bSCyndy Ishida       "swift-abi-version: 5\n"
325f9d8162bSCyndy Ishida       "parent-umbrella:\n"
326f9d8162bSCyndy Ishida       "  - targets:         [ i386-macos, x86_64-ios-simulator ]\n"
327f9d8162bSCyndy Ishida       "    umbrella:        System\n"
328f9d8162bSCyndy Ishida       "allowable-clients:\n"
329f9d8162bSCyndy Ishida       "  - targets:         [ i386-macos ]\n"
330f9d8162bSCyndy Ishida       "    clients:         [ ClientA ]\n"
331f9d8162bSCyndy Ishida       "exports:\n"
332f9d8162bSCyndy Ishida       "  - targets:         [ i386-macos ]\n"
333f9d8162bSCyndy Ishida       "    symbols:         [ _symA ]\n"
334f9d8162bSCyndy Ishida       "    objc-classes:    [ Class1 ]\n"
335f9d8162bSCyndy Ishida       "    weak-symbols:    [ _symC ]\n"
336f9d8162bSCyndy Ishida       "  - targets:         [ x86_64-ios-simulator ]\n"
337f9d8162bSCyndy Ishida       "    symbols:         [ _symB ]\n"
338f9d8162bSCyndy Ishida       "...\n";
339f9d8162bSCyndy Ishida 
340f9d8162bSCyndy Ishida   InterfaceFile File;
341f9d8162bSCyndy Ishida   TargetList Targets = {
3423025c3edSJuergen Ributzka       Target(AK_i386, PLATFORM_MACOS),
3433025c3edSJuergen Ributzka       Target(AK_x86_64, PLATFORM_IOSSIMULATOR),
344f9d8162bSCyndy Ishida   };
345f9d8162bSCyndy Ishida   File.setInstallName("Umbrella.framework/Umbrella");
346f9d8162bSCyndy Ishida   File.setFileType(FileType::TBD_V4);
347f9d8162bSCyndy Ishida   File.addTargets(Targets);
348f9d8162bSCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 2, 3));
349f9d8162bSCyndy Ishida   File.setTwoLevelNamespace();
350f9d8162bSCyndy Ishida   File.setApplicationExtensionSafe(true);
351f9d8162bSCyndy Ishida   File.setSwiftABIVersion(5);
352f9d8162bSCyndy Ishida   File.addAllowableClient("ClientA", Targets[0]);
353f9d8162bSCyndy Ishida   File.addParentUmbrella(Targets[0], "System");
354f9d8162bSCyndy Ishida   File.addParentUmbrella(Targets[1], "System");
355*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_symA", {Targets[0]});
356*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_symB", {Targets[1]});
357*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_symC", {Targets[0]},
358f9d8162bSCyndy Ishida                  SymbolFlags::WeakDefined);
359*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "Class1", {Targets[0]});
360f9d8162bSCyndy Ishida 
361f9d8162bSCyndy Ishida   SmallString<4096> Buffer;
362f9d8162bSCyndy Ishida   raw_svector_ostream OS(Buffer);
3632ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
364f9d8162bSCyndy Ishida   EXPECT_FALSE(Result);
365d26e0bcfSCyndy Ishida   EXPECT_STREQ(TBDv4File, Buffer.c_str());
366f9d8162bSCyndy Ishida }
367f9d8162bSCyndy Ishida 
TEST(TBDv4,WriteMultipleDocuments)368fd4d0751SCyndy Ishida TEST(TBDv4, WriteMultipleDocuments) {
369fd4d0751SCyndy Ishida   static const char TBDv4Inlines[] =
370fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
371fd4d0751SCyndy Ishida       "tbd-version:     4\n"
372fd4d0751SCyndy Ishida       "targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
373fd4d0751SCyndy Ishida       "install-name:    "
374fd4d0751SCyndy Ishida       "'/System/Library/Frameworks/Umbrella.framework/Umbrella'\n"
375fd4d0751SCyndy Ishida       "reexported-libraries:\n"
376fd4d0751SCyndy Ishida       "  - targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
377fd4d0751SCyndy Ishida       "    libraries:       [ '/System/Library/Frameworks/A.framework/A' ]\n"
378fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
379fd4d0751SCyndy Ishida       "tbd-version:     4\n"
380fd4d0751SCyndy Ishida       "targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
381fd4d0751SCyndy Ishida       "install-name:    '/System/Library/Frameworks/A.framework/A'\n"
382fd4d0751SCyndy Ishida       "exports:\n"
383fd4d0751SCyndy Ishida       "  - targets:         [ i386-maccatalyst ]\n"
384fd4d0751SCyndy Ishida       "    weak-symbols:    [ _symC ]\n"
385fd4d0751SCyndy Ishida       "  - targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
386fd4d0751SCyndy Ishida       "    symbols:         [ _symA ]\n"
387fd4d0751SCyndy Ishida       "    objc-classes:    [ Class1 ]\n"
388fd4d0751SCyndy Ishida       "  - targets:         [ x86_64-maccatalyst ]\n"
389fd4d0751SCyndy Ishida       "    symbols:         [ _symAB ]\n"
390fd4d0751SCyndy Ishida       "...\n";
391fd4d0751SCyndy Ishida 
392fd4d0751SCyndy Ishida   InterfaceFile File;
3933025c3edSJuergen Ributzka   PlatformType Platform = PLATFORM_MACCATALYST;
394fd4d0751SCyndy Ishida   TargetList Targets = {
395fd4d0751SCyndy Ishida       Target(AK_i386, Platform),
396fd4d0751SCyndy Ishida       Target(AK_x86_64, Platform),
397fd4d0751SCyndy Ishida   };
398b70d87bcSCyndy Ishida   TargetToAttr Uuids = {{Targets[0], "00000000-0000-0000-0000-000000000002"},
399fd4d0751SCyndy Ishida                         {Targets[1], "11111111-1111-1111-1111-111111111112"}};
400fd4d0751SCyndy Ishida   File.setInstallName("/System/Library/Frameworks/Umbrella.framework/Umbrella");
401fd4d0751SCyndy Ishida   File.setFileType(FileType::TBD_V4);
402fd4d0751SCyndy Ishida   File.addTargets(Targets);
403fd4d0751SCyndy Ishida   File.setCompatibilityVersion(PackedVersion(1, 0, 0));
404fd4d0751SCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 0, 0));
405fd4d0751SCyndy Ishida   File.setTwoLevelNamespace();
406fd4d0751SCyndy Ishida   File.setApplicationExtensionSafe(true);
407fd4d0751SCyndy Ishida   File.addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
408fd4d0751SCyndy Ishida                             Targets[0]);
409fd4d0751SCyndy Ishida   File.addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
410fd4d0751SCyndy Ishida                             Targets[1]);
411fd4d0751SCyndy Ishida 
412fd4d0751SCyndy Ishida   // Write Second Document
413fd4d0751SCyndy Ishida   Uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
414fd4d0751SCyndy Ishida            {Targets[1], "11111111-1111-1111-1111-111111111111"}};
415fd4d0751SCyndy Ishida   InterfaceFile Document;
416fd4d0751SCyndy Ishida   Document.setInstallName("/System/Library/Frameworks/A.framework/A");
417fd4d0751SCyndy Ishida   Document.setFileType(FileType::TBD_V4);
418fd4d0751SCyndy Ishida   Document.addTargets(Targets);
419fd4d0751SCyndy Ishida   Document.setCompatibilityVersion(PackedVersion(1, 0, 0));
420fd4d0751SCyndy Ishida   Document.setCurrentVersion(PackedVersion(1, 0, 0));
421fd4d0751SCyndy Ishida   Document.setTwoLevelNamespace();
422fd4d0751SCyndy Ishida   Document.setApplicationExtensionSafe(true);
423*d9a9872eSCyndy Ishida   Document.addSymbol(EncodeKind::GlobalSymbol, "_symA", Targets);
424*d9a9872eSCyndy Ishida   Document.addSymbol(EncodeKind::GlobalSymbol, "_symAB", {Targets[1]});
425*d9a9872eSCyndy Ishida   Document.addSymbol(EncodeKind::GlobalSymbol, "_symC", {Targets[0]},
426fd4d0751SCyndy Ishida                      SymbolFlags::WeakDefined);
427*d9a9872eSCyndy Ishida   Document.addSymbol(EncodeKind::ObjectiveCClass, "Class1", Targets);
428fd4d0751SCyndy Ishida   File.addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
429fd4d0751SCyndy Ishida 
430fd4d0751SCyndy Ishida   SmallString<4096> Buffer;
431fd4d0751SCyndy Ishida   raw_svector_ostream OS(Buffer);
4322ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
433fd4d0751SCyndy Ishida   EXPECT_FALSE(Result);
434fd4d0751SCyndy Ishida   EXPECT_STREQ(TBDv4Inlines, Buffer.c_str());
435fd4d0751SCyndy Ishida }
436fd4d0751SCyndy Ishida 
TEST(TBDv4,MultipleTargets)437f9d8162bSCyndy Ishida TEST(TBDv4, MultipleTargets) {
438d26e0bcfSCyndy Ishida   static const char TBDv4MultipleTargets[] =
439f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
440f9d8162bSCyndy Ishida       "tbd-version: 4\n"
441f9d8162bSCyndy Ishida       "targets: [ i386-maccatalyst, x86_64-tvos, arm64-ios ]\n"
442f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
443f9d8162bSCyndy Ishida       "...\n";
444f9d8162bSCyndy Ishida 
4452ba32084SCyndy Ishida   Expected<TBDFile> Result =
446d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MultipleTargets, "Test.tbd"));
447f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
448f9d8162bSCyndy Ishida   PlatformSet Platforms;
4493025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
4503025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_TVOS);
4513025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_IOS);
4522ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
453f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
454f9d8162bSCyndy Ishida   EXPECT_EQ(AK_x86_64 | AK_arm64 | AK_i386, File->getArchitectures());
455f9d8162bSCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
456f9d8162bSCyndy Ishida   for (auto Platform : File->getPlatforms())
457f9d8162bSCyndy Ishida     EXPECT_EQ(Platforms.count(Platform), 1U);
458c6e8bfe7SJonas Devlieghere 
459c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
460c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
4610b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
462c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
463d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4MultipleTargets),
464c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
465f9d8162bSCyndy Ishida }
466f9d8162bSCyndy Ishida 
TEST(TBDv4,MultipleTargetsSameArch)467f9d8162bSCyndy Ishida TEST(TBDv4, MultipleTargetsSameArch) {
468d26e0bcfSCyndy Ishida   static const char TBDv4TargetsSameArch[] =
469f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
470f9d8162bSCyndy Ishida       "tbd-version: 4\n"
471c6e8bfe7SJonas Devlieghere       "targets: [ x86_64-tvos , x86_64-maccatalyst ]\n"
472f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
473f9d8162bSCyndy Ishida       "...\n";
474f9d8162bSCyndy Ishida 
4752ba32084SCyndy Ishida   Expected<TBDFile> Result =
476d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4TargetsSameArch, "Test.tbd"));
477f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
478f9d8162bSCyndy Ishida   PlatformSet Platforms;
4793025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_TVOS);
4803025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
4812ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
482f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
483f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
484f9d8162bSCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
485f9d8162bSCyndy Ishida   for (auto Platform : File->getPlatforms())
486f9d8162bSCyndy Ishida     EXPECT_EQ(Platforms.count(Platform), 1U);
487c6e8bfe7SJonas Devlieghere 
488c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
489c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
4900b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
491c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
492d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4TargetsSameArch),
493c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
494f9d8162bSCyndy Ishida }
495f9d8162bSCyndy Ishida 
TEST(TBDv4,MultipleTargetsSamePlatform)496f9d8162bSCyndy Ishida TEST(TBDv4, MultipleTargetsSamePlatform) {
497d26e0bcfSCyndy Ishida   static const char TBDv4MultipleTargetsSamePlatform[] =
498f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
499f9d8162bSCyndy Ishida       "tbd-version: 4\n"
500c6e8bfe7SJonas Devlieghere       "targets: [ armv7k-ios , arm64-ios]\n"
501f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
502f9d8162bSCyndy Ishida       "...\n";
503f9d8162bSCyndy Ishida 
5042ba32084SCyndy Ishida   Expected<TBDFile> Result = TextAPIReader::get(
505d26e0bcfSCyndy Ishida       MemoryBufferRef(TBDv4MultipleTargetsSamePlatform, "Test.tbd"));
506f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5072ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
508f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
509f9d8162bSCyndy Ishida   EXPECT_EQ(AK_arm64 | AK_armv7k, File->getArchitectures());
510f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5113025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOS, *File->getPlatforms().begin());
512c6e8bfe7SJonas Devlieghere 
513c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
514c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5150b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
516c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
517d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4MultipleTargetsSamePlatform),
518c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
519f9d8162bSCyndy Ishida }
520f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_maccatalyst)521f9d8162bSCyndy Ishida TEST(TBDv4, Target_maccatalyst) {
522d26e0bcfSCyndy Ishida   static const char TBDv4TargetMacCatalyst[] =
523f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
524f9d8162bSCyndy Ishida       "tbd-version: 4\n"
525f9d8162bSCyndy Ishida       "targets: [  x86_64-maccatalyst ]\n"
526f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
527f9d8162bSCyndy Ishida       "...\n";
528f9d8162bSCyndy Ishida 
5292ba32084SCyndy Ishida   Expected<TBDFile> Result =
530d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4TargetMacCatalyst, "Test.tbd"));
531f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5322ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
533f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
534f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
535f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5363025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_MACCATALYST, *File->getPlatforms().begin());
537c6e8bfe7SJonas Devlieghere 
538c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
539c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5400b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
541c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
542d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4TargetMacCatalyst),
543c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
544f9d8162bSCyndy Ishida }
545f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_maccatalyst2)5462d292ab8SJuergen Ributzka TEST(TBDv4, Target_maccatalyst2) {
5472d292ab8SJuergen Ributzka   static const char TBDv4TargetMacCatalyst[] =
5482d292ab8SJuergen Ributzka       "--- !tapi-tbd\n"
5492d292ab8SJuergen Ributzka       "tbd-version: 4\n"
5502d292ab8SJuergen Ributzka       "targets: [  x86_64-maccatalyst ]\n"
5512d292ab8SJuergen Ributzka       "install-name: Test.dylib\n"
5522d292ab8SJuergen Ributzka       "...\n";
5532d292ab8SJuergen Ributzka 
5542d292ab8SJuergen Ributzka   Expected<TBDFile> Result =
5552d292ab8SJuergen Ributzka       TextAPIReader::get(MemoryBufferRef(TBDv4TargetMacCatalyst, "Test.tbd"));
5562d292ab8SJuergen Ributzka   EXPECT_TRUE(!!Result);
5572d292ab8SJuergen Ributzka   TBDFile File = std::move(Result.get());
5582d292ab8SJuergen Ributzka   EXPECT_EQ(File->getPlatforms().size(), 1U);
5592d292ab8SJuergen Ributzka   EXPECT_EQ(getPlatformFromName("ios-macabi"), *File->getPlatforms().begin());
5602d292ab8SJuergen Ributzka }
5612d292ab8SJuergen Ributzka 
TEST(TBDv4,Target_x86_ios)562f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_ios) {
563d26e0bcfSCyndy Ishida   static const char TBDv4Targetx86iOS[] = "--- !tapi-tbd\n"
564f9d8162bSCyndy Ishida                                           "tbd-version: 4\n"
565f9d8162bSCyndy Ishida                                           "targets: [  x86_64-ios ]\n"
566f9d8162bSCyndy Ishida                                           "install-name: Test.dylib\n"
567f9d8162bSCyndy Ishida                                           "...\n";
568f9d8162bSCyndy Ishida 
5692ba32084SCyndy Ishida   Expected<TBDFile> Result =
570d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Targetx86iOS, "Test.tbd"));
571f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5722ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
573f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
574f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
575f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5763025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOS, *File->getPlatforms().begin());
577c6e8bfe7SJonas Devlieghere 
578c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
579c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5800b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
581c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
582d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4Targetx86iOS),
583c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
584f9d8162bSCyndy Ishida }
585f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_arm_bridgeOS)586f9d8162bSCyndy Ishida TEST(TBDv4, Target_arm_bridgeOS) {
587d26e0bcfSCyndy Ishida   static const char TBDv4PlatformBridgeOS[] = "--- !tapi-tbd\n"
588f9d8162bSCyndy Ishida                                               "tbd-version: 4\n"
589f9d8162bSCyndy Ishida                                               "targets: [  armv7k-bridgeos ]\n"
590f9d8162bSCyndy Ishida                                               "install-name: Test.dylib\n"
591f9d8162bSCyndy Ishida                                               "...\n";
592f9d8162bSCyndy Ishida 
5932ba32084SCyndy Ishida   Expected<TBDFile> Result =
594d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4PlatformBridgeOS, "Test.tbd"));
595f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5962ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
597f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
598f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5993025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_BRIDGEOS, *File->getPlatforms().begin());
600f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_armv7k), File->getArchitectures());
601c6e8bfe7SJonas Devlieghere 
602c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
603c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6040b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
605c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
606d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4PlatformBridgeOS),
607c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
608f9d8162bSCyndy Ishida }
609f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_arm_iOS)610a0cd4134SCyndy Ishida TEST(TBDv4, Target_arm_iOS) {
611d26e0bcfSCyndy Ishida   static const char TBDv4ArchArm64e[] = "--- !tapi-tbd\n"
612a0cd4134SCyndy Ishida                                         "tbd-version: 4\n"
613a0cd4134SCyndy Ishida                                         "targets: [  arm64e-ios ]\n"
614a0cd4134SCyndy Ishida                                         "install-name: Test.dylib\n"
615a0cd4134SCyndy Ishida                                         "...\n";
616a0cd4134SCyndy Ishida 
6172ba32084SCyndy Ishida   Expected<TBDFile> Result =
618d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4ArchArm64e, "Test.tbd"));
619a0cd4134SCyndy Ishida   EXPECT_TRUE(!!Result);
6202ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
621a0cd4134SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
622a0cd4134SCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6233025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOS, *File->getPlatforms().begin());
624a0cd4134SCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_arm64e), File->getArchitectures());
625a0cd4134SCyndy Ishida 
626a0cd4134SCyndy Ishida   SmallString<4096> Buffer;
627a0cd4134SCyndy Ishida   raw_svector_ostream OS(Buffer);
6280b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
629a0cd4134SCyndy Ishida   EXPECT_TRUE(!WriteResult);
630d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4ArchArm64e), stripWhitespace(Buffer.c_str()));
631a0cd4134SCyndy Ishida }
632a0cd4134SCyndy Ishida 
TEST(TBDv4,Target_x86_macos)633f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_macos) {
634d26e0bcfSCyndy Ishida   static const char TBDv4Targetx86MacOS[] = "--- !tapi-tbd\n"
635f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
636f9d8162bSCyndy Ishida                                             "targets: [  x86_64-macos ]\n"
637f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
638f9d8162bSCyndy Ishida                                             "...\n";
639f9d8162bSCyndy Ishida 
6402ba32084SCyndy Ishida   Expected<TBDFile> Result =
641d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Targetx86MacOS, "Test.tbd"));
642f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
6432ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
644f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
645f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
646f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6473025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_MACOS, *File->getPlatforms().begin());
648c6e8bfe7SJonas Devlieghere 
649c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
650c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6510b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
652c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
653d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4Targetx86MacOS),
654d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
655f9d8162bSCyndy Ishida }
656f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_x86_ios_simulator)657f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_ios_simulator) {
658d26e0bcfSCyndy Ishida   static const char TBDv4Targetx86iOSSim[] =
659d26e0bcfSCyndy Ishida       "--- !tapi-tbd\n"
660f9d8162bSCyndy Ishida       "tbd-version: 4\n"
661f9d8162bSCyndy Ishida       "targets: [  x86_64-ios-simulator  ]\n"
662f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
663f9d8162bSCyndy Ishida       "...\n";
664f9d8162bSCyndy Ishida 
6652ba32084SCyndy Ishida   Expected<TBDFile> Result =
666d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Targetx86iOSSim, "Test.tbd"));
667f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
6682ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
669f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
670f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
671f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6723025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOSSIMULATOR, *File->getPlatforms().begin());
673c6e8bfe7SJonas Devlieghere 
674c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
675c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6760b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
677c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
678d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4Targetx86iOSSim),
679d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
680f9d8162bSCyndy Ishida }
681f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_x86_tvos_simulator)682f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_tvos_simulator) {
683d26e0bcfSCyndy Ishida   static const char TBDv4x86tvOSSim[] = "--- !tapi-tbd\n"
684f9d8162bSCyndy Ishida                                         "tbd-version: 4\n"
685f9d8162bSCyndy Ishida                                         "targets: [  x86_64-tvos-simulator  ]\n"
686f9d8162bSCyndy Ishida                                         "install-name: Test.dylib\n"
687f9d8162bSCyndy Ishida                                         "...\n";
688f9d8162bSCyndy Ishida 
6892ba32084SCyndy Ishida   Expected<TBDFile> Result =
690d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4x86tvOSSim, "Test.tbd"));
691f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
6922ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
693f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
694f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
695f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6963025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_TVOSSIMULATOR, *File->getPlatforms().begin());
697c6e8bfe7SJonas Devlieghere 
698c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
699c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
7000b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
701c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
702d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4x86tvOSSim), stripWhitespace(Buffer.c_str()));
703f9d8162bSCyndy Ishida }
704f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_i386_watchos_simulator)705f9d8162bSCyndy Ishida TEST(TBDv4, Target_i386_watchos_simulator) {
706d26e0bcfSCyndy Ishida   static const char TBDv4i386watchOSSim[] =
707f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
708f9d8162bSCyndy Ishida       "tbd-version: 4\n"
709f9d8162bSCyndy Ishida       "targets: [  i386-watchos-simulator  ]\n"
710f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
711f9d8162bSCyndy Ishida       "...\n";
712f9d8162bSCyndy Ishida 
7132ba32084SCyndy Ishida   Expected<TBDFile> Result =
714d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4i386watchOSSim, "Test.tbd"));
715f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
7162ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
717f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
718f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_i386), File->getArchitectures());
719f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
7203025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_WATCHOSSIMULATOR, *File->getPlatforms().begin());
721c6e8bfe7SJonas Devlieghere 
722c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
723c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
7240b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
725c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
726d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4i386watchOSSim),
727c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
728f9d8162bSCyndy Ishida }
729f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_i386_driverkit)730eef41efeSGreg McGary TEST(TBDv4, Target_i386_driverkit) {
731eef41efeSGreg McGary   static const char TBDv4i386DriverKit[] = "--- !tapi-tbd\n"
732eef41efeSGreg McGary                                            "tbd-version: 4\n"
733eef41efeSGreg McGary                                            "targets: [  i386-driverkit  ]\n"
734eef41efeSGreg McGary                                            "install-name: Test.dylib\n"
735eef41efeSGreg McGary                                            "...\n";
736eef41efeSGreg McGary 
737eef41efeSGreg McGary   Expected<TBDFile> Result =
738eef41efeSGreg McGary       TextAPIReader::get(MemoryBufferRef(TBDv4i386DriverKit, "Test.tbd"));
739eef41efeSGreg McGary   EXPECT_TRUE(!!Result);
740eef41efeSGreg McGary   TBDFile File = std::move(Result.get());
741eef41efeSGreg McGary   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
742eef41efeSGreg McGary   EXPECT_EQ(ArchitectureSet(AK_i386), File->getArchitectures());
743eef41efeSGreg McGary   EXPECT_EQ(File->getPlatforms().size(), 1U);
7443025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_DRIVERKIT, *File->getPlatforms().begin());
745eef41efeSGreg McGary 
746eef41efeSGreg McGary   SmallString<4096> Buffer;
747eef41efeSGreg McGary   raw_svector_ostream OS(Buffer);
7480b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
749eef41efeSGreg McGary   EXPECT_TRUE(!WriteResult);
750eef41efeSGreg McGary   EXPECT_EQ(stripWhitespace(TBDv4i386DriverKit),
751eef41efeSGreg McGary             stripWhitespace(Buffer.c_str()));
752eef41efeSGreg McGary }
753eef41efeSGreg McGary 
TEST(TBDv4,Target_arm64_xros)754735adbf1SCyndy Ishida TEST(TBDv4, Target_arm64_xros) {
755735adbf1SCyndy Ishida   static const char TBDv4ArchArm64e[] =
756735adbf1SCyndy Ishida       "--- !tapi-tbd\n"
757735adbf1SCyndy Ishida       "tbd-version: 4\n"
758735adbf1SCyndy Ishida       "targets: [ arm64e-xros, arm64e-xros-simulator ]\n"
759735adbf1SCyndy Ishida       "install-name: Test.dylib\n"
760735adbf1SCyndy Ishida       "...\n";
761735adbf1SCyndy Ishida 
762735adbf1SCyndy Ishida   auto Result =
763735adbf1SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4ArchArm64e, "Test.tbd"));
764735adbf1SCyndy Ishida   EXPECT_TRUE(!!Result);
765735adbf1SCyndy Ishida   auto File = std::move(Result.get());
766735adbf1SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
767735adbf1SCyndy Ishida   PlatformSet ExpectedSet;
768735adbf1SCyndy Ishida   ExpectedSet.insert(PLATFORM_XROS);
769735adbf1SCyndy Ishida   ExpectedSet.insert(PLATFORM_XROS_SIMULATOR);
770735adbf1SCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 2U);
771735adbf1SCyndy Ishida   for (auto Platform : File->getPlatforms())
772735adbf1SCyndy Ishida     EXPECT_EQ(ExpectedSet.count(Platform), 1U);
773735adbf1SCyndy Ishida 
774735adbf1SCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_arm64e), File->getArchitectures());
775735adbf1SCyndy Ishida 
776735adbf1SCyndy Ishida   SmallString<4096> Buffer;
777735adbf1SCyndy Ishida   raw_svector_ostream OS(Buffer);
778735adbf1SCyndy Ishida   auto WriteResult = TextAPIWriter::writeToStream(OS, *File);
779735adbf1SCyndy Ishida   EXPECT_TRUE(!WriteResult);
780735adbf1SCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4ArchArm64e), stripWhitespace(Buffer.c_str()));
781735adbf1SCyndy Ishida }
782735adbf1SCyndy Ishida 
TEST(TBDv4,Swift_1)783f9d8162bSCyndy Ishida TEST(TBDv4, Swift_1) {
784d26e0bcfSCyndy Ishida   static const char TBDv4SwiftVersion1[] = "--- !tapi-tbd\n"
785f9d8162bSCyndy Ishida                                            "tbd-version: 4\n"
786f9d8162bSCyndy Ishida                                            "targets: [  x86_64-macos ]\n"
787f9d8162bSCyndy Ishida                                            "install-name: Test.dylib\n"
788f9d8162bSCyndy Ishida                                            "swift-abi-version: 1\n"
789f9d8162bSCyndy Ishida                                            "...\n";
790f9d8162bSCyndy Ishida 
7912ba32084SCyndy Ishida   Expected<TBDFile> Result =
792d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4SwiftVersion1, "Test.tbd"));
793f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
7942ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
795f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
796f9d8162bSCyndy Ishida   EXPECT_EQ(1U, File->getSwiftABIVersion());
797c6e8bfe7SJonas Devlieghere 
798c6e8bfe7SJonas Devlieghere   // No writer test because we emit "swift-abi-version:1.0".
799f9d8162bSCyndy Ishida }
800f9d8162bSCyndy Ishida 
TEST(TBDv4,Swift_2)801f9d8162bSCyndy Ishida TEST(TBDv4, Swift_2) {
802d26e0bcfSCyndy Ishida   static const char TBDv4Swift2[] = "--- !tapi-tbd\n"
803f9d8162bSCyndy Ishida                                     "tbd-version: 4\n"
804f9d8162bSCyndy Ishida                                     "targets: [  x86_64-macos ]\n"
805f9d8162bSCyndy Ishida                                     "install-name: Test.dylib\n"
806f9d8162bSCyndy Ishida                                     "swift-abi-version: 2\n"
807f9d8162bSCyndy Ishida                                     "...\n";
808f9d8162bSCyndy Ishida 
8092ba32084SCyndy Ishida   Expected<TBDFile> Result =
8102ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Swift2, "Test.tbd"));
811f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
8122ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
813f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
814f9d8162bSCyndy Ishida   EXPECT_EQ(2U, File->getSwiftABIVersion());
815c6e8bfe7SJonas Devlieghere 
816c6e8bfe7SJonas Devlieghere   // No writer test because we emit "swift-abi-version:2.0".
817f9d8162bSCyndy Ishida }
818f9d8162bSCyndy Ishida 
TEST(TBDv4,Swift_5)819f9d8162bSCyndy Ishida TEST(TBDv4, Swift_5) {
820d26e0bcfSCyndy Ishida   static const char TBDv4SwiftVersion5[] = "--- !tapi-tbd\n"
821f9d8162bSCyndy Ishida                                            "tbd-version: 4\n"
822f9d8162bSCyndy Ishida                                            "targets: [  x86_64-macos ]\n"
823f9d8162bSCyndy Ishida                                            "install-name: Test.dylib\n"
824f9d8162bSCyndy Ishida                                            "swift-abi-version: 5\n"
825f9d8162bSCyndy Ishida                                            "...\n";
826f9d8162bSCyndy Ishida 
8272ba32084SCyndy Ishida   Expected<TBDFile> Result =
828d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4SwiftVersion5, "Test.tbd"));
829f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
8302ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
831f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
832f9d8162bSCyndy Ishida   EXPECT_EQ(5U, File->getSwiftABIVersion());
833c6e8bfe7SJonas Devlieghere 
834c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
835c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
8360b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
837c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
838d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4SwiftVersion5),
839d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
840f9d8162bSCyndy Ishida }
841f9d8162bSCyndy Ishida 
TEST(TBDv4,Swift_99)842f9d8162bSCyndy Ishida TEST(TBDv4, Swift_99) {
843d26e0bcfSCyndy Ishida   static const char TBDv4SwiftVersion99[] = "--- !tapi-tbd\n"
844f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
845f9d8162bSCyndy Ishida                                             "targets: [  x86_64-macos ]\n"
846f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
847f9d8162bSCyndy Ishida                                             "swift-abi-version: 99\n"
848f9d8162bSCyndy Ishida                                             "...\n";
849f9d8162bSCyndy Ishida 
8502ba32084SCyndy Ishida   Expected<TBDFile> Result =
851d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4SwiftVersion99, "Test.tbd"));
852f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
8532ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
854f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
855f9d8162bSCyndy Ishida   EXPECT_EQ(99U, File->getSwiftABIVersion());
856c6e8bfe7SJonas Devlieghere 
857c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
858c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
8590b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
860c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
861d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4SwiftVersion99),
862d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
863f9d8162bSCyndy Ishida }
864f9d8162bSCyndy Ishida 
TEST(TBDv4,NotForSharedCache)865e17efa60SCyndy Ishida TEST(TBDv4, NotForSharedCache) {
866e17efa60SCyndy Ishida 
867e17efa60SCyndy Ishida   static const char TBDv4NotForSharedCache[] =
868e17efa60SCyndy Ishida       "--- !tapi-tbd\n"
869e17efa60SCyndy Ishida       "tbd-version: 4\n"
870e17efa60SCyndy Ishida       "targets: [  arm64-macos ]\n"
871e17efa60SCyndy Ishida       "flags: [ not_for_dyld_shared_cache ]\n"
872e17efa60SCyndy Ishida       "install-name: /S/L/F/Foo.framework/Foo\n"
873e17efa60SCyndy Ishida       "...\n";
874e17efa60SCyndy Ishida 
875e17efa60SCyndy Ishida   Expected<TBDFile> Result =
876e17efa60SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4NotForSharedCache, "Test.tbd"));
877e17efa60SCyndy Ishida   EXPECT_TRUE(!!Result);
878e17efa60SCyndy Ishida   Target ExpectedTarget = Target(AK_arm64, PLATFORM_MACOS);
879e17efa60SCyndy Ishida   TBDFile ReadFile = std::move(Result.get());
880e17efa60SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, ReadFile->getFileType());
881e17efa60SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
882e17efa60SCyndy Ishida             ReadFile->getInstallName());
883e17efa60SCyndy Ishida   EXPECT_TRUE(ReadFile->targets().begin() != ReadFile->targets().end());
884e17efa60SCyndy Ishida   EXPECT_EQ(*ReadFile->targets().begin(), ExpectedTarget);
885e17efa60SCyndy Ishida   EXPECT_TRUE(ReadFile->isOSLibNotForSharedCache());
886e17efa60SCyndy Ishida }
887e17efa60SCyndy Ishida 
TEST(TBDv4,InvalidArchitecture)888f9d8162bSCyndy Ishida TEST(TBDv4, InvalidArchitecture) {
889d26e0bcfSCyndy Ishida   static const char TBDv4UnknownArch[] = "--- !tapi-tbd\n"
890f9d8162bSCyndy Ishida                                          "tbd-version: 4\n"
891f9d8162bSCyndy Ishida                                          "targets: [ foo-macos ]\n"
892f9d8162bSCyndy Ishida                                          "install-name: Test.dylib\n"
893f9d8162bSCyndy Ishida                                          "...\n";
894f9d8162bSCyndy Ishida 
8952ba32084SCyndy Ishida   Expected<TBDFile> Result =
896d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4UnknownArch, "Test.tbd"));
897f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
8982ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
899f9d8162bSCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:3:12: error: unknown "
900f9d8162bSCyndy Ishida             "architecture\ntargets: [ foo-macos ]\n"
901f9d8162bSCyndy Ishida             "           ^~~~~~~~~~\n",
9022ba32084SCyndy Ishida             ErrorMessage);
903f9d8162bSCyndy Ishida }
904f9d8162bSCyndy Ishida 
TEST(TBDv4,InvalidPlatform)905f9d8162bSCyndy Ishida TEST(TBDv4, InvalidPlatform) {
906d26e0bcfSCyndy Ishida   static const char TBDv4FInvalidPlatform[] = "--- !tapi-tbd\n"
907f9d8162bSCyndy Ishida                                               "tbd-version: 4\n"
908f9d8162bSCyndy Ishida                                               "targets: [ x86_64-maos ]\n"
909f9d8162bSCyndy Ishida                                               "install-name: Test.dylib\n"
910f9d8162bSCyndy Ishida                                               "...\n";
911f9d8162bSCyndy Ishida 
9122ba32084SCyndy Ishida   Expected<TBDFile> Result =
913d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4FInvalidPlatform, "Test.tbd"));
914f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9152ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
916f9d8162bSCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:3:12: error: unknown platform\ntargets: "
917f9d8162bSCyndy Ishida             "[ x86_64-maos ]\n"
918f9d8162bSCyndy Ishida             "           ^~~~~~~~~~~~\n",
9192ba32084SCyndy Ishida             ErrorMessage);
920f9d8162bSCyndy Ishida }
921f9d8162bSCyndy Ishida 
TEST(TBDv4,MalformedFile1)922f9d8162bSCyndy Ishida TEST(TBDv4, MalformedFile1) {
923d26e0bcfSCyndy Ishida   static const char TBDv4MalformedFile1[] = "--- !tapi-tbd\n"
924f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
925f9d8162bSCyndy Ishida                                             "...\n";
926f9d8162bSCyndy Ishida 
9272ba32084SCyndy Ishida   Expected<TBDFile> Result =
928d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MalformedFile1, "Test.tbd"));
929f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9302ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
931f9d8162bSCyndy Ishida   ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
932f9d8162bSCyndy Ishida             "'targets'\ntbd-version: 4\n^\n",
9332ba32084SCyndy Ishida             ErrorMessage);
934f9d8162bSCyndy Ishida }
935f9d8162bSCyndy Ishida 
TEST(TBDv4,MalformedFile2)936f9d8162bSCyndy Ishida TEST(TBDv4, MalformedFile2) {
937d26e0bcfSCyndy Ishida   static const char TBDv4MalformedFile2[] = "--- !tapi-tbd\n"
938f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
939f9d8162bSCyndy Ishida                                             "targets: [ x86_64-macos ]\n"
940f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
94179320a0cSCyndy Ishida                                             "foobar: \"unsupported key\"\n"
94279320a0cSCyndy Ishida                                             "...\n";
943f9d8162bSCyndy Ishida 
9442ba32084SCyndy Ishida   Expected<TBDFile> Result =
945d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MalformedFile2, "Test.tbd"));
946f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9472ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
948f9d8162bSCyndy Ishida   ASSERT_EQ(
949d380c38eSNathan James       "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
950d380c38eSNathan James       "\"unsupported key\"\n^~~~~~\n",
9512ba32084SCyndy Ishida       ErrorMessage);
952f9d8162bSCyndy Ishida }
953f9d8162bSCyndy Ishida 
TEST(TBDv4,MalformedFile3)954f9d8162bSCyndy Ishida TEST(TBDv4, MalformedFile3) {
955d26e0bcfSCyndy Ishida   static const char TBDv4MalformedSwift[] = "--- !tapi-tbd\n"
956f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
957f9d8162bSCyndy Ishida                                             "targets: [  x86_64-macos ]\n"
958f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
959f9d8162bSCyndy Ishida                                             "swift-abi-version: 1.1\n"
960f9d8162bSCyndy Ishida                                             "...\n";
961f9d8162bSCyndy Ishida 
9622ba32084SCyndy Ishida   Expected<TBDFile> Result =
963d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MalformedSwift, "Test.tbd"));
964f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9652ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
966f9d8162bSCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:5:20: error: invalid Swift ABI "
967f9d8162bSCyndy Ishida             "version.\nswift-abi-version: 1.1\n                   ^~~\n",
9682ba32084SCyndy Ishida             ErrorMessage);
969f9d8162bSCyndy Ishida }
970f9d8162bSCyndy Ishida 
TEST(TBDv4,InterfaceEquality)971eb2eeeb7SSam Powell TEST(TBDv4, InterfaceEquality) {
972eb2eeeb7SSam Powell   static const char TBDv4File[] =
973eb2eeeb7SSam Powell       "--- !tapi-tbd\n"
974eb2eeeb7SSam Powell       "tbd-version: 4\n"
9756820cb2dSAnton Sidorenko       "targets:  [ i386-macos, x86_64-macos, x86_64-ios, i386-maccatalyst, "
9766820cb2dSAnton Sidorenko       "x86_64-maccatalyst ]\n"
977eb2eeeb7SSam Powell       "install-name: Umbrella.framework/Umbrella\n"
978eb2eeeb7SSam Powell       "current-version: 1.2.3\n"
979eb2eeeb7SSam Powell       "compatibility-version: 1.2\n"
980eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
981eb2eeeb7SSam Powell       "parent-umbrella:\n"
982eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos, x86_64-ios ]\n"
983eb2eeeb7SSam Powell       "    umbrella: System\n"
984eb2eeeb7SSam Powell       "allowable-clients:\n"
985eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos, x86_64-ios ]\n"
986eb2eeeb7SSam Powell       "    clients: [ ClientA ]\n"
987eb2eeeb7SSam Powell       "reexported-libraries:\n"
988eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
989eb2eeeb7SSam Powell       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
990eb2eeeb7SSam Powell       "exports:\n"
991eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
992eb2eeeb7SSam Powell       "    symbols: [ _symA ]\n"
993eb2eeeb7SSam Powell       "    objc-classes: []\n"
994eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
995eb2eeeb7SSam Powell       "    objc-ivars: []\n"
996eb2eeeb7SSam Powell       "    weak-symbols: []\n"
997eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
998eb2eeeb7SSam Powell       "  - targets: [ x86_64-ios ]\n"
999eb2eeeb7SSam Powell       "    symbols: [_symB]\n"
1000eb2eeeb7SSam Powell       "  - targets: [ x86_64-macos, x86_64-ios ]\n"
1001eb2eeeb7SSam Powell       "    symbols: [_symAB]\n"
10026820cb2dSAnton Sidorenko       "  - targets: [ i386-maccatalyst ]\n"
10036820cb2dSAnton Sidorenko       "    weak-symbols: [ _symC ]\n"
10046820cb2dSAnton Sidorenko       "  - targets: [ i386-maccatalyst, x86_64-maccatalyst ]\n"
10056820cb2dSAnton Sidorenko       "    symbols: [ _symA ]\n"
10066820cb2dSAnton Sidorenko       "    objc-classes: [ Class1 ]\n"
10076820cb2dSAnton Sidorenko       "  - targets: [ x86_64-maccatalyst ]\n"
10086820cb2dSAnton Sidorenko       "    symbols: [ _symAB ]\n"
1009eb2eeeb7SSam Powell       "reexports:\n"
1010eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1011eb2eeeb7SSam Powell       "    symbols: [_symC]\n"
1012eb2eeeb7SSam Powell       "    objc-classes: []\n"
1013eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
1014eb2eeeb7SSam Powell       "    objc-ivars: []\n"
1015eb2eeeb7SSam Powell       "    weak-symbols: []\n"
1016eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
1017eb2eeeb7SSam Powell       "undefineds:\n"
1018eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1019eb2eeeb7SSam Powell       "    symbols: [ _symD ]\n"
1020eb2eeeb7SSam Powell       "    objc-classes: []\n"
1021eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
1022eb2eeeb7SSam Powell       "    objc-ivars: []\n"
1023eb2eeeb7SSam Powell       "    weak-symbols: []\n"
1024eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
1025eb2eeeb7SSam Powell       "...\n";
1026eb2eeeb7SSam Powell 
1027eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
1028eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestA.tbd"));
1029eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
1030eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
1031eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
1032eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestB.tbd"));
1033eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
1034eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
1035eb2eeeb7SSam Powell   EXPECT_TRUE(FileA == FileB);
1036eb2eeeb7SSam Powell }
1037eb2eeeb7SSam Powell 
TEST(TBDv4,InterfaceDiffVersionsEquality)1038eb2eeeb7SSam Powell TEST(TBDv4, InterfaceDiffVersionsEquality) {
1039eb2eeeb7SSam Powell   static const char TBDv4File[] =
1040eb2eeeb7SSam Powell       "--- !tapi-tbd\n"
1041eb2eeeb7SSam Powell       "tbd-version: 4\n"
1042eb2eeeb7SSam Powell       "targets:  [ i386-macos, x86_64-macos ]\n"
1043eb2eeeb7SSam Powell       "install-name: Umbrella.framework/Umbrella\n"
1044eb2eeeb7SSam Powell       "current-version: 1.2.3\n"
1045eb2eeeb7SSam Powell       "compatibility-version: 1.0\n"
1046eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
1047eb2eeeb7SSam Powell       "parent-umbrella:\n"
1048eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos ]\n"
1049eb2eeeb7SSam Powell       "    umbrella: System\n"
1050eb2eeeb7SSam Powell       "allowable-clients:\n"
1051eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos ]\n"
1052eb2eeeb7SSam Powell       "    clients: [ ClientA ]\n"
1053eb2eeeb7SSam Powell       "reexported-libraries:\n"
1054eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1055eb2eeeb7SSam Powell       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
1056eb2eeeb7SSam Powell       "exports:\n"
1057eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1058eb2eeeb7SSam Powell       "    symbols: [ _sym5 ]\n"
1059eb2eeeb7SSam Powell       "    objc-classes: [ class3]\n"
1060eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
1061eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar3 ]\n"
1062eb2eeeb7SSam Powell       "    weak-symbols: [ _weak3 ]\n"
1063eb2eeeb7SSam Powell       "  - targets: [ x86_64-macos ]\n"
1064eb2eeeb7SSam Powell       "    symbols: [_symAB]\n"
1065eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos ]\n"
1066eb2eeeb7SSam Powell       "    symbols: [_symA]\n"
1067eb2eeeb7SSam Powell       "    objc-classes: [ class1, class2 ]\n"
1068eb2eeeb7SSam Powell       "    objc-eh-types: [ class1 ]\n"
1069eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
1070eb2eeeb7SSam Powell       "    weak-symbols: [ _weak1, _weak2 ]\n"
1071eb2eeeb7SSam Powell       "    thread-local-symbols: [ _tlv1, _tlv3 ]\n"
1072eb2eeeb7SSam Powell       "undefineds:\n"
1073eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1074eb2eeeb7SSam Powell       "    symbols: [ _symC ]\n"
1075eb2eeeb7SSam Powell       "    objc-classes: []\n"
1076eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
1077eb2eeeb7SSam Powell       "    objc-ivars: []\n"
1078eb2eeeb7SSam Powell       "    weak-symbols: []\n"
1079eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
1080eb2eeeb7SSam Powell       "...\n";
1081eb2eeeb7SSam Powell 
1082eb2eeeb7SSam Powell   static const char TBDv3File[] =
1083eb2eeeb7SSam Powell       "--- !tapi-tbd-v3\n"
1084eb2eeeb7SSam Powell       "archs: [ i386, x86_64 ]\n"
1085eb2eeeb7SSam Powell       "platform: macosx\n"
1086eb2eeeb7SSam Powell       "install-name: Umbrella.framework/Umbrella\n"
1087eb2eeeb7SSam Powell       "current-version: 1.2.3\n"
1088eb2eeeb7SSam Powell       "compatibility-version: 1.0\n"
1089eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
1090eb2eeeb7SSam Powell       "parent-umbrella: System\n"
1091eb2eeeb7SSam Powell       "exports:\n"
1092eb2eeeb7SSam Powell       "  - archs: [ i386, x86_64 ]\n"
1093eb2eeeb7SSam Powell       "    allowable-clients: [ ClientA ]\n"
1094eb2eeeb7SSam Powell       "    symbols: [ _symA ]\n"
1095eb2eeeb7SSam Powell       "    objc-classes: [ class1, class2 ]\n"
1096eb2eeeb7SSam Powell       "    objc-eh-types: [ class1 ]\n"
1097eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
1098eb2eeeb7SSam Powell       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
1099eb2eeeb7SSam Powell       "    thread-local-symbols: [ _tlv1, _tlv3 ]\n"
1100eb2eeeb7SSam Powell       "  - archs: [ i386 ]\n"
1101eb2eeeb7SSam Powell       "    re-exports: [ /System/Library/Frameworks/A.framework/A ]\n"
1102eb2eeeb7SSam Powell       "    symbols: [ _sym5 ]\n"
1103eb2eeeb7SSam Powell       "    objc-classes: [ class3 ]\n"
1104eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar3 ]\n"
1105eb2eeeb7SSam Powell       "    weak-def-symbols: [ _weak3 ]\n"
1106eb2eeeb7SSam Powell       "  - archs: [ x86_64 ]\n"
1107eb2eeeb7SSam Powell       "    symbols: [ _symAB ]\n"
1108eb2eeeb7SSam Powell       "undefineds:\n"
1109eb2eeeb7SSam Powell       "  - archs: [ i386 ]\n"
1110eb2eeeb7SSam Powell       "    symbols: [ _symC ]\n"
1111eb2eeeb7SSam Powell       "...\n";
1112eb2eeeb7SSam Powell 
1113eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
1114eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestA.tbd"));
1115eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
1116eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
1117eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
1118eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestB.tbd"));
1119eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
1120eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
1121eb2eeeb7SSam Powell   EXPECT_TRUE(FileA == FileB);
1122eb2eeeb7SSam Powell }
1123eb2eeeb7SSam Powell 
TEST(TBDv4,InterfaceInequality)1124eb2eeeb7SSam Powell TEST(TBDv4, InterfaceInequality) {
1125eb2eeeb7SSam Powell   static const char TBDv4File[] = "--- !tapi-tbd\n"
1126eb2eeeb7SSam Powell                                   "tbd-version: 4\n"
1127eb2eeeb7SSam Powell                                   "targets:  [ i386-macos, x86_64-macos ]\n"
1128eb2eeeb7SSam Powell                                   "install-name: Umbrella.framework/Umbrella\n"
1129eb2eeeb7SSam Powell                                   "...\n";
1130eb2eeeb7SSam Powell 
1131eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
1132eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestA.tbd"));
1133eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
1134eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
1135eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
1136eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestB.tbd"));
1137eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
1138eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
1139eb2eeeb7SSam Powell 
1140eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11413025c3edSJuergen Ributzka     File->addTarget(Target(AK_x86_64, PLATFORM_IOS));
1142eb2eeeb7SSam Powell   }));
1143eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1144eb2eeeb7SSam Powell     File->setCurrentVersion(PackedVersion(1, 2, 3));
1145eb2eeeb7SSam Powell     File->setCompatibilityVersion(PackedVersion(1, 0, 0));
1146eb2eeeb7SSam Powell   }));
1147eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(
1148eb2eeeb7SSam Powell       FileA, FileB, [](InterfaceFile *File) { File->setSwiftABIVersion(5); }));
1149eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1150eb2eeeb7SSam Powell     File->setTwoLevelNamespace(false);
1151eb2eeeb7SSam Powell   }));
1152eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1153eb2eeeb7SSam Powell     File->setApplicationExtensionSafe(false);
1154eb2eeeb7SSam Powell   }));
1155eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11563025c3edSJuergen Ributzka     File->addParentUmbrella(Target(AK_x86_64, PLATFORM_MACOS), "System.dylib");
1157eb2eeeb7SSam Powell   }));
1158eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11593025c3edSJuergen Ributzka     File->addAllowableClient("ClientA", Target(AK_i386, PLATFORM_MACOS));
1160eb2eeeb7SSam Powell   }));
1161eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1162eb2eeeb7SSam Powell     File->addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
11633025c3edSJuergen Ributzka                                Target(AK_i386, PLATFORM_MACOS));
1164eb2eeeb7SSam Powell   }));
1165eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1166*d9a9872eSCyndy Ishida     File->addSymbol(EncodeKind::GlobalSymbol, "_symA",
11673025c3edSJuergen Ributzka                     {Target(AK_x86_64, PLATFORM_MACOS)});
1168eb2eeeb7SSam Powell   }));
1169eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1170eb2eeeb7SSam Powell     InterfaceFile Document;
1171e61e7616SCyndy Ishida     Document.setFileType(FileType::TBD_V4);
11723025c3edSJuergen Ributzka     Document.addTargets(TargetList{Target(AK_i386, PLATFORM_MACOS),
11733025c3edSJuergen Ributzka                                    Target(AK_x86_64, PLATFORM_MACOS)});
1174eb2eeeb7SSam Powell     Document.setInstallName("/System/Library/Frameworks/A.framework/A");
1175eb2eeeb7SSam Powell     File->addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
1176eb2eeeb7SSam Powell   }));
1177eb2eeeb7SSam Powell }
1178eb2eeeb7SSam Powell 
1179f9d8162bSCyndy Ishida } // end namespace TBDv4
1180