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"
67f9d8162bSCyndy Ishida       "    weak-symbols: []\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"
75f9d8162bSCyndy Ishida       "    weak-symbols: []\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   UUIDs uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
94f9d8162bSCyndy Ishida                  {Targets[1], "11111111-1111-1111-1111-111111111111"},
95f9d8162bSCyndy Ishida                  {Targets[2], "11111111-1111-1111-1111-111111111111"}};
96f9d8162bSCyndy Ishida   EXPECT_EQ(Archs, File->getArchitectures());
97f9d8162bSCyndy Ishida   EXPECT_EQ(uuids, File->uuids());
98f9d8162bSCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
99f9d8162bSCyndy Ishida   for (auto Platform : File->getPlatforms())
100f9d8162bSCyndy Ishida     EXPECT_EQ(Platforms.count(Platform), 1U);
101f9d8162bSCyndy Ishida   EXPECT_EQ(std::string("Umbrella.framework/Umbrella"), File->getInstallName());
102f9d8162bSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 3), File->getCurrentVersion());
103f9d8162bSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), File->getCompatibilityVersion());
104f9d8162bSCyndy Ishida   EXPECT_EQ(5U, File->getSwiftABIVersion());
105f9d8162bSCyndy Ishida   EXPECT_FALSE(File->isTwoLevelNamespace());
106f9d8162bSCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
107f9d8162bSCyndy Ishida   EXPECT_TRUE(File->isInstallAPI());
108f9d8162bSCyndy Ishida   InterfaceFileRef client("ClientA", Targets);
109f9d8162bSCyndy Ishida   InterfaceFileRef reexport("/System/Library/Frameworks/A.framework/A",
110f9d8162bSCyndy Ishida                             {Targets[0]});
111f9d8162bSCyndy Ishida   EXPECT_EQ(1U, File->allowableClients().size());
112f9d8162bSCyndy Ishida   EXPECT_EQ(client, File->allowableClients().front());
113f9d8162bSCyndy Ishida   EXPECT_EQ(1U, File->reexportedLibraries().size());
114f9d8162bSCyndy Ishida   EXPECT_EQ(reexport, File->reexportedLibraries().front());
115f9d8162bSCyndy Ishida 
1165810ed51SJonas Devlieghere   ExportedSymbolSeq Exports, Reexports, Undefineds;
1175810ed51SJonas Devlieghere   ExportedSymbol temp;
118f9d8162bSCyndy Ishida   for (const auto *Sym : File->symbols()) {
1195810ed51SJonas Devlieghere     temp = ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
120adcd0268SBenjamin Kramer                           Sym->isWeakDefined(), Sym->isThreadLocalValue()};
121f9d8162bSCyndy Ishida     EXPECT_FALSE(Sym->isWeakReferenced());
122f9d8162bSCyndy Ishida     if (Sym->isUndefined())
123f9d8162bSCyndy Ishida       Undefineds.emplace_back(std::move(temp));
124f9d8162bSCyndy Ishida     else
125f9d8162bSCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(temp))
126f9d8162bSCyndy Ishida                           : Exports.emplace_back(std::move(temp));
127f9d8162bSCyndy Ishida   }
128*cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
129*cd9a5cfdSDmitri Gribenko   llvm::sort(Reexports);
130*cd9a5cfdSDmitri Gribenko   llvm::sort(Undefineds);
131f9d8162bSCyndy Ishida 
132fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedExportedSymbols[] = {
133fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symA", false, false},
134fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symAB", false, false},
135fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symB", false, false},
136fd4d0751SCyndy Ishida   };
137fd4d0751SCyndy Ishida 
138fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedReexportedSymbols[] = {
139fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symC", false, false},
140fd4d0751SCyndy Ishida   };
141fd4d0751SCyndy Ishida 
142fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedUndefinedSymbols[] = {
143fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symD", false, false},
144fd4d0751SCyndy Ishida   };
145fd4d0751SCyndy Ishida 
146fd4d0751SCyndy Ishida   EXPECT_EQ(sizeof(ExpectedExportedSymbols) / sizeof(ExportedSymbol),
147f9d8162bSCyndy Ishida             Exports.size());
148fd4d0751SCyndy Ishida   EXPECT_EQ(sizeof(ExpectedReexportedSymbols) / sizeof(ExportedSymbol),
149f9d8162bSCyndy Ishida             Reexports.size());
150fd4d0751SCyndy Ishida   EXPECT_EQ(sizeof(ExpectedUndefinedSymbols) / sizeof(ExportedSymbol),
151f9d8162bSCyndy Ishida             Undefineds.size());
152f9d8162bSCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
153fd4d0751SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
154f9d8162bSCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
155fd4d0751SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
156f9d8162bSCyndy Ishida   EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(),
157fd4d0751SCyndy Ishida                          std::begin(ExpectedUndefinedSymbols)));
158fd4d0751SCyndy Ishida }
159fd4d0751SCyndy Ishida 
TEST(TBDv4,ReadMultipleDocuments)160fd4d0751SCyndy Ishida TEST(TBDv4, ReadMultipleDocuments) {
161fd4d0751SCyndy Ishida   static const char TBDv4Inlines[] =
162fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
163fd4d0751SCyndy Ishida       "tbd-version: 4\n"
164fd4d0751SCyndy Ishida       "targets: [ i386-macos, i386-maccatalyst, x86_64-macos, "
165fd4d0751SCyndy Ishida       "x86_64-maccatalyst ]\n"
166fd4d0751SCyndy Ishida       "uuids:\n"
167fd4d0751SCyndy Ishida       "  - target: i386-macos\n"
168fd4d0751SCyndy Ishida       "    value: 00000000-0000-0000-0000-000000000000\n"
169fd4d0751SCyndy Ishida       "  - target: i386-maccatalyst\n"
170fd4d0751SCyndy Ishida       "    value: 00000000-0000-0000-0000-000000000002\n"
171fd4d0751SCyndy Ishida       "  - target: x86_64-macos\n"
172fd4d0751SCyndy Ishida       "    value: 11111111-1111-1111-1111-111111111111\n"
173fd4d0751SCyndy Ishida       "  - target: x86_64-maccatalyst\n"
174fd4d0751SCyndy Ishida       "    value: 11111111-1111-1111-1111-111111111112\n"
175fd4d0751SCyndy Ishida       "install-name: /System/Library/Frameworks/Umbrella.framework/Umbrella\n"
176fd4d0751SCyndy Ishida       "parent-umbrella:\n"
177fd4d0751SCyndy Ishida       "  - targets: [ i386-macos, x86_64-macos ]\n"
178fd4d0751SCyndy Ishida       "    umbrella: System\n"
179fd4d0751SCyndy Ishida       "reexported-libraries:\n"
180fd4d0751SCyndy Ishida       "  - targets: [ i386-macos, x86_64-macos ]\n"
181fd4d0751SCyndy Ishida       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
182fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
183fd4d0751SCyndy Ishida       "tbd-version: 4\n"
184fd4d0751SCyndy Ishida       "targets:  [ i386-macos, x86_64-macos ]\n"
185fd4d0751SCyndy Ishida       "uuids:\n"
186fd4d0751SCyndy Ishida       "  - target: i386-macos\n"
187fd4d0751SCyndy Ishida       "    value: 20000000-0000-0000-0000-000000000000\n"
188fd4d0751SCyndy Ishida       "  - target: x86_64-macos\n"
189fd4d0751SCyndy Ishida       "    value: 21111111-1111-1111-1111-111111111111\n"
190fd4d0751SCyndy Ishida       "flags: [ flat_namespace ]\n"
191fd4d0751SCyndy Ishida       "install-name: /System/Library/Frameworks/A.framework/A\n"
192fd4d0751SCyndy Ishida       "current-version: 1.2.3\n"
193fd4d0751SCyndy Ishida       "compatibility-version: 1.2\n"
194fd4d0751SCyndy Ishida       "swift-abi-version: 5\n"
195fd4d0751SCyndy Ishida       "exports:\n"
196fd4d0751SCyndy Ishida       "  - targets: [ i386-macos ]\n"
197fd4d0751SCyndy Ishida       "    symbols: [ _symA ]\n"
198fd4d0751SCyndy Ishida       "    objc-classes: []\n"
199fd4d0751SCyndy Ishida       "    objc-eh-types: []\n"
200fd4d0751SCyndy Ishida       "    objc-ivars: []\n"
201fd4d0751SCyndy Ishida       "    weak-symbols: []\n"
202fd4d0751SCyndy Ishida       "    thread-local-symbols: []\n"
203fd4d0751SCyndy Ishida       "  - targets: [ x86_64-macos ]\n"
204fd4d0751SCyndy Ishida       "    symbols: [_symAB]\n"
205fd4d0751SCyndy Ishida       "reexports:\n"
206fd4d0751SCyndy Ishida       "  - targets: [ i386-macos ]\n"
207fd4d0751SCyndy Ishida       "    symbols: [_symC]\n"
208fd4d0751SCyndy Ishida       "    objc-classes: []\n"
209fd4d0751SCyndy Ishida       "    objc-eh-types: []\n"
210fd4d0751SCyndy Ishida       "    objc-ivars: []\n"
211fd4d0751SCyndy Ishida       "    weak-symbols: []\n"
212fd4d0751SCyndy Ishida       "    thread-local-symbols: []\n"
213fd4d0751SCyndy Ishida       "undefineds:\n"
214fd4d0751SCyndy Ishida       "  - targets: [ i386-macos ]\n"
215fd4d0751SCyndy Ishida       "    symbols: [ _symD ]\n"
216fd4d0751SCyndy Ishida       "    objc-classes: []\n"
217fd4d0751SCyndy Ishida       "    objc-eh-types: []\n"
218fd4d0751SCyndy Ishida       "    objc-ivars: []\n"
219fd4d0751SCyndy Ishida       "    weak-symbols: []\n"
220fd4d0751SCyndy Ishida       "    thread-local-symbols: []\n"
221fd4d0751SCyndy Ishida       "...\n";
222fd4d0751SCyndy Ishida 
223fd4d0751SCyndy Ishida   PlatformSet Platforms;
2243025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACOS);
2253025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
226fd4d0751SCyndy Ishida   ArchitectureSet Archs = AK_i386 | AK_x86_64;
227fd4d0751SCyndy Ishida   TargetList Targets;
228fd4d0751SCyndy Ishida   for (auto &&Arch : Archs)
229fd4d0751SCyndy Ishida     for (auto &&Platform : Platforms)
230fd4d0751SCyndy Ishida       Targets.emplace_back(Target(Arch, Platform));
231fd4d0751SCyndy Ishida   UUIDs Uuids = {
232fd4d0751SCyndy Ishida       {Targets[0], "00000000-0000-0000-0000-000000000000"},
233fd4d0751SCyndy Ishida       {Targets[1], "00000000-0000-0000-0000-000000000002"},
234fd4d0751SCyndy Ishida       {Targets[2], "11111111-1111-1111-1111-111111111111"},
235fd4d0751SCyndy Ishida       {Targets[3], "11111111-1111-1111-1111-111111111112"},
236fd4d0751SCyndy Ishida   };
237fd4d0751SCyndy Ishida 
2382ba32084SCyndy Ishida   Expected<TBDFile> Result =
2392ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Inlines, "Test.tbd"));
240fd4d0751SCyndy Ishida   EXPECT_TRUE(!!Result);
2412ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
242fd4d0751SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
243fd4d0751SCyndy Ishida   EXPECT_EQ(Archs, File->getArchitectures());
244fd4d0751SCyndy Ishida   EXPECT_EQ(Uuids, File->uuids());
245fd4d0751SCyndy Ishida   EXPECT_EQ(Platforms, File->getPlatforms());
246fd4d0751SCyndy Ishida   EXPECT_EQ(
247fd4d0751SCyndy Ishida       std::string("/System/Library/Frameworks/Umbrella.framework/Umbrella"),
248fd4d0751SCyndy Ishida       File->getInstallName());
249fd4d0751SCyndy Ishida   EXPECT_TRUE(File->isTwoLevelNamespace());
250fd4d0751SCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
251fd4d0751SCyndy Ishida   EXPECT_FALSE(File->isInstallAPI());
252fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion());
253fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
254fd4d0751SCyndy Ishida   InterfaceFileRef reexport("/System/Library/Frameworks/A.framework/A",
255fd4d0751SCyndy Ishida                             {Targets[0], Targets[2]});
256fd4d0751SCyndy Ishida   EXPECT_EQ(1U, File->reexportedLibraries().size());
257fd4d0751SCyndy Ishida   EXPECT_EQ(reexport, File->reexportedLibraries().front());
25825fefa5aSPaul Robinson   EXPECT_TRUE(File->symbols().empty());
259fd4d0751SCyndy Ishida 
260fd4d0751SCyndy Ishida   // Check Inlined Document
261fd4d0751SCyndy Ishida   Targets.clear();
262fd4d0751SCyndy Ishida   Uuids.clear();
2633025c3edSJuergen Ributzka   PlatformType Platform = PLATFORM_MACOS;
264fd4d0751SCyndy Ishida   for (auto &&Arch : Archs)
265fd4d0751SCyndy Ishida     Targets.emplace_back(Target(Arch, Platform));
266fd4d0751SCyndy Ishida   Uuids = {
267fd4d0751SCyndy Ishida       {Targets[0], "20000000-0000-0000-0000-000000000000"},
268fd4d0751SCyndy Ishida       {Targets[1], "21111111-1111-1111-1111-111111111111"},
269fd4d0751SCyndy Ishida   };
270fd4d0751SCyndy Ishida 
2710b15cb70SCyndy Ishida   TBDReexportFile Document = File->documents().front();
272fd4d0751SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, Document->getFileType());
273fd4d0751SCyndy Ishida   EXPECT_EQ(Archs, Document->getArchitectures());
274fd4d0751SCyndy Ishida   EXPECT_EQ(Uuids, Document->uuids());
275fd4d0751SCyndy Ishida   EXPECT_EQ(1U, Document->getPlatforms().size());
276fd4d0751SCyndy Ishida   EXPECT_EQ(Platform, *(Document->getPlatforms().begin()));
277fd4d0751SCyndy Ishida   EXPECT_EQ(std::string("/System/Library/Frameworks/A.framework/A"),
278fd4d0751SCyndy Ishida             Document->getInstallName());
279fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 3), Document->getCurrentVersion());
280fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), Document->getCompatibilityVersion());
281fd4d0751SCyndy Ishida   EXPECT_EQ(5U, Document->getSwiftABIVersion());
282fd4d0751SCyndy Ishida   EXPECT_FALSE(Document->isTwoLevelNamespace());
283fd4d0751SCyndy Ishida   EXPECT_TRUE(Document->isApplicationExtensionSafe());
284fd4d0751SCyndy Ishida   EXPECT_FALSE(Document->isInstallAPI());
285fd4d0751SCyndy Ishida 
28625fefa5aSPaul Robinson   ExportedSymbolSeq Exports;
287fd4d0751SCyndy Ishida   ExportedSymbolSeq Reexports, Undefineds;
288fd4d0751SCyndy Ishida   for (const auto *Sym : Document->symbols()) {
289fd4d0751SCyndy Ishida     ExportedSymbol Temp =
290fd4d0751SCyndy Ishida         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
291fd4d0751SCyndy Ishida                        Sym->isWeakDefined(), Sym->isThreadLocalValue()};
292fd4d0751SCyndy Ishida     EXPECT_FALSE(Sym->isWeakReferenced());
293fd4d0751SCyndy Ishida     if (Sym->isUndefined())
294fd4d0751SCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
295fd4d0751SCyndy Ishida     else
296fd4d0751SCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(Temp))
297fd4d0751SCyndy Ishida                           : Exports.emplace_back(std::move(Temp));
298fd4d0751SCyndy Ishida   }
299*cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
300*cd9a5cfdSDmitri Gribenko   llvm::sort(Reexports);
301*cd9a5cfdSDmitri Gribenko   llvm::sort(Undefineds);
302fd4d0751SCyndy Ishida 
303fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedExportedSymbols[] = {
304fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symA", false, false},
305fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symAB", false, false},
306fd4d0751SCyndy Ishida   };
307fd4d0751SCyndy Ishida 
308fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedReexportedSymbols[] = {
309fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symC", false, false},
310fd4d0751SCyndy Ishida   };
311fd4d0751SCyndy Ishida 
312fd4d0751SCyndy Ishida   static ExportedSymbol ExpectedUndefinedSymbols[] = {
313fd4d0751SCyndy Ishida       {SymbolKind::GlobalSymbol, "_symD", false, false},
314fd4d0751SCyndy Ishida   };
315fd4d0751SCyndy Ishida 
316fd4d0751SCyndy Ishida   EXPECT_EQ(sizeof(ExpectedExportedSymbols) / sizeof(ExportedSymbol),
317fd4d0751SCyndy Ishida             Exports.size());
318fd4d0751SCyndy Ishida   EXPECT_EQ(sizeof(ExpectedReexportedSymbols) / sizeof(ExportedSymbol),
319fd4d0751SCyndy Ishida             Reexports.size());
320fd4d0751SCyndy Ishida   EXPECT_EQ(sizeof(ExpectedUndefinedSymbols) / sizeof(ExportedSymbol),
321fd4d0751SCyndy Ishida             Undefineds.size());
322fd4d0751SCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
323fd4d0751SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
324fd4d0751SCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
325fd4d0751SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
326fd4d0751SCyndy Ishida   EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(),
327fd4d0751SCyndy Ishida                          std::begin(ExpectedUndefinedSymbols)));
328f9d8162bSCyndy Ishida }
329f9d8162bSCyndy Ishida 
TEST(TBDv4,WriteFile)330f9d8162bSCyndy Ishida TEST(TBDv4, WriteFile) {
331d26e0bcfSCyndy Ishida   static const char TBDv4File[] =
332f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
333f9d8162bSCyndy Ishida       "tbd-version:     4\n"
334f9d8162bSCyndy Ishida       "targets:         [ i386-macos, x86_64-ios-simulator ]\n"
335f9d8162bSCyndy Ishida       "uuids:\n"
336f9d8162bSCyndy Ishida       "  - target:          i386-macos\n"
337f9d8162bSCyndy Ishida       "    value:           00000000-0000-0000-0000-000000000000\n"
338f9d8162bSCyndy Ishida       "  - target:          x86_64-ios-simulator\n"
339f9d8162bSCyndy Ishida       "    value:           11111111-1111-1111-1111-111111111111\n"
340f9d8162bSCyndy Ishida       "flags:           [ installapi ]\n"
341f9d8162bSCyndy Ishida       "install-name:    'Umbrella.framework/Umbrella'\n"
342f9d8162bSCyndy Ishida       "current-version: 1.2.3\n"
343f9d8162bSCyndy Ishida       "compatibility-version: 0\n"
344f9d8162bSCyndy Ishida       "swift-abi-version: 5\n"
345f9d8162bSCyndy Ishida       "parent-umbrella:\n"
346f9d8162bSCyndy Ishida       "  - targets:         [ i386-macos, x86_64-ios-simulator ]\n"
347f9d8162bSCyndy Ishida       "    umbrella:        System\n"
348f9d8162bSCyndy Ishida       "allowable-clients:\n"
349f9d8162bSCyndy Ishida       "  - targets:         [ i386-macos ]\n"
350f9d8162bSCyndy Ishida       "    clients:         [ ClientA ]\n"
351f9d8162bSCyndy Ishida       "exports:\n"
352f9d8162bSCyndy Ishida       "  - targets:         [ i386-macos ]\n"
353f9d8162bSCyndy Ishida       "    symbols:         [ _symA ]\n"
354f9d8162bSCyndy Ishida       "    objc-classes:    [ Class1 ]\n"
355f9d8162bSCyndy Ishida       "    weak-symbols:    [ _symC ]\n"
356f9d8162bSCyndy Ishida       "  - targets:         [ x86_64-ios-simulator ]\n"
357f9d8162bSCyndy Ishida       "    symbols:         [ _symB ]\n"
358f9d8162bSCyndy Ishida       "...\n";
359f9d8162bSCyndy Ishida 
360f9d8162bSCyndy Ishida   InterfaceFile File;
361f9d8162bSCyndy Ishida   TargetList Targets = {
3623025c3edSJuergen Ributzka       Target(AK_i386, PLATFORM_MACOS),
3633025c3edSJuergen Ributzka       Target(AK_x86_64, PLATFORM_IOSSIMULATOR),
364f9d8162bSCyndy Ishida   };
365f9d8162bSCyndy Ishida   UUIDs uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
366f9d8162bSCyndy Ishida                  {Targets[1], "11111111-1111-1111-1111-111111111111"}};
367f9d8162bSCyndy Ishida   File.setInstallName("Umbrella.framework/Umbrella");
368f9d8162bSCyndy Ishida   File.setFileType(FileType::TBD_V4);
369f9d8162bSCyndy Ishida   File.addTargets(Targets);
370f9d8162bSCyndy Ishida   File.addUUID(uuids[0].first, uuids[0].second);
371f9d8162bSCyndy Ishida   File.addUUID(uuids[1].first, uuids[1].second);
372f9d8162bSCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 2, 3));
373f9d8162bSCyndy Ishida   File.setTwoLevelNamespace();
374f9d8162bSCyndy Ishida   File.setInstallAPI(true);
375f9d8162bSCyndy Ishida   File.setApplicationExtensionSafe(true);
376f9d8162bSCyndy Ishida   File.setSwiftABIVersion(5);
377f9d8162bSCyndy Ishida   File.addAllowableClient("ClientA", Targets[0]);
378f9d8162bSCyndy Ishida   File.addParentUmbrella(Targets[0], "System");
379f9d8162bSCyndy Ishida   File.addParentUmbrella(Targets[1], "System");
380f9d8162bSCyndy Ishida   File.addSymbol(SymbolKind::GlobalSymbol, "_symA", {Targets[0]});
381f9d8162bSCyndy Ishida   File.addSymbol(SymbolKind::GlobalSymbol, "_symB", {Targets[1]});
382f9d8162bSCyndy Ishida   File.addSymbol(SymbolKind::GlobalSymbol, "_symC", {Targets[0]},
383f9d8162bSCyndy Ishida                  SymbolFlags::WeakDefined);
384f9d8162bSCyndy Ishida   File.addSymbol(SymbolKind::ObjectiveCClass, "Class1", {Targets[0]});
385f9d8162bSCyndy Ishida 
386f9d8162bSCyndy Ishida   SmallString<4096> Buffer;
387f9d8162bSCyndy Ishida   raw_svector_ostream OS(Buffer);
3882ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
389f9d8162bSCyndy Ishida   EXPECT_FALSE(Result);
390d26e0bcfSCyndy Ishida   EXPECT_STREQ(TBDv4File, Buffer.c_str());
391f9d8162bSCyndy Ishida }
392f9d8162bSCyndy Ishida 
TEST(TBDv4,WriteMultipleDocuments)393fd4d0751SCyndy Ishida TEST(TBDv4, WriteMultipleDocuments) {
394fd4d0751SCyndy Ishida   static const char TBDv4Inlines[] =
395fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
396fd4d0751SCyndy Ishida       "tbd-version:     4\n"
397fd4d0751SCyndy Ishida       "targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
398fd4d0751SCyndy Ishida       "uuids:\n"
399fd4d0751SCyndy Ishida       "  - target:          i386-maccatalyst\n"
400fd4d0751SCyndy Ishida       "    value:           00000000-0000-0000-0000-000000000002\n"
401fd4d0751SCyndy Ishida       "  - target:          x86_64-maccatalyst\n"
402fd4d0751SCyndy Ishida       "    value:           11111111-1111-1111-1111-111111111112\n"
403fd4d0751SCyndy Ishida       "install-name:    "
404fd4d0751SCyndy Ishida       "'/System/Library/Frameworks/Umbrella.framework/Umbrella'\n"
405fd4d0751SCyndy Ishida       "reexported-libraries:\n"
406fd4d0751SCyndy Ishida       "  - targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
407fd4d0751SCyndy Ishida       "    libraries:       [ '/System/Library/Frameworks/A.framework/A' ]\n"
408fd4d0751SCyndy Ishida       "--- !tapi-tbd\n"
409fd4d0751SCyndy Ishida       "tbd-version:     4\n"
410fd4d0751SCyndy Ishida       "targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
411fd4d0751SCyndy Ishida       "uuids:\n"
412fd4d0751SCyndy Ishida       "  - target:          i386-maccatalyst\n"
413fd4d0751SCyndy Ishida       "    value:           00000000-0000-0000-0000-000000000000\n"
414fd4d0751SCyndy Ishida       "  - target:          x86_64-maccatalyst\n"
415fd4d0751SCyndy Ishida       "    value:           11111111-1111-1111-1111-111111111111\n"
416fd4d0751SCyndy Ishida       "install-name:    '/System/Library/Frameworks/A.framework/A'\n"
417fd4d0751SCyndy Ishida       "exports:\n"
418fd4d0751SCyndy Ishida       "  - targets:         [ i386-maccatalyst ]\n"
419fd4d0751SCyndy Ishida       "    weak-symbols:    [ _symC ]\n"
420fd4d0751SCyndy Ishida       "  - targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
421fd4d0751SCyndy Ishida       "    symbols:         [ _symA ]\n"
422fd4d0751SCyndy Ishida       "    objc-classes:    [ Class1 ]\n"
423fd4d0751SCyndy Ishida       "  - targets:         [ x86_64-maccatalyst ]\n"
424fd4d0751SCyndy Ishida       "    symbols:         [ _symAB ]\n"
425fd4d0751SCyndy Ishida       "...\n";
426fd4d0751SCyndy Ishida 
427fd4d0751SCyndy Ishida   InterfaceFile File;
4283025c3edSJuergen Ributzka   PlatformType Platform = PLATFORM_MACCATALYST;
429fd4d0751SCyndy Ishida   TargetList Targets = {
430fd4d0751SCyndy Ishida       Target(AK_i386, Platform),
431fd4d0751SCyndy Ishida       Target(AK_x86_64, Platform),
432fd4d0751SCyndy Ishida   };
433fd4d0751SCyndy Ishida   UUIDs Uuids = {{Targets[0], "00000000-0000-0000-0000-000000000002"},
434fd4d0751SCyndy Ishida                  {Targets[1], "11111111-1111-1111-1111-111111111112"}};
435fd4d0751SCyndy Ishida   File.setInstallName("/System/Library/Frameworks/Umbrella.framework/Umbrella");
436fd4d0751SCyndy Ishida   File.setFileType(FileType::TBD_V4);
437fd4d0751SCyndy Ishida   File.addTargets(Targets);
438fd4d0751SCyndy Ishida   File.addUUID(Uuids[0].first, Uuids[0].second);
439fd4d0751SCyndy Ishida   File.addUUID(Uuids[1].first, Uuids[1].second);
440fd4d0751SCyndy Ishida   File.setCompatibilityVersion(PackedVersion(1, 0, 0));
441fd4d0751SCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 0, 0));
442fd4d0751SCyndy Ishida   File.setTwoLevelNamespace();
443fd4d0751SCyndy Ishida   File.setApplicationExtensionSafe(true);
444fd4d0751SCyndy Ishida   File.addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
445fd4d0751SCyndy Ishida                             Targets[0]);
446fd4d0751SCyndy Ishida   File.addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
447fd4d0751SCyndy Ishida                             Targets[1]);
448fd4d0751SCyndy Ishida 
449fd4d0751SCyndy Ishida   // Write Second Document
450fd4d0751SCyndy Ishida   Uuids = {{Targets[0], "00000000-0000-0000-0000-000000000000"},
451fd4d0751SCyndy Ishida            {Targets[1], "11111111-1111-1111-1111-111111111111"}};
452fd4d0751SCyndy Ishida   InterfaceFile Document;
453fd4d0751SCyndy Ishida   Document.setInstallName("/System/Library/Frameworks/A.framework/A");
454fd4d0751SCyndy Ishida   Document.setFileType(FileType::TBD_V4);
455fd4d0751SCyndy Ishida   Document.addTargets(Targets);
456fd4d0751SCyndy Ishida   Document.addUUID(Uuids[0].first, Uuids[0].second);
457fd4d0751SCyndy Ishida   Document.addUUID(Uuids[1].first, Uuids[1].second);
458fd4d0751SCyndy Ishida   Document.setCompatibilityVersion(PackedVersion(1, 0, 0));
459fd4d0751SCyndy Ishida   Document.setCurrentVersion(PackedVersion(1, 0, 0));
460fd4d0751SCyndy Ishida   Document.setTwoLevelNamespace();
461fd4d0751SCyndy Ishida   Document.setApplicationExtensionSafe(true);
462fd4d0751SCyndy Ishida   Document.addSymbol(SymbolKind::GlobalSymbol, "_symA", Targets);
463fd4d0751SCyndy Ishida   Document.addSymbol(SymbolKind::GlobalSymbol, "_symAB", {Targets[1]});
464fd4d0751SCyndy Ishida   Document.addSymbol(SymbolKind::GlobalSymbol, "_symC", {Targets[0]},
465fd4d0751SCyndy Ishida                      SymbolFlags::WeakDefined);
466fd4d0751SCyndy Ishida   Document.addSymbol(SymbolKind::ObjectiveCClass, "Class1", Targets);
467fd4d0751SCyndy Ishida   File.addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
468fd4d0751SCyndy Ishida 
469fd4d0751SCyndy Ishida   SmallString<4096> Buffer;
470fd4d0751SCyndy Ishida   raw_svector_ostream OS(Buffer);
4712ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
472fd4d0751SCyndy Ishida   EXPECT_FALSE(Result);
473fd4d0751SCyndy Ishida   EXPECT_STREQ(TBDv4Inlines, Buffer.c_str());
474fd4d0751SCyndy Ishida }
475fd4d0751SCyndy Ishida 
TEST(TBDv4,MultipleTargets)476f9d8162bSCyndy Ishida TEST(TBDv4, MultipleTargets) {
477d26e0bcfSCyndy Ishida   static const char TBDv4MultipleTargets[] =
478f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
479f9d8162bSCyndy Ishida       "tbd-version: 4\n"
480f9d8162bSCyndy Ishida       "targets: [ i386-maccatalyst, x86_64-tvos, arm64-ios ]\n"
481f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
482f9d8162bSCyndy Ishida       "...\n";
483f9d8162bSCyndy Ishida 
4842ba32084SCyndy Ishida   Expected<TBDFile> Result =
485d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MultipleTargets, "Test.tbd"));
486f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
487f9d8162bSCyndy Ishida   PlatformSet Platforms;
4883025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
4893025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_TVOS);
4903025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_IOS);
4912ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
492f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
493f9d8162bSCyndy Ishida   EXPECT_EQ(AK_x86_64 | AK_arm64 | AK_i386, File->getArchitectures());
494f9d8162bSCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
495f9d8162bSCyndy Ishida   for (auto Platform : File->getPlatforms())
496f9d8162bSCyndy Ishida     EXPECT_EQ(Platforms.count(Platform), 1U);
497c6e8bfe7SJonas Devlieghere 
498c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
499c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5000b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
501c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
502d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4MultipleTargets),
503c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
504f9d8162bSCyndy Ishida }
505f9d8162bSCyndy Ishida 
TEST(TBDv4,MultipleTargetsSameArch)506f9d8162bSCyndy Ishida TEST(TBDv4, MultipleTargetsSameArch) {
507d26e0bcfSCyndy Ishida   static const char TBDv4TargetsSameArch[] =
508f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
509f9d8162bSCyndy Ishida       "tbd-version: 4\n"
510c6e8bfe7SJonas Devlieghere       "targets: [ x86_64-tvos , x86_64-maccatalyst ]\n"
511f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
512f9d8162bSCyndy Ishida       "...\n";
513f9d8162bSCyndy Ishida 
5142ba32084SCyndy Ishida   Expected<TBDFile> Result =
515d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4TargetsSameArch, "Test.tbd"));
516f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
517f9d8162bSCyndy Ishida   PlatformSet Platforms;
5183025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_TVOS);
5193025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
5202ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
521f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
522f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
523f9d8162bSCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
524f9d8162bSCyndy Ishida   for (auto Platform : File->getPlatforms())
525f9d8162bSCyndy Ishida     EXPECT_EQ(Platforms.count(Platform), 1U);
526c6e8bfe7SJonas Devlieghere 
527c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
528c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5290b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
530c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
531d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4TargetsSameArch),
532c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
533f9d8162bSCyndy Ishida }
534f9d8162bSCyndy Ishida 
TEST(TBDv4,MultipleTargetsSamePlatform)535f9d8162bSCyndy Ishida TEST(TBDv4, MultipleTargetsSamePlatform) {
536d26e0bcfSCyndy Ishida   static const char TBDv4MultipleTargetsSamePlatform[] =
537f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
538f9d8162bSCyndy Ishida       "tbd-version: 4\n"
539c6e8bfe7SJonas Devlieghere       "targets: [ armv7k-ios , arm64-ios]\n"
540f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
541f9d8162bSCyndy Ishida       "...\n";
542f9d8162bSCyndy Ishida 
5432ba32084SCyndy Ishida   Expected<TBDFile> Result = TextAPIReader::get(
544d26e0bcfSCyndy Ishida       MemoryBufferRef(TBDv4MultipleTargetsSamePlatform, "Test.tbd"));
545f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5462ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
547f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
548f9d8162bSCyndy Ishida   EXPECT_EQ(AK_arm64 | AK_armv7k, File->getArchitectures());
549f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5503025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOS, *File->getPlatforms().begin());
551c6e8bfe7SJonas Devlieghere 
552c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
553c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5540b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
555c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
556d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4MultipleTargetsSamePlatform),
557c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
558f9d8162bSCyndy Ishida }
559f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_maccatalyst)560f9d8162bSCyndy Ishida TEST(TBDv4, Target_maccatalyst) {
561d26e0bcfSCyndy Ishida   static const char TBDv4TargetMacCatalyst[] =
562f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
563f9d8162bSCyndy Ishida       "tbd-version: 4\n"
564f9d8162bSCyndy Ishida       "targets: [  x86_64-maccatalyst ]\n"
565f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
566f9d8162bSCyndy Ishida       "...\n";
567f9d8162bSCyndy Ishida 
5682ba32084SCyndy Ishida   Expected<TBDFile> Result =
569d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4TargetMacCatalyst, "Test.tbd"));
570f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5712ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
572f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
573f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
574f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5753025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_MACCATALYST, *File->getPlatforms().begin());
576c6e8bfe7SJonas Devlieghere 
577c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
578c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5790b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
580c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
581d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4TargetMacCatalyst),
582c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
583f9d8162bSCyndy Ishida }
584f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_x86_ios)585f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_ios) {
586d26e0bcfSCyndy Ishida   static const char TBDv4Targetx86iOS[] = "--- !tapi-tbd\n"
587f9d8162bSCyndy Ishida                                           "tbd-version: 4\n"
588f9d8162bSCyndy Ishida                                           "targets: [  x86_64-ios ]\n"
589f9d8162bSCyndy Ishida                                           "install-name: Test.dylib\n"
590f9d8162bSCyndy Ishida                                           "...\n";
591f9d8162bSCyndy Ishida 
5922ba32084SCyndy Ishida   Expected<TBDFile> Result =
593d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Targetx86iOS, "Test.tbd"));
594f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
5952ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
596f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
597f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
598f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5993025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOS, *File->getPlatforms().begin());
600c6e8bfe7SJonas Devlieghere 
601c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
602c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6030b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
604c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
605d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4Targetx86iOS),
606c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
607f9d8162bSCyndy Ishida }
608f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_arm_bridgeOS)609f9d8162bSCyndy Ishida TEST(TBDv4, Target_arm_bridgeOS) {
610d26e0bcfSCyndy Ishida   static const char TBDv4PlatformBridgeOS[] = "--- !tapi-tbd\n"
611f9d8162bSCyndy Ishida                                               "tbd-version: 4\n"
612f9d8162bSCyndy Ishida                                               "targets: [  armv7k-bridgeos ]\n"
613f9d8162bSCyndy Ishida                                               "install-name: Test.dylib\n"
614f9d8162bSCyndy Ishida                                               "...\n";
615f9d8162bSCyndy Ishida 
6162ba32084SCyndy Ishida   Expected<TBDFile> Result =
617d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4PlatformBridgeOS, "Test.tbd"));
618f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
6192ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
620f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
621f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6223025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_BRIDGEOS, *File->getPlatforms().begin());
623f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_armv7k), File->getArchitectures());
624c6e8bfe7SJonas Devlieghere 
625c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
626c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6270b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
628c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
629d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4PlatformBridgeOS),
630c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
631f9d8162bSCyndy Ishida }
632f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_arm_iOS)633a0cd4134SCyndy Ishida TEST(TBDv4, Target_arm_iOS) {
634d26e0bcfSCyndy Ishida   static const char TBDv4ArchArm64e[] = "--- !tapi-tbd\n"
635a0cd4134SCyndy Ishida                                         "tbd-version: 4\n"
636a0cd4134SCyndy Ishida                                         "targets: [  arm64e-ios ]\n"
637a0cd4134SCyndy Ishida                                         "install-name: Test.dylib\n"
638a0cd4134SCyndy Ishida                                         "...\n";
639a0cd4134SCyndy Ishida 
6402ba32084SCyndy Ishida   Expected<TBDFile> Result =
641d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4ArchArm64e, "Test.tbd"));
642a0cd4134SCyndy Ishida   EXPECT_TRUE(!!Result);
6432ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
644a0cd4134SCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
645a0cd4134SCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6463025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOS, *File->getPlatforms().begin());
647a0cd4134SCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_arm64e), File->getArchitectures());
648a0cd4134SCyndy Ishida 
649a0cd4134SCyndy Ishida   SmallString<4096> Buffer;
650a0cd4134SCyndy Ishida   raw_svector_ostream OS(Buffer);
6510b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
652a0cd4134SCyndy Ishida   EXPECT_TRUE(!WriteResult);
653d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4ArchArm64e), stripWhitespace(Buffer.c_str()));
654a0cd4134SCyndy Ishida }
655a0cd4134SCyndy Ishida 
TEST(TBDv4,Target_x86_macos)656f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_macos) {
657d26e0bcfSCyndy Ishida   static const char TBDv4Targetx86MacOS[] = "--- !tapi-tbd\n"
658f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
659f9d8162bSCyndy Ishida                                             "targets: [  x86_64-macos ]\n"
660f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
661f9d8162bSCyndy Ishida                                             "...\n";
662f9d8162bSCyndy Ishida 
6632ba32084SCyndy Ishida   Expected<TBDFile> Result =
664d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Targetx86MacOS, "Test.tbd"));
665f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
6662ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
667f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
668f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
669f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6703025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_MACOS, *File->getPlatforms().begin());
671c6e8bfe7SJonas Devlieghere 
672c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
673c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6740b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
675c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
676d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4Targetx86MacOS),
677d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
678f9d8162bSCyndy Ishida }
679f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_x86_ios_simulator)680f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_ios_simulator) {
681d26e0bcfSCyndy Ishida   static const char TBDv4Targetx86iOSSim[] =
682d26e0bcfSCyndy Ishida       "--- !tapi-tbd\n"
683f9d8162bSCyndy Ishida       "tbd-version: 4\n"
684f9d8162bSCyndy Ishida       "targets: [  x86_64-ios-simulator  ]\n"
685f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
686f9d8162bSCyndy Ishida       "...\n";
687f9d8162bSCyndy Ishida 
6882ba32084SCyndy Ishida   Expected<TBDFile> Result =
689d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Targetx86iOSSim, "Test.tbd"));
690f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
6912ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
692f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
693f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
694f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
6953025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_IOSSIMULATOR, *File->getPlatforms().begin());
696c6e8bfe7SJonas Devlieghere 
697c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
698c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6990b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
700c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
701d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4Targetx86iOSSim),
702d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
703f9d8162bSCyndy Ishida }
704f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_x86_tvos_simulator)705f9d8162bSCyndy Ishida TEST(TBDv4, Target_x86_tvos_simulator) {
706d26e0bcfSCyndy Ishida   static const char TBDv4x86tvOSSim[] = "--- !tapi-tbd\n"
707f9d8162bSCyndy Ishida                                         "tbd-version: 4\n"
708f9d8162bSCyndy Ishida                                         "targets: [  x86_64-tvos-simulator  ]\n"
709f9d8162bSCyndy Ishida                                         "install-name: Test.dylib\n"
710f9d8162bSCyndy Ishida                                         "...\n";
711f9d8162bSCyndy Ishida 
7122ba32084SCyndy Ishida   Expected<TBDFile> Result =
713d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4x86tvOSSim, "Test.tbd"));
714f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
7152ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
716f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
717f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_x86_64), File->getArchitectures());
718f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
7193025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_TVOSSIMULATOR, *File->getPlatforms().begin());
720c6e8bfe7SJonas Devlieghere 
721c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
722c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
7230b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
724c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
725d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4x86tvOSSim), stripWhitespace(Buffer.c_str()));
726f9d8162bSCyndy Ishida }
727f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_i386_watchos_simulator)728f9d8162bSCyndy Ishida TEST(TBDv4, Target_i386_watchos_simulator) {
729d26e0bcfSCyndy Ishida   static const char TBDv4i386watchOSSim[] =
730f9d8162bSCyndy Ishida       "--- !tapi-tbd\n"
731f9d8162bSCyndy Ishida       "tbd-version: 4\n"
732f9d8162bSCyndy Ishida       "targets: [  i386-watchos-simulator  ]\n"
733f9d8162bSCyndy Ishida       "install-name: Test.dylib\n"
734f9d8162bSCyndy Ishida       "...\n";
735f9d8162bSCyndy Ishida 
7362ba32084SCyndy Ishida   Expected<TBDFile> Result =
737d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4i386watchOSSim, "Test.tbd"));
738f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
7392ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
740f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
741f9d8162bSCyndy Ishida   EXPECT_EQ(ArchitectureSet(AK_i386), File->getArchitectures());
742f9d8162bSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
7433025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_WATCHOSSIMULATOR, *File->getPlatforms().begin());
744c6e8bfe7SJonas Devlieghere 
745c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
746c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
7470b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
748c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
749d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4i386watchOSSim),
750c6e8bfe7SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
751f9d8162bSCyndy Ishida }
752f9d8162bSCyndy Ishida 
TEST(TBDv4,Target_i386_driverkit)753eef41efeSGreg McGary TEST(TBDv4, Target_i386_driverkit) {
754eef41efeSGreg McGary   static const char TBDv4i386DriverKit[] = "--- !tapi-tbd\n"
755eef41efeSGreg McGary                                            "tbd-version: 4\n"
756eef41efeSGreg McGary                                            "targets: [  i386-driverkit  ]\n"
757eef41efeSGreg McGary                                            "install-name: Test.dylib\n"
758eef41efeSGreg McGary                                            "...\n";
759eef41efeSGreg McGary 
760eef41efeSGreg McGary   Expected<TBDFile> Result =
761eef41efeSGreg McGary       TextAPIReader::get(MemoryBufferRef(TBDv4i386DriverKit, "Test.tbd"));
762eef41efeSGreg McGary   EXPECT_TRUE(!!Result);
763eef41efeSGreg McGary   TBDFile File = std::move(Result.get());
764eef41efeSGreg McGary   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
765eef41efeSGreg McGary   EXPECT_EQ(ArchitectureSet(AK_i386), File->getArchitectures());
766eef41efeSGreg McGary   EXPECT_EQ(File->getPlatforms().size(), 1U);
7673025c3edSJuergen Ributzka   EXPECT_EQ(PLATFORM_DRIVERKIT, *File->getPlatforms().begin());
768eef41efeSGreg McGary 
769eef41efeSGreg McGary   SmallString<4096> Buffer;
770eef41efeSGreg McGary   raw_svector_ostream OS(Buffer);
7710b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
772eef41efeSGreg McGary   EXPECT_TRUE(!WriteResult);
773eef41efeSGreg McGary   EXPECT_EQ(stripWhitespace(TBDv4i386DriverKit),
774eef41efeSGreg McGary             stripWhitespace(Buffer.c_str()));
775eef41efeSGreg McGary }
776eef41efeSGreg McGary 
TEST(TBDv4,Swift_1)777f9d8162bSCyndy Ishida TEST(TBDv4, Swift_1) {
778d26e0bcfSCyndy Ishida   static const char TBDv4SwiftVersion1[] = "--- !tapi-tbd\n"
779f9d8162bSCyndy Ishida                                            "tbd-version: 4\n"
780f9d8162bSCyndy Ishida                                            "targets: [  x86_64-macos ]\n"
781f9d8162bSCyndy Ishida                                            "install-name: Test.dylib\n"
782f9d8162bSCyndy Ishida                                            "swift-abi-version: 1\n"
783f9d8162bSCyndy Ishida                                            "...\n";
784f9d8162bSCyndy Ishida 
7852ba32084SCyndy Ishida   Expected<TBDFile> Result =
786d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4SwiftVersion1, "Test.tbd"));
787f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
7882ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
789f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
790f9d8162bSCyndy Ishida   EXPECT_EQ(1U, File->getSwiftABIVersion());
791c6e8bfe7SJonas Devlieghere 
792c6e8bfe7SJonas Devlieghere   // No writer test because we emit "swift-abi-version:1.0".
793f9d8162bSCyndy Ishida }
794f9d8162bSCyndy Ishida 
TEST(TBDv4,Swift_2)795f9d8162bSCyndy Ishida TEST(TBDv4, Swift_2) {
796d26e0bcfSCyndy Ishida   static const char TBDv4Swift2[] = "--- !tapi-tbd\n"
797f9d8162bSCyndy Ishida                                     "tbd-version: 4\n"
798f9d8162bSCyndy Ishida                                     "targets: [  x86_64-macos ]\n"
799f9d8162bSCyndy Ishida                                     "install-name: Test.dylib\n"
800f9d8162bSCyndy Ishida                                     "swift-abi-version: 2\n"
801f9d8162bSCyndy Ishida                                     "...\n";
802f9d8162bSCyndy Ishida 
8032ba32084SCyndy Ishida   Expected<TBDFile> Result =
8042ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4Swift2, "Test.tbd"));
805f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
8062ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
807f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
808f9d8162bSCyndy Ishida   EXPECT_EQ(2U, File->getSwiftABIVersion());
809c6e8bfe7SJonas Devlieghere 
810c6e8bfe7SJonas Devlieghere   // No writer test because we emit "swift-abi-version:2.0".
811f9d8162bSCyndy Ishida }
812f9d8162bSCyndy Ishida 
TEST(TBDv4,Swift_5)813f9d8162bSCyndy Ishida TEST(TBDv4, Swift_5) {
814d26e0bcfSCyndy Ishida   static const char TBDv4SwiftVersion5[] = "--- !tapi-tbd\n"
815f9d8162bSCyndy Ishida                                            "tbd-version: 4\n"
816f9d8162bSCyndy Ishida                                            "targets: [  x86_64-macos ]\n"
817f9d8162bSCyndy Ishida                                            "install-name: Test.dylib\n"
818f9d8162bSCyndy Ishida                                            "swift-abi-version: 5\n"
819f9d8162bSCyndy Ishida                                            "...\n";
820f9d8162bSCyndy Ishida 
8212ba32084SCyndy Ishida   Expected<TBDFile> Result =
822d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4SwiftVersion5, "Test.tbd"));
823f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
8242ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
825f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
826f9d8162bSCyndy Ishida   EXPECT_EQ(5U, File->getSwiftABIVersion());
827c6e8bfe7SJonas Devlieghere 
828c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
829c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
8300b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
831c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
832d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4SwiftVersion5),
833d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
834f9d8162bSCyndy Ishida }
835f9d8162bSCyndy Ishida 
TEST(TBDv4,Swift_99)836f9d8162bSCyndy Ishida TEST(TBDv4, Swift_99) {
837d26e0bcfSCyndy Ishida   static const char TBDv4SwiftVersion99[] = "--- !tapi-tbd\n"
838f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
839f9d8162bSCyndy Ishida                                             "targets: [  x86_64-macos ]\n"
840f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
841f9d8162bSCyndy Ishida                                             "swift-abi-version: 99\n"
842f9d8162bSCyndy Ishida                                             "...\n";
843f9d8162bSCyndy Ishida 
8442ba32084SCyndy Ishida   Expected<TBDFile> Result =
845d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4SwiftVersion99, "Test.tbd"));
846f9d8162bSCyndy Ishida   EXPECT_TRUE(!!Result);
8472ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
848f9d8162bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V4, File->getFileType());
849f9d8162bSCyndy Ishida   EXPECT_EQ(99U, File->getSwiftABIVersion());
850c6e8bfe7SJonas Devlieghere 
851c6e8bfe7SJonas Devlieghere   SmallString<4096> Buffer;
852c6e8bfe7SJonas Devlieghere   raw_svector_ostream OS(Buffer);
8530b15cb70SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
854c6e8bfe7SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
855d26e0bcfSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv4SwiftVersion99),
856d26e0bcfSCyndy Ishida             stripWhitespace(Buffer.c_str()));
857f9d8162bSCyndy Ishida }
858f9d8162bSCyndy Ishida 
TEST(TBDv4,InvalidArchitecture)859f9d8162bSCyndy Ishida TEST(TBDv4, InvalidArchitecture) {
860d26e0bcfSCyndy Ishida   static const char TBDv4UnknownArch[] = "--- !tapi-tbd\n"
861f9d8162bSCyndy Ishida                                          "tbd-version: 4\n"
862f9d8162bSCyndy Ishida                                          "targets: [ foo-macos ]\n"
863f9d8162bSCyndy Ishida                                          "install-name: Test.dylib\n"
864f9d8162bSCyndy Ishida                                          "...\n";
865f9d8162bSCyndy Ishida 
8662ba32084SCyndy Ishida   Expected<TBDFile> Result =
867d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4UnknownArch, "Test.tbd"));
868f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
8692ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
870f9d8162bSCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:3:12: error: unknown "
871f9d8162bSCyndy Ishida             "architecture\ntargets: [ foo-macos ]\n"
872f9d8162bSCyndy Ishida             "           ^~~~~~~~~~\n",
8732ba32084SCyndy Ishida             ErrorMessage);
874f9d8162bSCyndy Ishida }
875f9d8162bSCyndy Ishida 
TEST(TBDv4,InvalidPlatform)876f9d8162bSCyndy Ishida TEST(TBDv4, InvalidPlatform) {
877d26e0bcfSCyndy Ishida   static const char TBDv4FInvalidPlatform[] = "--- !tapi-tbd\n"
878f9d8162bSCyndy Ishida                                               "tbd-version: 4\n"
879f9d8162bSCyndy Ishida                                               "targets: [ x86_64-maos ]\n"
880f9d8162bSCyndy Ishida                                               "install-name: Test.dylib\n"
881f9d8162bSCyndy Ishida                                               "...\n";
882f9d8162bSCyndy Ishida 
8832ba32084SCyndy Ishida   Expected<TBDFile> Result =
884d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4FInvalidPlatform, "Test.tbd"));
885f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
8862ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
887f9d8162bSCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:3:12: error: unknown platform\ntargets: "
888f9d8162bSCyndy Ishida             "[ x86_64-maos ]\n"
889f9d8162bSCyndy Ishida             "           ^~~~~~~~~~~~\n",
8902ba32084SCyndy Ishida             ErrorMessage);
891f9d8162bSCyndy Ishida }
892f9d8162bSCyndy Ishida 
TEST(TBDv4,MalformedFile1)893f9d8162bSCyndy Ishida TEST(TBDv4, MalformedFile1) {
894d26e0bcfSCyndy Ishida   static const char TBDv4MalformedFile1[] = "--- !tapi-tbd\n"
895f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
896f9d8162bSCyndy Ishida                                             "...\n";
897f9d8162bSCyndy Ishida 
8982ba32084SCyndy Ishida   Expected<TBDFile> Result =
899d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MalformedFile1, "Test.tbd"));
900f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9012ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
902f9d8162bSCyndy Ishida   ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
903f9d8162bSCyndy Ishida             "'targets'\ntbd-version: 4\n^\n",
9042ba32084SCyndy Ishida             ErrorMessage);
905f9d8162bSCyndy Ishida }
906f9d8162bSCyndy Ishida 
TEST(TBDv4,MalformedFile2)907f9d8162bSCyndy Ishida TEST(TBDv4, MalformedFile2) {
908d26e0bcfSCyndy Ishida   static const char TBDv4MalformedFile2[] = "--- !tapi-tbd\n"
909f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
910f9d8162bSCyndy Ishida                                             "targets: [ x86_64-macos ]\n"
911f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
912f9d8162bSCyndy Ishida                                             "foobar: \"unsupported key\"\n";
913f9d8162bSCyndy Ishida 
9142ba32084SCyndy Ishida   Expected<TBDFile> Result =
915d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MalformedFile2, "Test.tbd"));
916f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9172ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
918f9d8162bSCyndy Ishida   ASSERT_EQ(
919d380c38eSNathan James       "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
920d380c38eSNathan James       "\"unsupported key\"\n^~~~~~\n",
9212ba32084SCyndy Ishida       ErrorMessage);
922f9d8162bSCyndy Ishida }
923f9d8162bSCyndy Ishida 
TEST(TBDv4,MalformedFile3)924f9d8162bSCyndy Ishida TEST(TBDv4, MalformedFile3) {
925d26e0bcfSCyndy Ishida   static const char TBDv4MalformedSwift[] = "--- !tapi-tbd\n"
926f9d8162bSCyndy Ishida                                             "tbd-version: 4\n"
927f9d8162bSCyndy Ishida                                             "targets: [  x86_64-macos ]\n"
928f9d8162bSCyndy Ishida                                             "install-name: Test.dylib\n"
929f9d8162bSCyndy Ishida                                             "swift-abi-version: 1.1\n"
930f9d8162bSCyndy Ishida                                             "...\n";
931f9d8162bSCyndy Ishida 
9322ba32084SCyndy Ishida   Expected<TBDFile> Result =
933d26e0bcfSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv4MalformedSwift, "Test.tbd"));
934f9d8162bSCyndy Ishida   EXPECT_FALSE(!!Result);
9352ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
936f9d8162bSCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:5:20: error: invalid Swift ABI "
937f9d8162bSCyndy Ishida             "version.\nswift-abi-version: 1.1\n                   ^~~\n",
9382ba32084SCyndy Ishida             ErrorMessage);
939f9d8162bSCyndy Ishida }
940f9d8162bSCyndy Ishida 
TEST(TBDv4,InterfaceEquality)941eb2eeeb7SSam Powell TEST(TBDv4, InterfaceEquality) {
942eb2eeeb7SSam Powell   static const char TBDv4File[] =
943eb2eeeb7SSam Powell       "--- !tapi-tbd\n"
944eb2eeeb7SSam Powell       "tbd-version: 4\n"
945eb2eeeb7SSam Powell       "targets:  [ i386-macos, x86_64-macos, x86_64-ios ]\n"
946eb2eeeb7SSam Powell       "uuids:\n"
947eb2eeeb7SSam Powell       "  - target: i386-macos\n"
948eb2eeeb7SSam Powell       "    value: 00000000-0000-0000-0000-000000000000\n"
949eb2eeeb7SSam Powell       "  - target: x86_64-macos\n"
950eb2eeeb7SSam Powell       "    value: 11111111-1111-1111-1111-111111111111\n"
951eb2eeeb7SSam Powell       "  - target: x86_64-ios\n"
952eb2eeeb7SSam Powell       "    value: 11111111-1111-1111-1111-111111111111\n"
953eb2eeeb7SSam Powell       "flags: [ flat_namespace, installapi ]\n"
954eb2eeeb7SSam Powell       "install-name: Umbrella.framework/Umbrella\n"
955eb2eeeb7SSam Powell       "current-version: 1.2.3\n"
956eb2eeeb7SSam Powell       "compatibility-version: 1.2\n"
957eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
958eb2eeeb7SSam Powell       "parent-umbrella:\n"
959eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos, x86_64-ios ]\n"
960eb2eeeb7SSam Powell       "    umbrella: System\n"
961eb2eeeb7SSam Powell       "allowable-clients:\n"
962eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos, x86_64-ios ]\n"
963eb2eeeb7SSam Powell       "    clients: [ ClientA ]\n"
964eb2eeeb7SSam Powell       "reexported-libraries:\n"
965eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
966eb2eeeb7SSam Powell       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
967eb2eeeb7SSam Powell       "exports:\n"
968eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
969eb2eeeb7SSam Powell       "    symbols: [ _symA ]\n"
970eb2eeeb7SSam Powell       "    objc-classes: []\n"
971eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
972eb2eeeb7SSam Powell       "    objc-ivars: []\n"
973eb2eeeb7SSam Powell       "    weak-symbols: []\n"
974eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
975eb2eeeb7SSam Powell       "  - targets: [ x86_64-ios ]\n"
976eb2eeeb7SSam Powell       "    symbols: [_symB]\n"
977eb2eeeb7SSam Powell       "  - targets: [ x86_64-macos, x86_64-ios ]\n"
978eb2eeeb7SSam Powell       "    symbols: [_symAB]\n"
979eb2eeeb7SSam Powell       "reexports:\n"
980eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
981eb2eeeb7SSam Powell       "    symbols: [_symC]\n"
982eb2eeeb7SSam Powell       "    objc-classes: []\n"
983eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
984eb2eeeb7SSam Powell       "    objc-ivars: []\n"
985eb2eeeb7SSam Powell       "    weak-symbols: []\n"
986eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
987eb2eeeb7SSam Powell       "undefineds:\n"
988eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
989eb2eeeb7SSam Powell       "    symbols: [ _symD ]\n"
990eb2eeeb7SSam Powell       "    objc-classes: []\n"
991eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
992eb2eeeb7SSam Powell       "    objc-ivars: []\n"
993eb2eeeb7SSam Powell       "    weak-symbols: []\n"
994eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
995eb2eeeb7SSam Powell       "tbd-version:     4\n"
996eb2eeeb7SSam Powell       "targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
997eb2eeeb7SSam Powell       "uuids:\n"
998eb2eeeb7SSam Powell       "  - target:          i386-maccatalyst\n"
999eb2eeeb7SSam Powell       "    value:           00000000-0000-0000-0000-000000000000\n"
1000eb2eeeb7SSam Powell       "  - target:          x86_64-maccatalyst\n"
1001eb2eeeb7SSam Powell       "    value:           11111111-1111-1111-1111-111111111111\n"
1002eb2eeeb7SSam Powell       "install-name:    '/System/Library/Frameworks/A.framework/A'\n"
1003eb2eeeb7SSam Powell       "exports:\n"
1004eb2eeeb7SSam Powell       "  - targets:         [ i386-maccatalyst ]\n"
1005eb2eeeb7SSam Powell       "    weak-symbols:    [ _symC ]\n"
1006eb2eeeb7SSam Powell       "  - targets:         [ i386-maccatalyst, x86_64-maccatalyst ]\n"
1007eb2eeeb7SSam Powell       "    symbols:         [ _symA ]\n"
1008eb2eeeb7SSam Powell       "    objc-classes:    [ Class1 ]\n"
1009eb2eeeb7SSam Powell       "  - targets:         [ x86_64-maccatalyst ]\n"
1010eb2eeeb7SSam Powell       "    symbols:         [ _symAB ]\n"
1011eb2eeeb7SSam Powell       "...\n";
1012eb2eeeb7SSam Powell 
1013eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
1014eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestA.tbd"));
1015eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
1016eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
1017eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
1018eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestB.tbd"));
1019eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
1020eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
1021eb2eeeb7SSam Powell   EXPECT_TRUE(FileA == FileB);
1022eb2eeeb7SSam Powell }
1023eb2eeeb7SSam Powell 
TEST(TBDv4,InterfaceDiffVersionsEquality)1024eb2eeeb7SSam Powell TEST(TBDv4, InterfaceDiffVersionsEquality) {
1025eb2eeeb7SSam Powell   static const char TBDv4File[] =
1026eb2eeeb7SSam Powell       "--- !tapi-tbd\n"
1027eb2eeeb7SSam Powell       "tbd-version: 4\n"
1028eb2eeeb7SSam Powell       "targets:  [ i386-macos, x86_64-macos ]\n"
1029eb2eeeb7SSam Powell       "uuids:\n"
1030eb2eeeb7SSam Powell       "  - target: i386-macos\n"
1031eb2eeeb7SSam Powell       "    value: 00000000-0000-0000-0000-000000000000\n"
1032eb2eeeb7SSam Powell       "  - target: x86_64-macos\n"
1033eb2eeeb7SSam Powell       "    value: 11111111-1111-1111-1111-111111111111\n"
1034eb2eeeb7SSam Powell       "flags: [ installapi ]\n"
1035eb2eeeb7SSam Powell       "install-name: Umbrella.framework/Umbrella\n"
1036eb2eeeb7SSam Powell       "current-version: 1.2.3\n"
1037eb2eeeb7SSam Powell       "compatibility-version: 1.0\n"
1038eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
1039eb2eeeb7SSam Powell       "parent-umbrella:\n"
1040eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos ]\n"
1041eb2eeeb7SSam Powell       "    umbrella: System\n"
1042eb2eeeb7SSam Powell       "allowable-clients:\n"
1043eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos ]\n"
1044eb2eeeb7SSam Powell       "    clients: [ ClientA ]\n"
1045eb2eeeb7SSam Powell       "reexported-libraries:\n"
1046eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1047eb2eeeb7SSam Powell       "    libraries: [ /System/Library/Frameworks/A.framework/A ]\n"
1048eb2eeeb7SSam Powell       "exports:\n"
1049eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1050eb2eeeb7SSam Powell       "    symbols: [ _sym5 ]\n"
1051eb2eeeb7SSam Powell       "    objc-classes: [ class3]\n"
1052eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
1053eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar3 ]\n"
1054eb2eeeb7SSam Powell       "    weak-symbols: [ _weak3 ]\n"
1055eb2eeeb7SSam Powell       "  - targets: [ x86_64-macos ]\n"
1056eb2eeeb7SSam Powell       "    symbols: [_symAB]\n"
1057eb2eeeb7SSam Powell       "  - targets: [ i386-macos, x86_64-macos ]\n"
1058eb2eeeb7SSam Powell       "    symbols: [_symA]\n"
1059eb2eeeb7SSam Powell       "    objc-classes: [ class1, class2 ]\n"
1060eb2eeeb7SSam Powell       "    objc-eh-types: [ class1 ]\n"
1061eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
1062eb2eeeb7SSam Powell       "    weak-symbols: [ _weak1, _weak2 ]\n"
1063eb2eeeb7SSam Powell       "    thread-local-symbols: [ _tlv1, _tlv3 ]\n"
1064eb2eeeb7SSam Powell       "undefineds:\n"
1065eb2eeeb7SSam Powell       "  - targets: [ i386-macos ]\n"
1066eb2eeeb7SSam Powell       "    symbols: [ _symC ]\n"
1067eb2eeeb7SSam Powell       "    objc-classes: []\n"
1068eb2eeeb7SSam Powell       "    objc-eh-types: []\n"
1069eb2eeeb7SSam Powell       "    objc-ivars: []\n"
1070eb2eeeb7SSam Powell       "    weak-symbols: []\n"
1071eb2eeeb7SSam Powell       "    thread-local-symbols: []\n"
1072eb2eeeb7SSam Powell       "...\n";
1073eb2eeeb7SSam Powell 
1074eb2eeeb7SSam Powell   static const char TBDv3File[] =
1075eb2eeeb7SSam Powell       "--- !tapi-tbd-v3\n"
1076eb2eeeb7SSam Powell       "archs: [ i386, x86_64 ]\n"
1077eb2eeeb7SSam Powell       "uuids: [ 'i386: 00000000-0000-0000-0000-000000000000',\n"
1078eb2eeeb7SSam Powell       "         'x86_64: 22222222-2222-2222-2222-222222222222']\n"
1079eb2eeeb7SSam Powell       "platform: macosx\n"
1080eb2eeeb7SSam Powell       "flags: [ installapi ]\n"
1081eb2eeeb7SSam Powell       "install-name: Umbrella.framework/Umbrella\n"
1082eb2eeeb7SSam Powell       "current-version: 1.2.3\n"
1083eb2eeeb7SSam Powell       "compatibility-version: 1.0\n"
1084eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
1085eb2eeeb7SSam Powell       "parent-umbrella: System\n"
1086eb2eeeb7SSam Powell       "exports:\n"
1087eb2eeeb7SSam Powell       "  - archs: [ i386, x86_64 ]\n"
1088eb2eeeb7SSam Powell       "    allowable-clients: [ ClientA ]\n"
1089eb2eeeb7SSam Powell       "    symbols: [ _symA ]\n"
1090eb2eeeb7SSam Powell       "    objc-classes: [ class1, class2 ]\n"
1091eb2eeeb7SSam Powell       "    objc-eh-types: [ class1 ]\n"
1092eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
1093eb2eeeb7SSam Powell       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
1094eb2eeeb7SSam Powell       "    thread-local-symbols: [ _tlv1, _tlv3 ]\n"
1095eb2eeeb7SSam Powell       "  - archs: [ i386 ]\n"
1096eb2eeeb7SSam Powell       "    re-exports: [ /System/Library/Frameworks/A.framework/A ]\n"
1097eb2eeeb7SSam Powell       "    symbols: [ _sym5 ]\n"
1098eb2eeeb7SSam Powell       "    objc-classes: [ class3 ]\n"
1099eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar3 ]\n"
1100eb2eeeb7SSam Powell       "    weak-def-symbols: [ _weak3 ]\n"
1101eb2eeeb7SSam Powell       "  - archs: [ x86_64 ]\n"
1102eb2eeeb7SSam Powell       "    symbols: [ _symAB ]\n"
1103eb2eeeb7SSam Powell       "undefineds:\n"
1104eb2eeeb7SSam Powell       "  - archs: [ i386 ]\n"
1105eb2eeeb7SSam Powell       "    symbols: [ _symC ]\n"
1106eb2eeeb7SSam Powell       "...\n";
1107eb2eeeb7SSam Powell 
1108eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
1109eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestA.tbd"));
1110eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
1111eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
1112eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
1113eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestB.tbd"));
1114eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
1115eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
1116eb2eeeb7SSam Powell   EXPECT_NE(FileA.uuids(), FileB.uuids());
1117eb2eeeb7SSam Powell   EXPECT_TRUE(FileA == FileB);
1118eb2eeeb7SSam Powell }
1119eb2eeeb7SSam Powell 
TEST(TBDv4,InterfaceInequality)1120eb2eeeb7SSam Powell TEST(TBDv4, InterfaceInequality) {
1121eb2eeeb7SSam Powell   static const char TBDv4File[] = "--- !tapi-tbd\n"
1122eb2eeeb7SSam Powell                                   "tbd-version: 4\n"
1123eb2eeeb7SSam Powell                                   "targets:  [ i386-macos, x86_64-macos ]\n"
1124eb2eeeb7SSam Powell                                   "install-name: Umbrella.framework/Umbrella\n"
1125eb2eeeb7SSam Powell                                   "...\n";
1126eb2eeeb7SSam Powell 
1127eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
1128eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestA.tbd"));
1129eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
1130eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
1131eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
1132eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv4File, "TestB.tbd"));
1133eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
1134eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
1135eb2eeeb7SSam Powell 
1136eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11373025c3edSJuergen Ributzka     File->addTarget(Target(AK_x86_64, PLATFORM_IOS));
1138eb2eeeb7SSam Powell   }));
1139eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1140eb2eeeb7SSam Powell     File->setCurrentVersion(PackedVersion(1, 2, 3));
1141eb2eeeb7SSam Powell     File->setCompatibilityVersion(PackedVersion(1, 0, 0));
1142eb2eeeb7SSam Powell   }));
1143eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(
1144eb2eeeb7SSam Powell       FileA, FileB, [](InterfaceFile *File) { File->setSwiftABIVersion(5); }));
1145eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1146eb2eeeb7SSam Powell     File->setTwoLevelNamespace(false);
1147eb2eeeb7SSam Powell   }));
1148eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(
1149eb2eeeb7SSam Powell       FileA, FileB, [](InterfaceFile *File) { File->setInstallAPI(true); }));
1150eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1151eb2eeeb7SSam Powell     File->setApplicationExtensionSafe(false);
1152eb2eeeb7SSam Powell   }));
1153eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11543025c3edSJuergen Ributzka     File->addParentUmbrella(Target(AK_x86_64, PLATFORM_MACOS), "System.dylib");
1155eb2eeeb7SSam Powell   }));
1156eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11573025c3edSJuergen Ributzka     File->addAllowableClient("ClientA", Target(AK_i386, PLATFORM_MACOS));
1158eb2eeeb7SSam Powell   }));
1159eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1160eb2eeeb7SSam Powell     File->addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
11613025c3edSJuergen Ributzka                                Target(AK_i386, PLATFORM_MACOS));
1162eb2eeeb7SSam Powell   }));
1163eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
11643025c3edSJuergen Ributzka     File->addSymbol(SymbolKind::GlobalSymbol, "_symA",
11653025c3edSJuergen Ributzka                     {Target(AK_x86_64, PLATFORM_MACOS)});
1166eb2eeeb7SSam Powell   }));
1167eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
1168eb2eeeb7SSam Powell     InterfaceFile Document;
11693025c3edSJuergen Ributzka     Document.addTargets(TargetList{Target(AK_i386, PLATFORM_MACOS),
11703025c3edSJuergen Ributzka                                    Target(AK_x86_64, PLATFORM_MACOS)});
1171eb2eeeb7SSam Powell     Document.setInstallName("/System/Library/Frameworks/A.framework/A");
1172eb2eeeb7SSam Powell     File->addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
1173eb2eeeb7SSam Powell   }));
1174eb2eeeb7SSam Powell }
1175eb2eeeb7SSam Powell 
1176f9d8162bSCyndy Ishida } // end namespace TBDv4
1177