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