1b978c51cSJuergen Ributzka //===-- TextStubV3Tests.cpp - TBD V3 File Test ----------------------------===//
2b978c51cSJuergen Ributzka //
3b978c51cSJuergen Ributzka // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4b978c51cSJuergen Ributzka // See https://llvm.org/LICENSE.txt for license information.
5b978c51cSJuergen Ributzka // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b978c51cSJuergen Ributzka //
7b978c51cSJuergen Ributzka //===-----------------------------------------------------------------------===/
85810ed51SJonas Devlieghere #include "TextStubHelpers.h"
90116d04dSCyndy Ishida #include "llvm/TextAPI/InterfaceFile.h"
100116d04dSCyndy Ishida #include "llvm/TextAPI/TextAPIReader.h"
110116d04dSCyndy Ishida #include "llvm/TextAPI/TextAPIWriter.h"
12b978c51cSJuergen Ributzka #include "gtest/gtest.h"
13b978c51cSJuergen Ributzka #include <string>
14b978c51cSJuergen Ributzka #include <vector>
15b978c51cSJuergen Ributzka
16b978c51cSJuergen Ributzka using namespace llvm;
17b978c51cSJuergen Ributzka using namespace llvm::MachO;
18b978c51cSJuergen Ributzka
19b978c51cSJuergen Ributzka static ExportedSymbol TBDv3Symbols[] = {
20b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "$ld$hide$os9.0$_sym1", false, false},
21b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_sym1", false, false},
22b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_sym2", false, false},
23b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_sym3", false, false},
24b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_sym4", false, false},
25b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_sym5", false, false},
26b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_tlv1", false, true},
27b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_tlv3", false, true},
28b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_weak1", true, false},
29b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_weak2", true, false},
30b978c51cSJuergen Ributzka {SymbolKind::GlobalSymbol, "_weak3", true, false},
31b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCClass, "class1", false, false},
32b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCClass, "class2", false, false},
33b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCClass, "class3", false, false},
34b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCClassEHType, "class1", false, false},
35b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCInstanceVariable, "class1._ivar1", false, false},
36b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCInstanceVariable, "class1._ivar2", false, false},
37b978c51cSJuergen Ributzka {SymbolKind::ObjectiveCInstanceVariable, "class1._ivar3", false, false},
38b978c51cSJuergen Ributzka };
39b978c51cSJuergen Ributzka
40b978c51cSJuergen Ributzka namespace TBDv3 {
41b978c51cSJuergen Ributzka
TEST(TBDv3,ReadFile)42b978c51cSJuergen Ributzka TEST(TBDv3, ReadFile) {
436d2372ceSCyndy Ishida static const char TBDv3File1[] =
44b978c51cSJuergen Ributzka "--- !tapi-tbd-v3\n"
45b978c51cSJuergen Ributzka "archs: [ armv7, arm64 ]\n"
46b978c51cSJuergen Ributzka "uuids: [ 'armv7: 00000000-0000-0000-0000-000000000000',\n"
47b978c51cSJuergen Ributzka " 'arm64: 11111111-1111-1111-1111-111111111111']\n"
48b978c51cSJuergen Ributzka "platform: ios\n"
49b978c51cSJuergen Ributzka "flags: [ installapi ]\n"
50b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
51b978c51cSJuergen Ributzka "current-version: 2.3.4\n"
52b978c51cSJuergen Ributzka "compatibility-version: 1.0\n"
53b978c51cSJuergen Ributzka "swift-abi-version: 1.1\n"
54b978c51cSJuergen Ributzka "parent-umbrella: Umbrella.dylib\n"
55b978c51cSJuergen Ributzka "exports:\n"
56b978c51cSJuergen Ributzka " - archs: [ armv7, arm64 ]\n"
57b978c51cSJuergen Ributzka " allowable-clients: [ clientA ]\n"
58b978c51cSJuergen Ributzka " re-exports: [ /usr/lib/libfoo.dylib ]\n"
59b978c51cSJuergen Ributzka " symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
60b978c51cSJuergen Ributzka " objc-classes: [ class1, class2 ]\n"
61b978c51cSJuergen Ributzka " objc-eh-types: [ class1 ]\n"
62b978c51cSJuergen Ributzka " objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
63b978c51cSJuergen Ributzka " weak-def-symbols: [ _weak1, _weak2 ]\n"
64b978c51cSJuergen Ributzka " thread-local-symbols: [ _tlv1, _tlv3 ]\n"
65b978c51cSJuergen Ributzka " - archs: [ armv7 ]\n"
66b978c51cSJuergen Ributzka " symbols: [ _sym5 ]\n"
67b978c51cSJuergen Ributzka " objc-classes: [ class3 ]\n"
68b978c51cSJuergen Ributzka " objc-ivars: [ class1._ivar3 ]\n"
69b978c51cSJuergen Ributzka " weak-def-symbols: [ _weak3 ]\n"
70b978c51cSJuergen Ributzka " thread-local-symbols: [ _tlv3 ]\n"
71b978c51cSJuergen Ributzka "...\n";
72b978c51cSJuergen Ributzka
732ba32084SCyndy Ishida Expected<TBDFile> Result =
742ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3File1, "Test.tbd"));
75b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
762ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
77b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
78b978c51cSJuergen Ributzka auto Archs = AK_armv7 | AK_arm64;
793025c3edSJuergen Ributzka auto Platform = PLATFORM_IOS;
8081669d5eSCyndy Ishida TargetList Targets;
8181669d5eSCyndy Ishida for (auto &&arch : Archs)
8281669d5eSCyndy Ishida Targets.emplace_back(Target(arch, Platform));
83b978c51cSJuergen Ributzka EXPECT_EQ(Archs, File->getArchitectures());
843025c3edSJuergen Ributzka UUIDs Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
8581669d5eSCyndy Ishida "00000000-0000-0000-0000-000000000000"},
863025c3edSJuergen Ributzka {Target(AK_arm64, PLATFORM_UNKNOWN),
8781669d5eSCyndy Ishida "11111111-1111-1111-1111-111111111111"}};
8881669d5eSCyndy Ishida EXPECT_EQ(Uuids, File->uuids());
8981669d5eSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
9081669d5eSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
91b978c51cSJuergen Ributzka EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
92b978c51cSJuergen Ributzka EXPECT_EQ(PackedVersion(2, 3, 4), File->getCurrentVersion());
93b978c51cSJuergen Ributzka EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
94b978c51cSJuergen Ributzka EXPECT_EQ(2U, File->getSwiftABIVersion());
95b978c51cSJuergen Ributzka EXPECT_EQ(ObjCConstraintType::Retain_Release, File->getObjCConstraint());
96b978c51cSJuergen Ributzka EXPECT_TRUE(File->isTwoLevelNamespace());
97b978c51cSJuergen Ributzka EXPECT_TRUE(File->isApplicationExtensionSafe());
98b978c51cSJuergen Ributzka EXPECT_TRUE(File->isInstallAPI());
9981669d5eSCyndy Ishida InterfaceFileRef client("clientA", Targets);
10081669d5eSCyndy Ishida InterfaceFileRef reexport("/usr/lib/libfoo.dylib", Targets);
101b978c51cSJuergen Ributzka EXPECT_EQ(1U, File->allowableClients().size());
102b978c51cSJuergen Ributzka EXPECT_EQ(client, File->allowableClients().front());
103b978c51cSJuergen Ributzka EXPECT_EQ(1U, File->reexportedLibraries().size());
104b978c51cSJuergen Ributzka EXPECT_EQ(reexport, File->reexportedLibraries().front());
105b978c51cSJuergen Ributzka
106b978c51cSJuergen Ributzka ExportedSymbolSeq Exports;
107b978c51cSJuergen Ributzka for (const auto *Sym : File->symbols()) {
108b978c51cSJuergen Ributzka EXPECT_FALSE(Sym->isWeakReferenced());
109b978c51cSJuergen Ributzka EXPECT_FALSE(Sym->isUndefined());
110adcd0268SBenjamin Kramer Exports.emplace_back(
111adcd0268SBenjamin Kramer ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
112adcd0268SBenjamin Kramer Sym->isWeakDefined(), Sym->isThreadLocalValue()});
113b978c51cSJuergen Ributzka }
114*cd9a5cfdSDmitri Gribenko llvm::sort(Exports);
115b978c51cSJuergen Ributzka
116b978c51cSJuergen Ributzka EXPECT_EQ(sizeof(TBDv3Symbols) / sizeof(ExportedSymbol), Exports.size());
117b978c51cSJuergen Ributzka EXPECT_TRUE(
118b978c51cSJuergen Ributzka std::equal(Exports.begin(), Exports.end(), std::begin(TBDv3Symbols)));
119b978c51cSJuergen Ributzka }
120b978c51cSJuergen Ributzka
TEST(TBDv3,ReadMultipleDocuments)121fd4d0751SCyndy Ishida TEST(TBDv3, ReadMultipleDocuments) {
122fd4d0751SCyndy Ishida static const char TBDv3Inlines[] =
123fd4d0751SCyndy Ishida "--- !tapi-tbd-v3\n"
124fd4d0751SCyndy Ishida "archs: [ armv7, arm64 ]\n"
125fd4d0751SCyndy Ishida "uuids: [ 'armv7: 00000000-0000-0000-0000-000000000000',\n"
126fd4d0751SCyndy Ishida " 'arm64: 11111111-1111-1111-1111-111111111111']\n"
127fd4d0751SCyndy Ishida "platform: ios\n"
128fd4d0751SCyndy Ishida "install-name: Test.dylib\n"
129fd4d0751SCyndy Ishida "current-version: 2.3.4\n"
130fd4d0751SCyndy Ishida "compatibility-version: 1.0\n"
131fd4d0751SCyndy Ishida "swift-abi-version: 1.1\n"
132fd4d0751SCyndy Ishida "parent-umbrella: Umbrella.dylib\n"
133fd4d0751SCyndy Ishida "exports:\n"
134fd4d0751SCyndy Ishida " - archs: [ armv7, arm64 ]\n"
135fd4d0751SCyndy Ishida " allowable-clients: [ clientA ]\n"
136fd4d0751SCyndy Ishida " re-exports: [ /usr/lib/libfoo.dylib,\n"
137fd4d0751SCyndy Ishida " TestInline.dylib ]\n"
138fd4d0751SCyndy Ishida " symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
139fd4d0751SCyndy Ishida " objc-classes: [ class1, class2 ]\n"
140fd4d0751SCyndy Ishida " objc-eh-types: [ class1 ]\n"
141fd4d0751SCyndy Ishida " objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
142fd4d0751SCyndy Ishida " weak-def-symbols: [ _weak1, _weak2 ]\n"
143fd4d0751SCyndy Ishida " thread-local-symbols: [ _tlv1, _tlv3 ]\n"
144fd4d0751SCyndy Ishida " - archs: [ armv7 ]\n"
145fd4d0751SCyndy Ishida " symbols: [ _sym5 ]\n"
146fd4d0751SCyndy Ishida " objc-classes: [ class3 ]\n"
147fd4d0751SCyndy Ishida " objc-ivars: [ class1._ivar3 ]\n"
148fd4d0751SCyndy Ishida " weak-def-symbols: [ _weak3 ]\n"
149fd4d0751SCyndy Ishida " thread-local-symbols: [ _tlv3 ]\n"
150fd4d0751SCyndy Ishida "--- !tapi-tbd-v3\n"
151fd4d0751SCyndy Ishida "archs: [ armv7, arm64 ]\n"
152fd4d0751SCyndy Ishida "uuids: [ 'armv7: 00000000-0000-0000-0000-000000000000',\n"
153fd4d0751SCyndy Ishida " 'arm64: 11111111-1111-1111-1111-111111111111']\n"
154fd4d0751SCyndy Ishida "platform: ios\n"
155fd4d0751SCyndy Ishida "install-name: TestInline.dylib\n"
156fd4d0751SCyndy Ishida "swift-abi-version: 1.1\n"
157fd4d0751SCyndy Ishida "exports:\n"
158fd4d0751SCyndy Ishida " - archs: [ armv7, arm64 ]\n"
159fd4d0751SCyndy Ishida " symbols: [ _sym5, _sym6 ]\n"
160fd4d0751SCyndy Ishida "...\n";
161fd4d0751SCyndy Ishida
1622ba32084SCyndy Ishida Expected<TBDFile> Result =
1632ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Inlines, "Test.tbd"));
164fd4d0751SCyndy Ishida EXPECT_TRUE(!!Result);
1652ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
166fd4d0751SCyndy Ishida EXPECT_EQ(File->documents().size(), 1U);
167fd4d0751SCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
168fd4d0751SCyndy Ishida auto Archs = AK_armv7 | AK_arm64;
1693025c3edSJuergen Ributzka auto Platform = PLATFORM_IOS;
170fd4d0751SCyndy Ishida TargetList Targets;
171fd4d0751SCyndy Ishida for (auto &&arch : Archs)
172fd4d0751SCyndy Ishida Targets.emplace_back(Target(arch, Platform));
173fd4d0751SCyndy Ishida EXPECT_EQ(Archs, File->getArchitectures());
1743025c3edSJuergen Ributzka UUIDs Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
175fd4d0751SCyndy Ishida "00000000-0000-0000-0000-000000000000"},
1763025c3edSJuergen Ributzka {Target(AK_arm64, PLATFORM_UNKNOWN),
177fd4d0751SCyndy Ishida "11111111-1111-1111-1111-111111111111"}};
178fd4d0751SCyndy Ishida EXPECT_EQ(Uuids, File->uuids());
179fd4d0751SCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
180fd4d0751SCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
181fd4d0751SCyndy Ishida EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
182fd4d0751SCyndy Ishida EXPECT_EQ(PackedVersion(2, 3, 4), File->getCurrentVersion());
183fd4d0751SCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
184fd4d0751SCyndy Ishida EXPECT_EQ(2U, File->getSwiftABIVersion());
185fd4d0751SCyndy Ishida EXPECT_EQ(ObjCConstraintType::Retain_Release, File->getObjCConstraint());
186fd4d0751SCyndy Ishida EXPECT_TRUE(File->isTwoLevelNamespace());
187fd4d0751SCyndy Ishida EXPECT_TRUE(File->isApplicationExtensionSafe());
188fd4d0751SCyndy Ishida EXPECT_FALSE(File->isInstallAPI());
189fd4d0751SCyndy Ishida InterfaceFileRef Client("clientA", Targets);
190fd4d0751SCyndy Ishida const std::vector<InterfaceFileRef> Reexports = {
191fd4d0751SCyndy Ishida InterfaceFileRef("/usr/lib/libfoo.dylib", Targets),
192fd4d0751SCyndy Ishida InterfaceFileRef("TestInline.dylib", Targets)};
193fd4d0751SCyndy Ishida EXPECT_EQ(1U, File->allowableClients().size());
194fd4d0751SCyndy Ishida EXPECT_EQ(Client, File->allowableClients().front());
195fd4d0751SCyndy Ishida EXPECT_EQ(2U, File->reexportedLibraries().size());
196fd4d0751SCyndy Ishida EXPECT_EQ(Reexports, File->reexportedLibraries());
197fd4d0751SCyndy Ishida
198fd4d0751SCyndy Ishida ExportedSymbolSeq Exports;
199fd4d0751SCyndy Ishida for (const auto *Sym : File->symbols()) {
200fd4d0751SCyndy Ishida EXPECT_FALSE(Sym->isWeakReferenced());
201fd4d0751SCyndy Ishida EXPECT_FALSE(Sym->isUndefined());
202fd4d0751SCyndy Ishida Exports.emplace_back(ExportedSymbol{Sym->getKind(), Sym->getName().str(),
203fd4d0751SCyndy Ishida Sym->isWeakDefined(),
204fd4d0751SCyndy Ishida Sym->isThreadLocalValue()});
205fd4d0751SCyndy Ishida }
206*cd9a5cfdSDmitri Gribenko llvm::sort(Exports);
207fd4d0751SCyndy Ishida
208fd4d0751SCyndy Ishida EXPECT_EQ(sizeof(TBDv3Symbols) / sizeof(ExportedSymbol), Exports.size());
209fd4d0751SCyndy Ishida EXPECT_TRUE(
210fd4d0751SCyndy Ishida std::equal(Exports.begin(), Exports.end(), std::begin(TBDv3Symbols)));
211fd4d0751SCyndy Ishida
212fd4d0751SCyndy Ishida // Check Second Document
213fd4d0751SCyndy Ishida Exports.clear();
2140b15cb70SCyndy Ishida TBDReexportFile Document = File->documents().front();
215fd4d0751SCyndy Ishida EXPECT_EQ(FileType::TBD_V3, Document->getFileType());
216fd4d0751SCyndy Ishida EXPECT_EQ(Archs, Document->getArchitectures());
217fd4d0751SCyndy Ishida EXPECT_EQ(Uuids, Document->uuids());
218fd4d0751SCyndy Ishida EXPECT_EQ(Platform, *Document->getPlatforms().begin());
219fd4d0751SCyndy Ishida EXPECT_EQ(std::string("TestInline.dylib"), Document->getInstallName());
220fd4d0751SCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCurrentVersion());
221fd4d0751SCyndy Ishida EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCompatibilityVersion());
222fd4d0751SCyndy Ishida EXPECT_EQ(2U, Document->getSwiftABIVersion());
223fd4d0751SCyndy Ishida
224fd4d0751SCyndy Ishida for (const auto *Sym : Document->symbols()) {
225fd4d0751SCyndy Ishida EXPECT_FALSE(Sym->isWeakReferenced());
226fd4d0751SCyndy Ishida EXPECT_FALSE(Sym->isUndefined());
227fd4d0751SCyndy Ishida Exports.emplace_back(ExportedSymbol{Sym->getKind(), Sym->getName().str(),
228fd4d0751SCyndy Ishida Sym->isWeakDefined(),
229fd4d0751SCyndy Ishida Sym->isThreadLocalValue()});
230fd4d0751SCyndy Ishida }
231*cd9a5cfdSDmitri Gribenko llvm::sort(Exports);
232fd4d0751SCyndy Ishida
233fd4d0751SCyndy Ishida ExportedSymbolSeq DocumentSymbols{
234fd4d0751SCyndy Ishida {SymbolKind::GlobalSymbol, "_sym5", false, false},
235fd4d0751SCyndy Ishida {SymbolKind::GlobalSymbol, "_sym6", false, false},
236fd4d0751SCyndy Ishida };
237fd4d0751SCyndy Ishida
238fd4d0751SCyndy Ishida EXPECT_EQ(DocumentSymbols.size(), Exports.size());
239fd4d0751SCyndy Ishida EXPECT_TRUE(
240fd4d0751SCyndy Ishida std::equal(Exports.begin(), Exports.end(), DocumentSymbols.begin()));
241fd4d0751SCyndy Ishida }
242fd4d0751SCyndy Ishida
TEST(TBDv3,WriteFile)243b978c51cSJuergen Ributzka TEST(TBDv3, WriteFile) {
2446d2372ceSCyndy Ishida static const char TBDv3File3[] =
245b978c51cSJuergen Ributzka "--- !tapi-tbd-v3\n"
246b978c51cSJuergen Ributzka "archs: [ i386, x86_64 ]\n"
247b978c51cSJuergen Ributzka "platform: macosx\n"
248b978c51cSJuergen Ributzka "install-name: '/usr/lib/libfoo.dylib'\n"
249b978c51cSJuergen Ributzka "current-version: 1.2.3\n"
250b978c51cSJuergen Ributzka "compatibility-version: 0\n"
251b978c51cSJuergen Ributzka "swift-abi-version: 5\n"
252b978c51cSJuergen Ributzka "exports:\n"
253b978c51cSJuergen Ributzka " - archs: [ i386 ]\n"
254b978c51cSJuergen Ributzka " symbols: [ _sym1 ]\n"
255b978c51cSJuergen Ributzka " weak-def-symbols: [ _sym2 ]\n"
256b978c51cSJuergen Ributzka " thread-local-symbols: [ _sym3 ]\n"
257b978c51cSJuergen Ributzka " - archs: [ x86_64 ]\n"
258b978c51cSJuergen Ributzka " allowable-clients: [ clientA ]\n"
259b978c51cSJuergen Ributzka " re-exports: [ '/usr/lib/libfoo.dylib' ]\n"
260b978c51cSJuergen Ributzka " objc-classes: [ Class1 ]\n"
261b978c51cSJuergen Ributzka " objc-eh-types: [ Class1 ]\n"
262b978c51cSJuergen Ributzka " objc-ivars: [ Class1._ivar1 ]\n"
263b978c51cSJuergen Ributzka "...\n";
264b978c51cSJuergen Ributzka
265b978c51cSJuergen Ributzka InterfaceFile File;
26681669d5eSCyndy Ishida TargetList Targets;
26781669d5eSCyndy Ishida for (auto &&arch : AK_i386 | AK_x86_64)
2683025c3edSJuergen Ributzka Targets.emplace_back(Target(arch, PLATFORM_MACOS));
269b978c51cSJuergen Ributzka File.setPath("libfoo.dylib");
270b978c51cSJuergen Ributzka File.setInstallName("/usr/lib/libfoo.dylib");
271b978c51cSJuergen Ributzka File.setFileType(FileType::TBD_V3);
27281669d5eSCyndy Ishida File.addTargets(Targets);
273b978c51cSJuergen Ributzka File.setCurrentVersion(PackedVersion(1, 2, 3));
274b978c51cSJuergen Ributzka File.setTwoLevelNamespace();
275b978c51cSJuergen Ributzka File.setApplicationExtensionSafe();
276b978c51cSJuergen Ributzka File.setSwiftABIVersion(5);
277b978c51cSJuergen Ributzka File.setObjCConstraint(ObjCConstraintType::Retain_Release);
27881669d5eSCyndy Ishida File.addAllowableClient("clientA", Targets[1]);
27981669d5eSCyndy Ishida File.addReexportedLibrary("/usr/lib/libfoo.dylib", Targets[1]);
28081669d5eSCyndy Ishida File.addSymbol(SymbolKind::GlobalSymbol, "_sym1", {Targets[0]});
28181669d5eSCyndy Ishida File.addSymbol(SymbolKind::GlobalSymbol, "_sym2", {Targets[0]},
282b978c51cSJuergen Ributzka SymbolFlags::WeakDefined);
28381669d5eSCyndy Ishida File.addSymbol(SymbolKind::GlobalSymbol, "_sym3", {Targets[0]},
284b978c51cSJuergen Ributzka SymbolFlags::ThreadLocalValue);
28581669d5eSCyndy Ishida File.addSymbol(SymbolKind::ObjectiveCClass, "Class1", {Targets[1]});
28681669d5eSCyndy Ishida File.addSymbol(SymbolKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
287b978c51cSJuergen Ributzka File.addSymbol(SymbolKind::ObjectiveCInstanceVariable, "Class1._ivar1",
28881669d5eSCyndy Ishida {Targets[1]});
289b978c51cSJuergen Ributzka
290b978c51cSJuergen Ributzka SmallString<4096> Buffer;
291b978c51cSJuergen Ributzka raw_svector_ostream OS(Buffer);
2922ba32084SCyndy Ishida Error Result = TextAPIWriter::writeToStream(OS, File);
293b978c51cSJuergen Ributzka EXPECT_FALSE(Result);
2946d2372ceSCyndy Ishida EXPECT_STREQ(TBDv3File3, Buffer.c_str());
295b978c51cSJuergen Ributzka }
296b978c51cSJuergen Ributzka
TEST(TBDv3,WriteMultipleDocuments)297fd4d0751SCyndy Ishida TEST(TBDv3, WriteMultipleDocuments) {
298fd4d0751SCyndy Ishida static const char TBDv3Inlines[] =
299fd4d0751SCyndy Ishida "--- !tapi-tbd-v3\n"
300fd4d0751SCyndy Ishida "archs: [ i386, x86_64 ]\n"
301fd4d0751SCyndy Ishida "platform: zippered\n"
302fd4d0751SCyndy Ishida "install-name: '/usr/lib/libfoo.dylib'\n"
303fd4d0751SCyndy Ishida "current-version: 1.2.3\n"
304fd4d0751SCyndy Ishida "compatibility-version: 0\n"
305fd4d0751SCyndy Ishida "swift-abi-version: 5\n"
306fd4d0751SCyndy Ishida "exports:\n"
307fd4d0751SCyndy Ishida " - archs: [ x86_64 ]\n"
308fd4d0751SCyndy Ishida " allowable-clients: [ clientA ]\n"
309fd4d0751SCyndy Ishida " re-exports: [ '/usr/lib/libbar.dylib' ]\n"
310fd4d0751SCyndy Ishida " - archs: [ i386, x86_64 ]\n"
311fd4d0751SCyndy Ishida " symbols: [ _sym1 ]\n"
312fd4d0751SCyndy Ishida " objc-classes: [ Class1 ]\n"
313fd4d0751SCyndy Ishida " objc-eh-types: [ Class1 ]\n"
314fd4d0751SCyndy Ishida " objc-ivars: [ Class1._ivar1 ]\n"
315fd4d0751SCyndy Ishida " weak-def-symbols: [ _sym2 ]\n"
316fd4d0751SCyndy Ishida " thread-local-symbols: [ _symA ]\n"
317fd4d0751SCyndy Ishida "--- !tapi-tbd-v3\n"
318fd4d0751SCyndy Ishida "archs: [ i386 ]\n"
319fd4d0751SCyndy Ishida "platform: macosx\n"
320fd4d0751SCyndy Ishida "install-name: '/usr/lib/libbar.dylib'\n"
321fd4d0751SCyndy Ishida "current-version: 0\n"
322fd4d0751SCyndy Ishida "compatibility-version: 0\n"
323fd4d0751SCyndy Ishida "swift-abi-version: 5\n"
324fd4d0751SCyndy Ishida "objc-constraint: none\n"
325fd4d0751SCyndy Ishida "exports:\n"
326fd4d0751SCyndy Ishida " - archs: [ i386 ]\n"
327fd4d0751SCyndy Ishida " symbols: [ _sym3, _sym4 ]\n"
328fd4d0751SCyndy Ishida "...\n";
329fd4d0751SCyndy Ishida
330fd4d0751SCyndy Ishida InterfaceFile File;
331fd4d0751SCyndy Ishida TargetList Targets;
332fd4d0751SCyndy Ishida for (auto &&arch : AK_i386 | AK_x86_64) {
3333025c3edSJuergen Ributzka Targets.emplace_back(Target(arch, PLATFORM_MACOS));
3343025c3edSJuergen Ributzka Targets.emplace_back(Target(arch, PLATFORM_MACCATALYST));
335fd4d0751SCyndy Ishida }
336fd4d0751SCyndy Ishida File.addTargets(Targets);
337fd4d0751SCyndy Ishida File.setPath("libfoo.dylib");
338fd4d0751SCyndy Ishida File.setInstallName("/usr/lib/libfoo.dylib");
339fd4d0751SCyndy Ishida File.setFileType(FileType::TBD_V3);
340fd4d0751SCyndy Ishida File.setCurrentVersion(PackedVersion(1, 2, 3));
341fd4d0751SCyndy Ishida File.setTwoLevelNamespace();
342fd4d0751SCyndy Ishida File.setApplicationExtensionSafe();
343fd4d0751SCyndy Ishida File.setSwiftABIVersion(5);
344fd4d0751SCyndy Ishida File.setObjCConstraint(ObjCConstraintType::Retain_Release);
345fd4d0751SCyndy Ishida File.addAllowableClient("clientA", Targets[2]);
346fd4d0751SCyndy Ishida File.addReexportedLibrary("/usr/lib/libbar.dylib", Targets[2]);
347fd4d0751SCyndy Ishida File.addSymbol(SymbolKind::GlobalSymbol, "_sym1", Targets);
348fd4d0751SCyndy Ishida File.addSymbol(SymbolKind::GlobalSymbol, "_sym2", Targets,
349fd4d0751SCyndy Ishida SymbolFlags::WeakDefined);
350fd4d0751SCyndy Ishida File.addSymbol(SymbolKind::GlobalSymbol, "_symA", Targets,
351fd4d0751SCyndy Ishida SymbolFlags::ThreadLocalValue);
352fd4d0751SCyndy Ishida File.addSymbol(SymbolKind::ObjectiveCClass, "Class1", Targets);
353fd4d0751SCyndy Ishida File.addSymbol(SymbolKind::ObjectiveCClassEHType, "Class1", Targets);
354fd4d0751SCyndy Ishida File.addSymbol(SymbolKind::ObjectiveCInstanceVariable, "Class1._ivar1",
355fd4d0751SCyndy Ishida Targets);
356fd4d0751SCyndy Ishida
357fd4d0751SCyndy Ishida // Inline document
358fd4d0751SCyndy Ishida InterfaceFile Document;
3593025c3edSJuergen Ributzka Targets = {Target(AK_i386, PLATFORM_MACOS)};
360fd4d0751SCyndy Ishida Document.addTargets(Targets);
361fd4d0751SCyndy Ishida Document.setPath("libbar.dylib");
362fd4d0751SCyndy Ishida Document.setInstallName("/usr/lib/libbar.dylib");
363fd4d0751SCyndy Ishida Document.setFileType(FileType::TBD_V3);
364fd4d0751SCyndy Ishida Document.setTwoLevelNamespace();
365fd4d0751SCyndy Ishida Document.setApplicationExtensionSafe();
366fd4d0751SCyndy Ishida Document.setSwiftABIVersion(5);
367fd4d0751SCyndy Ishida Document.addSymbol(SymbolKind::GlobalSymbol, "_sym3", Targets);
368fd4d0751SCyndy Ishida Document.addSymbol(SymbolKind::GlobalSymbol, "_sym4", Targets);
369fd4d0751SCyndy Ishida File.addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
370fd4d0751SCyndy Ishida
371fd4d0751SCyndy Ishida SmallString<4096> Buffer;
372fd4d0751SCyndy Ishida raw_svector_ostream OS(Buffer);
3732ba32084SCyndy Ishida Error Result = TextAPIWriter::writeToStream(OS, File);
374fd4d0751SCyndy Ishida EXPECT_FALSE(Result);
375fd4d0751SCyndy Ishida EXPECT_STREQ(TBDv3Inlines, Buffer.c_str());
376fd4d0751SCyndy Ishida }
377fd4d0751SCyndy Ishida
TEST(TBDv3,Platform_macOS)378b978c51cSJuergen Ributzka TEST(TBDv3, Platform_macOS) {
3796d2372ceSCyndy Ishida static const char TBDv3PlatformMacOS[] = "--- !tapi-tbd-v3\n"
380b978c51cSJuergen Ributzka "archs: [ x86_64 ]\n"
381b978c51cSJuergen Ributzka "platform: macosx\n"
382b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
383b978c51cSJuergen Ributzka "...\n";
384b978c51cSJuergen Ributzka
3852ba32084SCyndy Ishida Expected<TBDFile> Result =
3866d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformMacOS, "Test.tbd"));
387b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
3883025c3edSJuergen Ributzka auto Platform = PLATFORM_MACOS;
3892ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
390b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
39181669d5eSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
39281669d5eSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
3934274a610SJonas Devlieghere
3944274a610SJonas Devlieghere SmallString<4096> Buffer;
3954274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
3962ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
3974274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
3986d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformMacOS),
3994274a610SJonas Devlieghere stripWhitespace(Buffer.c_str()));
400b978c51cSJuergen Ributzka }
401b978c51cSJuergen Ributzka
TEST(TBDv3,Platform_iOS)402b978c51cSJuergen Ributzka TEST(TBDv3, Platform_iOS) {
4036d2372ceSCyndy Ishida static const char TBDv3PlatformiOS[] = "--- !tapi-tbd-v3\n"
404b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
405b978c51cSJuergen Ributzka "platform: ios\n"
406b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
407b978c51cSJuergen Ributzka "...\n";
408b978c51cSJuergen Ributzka
4092ba32084SCyndy Ishida Expected<TBDFile> Result =
4106d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformiOS, "Test.tbd"));
411b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
4123025c3edSJuergen Ributzka auto Platform = PLATFORM_IOS;
4132ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
414b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
41581669d5eSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
41681669d5eSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
4174274a610SJonas Devlieghere
4184274a610SJonas Devlieghere SmallString<4096> Buffer;
4194274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
4202ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4214274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
4226d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformiOS), stripWhitespace(Buffer.c_str()));
423b978c51cSJuergen Ributzka }
424b978c51cSJuergen Ributzka
TEST(TBDv3,Platform_watchOS)425b978c51cSJuergen Ributzka TEST(TBDv3, Platform_watchOS) {
4266d2372ceSCyndy Ishida static const char TBDv3watchOS[] = "--- !tapi-tbd-v3\n"
427b978c51cSJuergen Ributzka "archs: [ armv7k ]\n"
428b978c51cSJuergen Ributzka "platform: watchos\n"
429b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
430b978c51cSJuergen Ributzka "...\n";
431b978c51cSJuergen Ributzka
4322ba32084SCyndy Ishida Expected<TBDFile> Result =
4332ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3watchOS, "Test.tbd"));
434b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
4353025c3edSJuergen Ributzka auto Platform = PLATFORM_WATCHOS;
4362ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
437b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
43881669d5eSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
43981669d5eSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
4404274a610SJonas Devlieghere
4414274a610SJonas Devlieghere SmallString<4096> Buffer;
4424274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
4432ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4444274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
4456d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3watchOS), stripWhitespace(Buffer.c_str()));
446b978c51cSJuergen Ributzka }
447b978c51cSJuergen Ributzka
TEST(TBDv3,Platform_tvOS)448b978c51cSJuergen Ributzka TEST(TBDv3, Platform_tvOS) {
4496d2372ceSCyndy Ishida static const char TBDv3PlatformtvOS[] = "--- !tapi-tbd-v3\n"
450b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
451b978c51cSJuergen Ributzka "platform: tvos\n"
452b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
453b978c51cSJuergen Ributzka "...\n";
454b978c51cSJuergen Ributzka
4552ba32084SCyndy Ishida Expected<TBDFile> Result =
4566d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformtvOS, "Test.tbd"));
457b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
4582ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
4593025c3edSJuergen Ributzka auto Platform = PLATFORM_TVOS;
460b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
46181669d5eSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
46281669d5eSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
4634274a610SJonas Devlieghere
4644274a610SJonas Devlieghere SmallString<4096> Buffer;
4654274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
4662ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4672ba32084SCyndy Ishida EXPECT_FALSE(WriteResult);
4686d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformtvOS),
4694274a610SJonas Devlieghere stripWhitespace(Buffer.c_str()));
470b978c51cSJuergen Ributzka }
471b978c51cSJuergen Ributzka
TEST(TBDv3,Platform_bridgeOS)472b978c51cSJuergen Ributzka TEST(TBDv3, Platform_bridgeOS) {
4736d2372ceSCyndy Ishida static const char TBDv3BridgeOS[] = "--- !tapi-tbd-v3\n"
474b978c51cSJuergen Ributzka "archs: [ armv7k ]\n"
475b978c51cSJuergen Ributzka "platform: bridgeos\n"
476b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
477b978c51cSJuergen Ributzka "...\n";
478b978c51cSJuergen Ributzka
4792ba32084SCyndy Ishida Expected<TBDFile> Result =
4802ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3BridgeOS, "Test.tbd"));
481b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
4823025c3edSJuergen Ributzka auto Platform = PLATFORM_BRIDGEOS;
4832ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
484b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
48581669d5eSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
48681669d5eSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
4874274a610SJonas Devlieghere
4884274a610SJonas Devlieghere SmallString<4096> Buffer;
4894274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
4902ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4914274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
4926d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3BridgeOS), stripWhitespace(Buffer.c_str()));
493b978c51cSJuergen Ributzka }
494b978c51cSJuergen Ributzka
TEST(TBDv3,Platform_macCatalyst)495d8d99d95SCyndy Ishida TEST(TBDv3, Platform_macCatalyst) {
4966d2372ceSCyndy Ishida static const char TBDv3PlatformiOSmac[] = "--- !tapi-tbd-v3\n"
497d8d99d95SCyndy Ishida "archs: [ armv7k ]\n"
498d8d99d95SCyndy Ishida "platform: iosmac\n"
499d8d99d95SCyndy Ishida "install-name: Test.dylib\n"
500d8d99d95SCyndy Ishida "...\n";
501d8d99d95SCyndy Ishida
5022ba32084SCyndy Ishida Expected<TBDFile> Result =
5036d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformiOSmac, "Test.tbd"));
504d8d99d95SCyndy Ishida EXPECT_TRUE(!!Result);
5053025c3edSJuergen Ributzka auto Platform = PLATFORM_MACCATALYST;
5062ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
507d8d99d95SCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
508d8d99d95SCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
5094274a610SJonas Devlieghere
5104274a610SJonas Devlieghere SmallString<4096> Buffer;
5114274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
5122ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5134274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
5146d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformiOSmac),
5156d2372ceSCyndy Ishida stripWhitespace(Buffer.c_str()));
516d8d99d95SCyndy Ishida }
517d8d99d95SCyndy Ishida
TEST(TBDv3,Platform_zippered)518d8d99d95SCyndy Ishida TEST(TBDv3, Platform_zippered) {
5196d2372ceSCyndy Ishida static const char TBDv3PlatformZippered[] = "--- !tapi-tbd-v3\n"
520d8d99d95SCyndy Ishida "archs: [ armv7k ]\n"
521d8d99d95SCyndy Ishida "platform: zippered\n"
522d8d99d95SCyndy Ishida "install-name: Test.dylib\n"
523d8d99d95SCyndy Ishida "...\n";
524d8d99d95SCyndy Ishida
5252ba32084SCyndy Ishida Expected<TBDFile> Result =
5266d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformZippered, "Test.tbd"));
527d8d99d95SCyndy Ishida EXPECT_TRUE(!!Result);
5282ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
529d8d99d95SCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
530d8d99d95SCyndy Ishida
531d8d99d95SCyndy Ishida PlatformSet Platforms;
5323025c3edSJuergen Ributzka Platforms.insert(PLATFORM_MACOS);
5333025c3edSJuergen Ributzka Platforms.insert(PLATFORM_MACCATALYST);
534d8d99d95SCyndy Ishida EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
535d8d99d95SCyndy Ishida for (auto Platform : File->getPlatforms())
536d8d99d95SCyndy Ishida EXPECT_EQ(Platforms.count(Platform), 1U);
5374274a610SJonas Devlieghere
5384274a610SJonas Devlieghere SmallString<4096> Buffer;
5394274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
5402ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5414274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
5426d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformZippered),
5434274a610SJonas Devlieghere stripWhitespace(Buffer.c_str()));
544d8d99d95SCyndy Ishida }
545d8d99d95SCyndy Ishida
TEST(TBDv3,Platform_iOSSim)5468c3d0d6aSCyndy Ishida TEST(TBDv3, Platform_iOSSim) {
5476d2372ceSCyndy Ishida static const char TBDv3PlatformiOSsim[] = "--- !tapi-tbd-v3\n"
5488c3d0d6aSCyndy Ishida "archs: [ x86_64 ]\n"
5498c3d0d6aSCyndy Ishida "platform: ios\n"
5508c3d0d6aSCyndy Ishida "install-name: Test.dylib\n"
5518c3d0d6aSCyndy Ishida "...\n";
5528c3d0d6aSCyndy Ishida
5532ba32084SCyndy Ishida Expected<TBDFile> Result =
5546d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformiOSsim, "Test.tbd"));
5558c3d0d6aSCyndy Ishida EXPECT_TRUE(!!Result);
5563025c3edSJuergen Ributzka auto Platform = PLATFORM_IOSSIMULATOR;
5572ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
5588c3d0d6aSCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
5598c3d0d6aSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
5608c3d0d6aSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
5618c3d0d6aSCyndy Ishida
5628c3d0d6aSCyndy Ishida SmallString<4096> Buffer;
5638c3d0d6aSCyndy Ishida raw_svector_ostream OS(Buffer);
5642ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5658c3d0d6aSCyndy Ishida EXPECT_TRUE(!WriteResult);
5666d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformiOSsim),
5678c3d0d6aSCyndy Ishida stripWhitespace(Buffer.c_str()));
5688c3d0d6aSCyndy Ishida }
5698c3d0d6aSCyndy Ishida
TEST(TBDv3,Platform_watchOSSim)5708c3d0d6aSCyndy Ishida TEST(TBDv3, Platform_watchOSSim) {
5716d2372ceSCyndy Ishida static const char TBDv3watchOSsim[] = "--- !tapi-tbd-v3\n"
5728c3d0d6aSCyndy Ishida "archs: [ x86_64 ]\n"
5738c3d0d6aSCyndy Ishida "platform: watchos\n"
5748c3d0d6aSCyndy Ishida "install-name: Test.dylib\n"
5758c3d0d6aSCyndy Ishida "...\n";
5768c3d0d6aSCyndy Ishida
5772ba32084SCyndy Ishida Expected<TBDFile> Result =
5786d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3watchOSsim, "Test.tbd"));
5798c3d0d6aSCyndy Ishida EXPECT_TRUE(!!Result);
5803025c3edSJuergen Ributzka auto Platform = PLATFORM_WATCHOSSIMULATOR;
5812ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
5828c3d0d6aSCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
5838c3d0d6aSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
5848c3d0d6aSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
5858c3d0d6aSCyndy Ishida
5868c3d0d6aSCyndy Ishida SmallString<4096> Buffer;
5878c3d0d6aSCyndy Ishida raw_svector_ostream OS(Buffer);
5882ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5898c3d0d6aSCyndy Ishida EXPECT_TRUE(!WriteResult);
5906d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3watchOSsim), stripWhitespace(Buffer.c_str()));
5918c3d0d6aSCyndy Ishida }
5928c3d0d6aSCyndy Ishida
TEST(TBDv3,Platform_tvOSSim)5938c3d0d6aSCyndy Ishida TEST(TBDv3, Platform_tvOSSim) {
5946d2372ceSCyndy Ishida static const char TBDv3PlatformtvOSsim[] = "--- !tapi-tbd-v3\n"
5958c3d0d6aSCyndy Ishida "archs: [ x86_64 ]\n"
5968c3d0d6aSCyndy Ishida "platform: tvos\n"
5978c3d0d6aSCyndy Ishida "install-name: Test.dylib\n"
5988c3d0d6aSCyndy Ishida "...\n";
5998c3d0d6aSCyndy Ishida
6002ba32084SCyndy Ishida Expected<TBDFile> Result =
6016d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3PlatformtvOSsim, "Test.tbd"));
6028c3d0d6aSCyndy Ishida EXPECT_TRUE(!!Result);
6032ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
6043025c3edSJuergen Ributzka auto Platform = PLATFORM_TVOSSIMULATOR;
6058c3d0d6aSCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
6068c3d0d6aSCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
6078c3d0d6aSCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
6088c3d0d6aSCyndy Ishida
6098c3d0d6aSCyndy Ishida SmallString<4096> Buffer;
6108c3d0d6aSCyndy Ishida raw_svector_ostream OS(Buffer);
6112ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6128c3d0d6aSCyndy Ishida EXPECT_TRUE(!WriteResult);
6136d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3PlatformtvOSsim),
6148c3d0d6aSCyndy Ishida stripWhitespace(Buffer.c_str()));
6158c3d0d6aSCyndy Ishida }
6168c3d0d6aSCyndy Ishida
TEST(TBDv3,Arch_arm64e)617a0cd4134SCyndy Ishida TEST(TBDv3, Arch_arm64e) {
618a0cd4134SCyndy Ishida static const char TBDv3ArchArm64e[] = "--- !tapi-tbd-v3\n"
619a0cd4134SCyndy Ishida "archs: [ arm64, arm64e ]\n"
620a0cd4134SCyndy Ishida "platform: ios\n"
621a0cd4134SCyndy Ishida "install-name: Test.dylib\n"
622a0cd4134SCyndy Ishida "...\n";
623a0cd4134SCyndy Ishida
6242ba32084SCyndy Ishida Expected<TBDFile> Result =
625a0cd4134SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3ArchArm64e, "Test.tbd"));
626a0cd4134SCyndy Ishida EXPECT_TRUE(!!Result);
6272ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
6283025c3edSJuergen Ributzka auto Platform = PLATFORM_IOS;
629a0cd4134SCyndy Ishida auto Archs = AK_arm64 | AK_arm64e;
630a0cd4134SCyndy Ishida EXPECT_EQ(FileType::TBD_V3, File->getFileType());
631a0cd4134SCyndy Ishida EXPECT_EQ(File->getPlatforms().size(), 1U);
632a0cd4134SCyndy Ishida EXPECT_EQ(Platform, *File->getPlatforms().begin());
633a0cd4134SCyndy Ishida EXPECT_EQ(Archs, File->getArchitectures());
634a0cd4134SCyndy Ishida
635a0cd4134SCyndy Ishida SmallString<4096> Buffer;
636a0cd4134SCyndy Ishida raw_svector_ostream OS(Buffer);
6372ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
638a0cd4134SCyndy Ishida EXPECT_TRUE(!WriteResult);
639a0cd4134SCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3ArchArm64e), stripWhitespace(Buffer.c_str()));
640a0cd4134SCyndy Ishida }
641a0cd4134SCyndy Ishida
TEST(TBDv3,Swift_1_0)642b978c51cSJuergen Ributzka TEST(TBDv3, Swift_1_0) {
6436d2372ceSCyndy Ishida static const char TBDv3Swift1[] = "--- !tapi-tbd-v3\n"
644b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
645b978c51cSJuergen Ributzka "platform: ios\n"
646b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
647b978c51cSJuergen Ributzka "swift-abi-version: 1.0\n"
648b978c51cSJuergen Ributzka "...\n";
649b978c51cSJuergen Ributzka
6502ba32084SCyndy Ishida Expected<TBDFile> Result =
6512ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift1, "Test.tbd"));
652b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
6532ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
654b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
655b978c51cSJuergen Ributzka EXPECT_EQ(1U, File->getSwiftABIVersion());
6564274a610SJonas Devlieghere
6574274a610SJonas Devlieghere SmallString<4096> Buffer;
6584274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
6592ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6604274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
6616d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3Swift1), stripWhitespace(Buffer.c_str()));
662b978c51cSJuergen Ributzka }
663b978c51cSJuergen Ributzka
TEST(TBDv3,Swift_1_1)664b978c51cSJuergen Ributzka TEST(TBDv3, Swift_1_1) {
6656d2372ceSCyndy Ishida static const char TBDv3Swift1Dot[] = "--- !tapi-tbd-v3\n"
666b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
667b978c51cSJuergen Ributzka "platform: ios\n"
668b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
669b978c51cSJuergen Ributzka "swift-abi-version: 1.1\n"
670b978c51cSJuergen Ributzka "...\n";
671b978c51cSJuergen Ributzka
6722ba32084SCyndy Ishida Expected<TBDFile> Result =
6732ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift1Dot, "Test.tbd"));
674b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
6752ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
676b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
677b978c51cSJuergen Ributzka EXPECT_EQ(2U, File->getSwiftABIVersion());
6784274a610SJonas Devlieghere
6794274a610SJonas Devlieghere SmallString<4096> Buffer;
6804274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
6812ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6824274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
6836d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3Swift1Dot), stripWhitespace(Buffer.c_str()));
684b978c51cSJuergen Ributzka }
685b978c51cSJuergen Ributzka
TEST(TBDv3,Swift_2_0)686b978c51cSJuergen Ributzka TEST(TBDv3, Swift_2_0) {
6876d2372ceSCyndy Ishida static const char TBDv3Swift2[] = "--- !tapi-tbd-v3\n"
688b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
689b978c51cSJuergen Ributzka "platform: ios\n"
690b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
691b978c51cSJuergen Ributzka "swift-abi-version: 2.0\n"
692b978c51cSJuergen Ributzka "...\n";
693b978c51cSJuergen Ributzka
6942ba32084SCyndy Ishida Expected<TBDFile> Result =
6952ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift2, "Test.tbd"));
696b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
6972ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
698b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
699b978c51cSJuergen Ributzka EXPECT_EQ(3U, File->getSwiftABIVersion());
7004274a610SJonas Devlieghere
7014274a610SJonas Devlieghere SmallString<4096> Buffer;
7024274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
7032ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
7044274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
7056d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3Swift2), stripWhitespace(Buffer.c_str()));
706b978c51cSJuergen Ributzka }
707b978c51cSJuergen Ributzka
TEST(TBDv3,Swift_3_0)708b978c51cSJuergen Ributzka TEST(TBDv3, Swift_3_0) {
7096d2372ceSCyndy Ishida static const char TBDv3Swift3[] = "--- !tapi-tbd-v3\n"
710b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
711b978c51cSJuergen Ributzka "platform: ios\n"
712b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
713b978c51cSJuergen Ributzka "swift-abi-version: 3.0\n"
714b978c51cSJuergen Ributzka "...\n";
715b978c51cSJuergen Ributzka
7162ba32084SCyndy Ishida Expected<TBDFile> Result =
7172ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift3, "Test.tbd"));
718b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
7192ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
720b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
721b978c51cSJuergen Ributzka EXPECT_EQ(4U, File->getSwiftABIVersion());
7224274a610SJonas Devlieghere
7234274a610SJonas Devlieghere SmallString<4096> Buffer;
7244274a610SJonas Devlieghere raw_svector_ostream OS(Buffer);
7252ba32084SCyndy Ishida Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
7264274a610SJonas Devlieghere EXPECT_TRUE(!WriteResult);
7276d2372ceSCyndy Ishida EXPECT_EQ(stripWhitespace(TBDv3Swift3), stripWhitespace(Buffer.c_str()));
728b978c51cSJuergen Ributzka }
729b978c51cSJuergen Ributzka
TEST(TBDv3,Swift_4_0)730b978c51cSJuergen Ributzka TEST(TBDv3, Swift_4_0) {
7316d2372ceSCyndy Ishida static const char TBDv3Swift4[] = "--- !tapi-tbd-v3\n"
732b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
733b978c51cSJuergen Ributzka "platform: ios\n"
734b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
735b978c51cSJuergen Ributzka "swift-abi-version: 4.0\n"
736b978c51cSJuergen Ributzka "...\n";
737b978c51cSJuergen Ributzka
7382ba32084SCyndy Ishida Expected<TBDFile> Result =
7392ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift4, "Test.tbd"));
740b978c51cSJuergen Ributzka EXPECT_FALSE(!!Result);
7412ba32084SCyndy Ishida std::string ErrorMessage = toString(Result.takeError());
742b978c51cSJuergen Ributzka EXPECT_EQ("malformed file\nTest.tbd:5:20: error: invalid Swift ABI "
743b978c51cSJuergen Ributzka "version.\nswift-abi-version: 4.0\n ^~~\n",
7442ba32084SCyndy Ishida ErrorMessage);
745b978c51cSJuergen Ributzka }
746b978c51cSJuergen Ributzka
TEST(TBDv3,Swift_5)747b978c51cSJuergen Ributzka TEST(TBDv3, Swift_5) {
7486d2372ceSCyndy Ishida static const char TBDv3Swift5[] = "--- !tapi-tbd-v3\n"
749b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
750b978c51cSJuergen Ributzka "platform: ios\n"
751b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
752b978c51cSJuergen Ributzka "swift-abi-version: 5\n"
753b978c51cSJuergen Ributzka "...\n";
754b978c51cSJuergen Ributzka
7552ba32084SCyndy Ishida Expected<TBDFile> Result =
7562ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift5, "Test.tbd"));
757b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
7582ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
759b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
760b978c51cSJuergen Ributzka EXPECT_EQ(5U, File->getSwiftABIVersion());
761b978c51cSJuergen Ributzka }
762b978c51cSJuergen Ributzka
TEST(TBDv3,Swift_99)763b978c51cSJuergen Ributzka TEST(TBDv3, Swift_99) {
7646d2372ceSCyndy Ishida static const char TBDv3Swift99[] = "--- !tapi-tbd-v3\n"
765b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
766b978c51cSJuergen Ributzka "platform: ios\n"
767b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
768b978c51cSJuergen Ributzka "swift-abi-version: 99\n"
769b978c51cSJuergen Ributzka "...\n";
770b978c51cSJuergen Ributzka
7712ba32084SCyndy Ishida Expected<TBDFile> Result =
7722ba32084SCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3Swift99, "Test.tbd"));
773b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
7742ba32084SCyndy Ishida TBDFile File = std::move(Result.get());
775b978c51cSJuergen Ributzka EXPECT_EQ(FileType::TBD_V3, File->getFileType());
776b978c51cSJuergen Ributzka EXPECT_EQ(99U, File->getSwiftABIVersion());
777b978c51cSJuergen Ributzka }
778b978c51cSJuergen Ributzka
TEST(TBDv3,UnknownArchitecture)779b978c51cSJuergen Ributzka TEST(TBDv3, UnknownArchitecture) {
7806d2372ceSCyndy Ishida static const char TBDv3FileUnknownArch[] = "--- !tapi-tbd-v3\n"
781b978c51cSJuergen Ributzka "archs: [ foo ]\n"
782b978c51cSJuergen Ributzka "platform: macosx\n"
783b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
784b978c51cSJuergen Ributzka "...\n";
785b978c51cSJuergen Ributzka
7862ba32084SCyndy Ishida Expected<TBDFile> Result =
7876d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3FileUnknownArch, "Test.tbd"));
788b978c51cSJuergen Ributzka EXPECT_TRUE(!!Result);
789b978c51cSJuergen Ributzka }
790b978c51cSJuergen Ributzka
TEST(TBDv3,UnknownPlatform)791b978c51cSJuergen Ributzka TEST(TBDv3, UnknownPlatform) {
7926d2372ceSCyndy Ishida static const char TBDv3FileUnknownPlatform[] = "--- !tapi-tbd-v3\n"
793b978c51cSJuergen Ributzka "archs: [ i386 ]\n"
794b978c51cSJuergen Ributzka "platform: newOS\n"
795b978c51cSJuergen Ributzka "...\n";
796b978c51cSJuergen Ributzka
7972ba32084SCyndy Ishida Expected<TBDFile> Result =
7986d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3FileUnknownPlatform, "Test.tbd"));
799b978c51cSJuergen Ributzka EXPECT_FALSE(!!Result);
8002ba32084SCyndy Ishida std::string ErrorMessage = toString(Result.takeError());
801b978c51cSJuergen Ributzka EXPECT_EQ("malformed file\nTest.tbd:3:11: error: unknown platform\nplatform: "
802b978c51cSJuergen Ributzka "newOS\n ^~~~~\n",
8032ba32084SCyndy Ishida ErrorMessage);
804b978c51cSJuergen Ributzka }
805b978c51cSJuergen Ributzka
TEST(TBDv3,MalformedFile1)806b978c51cSJuergen Ributzka TEST(TBDv3, MalformedFile1) {
8076d2372ceSCyndy Ishida static const char TBDv3FileMalformed1[] = "--- !tapi-tbd-v3\n"
808b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
809b978c51cSJuergen Ributzka "foobar: \"Unsupported key\"\n"
810b978c51cSJuergen Ributzka "...\n";
811b978c51cSJuergen Ributzka
8122ba32084SCyndy Ishida Expected<TBDFile> Result =
8136d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3FileMalformed1, "Test.tbd"));
814b978c51cSJuergen Ributzka EXPECT_FALSE(!!Result);
8152ba32084SCyndy Ishida std::string ErrorMessage = toString(Result.takeError());
816b978c51cSJuergen Ributzka ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
817b978c51cSJuergen Ributzka "'platform'\narchs: [ arm64 ]\n^\n",
8182ba32084SCyndy Ishida ErrorMessage);
819b978c51cSJuergen Ributzka }
820b978c51cSJuergen Ributzka
TEST(TBDv3,MalformedFile2)821b978c51cSJuergen Ributzka TEST(TBDv3, MalformedFile2) {
8226d2372ceSCyndy Ishida static const char TBDv3FileMalformed2[] = "--- !tapi-tbd-v3\n"
823b978c51cSJuergen Ributzka "archs: [ arm64 ]\n"
824b978c51cSJuergen Ributzka "platform: ios\n"
825b978c51cSJuergen Ributzka "install-name: Test.dylib\n"
826b978c51cSJuergen Ributzka "foobar: \"Unsupported key\"\n"
827b978c51cSJuergen Ributzka "...\n";
828b978c51cSJuergen Ributzka
8292ba32084SCyndy Ishida Expected<TBDFile> Result =
8306d2372ceSCyndy Ishida TextAPIReader::get(MemoryBufferRef(TBDv3FileMalformed2, "Test.tbd"));
831b978c51cSJuergen Ributzka EXPECT_FALSE(!!Result);
8322ba32084SCyndy Ishida std::string ErrorMessage = toString(Result.takeError());
833b978c51cSJuergen Ributzka ASSERT_EQ(
834d380c38eSNathan James "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
835d380c38eSNathan James "\"Unsupported key\"\n^~~~~~\n",
8362ba32084SCyndy Ishida ErrorMessage);
837b978c51cSJuergen Ributzka }
838b978c51cSJuergen Ributzka
TEST(TBDv3,InterfaceEquality)839eb2eeeb7SSam Powell TEST(TBDv3, InterfaceEquality) {
840eb2eeeb7SSam Powell static const char TBDv3File[] =
841eb2eeeb7SSam Powell "--- !tapi-tbd-v3\n"
842eb2eeeb7SSam Powell "archs: [ armv7, arm64 ]\n"
843eb2eeeb7SSam Powell "uuids: [ 'armv7: 00000000-0000-0000-0000-000000000000',\n"
844eb2eeeb7SSam Powell " 'arm64: 11111111-1111-1111-1111-111111111111']\n"
845eb2eeeb7SSam Powell "platform: ios\n"
846eb2eeeb7SSam Powell "flags: [ installapi ]\n"
847eb2eeeb7SSam Powell "install-name: Test.dylib\n"
848eb2eeeb7SSam Powell "current-version: 2.3.4\n"
849eb2eeeb7SSam Powell "compatibility-version: 1.0\n"
850eb2eeeb7SSam Powell "swift-abi-version: 1.1\n"
851eb2eeeb7SSam Powell "parent-umbrella: Umbrella.dylib\n"
852eb2eeeb7SSam Powell "exports:\n"
853eb2eeeb7SSam Powell " - archs: [ armv7, arm64 ]\n"
854eb2eeeb7SSam Powell " allowable-clients: [ clientA ]\n"
855eb2eeeb7SSam Powell " re-exports: [ /usr/lib/libfoo.dylib ]\n"
856eb2eeeb7SSam Powell " symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
857eb2eeeb7SSam Powell " objc-classes: [ class1, class2 ]\n"
858eb2eeeb7SSam Powell " objc-eh-types: [ class1 ]\n"
859eb2eeeb7SSam Powell " objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
860eb2eeeb7SSam Powell " weak-def-symbols: [ _weak1, _weak2 ]\n"
861eb2eeeb7SSam Powell " thread-local-symbols: [ _tlv1, _tlv3 ]\n"
862eb2eeeb7SSam Powell " - archs: [ armv7 ]\n"
863eb2eeeb7SSam Powell " symbols: [ _sym5 ]\n"
864eb2eeeb7SSam Powell " objc-classes: [ class3 ]\n"
865eb2eeeb7SSam Powell " objc-ivars: [ class1._ivar3 ]\n"
866eb2eeeb7SSam Powell " weak-def-symbols: [ _weak3 ]\n"
867eb2eeeb7SSam Powell " thread-local-symbols: [ _tlv3 ]\n"
868eb2eeeb7SSam Powell "--- !tapi-tbd-v3\n"
869eb2eeeb7SSam Powell "archs: [ i386 ]\n"
870eb2eeeb7SSam Powell "platform: macosx\n"
871eb2eeeb7SSam Powell "install-name: '/usr/lib/libbar.dylib'\n"
872eb2eeeb7SSam Powell "current-version: 0\n"
873eb2eeeb7SSam Powell "compatibility-version: 0\n"
874eb2eeeb7SSam Powell "swift-abi-version: 5\n"
875eb2eeeb7SSam Powell "objc-constraint: none\n"
876eb2eeeb7SSam Powell "exports:\n"
877eb2eeeb7SSam Powell " - archs: [ i386 ]\n"
878eb2eeeb7SSam Powell " symbols: [ _sym3, _sym4 ]\n"
879eb2eeeb7SSam Powell "...\n";
880eb2eeeb7SSam Powell Expected<TBDFile> ResultA =
881eb2eeeb7SSam Powell TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestA.tbd"));
882eb2eeeb7SSam Powell EXPECT_TRUE(!!ResultA);
883eb2eeeb7SSam Powell InterfaceFile FileA = std::move(*ResultA.get());
884eb2eeeb7SSam Powell Expected<TBDFile> ResultB =
885eb2eeeb7SSam Powell TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestB.tbd"));
886eb2eeeb7SSam Powell EXPECT_TRUE(!!ResultB);
887eb2eeeb7SSam Powell InterfaceFile FileB = std::move(*ResultB.get());
888eb2eeeb7SSam Powell EXPECT_FALSE(FileA.getPath() == FileB.getPath());
889eb2eeeb7SSam Powell EXPECT_TRUE(FileA == FileB);
890eb2eeeb7SSam Powell }
891eb2eeeb7SSam Powell
892eb2eeeb7SSam Powell
893eb2eeeb7SSam Powell
TEST(TBDv3,InterfaceInequality)894eb2eeeb7SSam Powell TEST(TBDv3, InterfaceInequality) {
895eb2eeeb7SSam Powell static const char TBDv3File[] = "--- !tapi-tbd-v3\n"
896eb2eeeb7SSam Powell "archs: [ armv7, arm64 ]\n"
897eb2eeeb7SSam Powell "platform: ios\n"
898eb2eeeb7SSam Powell "install-name: Test.dylib\n"
899eb2eeeb7SSam Powell "...\n";
900eb2eeeb7SSam Powell
901eb2eeeb7SSam Powell Expected<TBDFile> ResultA =
902eb2eeeb7SSam Powell TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestA.tbd"));
903eb2eeeb7SSam Powell EXPECT_TRUE(!!ResultA);
904eb2eeeb7SSam Powell InterfaceFile FileA = std::move(*ResultA.get());
905eb2eeeb7SSam Powell Expected<TBDFile> ResultB =
906eb2eeeb7SSam Powell TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestB.tbd"));
907eb2eeeb7SSam Powell EXPECT_TRUE(!!ResultB);
908eb2eeeb7SSam Powell InterfaceFile FileB = std::move(*ResultB.get());
909eb2eeeb7SSam Powell
910eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9113025c3edSJuergen Ributzka File->addTarget(Target(AK_x86_64, PLATFORM_IOS));
912eb2eeeb7SSam Powell }));
913eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
914eb2eeeb7SSam Powell File->setCurrentVersion(PackedVersion(1, 2, 3));
915eb2eeeb7SSam Powell File->setCompatibilityVersion(PackedVersion(1, 0, 0));
916eb2eeeb7SSam Powell }));
917eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(
918eb2eeeb7SSam Powell FileA, FileB, [](InterfaceFile *File) { File->setSwiftABIVersion(5); }));
919eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
920eb2eeeb7SSam Powell File->setTwoLevelNamespace(false);
921eb2eeeb7SSam Powell }));
922eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(
923eb2eeeb7SSam Powell FileA, FileB, [](InterfaceFile *File) { File->setInstallAPI(true); }));
924eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
925eb2eeeb7SSam Powell File->setApplicationExtensionSafe(false);
926eb2eeeb7SSam Powell }));
927eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9283025c3edSJuergen Ributzka File->addParentUmbrella(Target(AK_armv7, PLATFORM_IOS), "Umbrella.dylib");
929eb2eeeb7SSam Powell }));
930eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9313025c3edSJuergen Ributzka File->addAllowableClient("ClientA", Target(AK_armv7, PLATFORM_IOS));
932eb2eeeb7SSam Powell }));
933eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
934eb2eeeb7SSam Powell File->addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
9353025c3edSJuergen Ributzka Target(AK_armv7, PLATFORM_IOS));
936eb2eeeb7SSam Powell }));
937eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9383025c3edSJuergen Ributzka File->addSymbol(SymbolKind::GlobalSymbol, "_symA",
9393025c3edSJuergen Ributzka {Target(AK_arm64, PLATFORM_IOS)});
940eb2eeeb7SSam Powell }));
941eb2eeeb7SSam Powell EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
942eb2eeeb7SSam Powell InterfaceFile Document;
9433025c3edSJuergen Ributzka Document.addTargets(TargetList{Target(AK_armv7, PLATFORM_IOS),
9443025c3edSJuergen Ributzka Target(AK_arm64, PLATFORM_IOS)});
945eb2eeeb7SSam Powell Document.setInstallName("/System/Library/Frameworks/A.framework/A");
946eb2eeeb7SSam Powell File->addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
947eb2eeeb7SSam Powell }));
948eb2eeeb7SSam Powell }
949eb2eeeb7SSam Powell
950b978c51cSJuergen Ributzka } // namespace TBDv3
951