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