xref: /llvm-project/llvm/unittests/TextAPI/TextStubV3Tests.cpp (revision d9a9872ec4760762fdc467ef283cea302a3742e5)
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[] = {
20*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "$ld$hide$os9.0$_sym1", false, false},
21*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym1", false, false},
22*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym2", false, false},
23*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym3", false, false},
24*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym4", false, false},
25*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym5", false, false},
26*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_tlv1", false, true},
27*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_tlv3", false, true},
28*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak1", true, false},
29*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak2", true, false},
30*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak3", true, false},
31*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class1", false, false},
32*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class2", false, false},
33*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class3", false, false},
34*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClassEHType, "class1", false, false},
35*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCInstanceVariable, "class1._ivar1", false, false},
36*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCInstanceVariable, "class1._ivar2", false, false},
37*d9a9872eSCyndy Ishida     {EncodeKind::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());
84b70d87bcSCyndy Ishida   TargetToAttr 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(File->getPlatforms().size(), 1U);
8981669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
90b978c51cSJuergen Ributzka   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
91b978c51cSJuergen Ributzka   EXPECT_EQ(PackedVersion(2, 3, 4), File->getCurrentVersion());
92b978c51cSJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
93b978c51cSJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
94b978c51cSJuergen Ributzka   EXPECT_EQ(ObjCConstraintType::Retain_Release, File->getObjCConstraint());
95b978c51cSJuergen Ributzka   EXPECT_TRUE(File->isTwoLevelNamespace());
96b978c51cSJuergen Ributzka   EXPECT_TRUE(File->isApplicationExtensionSafe());
9781669d5eSCyndy Ishida   InterfaceFileRef client("clientA", Targets);
9881669d5eSCyndy Ishida   InterfaceFileRef reexport("/usr/lib/libfoo.dylib", Targets);
99b978c51cSJuergen Ributzka   EXPECT_EQ(1U, File->allowableClients().size());
100b978c51cSJuergen Ributzka   EXPECT_EQ(client, File->allowableClients().front());
101b978c51cSJuergen Ributzka   EXPECT_EQ(1U, File->reexportedLibraries().size());
102b978c51cSJuergen Ributzka   EXPECT_EQ(reexport, File->reexportedLibraries().front());
103b978c51cSJuergen Ributzka 
104b978c51cSJuergen Ributzka   ExportedSymbolSeq Exports;
105b978c51cSJuergen Ributzka   for (const auto *Sym : File->symbols()) {
106b978c51cSJuergen Ributzka     EXPECT_FALSE(Sym->isWeakReferenced());
107b978c51cSJuergen Ributzka     EXPECT_FALSE(Sym->isUndefined());
108adcd0268SBenjamin Kramer     Exports.emplace_back(
109adcd0268SBenjamin Kramer         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
110adcd0268SBenjamin Kramer                        Sym->isWeakDefined(), Sym->isThreadLocalValue()});
111b978c51cSJuergen Ributzka   }
112cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
113b978c51cSJuergen Ributzka 
114589725f6SKazu Hirata   EXPECT_EQ(std::size(TBDv3Symbols), Exports.size());
115b978c51cSJuergen Ributzka   EXPECT_TRUE(
116b978c51cSJuergen Ributzka       std::equal(Exports.begin(), Exports.end(), std::begin(TBDv3Symbols)));
117b978c51cSJuergen Ributzka }
118b978c51cSJuergen Ributzka 
TEST(TBDv3,ReadMultipleDocuments)119fd4d0751SCyndy Ishida TEST(TBDv3, ReadMultipleDocuments) {
120fd4d0751SCyndy Ishida   static const char TBDv3Inlines[] =
121fd4d0751SCyndy Ishida       "--- !tapi-tbd-v3\n"
122fd4d0751SCyndy Ishida       "archs: [ armv7, arm64 ]\n"
123fd4d0751SCyndy Ishida       "platform: ios\n"
124fd4d0751SCyndy Ishida       "install-name: Test.dylib\n"
125fd4d0751SCyndy Ishida       "current-version: 2.3.4\n"
126fd4d0751SCyndy Ishida       "compatibility-version: 1.0\n"
127fd4d0751SCyndy Ishida       "swift-abi-version: 1.1\n"
128fd4d0751SCyndy Ishida       "parent-umbrella: Umbrella.dylib\n"
129fd4d0751SCyndy Ishida       "exports:\n"
130fd4d0751SCyndy Ishida       "  - archs: [ armv7, arm64 ]\n"
131fd4d0751SCyndy Ishida       "    allowable-clients: [ clientA ]\n"
132fd4d0751SCyndy Ishida       "    re-exports: [ /usr/lib/libfoo.dylib,\n"
133fd4d0751SCyndy Ishida       "                  TestInline.dylib ]\n"
134fd4d0751SCyndy Ishida       "    symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
135fd4d0751SCyndy Ishida       "    objc-classes: [ class1, class2 ]\n"
136fd4d0751SCyndy Ishida       "    objc-eh-types: [ class1 ]\n"
137fd4d0751SCyndy Ishida       "    objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
138fd4d0751SCyndy Ishida       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
139fd4d0751SCyndy Ishida       "    thread-local-symbols: [ _tlv1, _tlv3 ]\n"
140fd4d0751SCyndy Ishida       "  - archs: [ armv7 ]\n"
141fd4d0751SCyndy Ishida       "    symbols: [ _sym5 ]\n"
142fd4d0751SCyndy Ishida       "    objc-classes: [ class3 ]\n"
143fd4d0751SCyndy Ishida       "    objc-ivars: [ class1._ivar3 ]\n"
144fd4d0751SCyndy Ishida       "    weak-def-symbols: [ _weak3 ]\n"
145fd4d0751SCyndy Ishida       "    thread-local-symbols: [ _tlv3 ]\n"
146fd4d0751SCyndy Ishida       "--- !tapi-tbd-v3\n"
147fd4d0751SCyndy Ishida       "archs: [ armv7, arm64 ]\n"
148fd4d0751SCyndy Ishida       "platform: ios\n"
149fd4d0751SCyndy Ishida       "install-name: TestInline.dylib\n"
150fd4d0751SCyndy Ishida       "swift-abi-version: 1.1\n"
151fd4d0751SCyndy Ishida       "exports:\n"
152fd4d0751SCyndy Ishida       "  - archs: [ armv7, arm64 ]\n"
153fd4d0751SCyndy Ishida       "    symbols: [ _sym5, _sym6 ]\n"
154fd4d0751SCyndy Ishida       "...\n";
155fd4d0751SCyndy Ishida 
1562ba32084SCyndy Ishida   Expected<TBDFile> Result =
1572ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Inlines, "Test.tbd"));
158fd4d0751SCyndy Ishida   EXPECT_TRUE(!!Result);
1592ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
160fd4d0751SCyndy Ishida   EXPECT_EQ(File->documents().size(), 1U);
161fd4d0751SCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
162fd4d0751SCyndy Ishida   auto Archs = AK_armv7 | AK_arm64;
1633025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
164fd4d0751SCyndy Ishida   TargetList Targets;
165fd4d0751SCyndy Ishida   for (auto &&arch : Archs)
166fd4d0751SCyndy Ishida     Targets.emplace_back(Target(arch, Platform));
167fd4d0751SCyndy Ishida   EXPECT_EQ(Archs, File->getArchitectures());
168b70d87bcSCyndy Ishida   TargetToAttr Uuids = {{Target(AK_armv7, PLATFORM_UNKNOWN),
169fd4d0751SCyndy Ishida                          "00000000-0000-0000-0000-000000000000"},
1703025c3edSJuergen Ributzka                         {Target(AK_arm64, PLATFORM_UNKNOWN),
171fd4d0751SCyndy Ishida                          "11111111-1111-1111-1111-111111111111"}};
172fd4d0751SCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
173fd4d0751SCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
174fd4d0751SCyndy Ishida   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
175fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(2, 3, 4), File->getCurrentVersion());
176fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
177fd4d0751SCyndy Ishida   EXPECT_EQ(2U, File->getSwiftABIVersion());
178fd4d0751SCyndy Ishida   EXPECT_EQ(ObjCConstraintType::Retain_Release, File->getObjCConstraint());
179fd4d0751SCyndy Ishida   EXPECT_TRUE(File->isTwoLevelNamespace());
180fd4d0751SCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
181fd4d0751SCyndy Ishida   InterfaceFileRef Client("clientA", Targets);
182fd4d0751SCyndy Ishida   const std::vector<InterfaceFileRef> Reexports = {
183fd4d0751SCyndy Ishida       InterfaceFileRef("/usr/lib/libfoo.dylib", Targets),
184fd4d0751SCyndy Ishida       InterfaceFileRef("TestInline.dylib", Targets)};
185fd4d0751SCyndy Ishida   EXPECT_EQ(1U, File->allowableClients().size());
186fd4d0751SCyndy Ishida   EXPECT_EQ(Client, File->allowableClients().front());
187fd4d0751SCyndy Ishida   EXPECT_EQ(2U, File->reexportedLibraries().size());
188fd4d0751SCyndy Ishida   EXPECT_EQ(Reexports, File->reexportedLibraries());
189fd4d0751SCyndy Ishida 
190fd4d0751SCyndy Ishida   ExportedSymbolSeq Exports;
191fd4d0751SCyndy Ishida   for (const auto *Sym : File->symbols()) {
192fd4d0751SCyndy Ishida     EXPECT_FALSE(Sym->isWeakReferenced());
193fd4d0751SCyndy Ishida     EXPECT_FALSE(Sym->isUndefined());
194fd4d0751SCyndy Ishida     Exports.emplace_back(ExportedSymbol{Sym->getKind(), Sym->getName().str(),
195fd4d0751SCyndy Ishida                                         Sym->isWeakDefined(),
196fd4d0751SCyndy Ishida                                         Sym->isThreadLocalValue()});
197fd4d0751SCyndy Ishida   }
198cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
199fd4d0751SCyndy Ishida 
200589725f6SKazu Hirata   EXPECT_EQ(std::size(TBDv3Symbols), Exports.size());
201fd4d0751SCyndy Ishida   EXPECT_TRUE(
202fd4d0751SCyndy Ishida       std::equal(Exports.begin(), Exports.end(), std::begin(TBDv3Symbols)));
203fd4d0751SCyndy Ishida 
204fd4d0751SCyndy Ishida   // Check Second Document
205fd4d0751SCyndy Ishida   Exports.clear();
2060b15cb70SCyndy Ishida   TBDReexportFile Document = File->documents().front();
207fd4d0751SCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, Document->getFileType());
208fd4d0751SCyndy Ishida   EXPECT_EQ(Archs, Document->getArchitectures());
209fd4d0751SCyndy Ishida   EXPECT_EQ(Platform, *Document->getPlatforms().begin());
210fd4d0751SCyndy Ishida   EXPECT_EQ(std::string("TestInline.dylib"), Document->getInstallName());
211fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCurrentVersion());
212fd4d0751SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCompatibilityVersion());
213fd4d0751SCyndy Ishida   EXPECT_EQ(2U, Document->getSwiftABIVersion());
214fd4d0751SCyndy Ishida 
215fd4d0751SCyndy Ishida   for (const auto *Sym : Document->symbols()) {
216fd4d0751SCyndy Ishida     EXPECT_FALSE(Sym->isWeakReferenced());
217fd4d0751SCyndy Ishida     EXPECT_FALSE(Sym->isUndefined());
218fd4d0751SCyndy Ishida     Exports.emplace_back(ExportedSymbol{Sym->getKind(), Sym->getName().str(),
219fd4d0751SCyndy Ishida                                         Sym->isWeakDefined(),
220fd4d0751SCyndy Ishida                                         Sym->isThreadLocalValue()});
221fd4d0751SCyndy Ishida   }
222cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
223fd4d0751SCyndy Ishida 
224fd4d0751SCyndy Ishida   ExportedSymbolSeq DocumentSymbols{
225*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_sym5", false, false},
226*d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_sym6", false, false},
227fd4d0751SCyndy Ishida   };
228fd4d0751SCyndy Ishida 
229fd4d0751SCyndy Ishida   EXPECT_EQ(DocumentSymbols.size(), Exports.size());
230fd4d0751SCyndy Ishida   EXPECT_TRUE(
231fd4d0751SCyndy Ishida       std::equal(Exports.begin(), Exports.end(), DocumentSymbols.begin()));
232fd4d0751SCyndy Ishida }
233fd4d0751SCyndy Ishida 
TEST(TBDv3,WriteFile)234b978c51cSJuergen Ributzka TEST(TBDv3, WriteFile) {
2356d2372ceSCyndy Ishida   static const char TBDv3File3[] =
236b978c51cSJuergen Ributzka       "--- !tapi-tbd-v3\n"
237b978c51cSJuergen Ributzka       "archs:           [ i386, x86_64 ]\n"
238b978c51cSJuergen Ributzka       "platform:        macosx\n"
239b978c51cSJuergen Ributzka       "install-name:    '/usr/lib/libfoo.dylib'\n"
240b978c51cSJuergen Ributzka       "current-version: 1.2.3\n"
241b978c51cSJuergen Ributzka       "compatibility-version: 0\n"
242b978c51cSJuergen Ributzka       "swift-abi-version: 5\n"
243b978c51cSJuergen Ributzka       "exports:\n"
244b978c51cSJuergen Ributzka       "  - archs:           [ i386 ]\n"
245b978c51cSJuergen Ributzka       "    symbols:         [ _sym1 ]\n"
246b978c51cSJuergen Ributzka       "    weak-def-symbols: [ _sym2 ]\n"
247b978c51cSJuergen Ributzka       "    thread-local-symbols: [ _sym3 ]\n"
248b978c51cSJuergen Ributzka       "  - archs:           [ x86_64 ]\n"
249b978c51cSJuergen Ributzka       "    allowable-clients: [ clientA ]\n"
250b978c51cSJuergen Ributzka       "    re-exports:      [ '/usr/lib/libfoo.dylib' ]\n"
251b978c51cSJuergen Ributzka       "    objc-classes:    [ Class1 ]\n"
252b978c51cSJuergen Ributzka       "    objc-eh-types:   [ Class1 ]\n"
253b978c51cSJuergen Ributzka       "    objc-ivars:      [ Class1._ivar1 ]\n"
254b978c51cSJuergen Ributzka       "...\n";
255b978c51cSJuergen Ributzka 
256b978c51cSJuergen Ributzka   InterfaceFile File;
25781669d5eSCyndy Ishida   TargetList Targets;
25881669d5eSCyndy Ishida   for (auto &&arch : AK_i386 | AK_x86_64)
2593025c3edSJuergen Ributzka     Targets.emplace_back(Target(arch, PLATFORM_MACOS));
260b978c51cSJuergen Ributzka   File.setPath("libfoo.dylib");
261b978c51cSJuergen Ributzka   File.setInstallName("/usr/lib/libfoo.dylib");
262b978c51cSJuergen Ributzka   File.setFileType(FileType::TBD_V3);
26381669d5eSCyndy Ishida   File.addTargets(Targets);
264b978c51cSJuergen Ributzka   File.setCurrentVersion(PackedVersion(1, 2, 3));
265b978c51cSJuergen Ributzka   File.setTwoLevelNamespace();
266b978c51cSJuergen Ributzka   File.setApplicationExtensionSafe();
267b978c51cSJuergen Ributzka   File.setSwiftABIVersion(5);
268b978c51cSJuergen Ributzka   File.setObjCConstraint(ObjCConstraintType::Retain_Release);
26981669d5eSCyndy Ishida   File.addAllowableClient("clientA", Targets[1]);
27081669d5eSCyndy Ishida   File.addReexportedLibrary("/usr/lib/libfoo.dylib", Targets[1]);
271*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym1", {Targets[0]});
272*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym2", {Targets[0]},
273b978c51cSJuergen Ributzka                  SymbolFlags::WeakDefined);
274*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym3", {Targets[0]},
275b978c51cSJuergen Ributzka                  SymbolFlags::ThreadLocalValue);
276*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "Class1", {Targets[1]});
277*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
278*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "Class1._ivar1",
27981669d5eSCyndy Ishida                  {Targets[1]});
280b978c51cSJuergen Ributzka 
281b978c51cSJuergen Ributzka   SmallString<4096> Buffer;
282b978c51cSJuergen Ributzka   raw_svector_ostream OS(Buffer);
2832ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
284b978c51cSJuergen Ributzka   EXPECT_FALSE(Result);
2856d2372ceSCyndy Ishida   EXPECT_STREQ(TBDv3File3, Buffer.c_str());
286b978c51cSJuergen Ributzka }
287b978c51cSJuergen Ributzka 
TEST(TBDv3,WriteMultipleDocuments)288fd4d0751SCyndy Ishida TEST(TBDv3, WriteMultipleDocuments) {
289fd4d0751SCyndy Ishida   static const char TBDv3Inlines[] =
290fd4d0751SCyndy Ishida       "--- !tapi-tbd-v3\n"
291fd4d0751SCyndy Ishida       "archs:           [ i386, x86_64 ]\n"
292fd4d0751SCyndy Ishida       "platform:        zippered\n"
293fd4d0751SCyndy Ishida       "install-name:    '/usr/lib/libfoo.dylib'\n"
294fd4d0751SCyndy Ishida       "current-version: 1.2.3\n"
295fd4d0751SCyndy Ishida       "compatibility-version: 0\n"
296fd4d0751SCyndy Ishida       "swift-abi-version: 5\n"
297fd4d0751SCyndy Ishida       "exports:\n"
298fd4d0751SCyndy Ishida       "  - archs:           [ x86_64 ]\n"
299fd4d0751SCyndy Ishida       "    allowable-clients: [ clientA ]\n"
300fd4d0751SCyndy Ishida       "    re-exports:      [ '/usr/lib/libbar.dylib' ]\n"
301fd4d0751SCyndy Ishida       "  - archs:           [ i386, x86_64 ]\n"
302fd4d0751SCyndy Ishida       "    symbols:         [ _sym1 ]\n"
303fd4d0751SCyndy Ishida       "    objc-classes:    [ Class1 ]\n"
304fd4d0751SCyndy Ishida       "    objc-eh-types:   [ Class1 ]\n"
305fd4d0751SCyndy Ishida       "    objc-ivars:      [ Class1._ivar1 ]\n"
306fd4d0751SCyndy Ishida       "    weak-def-symbols: [ _sym2 ]\n"
307fd4d0751SCyndy Ishida       "    thread-local-symbols: [ _symA ]\n"
308fd4d0751SCyndy Ishida       "--- !tapi-tbd-v3\n"
309fd4d0751SCyndy Ishida       "archs:           [ i386 ]\n"
310fd4d0751SCyndy Ishida       "platform:        macosx\n"
311fd4d0751SCyndy Ishida       "install-name:    '/usr/lib/libbar.dylib'\n"
312fd4d0751SCyndy Ishida       "current-version: 0\n"
313fd4d0751SCyndy Ishida       "compatibility-version: 0\n"
314fd4d0751SCyndy Ishida       "swift-abi-version: 5\n"
315fd4d0751SCyndy Ishida       "objc-constraint: none\n"
316fd4d0751SCyndy Ishida       "exports:\n"
317fd4d0751SCyndy Ishida       "  - archs:           [ i386 ]\n"
318fd4d0751SCyndy Ishida       "    symbols:         [ _sym3, _sym4 ]\n"
319fd4d0751SCyndy Ishida       "...\n";
320fd4d0751SCyndy Ishida 
321fd4d0751SCyndy Ishida   InterfaceFile File;
322fd4d0751SCyndy Ishida   TargetList Targets;
323fd4d0751SCyndy Ishida   for (auto &&arch : AK_i386 | AK_x86_64) {
3243025c3edSJuergen Ributzka     Targets.emplace_back(Target(arch, PLATFORM_MACOS));
3253025c3edSJuergen Ributzka     Targets.emplace_back(Target(arch, PLATFORM_MACCATALYST));
326fd4d0751SCyndy Ishida   }
327fd4d0751SCyndy Ishida   File.addTargets(Targets);
328fd4d0751SCyndy Ishida   File.setPath("libfoo.dylib");
329fd4d0751SCyndy Ishida   File.setInstallName("/usr/lib/libfoo.dylib");
330fd4d0751SCyndy Ishida   File.setFileType(FileType::TBD_V3);
331fd4d0751SCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 2, 3));
332fd4d0751SCyndy Ishida   File.setTwoLevelNamespace();
333fd4d0751SCyndy Ishida   File.setApplicationExtensionSafe();
334fd4d0751SCyndy Ishida   File.setSwiftABIVersion(5);
335fd4d0751SCyndy Ishida   File.setObjCConstraint(ObjCConstraintType::Retain_Release);
336fd4d0751SCyndy Ishida   File.addAllowableClient("clientA", Targets[2]);
337fd4d0751SCyndy Ishida   File.addReexportedLibrary("/usr/lib/libbar.dylib", Targets[2]);
338*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym1", Targets);
339*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym2", Targets,
340fd4d0751SCyndy Ishida                  SymbolFlags::WeakDefined);
341*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_symA", Targets,
342fd4d0751SCyndy Ishida                  SymbolFlags::ThreadLocalValue);
343*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "Class1", Targets);
344*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClassEHType, "Class1", Targets);
345*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "Class1._ivar1",
346fd4d0751SCyndy Ishida                  Targets);
347fd4d0751SCyndy Ishida 
348fd4d0751SCyndy Ishida   // Inline document
349fd4d0751SCyndy Ishida   InterfaceFile Document;
3503025c3edSJuergen Ributzka   Targets = {Target(AK_i386, PLATFORM_MACOS)};
351fd4d0751SCyndy Ishida   Document.addTargets(Targets);
352fd4d0751SCyndy Ishida   Document.setPath("libbar.dylib");
353fd4d0751SCyndy Ishida   Document.setInstallName("/usr/lib/libbar.dylib");
354fd4d0751SCyndy Ishida   Document.setFileType(FileType::TBD_V3);
355fd4d0751SCyndy Ishida   Document.setTwoLevelNamespace();
356fd4d0751SCyndy Ishida   Document.setApplicationExtensionSafe();
357fd4d0751SCyndy Ishida   Document.setSwiftABIVersion(5);
358*d9a9872eSCyndy Ishida   Document.addSymbol(EncodeKind::GlobalSymbol, "_sym3", Targets);
359*d9a9872eSCyndy Ishida   Document.addSymbol(EncodeKind::GlobalSymbol, "_sym4", Targets);
360fd4d0751SCyndy Ishida   File.addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
361fd4d0751SCyndy Ishida 
362fd4d0751SCyndy Ishida   SmallString<4096> Buffer;
363fd4d0751SCyndy Ishida   raw_svector_ostream OS(Buffer);
3642ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
365fd4d0751SCyndy Ishida   EXPECT_FALSE(Result);
366fd4d0751SCyndy Ishida   EXPECT_STREQ(TBDv3Inlines, Buffer.c_str());
367fd4d0751SCyndy Ishida }
368fd4d0751SCyndy Ishida 
TEST(TBDv3,Platform_macOS)369b978c51cSJuergen Ributzka TEST(TBDv3, Platform_macOS) {
3706d2372ceSCyndy Ishida   static const char TBDv3PlatformMacOS[] = "--- !tapi-tbd-v3\n"
371b978c51cSJuergen Ributzka                                            "archs: [ x86_64 ]\n"
372b978c51cSJuergen Ributzka                                            "platform: macosx\n"
373b978c51cSJuergen Ributzka                                            "install-name: Test.dylib\n"
374b978c51cSJuergen Ributzka                                            "...\n";
375b978c51cSJuergen Ributzka 
3762ba32084SCyndy Ishida   Expected<TBDFile> Result =
3776d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformMacOS, "Test.tbd"));
378b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
3793025c3edSJuergen Ributzka   auto Platform = PLATFORM_MACOS;
3802ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
381b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
38281669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
38381669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
3844274a610SJonas Devlieghere 
3854274a610SJonas Devlieghere   SmallString<4096> Buffer;
3864274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
3872ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
3884274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
3896d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformMacOS),
3904274a610SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
391b978c51cSJuergen Ributzka }
392b978c51cSJuergen Ributzka 
TEST(TBDv3,Platform_iOS)393b978c51cSJuergen Ributzka TEST(TBDv3, Platform_iOS) {
3946d2372ceSCyndy Ishida   static const char TBDv3PlatformiOS[] = "--- !tapi-tbd-v3\n"
395b978c51cSJuergen Ributzka                                          "archs: [ arm64 ]\n"
396b978c51cSJuergen Ributzka                                          "platform: ios\n"
397b978c51cSJuergen Ributzka                                          "install-name: Test.dylib\n"
398b978c51cSJuergen Ributzka                                          "...\n";
399b978c51cSJuergen Ributzka 
4002ba32084SCyndy Ishida   Expected<TBDFile> Result =
4016d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformiOS, "Test.tbd"));
402b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
4033025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
4042ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
405b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
40681669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
40781669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
4084274a610SJonas Devlieghere 
4094274a610SJonas Devlieghere   SmallString<4096> Buffer;
4104274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
4112ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4124274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
4136d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformiOS), stripWhitespace(Buffer.c_str()));
414b978c51cSJuergen Ributzka }
415b978c51cSJuergen Ributzka 
TEST(TBDv3,Platform_watchOS)416b978c51cSJuergen Ributzka TEST(TBDv3, Platform_watchOS) {
4176d2372ceSCyndy Ishida   static const char TBDv3watchOS[] = "--- !tapi-tbd-v3\n"
418b978c51cSJuergen Ributzka                                      "archs: [ armv7k ]\n"
419b978c51cSJuergen Ributzka                                      "platform: watchos\n"
420b978c51cSJuergen Ributzka                                      "install-name: Test.dylib\n"
421b978c51cSJuergen Ributzka                                      "...\n";
422b978c51cSJuergen Ributzka 
4232ba32084SCyndy Ishida   Expected<TBDFile> Result =
4242ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3watchOS, "Test.tbd"));
425b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
4263025c3edSJuergen Ributzka   auto Platform = PLATFORM_WATCHOS;
4272ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
428b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
42981669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
43081669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
4314274a610SJonas Devlieghere 
4324274a610SJonas Devlieghere   SmallString<4096> Buffer;
4334274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
4342ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4354274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
4366d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3watchOS), stripWhitespace(Buffer.c_str()));
437b978c51cSJuergen Ributzka }
438b978c51cSJuergen Ributzka 
TEST(TBDv3,Platform_tvOS)439b978c51cSJuergen Ributzka TEST(TBDv3, Platform_tvOS) {
4406d2372ceSCyndy Ishida   static const char TBDv3PlatformtvOS[] = "--- !tapi-tbd-v3\n"
441b978c51cSJuergen Ributzka                                           "archs: [ arm64 ]\n"
442b978c51cSJuergen Ributzka                                           "platform: tvos\n"
443b978c51cSJuergen Ributzka                                           "install-name: Test.dylib\n"
444b978c51cSJuergen Ributzka                                           "...\n";
445b978c51cSJuergen Ributzka 
4462ba32084SCyndy Ishida   Expected<TBDFile> Result =
4476d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformtvOS, "Test.tbd"));
448b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
4492ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
4503025c3edSJuergen Ributzka   auto Platform = PLATFORM_TVOS;
451b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
45281669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
45381669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
4544274a610SJonas Devlieghere 
4554274a610SJonas Devlieghere   SmallString<4096> Buffer;
4564274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
4572ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4582ba32084SCyndy Ishida   EXPECT_FALSE(WriteResult);
4596d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformtvOS),
4604274a610SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
461b978c51cSJuergen Ributzka }
462b978c51cSJuergen Ributzka 
TEST(TBDv3,Platform_bridgeOS)463b978c51cSJuergen Ributzka TEST(TBDv3, Platform_bridgeOS) {
4646d2372ceSCyndy Ishida   static const char TBDv3BridgeOS[] = "--- !tapi-tbd-v3\n"
465b978c51cSJuergen Ributzka                                       "archs: [ armv7k ]\n"
466b978c51cSJuergen Ributzka                                       "platform: bridgeos\n"
467b978c51cSJuergen Ributzka                                       "install-name: Test.dylib\n"
468b978c51cSJuergen Ributzka                                       "...\n";
469b978c51cSJuergen Ributzka 
4702ba32084SCyndy Ishida   Expected<TBDFile> Result =
4712ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3BridgeOS, "Test.tbd"));
472b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
4733025c3edSJuergen Ributzka   auto Platform = PLATFORM_BRIDGEOS;
4742ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
475b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
47681669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
47781669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
4784274a610SJonas Devlieghere 
4794274a610SJonas Devlieghere   SmallString<4096> Buffer;
4804274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
4812ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
4824274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
4836d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3BridgeOS), stripWhitespace(Buffer.c_str()));
484b978c51cSJuergen Ributzka }
485b978c51cSJuergen Ributzka 
TEST(TBDv3,Platform_macCatalyst)486d8d99d95SCyndy Ishida TEST(TBDv3, Platform_macCatalyst) {
4876d2372ceSCyndy Ishida   static const char TBDv3PlatformiOSmac[] = "--- !tapi-tbd-v3\n"
488d8d99d95SCyndy Ishida                                             "archs: [ armv7k ]\n"
4899b29de1cSCyndy Ishida                                             "platform: maccatalyst\n"
490d8d99d95SCyndy Ishida                                             "install-name: Test.dylib\n"
491d8d99d95SCyndy Ishida                                             "...\n";
492d8d99d95SCyndy Ishida 
4932ba32084SCyndy Ishida   Expected<TBDFile> Result =
4946d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformiOSmac, "Test.tbd"));
495d8d99d95SCyndy Ishida   EXPECT_TRUE(!!Result);
4963025c3edSJuergen Ributzka   auto Platform = PLATFORM_MACCATALYST;
4972ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
498d8d99d95SCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
499d8d99d95SCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
5004274a610SJonas Devlieghere 
5014274a610SJonas Devlieghere   SmallString<4096> Buffer;
5024274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5032ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5044274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
5056d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformiOSmac),
5066d2372ceSCyndy Ishida             stripWhitespace(Buffer.c_str()));
507d8d99d95SCyndy Ishida }
508d8d99d95SCyndy Ishida 
TEST(TBDv3,Platform_zippered)509d8d99d95SCyndy Ishida TEST(TBDv3, Platform_zippered) {
5106d2372ceSCyndy Ishida   static const char TBDv3PlatformZippered[] = "--- !tapi-tbd-v3\n"
511d8d99d95SCyndy Ishida                                               "archs: [ armv7k ]\n"
512d8d99d95SCyndy Ishida                                               "platform: zippered\n"
513d8d99d95SCyndy Ishida                                               "install-name: Test.dylib\n"
514d8d99d95SCyndy Ishida                                               "...\n";
515d8d99d95SCyndy Ishida 
5162ba32084SCyndy Ishida   Expected<TBDFile> Result =
5176d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformZippered, "Test.tbd"));
518d8d99d95SCyndy Ishida   EXPECT_TRUE(!!Result);
5192ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
520d8d99d95SCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
521d8d99d95SCyndy Ishida 
522d8d99d95SCyndy Ishida   PlatformSet Platforms;
5233025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACOS);
5243025c3edSJuergen Ributzka   Platforms.insert(PLATFORM_MACCATALYST);
525d8d99d95SCyndy Ishida   EXPECT_EQ(Platforms.size(), File->getPlatforms().size());
526d8d99d95SCyndy Ishida   for (auto Platform : File->getPlatforms())
527d8d99d95SCyndy Ishida 	    EXPECT_EQ(Platforms.count(Platform), 1U);
5284274a610SJonas Devlieghere 
5294274a610SJonas Devlieghere   SmallString<4096> Buffer;
5304274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
5312ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5324274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
5336d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformZippered),
5344274a610SJonas Devlieghere             stripWhitespace(Buffer.c_str()));
535d8d99d95SCyndy Ishida }
536d8d99d95SCyndy Ishida 
TEST(TBDv3,Platform_iOSSim)5378c3d0d6aSCyndy Ishida TEST(TBDv3, Platform_iOSSim) {
5386d2372ceSCyndy Ishida   static const char TBDv3PlatformiOSsim[] = "--- !tapi-tbd-v3\n"
5398c3d0d6aSCyndy Ishida                                             "archs: [ x86_64 ]\n"
5408c3d0d6aSCyndy Ishida                                             "platform: ios\n"
5418c3d0d6aSCyndy Ishida                                             "install-name: Test.dylib\n"
5428c3d0d6aSCyndy Ishida                                             "...\n";
5438c3d0d6aSCyndy Ishida 
5442ba32084SCyndy Ishida   Expected<TBDFile> Result =
5456d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformiOSsim, "Test.tbd"));
5468c3d0d6aSCyndy Ishida   EXPECT_TRUE(!!Result);
5473025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOSSIMULATOR;
5482ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
5498c3d0d6aSCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
5508c3d0d6aSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5518c3d0d6aSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
5528c3d0d6aSCyndy Ishida 
5538c3d0d6aSCyndy Ishida   SmallString<4096> Buffer;
5548c3d0d6aSCyndy Ishida   raw_svector_ostream OS(Buffer);
5552ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5568c3d0d6aSCyndy Ishida   EXPECT_TRUE(!WriteResult);
5576d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformiOSsim),
5588c3d0d6aSCyndy Ishida             stripWhitespace(Buffer.c_str()));
5598c3d0d6aSCyndy Ishida }
5608c3d0d6aSCyndy Ishida 
TEST(TBDv3,Platform_watchOSSim)5618c3d0d6aSCyndy Ishida TEST(TBDv3, Platform_watchOSSim) {
5626d2372ceSCyndy Ishida   static const char TBDv3watchOSsim[] = "--- !tapi-tbd-v3\n"
5638c3d0d6aSCyndy Ishida                                         "archs: [ x86_64 ]\n"
5648c3d0d6aSCyndy Ishida                                         "platform: watchos\n"
5658c3d0d6aSCyndy Ishida                                         "install-name: Test.dylib\n"
5668c3d0d6aSCyndy Ishida                                         "...\n";
5678c3d0d6aSCyndy Ishida 
5682ba32084SCyndy Ishida   Expected<TBDFile> Result =
5696d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3watchOSsim, "Test.tbd"));
5708c3d0d6aSCyndy Ishida   EXPECT_TRUE(!!Result);
5713025c3edSJuergen Ributzka   auto Platform = PLATFORM_WATCHOSSIMULATOR;
5722ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
5738c3d0d6aSCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
5748c3d0d6aSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5758c3d0d6aSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
5768c3d0d6aSCyndy Ishida 
5778c3d0d6aSCyndy Ishida   SmallString<4096> Buffer;
5788c3d0d6aSCyndy Ishida   raw_svector_ostream OS(Buffer);
5792ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
5808c3d0d6aSCyndy Ishida   EXPECT_TRUE(!WriteResult);
5816d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3watchOSsim), stripWhitespace(Buffer.c_str()));
5828c3d0d6aSCyndy Ishida }
5838c3d0d6aSCyndy Ishida 
TEST(TBDv3,Platform_tvOSSim)5848c3d0d6aSCyndy Ishida TEST(TBDv3, Platform_tvOSSim) {
5856d2372ceSCyndy Ishida   static const char TBDv3PlatformtvOSsim[] = "--- !tapi-tbd-v3\n"
5868c3d0d6aSCyndy Ishida                                              "archs: [ x86_64 ]\n"
5878c3d0d6aSCyndy Ishida                                              "platform: tvos\n"
5888c3d0d6aSCyndy Ishida                                              "install-name: Test.dylib\n"
5898c3d0d6aSCyndy Ishida                                              "...\n";
5908c3d0d6aSCyndy Ishida 
5912ba32084SCyndy Ishida   Expected<TBDFile> Result =
5926d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3PlatformtvOSsim, "Test.tbd"));
5938c3d0d6aSCyndy Ishida   EXPECT_TRUE(!!Result);
5942ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
5953025c3edSJuergen Ributzka   auto Platform = PLATFORM_TVOSSIMULATOR;
5968c3d0d6aSCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
5978c3d0d6aSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
5988c3d0d6aSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
5998c3d0d6aSCyndy Ishida 
6008c3d0d6aSCyndy Ishida   SmallString<4096> Buffer;
6018c3d0d6aSCyndy Ishida   raw_svector_ostream OS(Buffer);
6022ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6038c3d0d6aSCyndy Ishida   EXPECT_TRUE(!WriteResult);
6046d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3PlatformtvOSsim),
6058c3d0d6aSCyndy Ishida             stripWhitespace(Buffer.c_str()));
6068c3d0d6aSCyndy Ishida }
6078c3d0d6aSCyndy Ishida 
TEST(TBDv3,Arch_arm64e)608a0cd4134SCyndy Ishida TEST(TBDv3, Arch_arm64e) {
609a0cd4134SCyndy Ishida   static const char TBDv3ArchArm64e[] = "--- !tapi-tbd-v3\n"
610a0cd4134SCyndy Ishida                                         "archs: [ arm64, arm64e ]\n"
611a0cd4134SCyndy Ishida                                         "platform: ios\n"
612a0cd4134SCyndy Ishida                                         "install-name: Test.dylib\n"
613a0cd4134SCyndy Ishida                                         "...\n";
614a0cd4134SCyndy Ishida 
6152ba32084SCyndy Ishida   Expected<TBDFile> Result =
616a0cd4134SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3ArchArm64e, "Test.tbd"));
617a0cd4134SCyndy Ishida   EXPECT_TRUE(!!Result);
6182ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
6193025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
620a0cd4134SCyndy Ishida   auto Archs = AK_arm64 | AK_arm64e;
621a0cd4134SCyndy Ishida   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
622a0cd4134SCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
623a0cd4134SCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
624a0cd4134SCyndy Ishida   EXPECT_EQ(Archs, File->getArchitectures());
625a0cd4134SCyndy Ishida 
626a0cd4134SCyndy Ishida   SmallString<4096> Buffer;
627a0cd4134SCyndy Ishida   raw_svector_ostream OS(Buffer);
6282ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
629a0cd4134SCyndy Ishida   EXPECT_TRUE(!WriteResult);
630a0cd4134SCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3ArchArm64e), stripWhitespace(Buffer.c_str()));
631a0cd4134SCyndy Ishida }
632a0cd4134SCyndy Ishida 
TEST(TBDv3,Swift_1_0)633b978c51cSJuergen Ributzka TEST(TBDv3, Swift_1_0) {
6346d2372ceSCyndy Ishida   static const char TBDv3Swift1[] = "--- !tapi-tbd-v3\n"
635b978c51cSJuergen Ributzka                                     "archs: [ arm64 ]\n"
636b978c51cSJuergen Ributzka                                     "platform: ios\n"
637b978c51cSJuergen Ributzka                                     "install-name: Test.dylib\n"
638b978c51cSJuergen Ributzka                                     "swift-abi-version: 1.0\n"
639b978c51cSJuergen Ributzka                                     "...\n";
640b978c51cSJuergen Ributzka 
6412ba32084SCyndy Ishida   Expected<TBDFile> Result =
6422ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift1, "Test.tbd"));
643b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
6442ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
645b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
646b978c51cSJuergen Ributzka   EXPECT_EQ(1U, File->getSwiftABIVersion());
6474274a610SJonas Devlieghere 
6484274a610SJonas Devlieghere   SmallString<4096> Buffer;
6494274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6502ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6514274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
6526d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3Swift1), stripWhitespace(Buffer.c_str()));
653b978c51cSJuergen Ributzka }
654b978c51cSJuergen Ributzka 
TEST(TBDv3,Swift_1_1)655b978c51cSJuergen Ributzka TEST(TBDv3, Swift_1_1) {
6566d2372ceSCyndy Ishida   static const char TBDv3Swift1Dot[] = "--- !tapi-tbd-v3\n"
657b978c51cSJuergen Ributzka                                        "archs: [ arm64 ]\n"
658b978c51cSJuergen Ributzka                                        "platform: ios\n"
659b978c51cSJuergen Ributzka                                        "install-name: Test.dylib\n"
660b978c51cSJuergen Ributzka                                        "swift-abi-version: 1.1\n"
661b978c51cSJuergen Ributzka                                        "...\n";
662b978c51cSJuergen Ributzka 
6632ba32084SCyndy Ishida   Expected<TBDFile> Result =
6642ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift1Dot, "Test.tbd"));
665b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
6662ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
667b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
668b978c51cSJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
6694274a610SJonas Devlieghere 
6704274a610SJonas Devlieghere   SmallString<4096> Buffer;
6714274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6722ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6734274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
6746d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3Swift1Dot), stripWhitespace(Buffer.c_str()));
675b978c51cSJuergen Ributzka }
676b978c51cSJuergen Ributzka 
TEST(TBDv3,Swift_2_0)677b978c51cSJuergen Ributzka TEST(TBDv3, Swift_2_0) {
6786d2372ceSCyndy Ishida   static const char TBDv3Swift2[] = "--- !tapi-tbd-v3\n"
679b978c51cSJuergen Ributzka                                     "archs: [ arm64 ]\n"
680b978c51cSJuergen Ributzka                                     "platform: ios\n"
681b978c51cSJuergen Ributzka                                     "install-name: Test.dylib\n"
682b978c51cSJuergen Ributzka                                     "swift-abi-version: 2.0\n"
683b978c51cSJuergen Ributzka                                     "...\n";
684b978c51cSJuergen Ributzka 
6852ba32084SCyndy Ishida   Expected<TBDFile> Result =
6862ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift2, "Test.tbd"));
687b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
6882ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
689b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
690b978c51cSJuergen Ributzka   EXPECT_EQ(3U, File->getSwiftABIVersion());
6914274a610SJonas Devlieghere 
6924274a610SJonas Devlieghere   SmallString<4096> Buffer;
6934274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
6942ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
6954274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
6966d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3Swift2), stripWhitespace(Buffer.c_str()));
697b978c51cSJuergen Ributzka }
698b978c51cSJuergen Ributzka 
TEST(TBDv3,Swift_3_0)699b978c51cSJuergen Ributzka TEST(TBDv3, Swift_3_0) {
7006d2372ceSCyndy Ishida   static const char TBDv3Swift3[] = "--- !tapi-tbd-v3\n"
701b978c51cSJuergen Ributzka                                     "archs: [ arm64 ]\n"
702b978c51cSJuergen Ributzka                                     "platform: ios\n"
703b978c51cSJuergen Ributzka                                     "install-name: Test.dylib\n"
704b978c51cSJuergen Ributzka                                     "swift-abi-version: 3.0\n"
705b978c51cSJuergen Ributzka                                     "...\n";
706b978c51cSJuergen Ributzka 
7072ba32084SCyndy Ishida   Expected<TBDFile> Result =
7082ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift3, "Test.tbd"));
709b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
7102ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
711b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
712b978c51cSJuergen Ributzka   EXPECT_EQ(4U, File->getSwiftABIVersion());
7134274a610SJonas Devlieghere 
7144274a610SJonas Devlieghere   SmallString<4096> Buffer;
7154274a610SJonas Devlieghere   raw_svector_ostream OS(Buffer);
7162ba32084SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
7174274a610SJonas Devlieghere   EXPECT_TRUE(!WriteResult);
7186d2372ceSCyndy Ishida   EXPECT_EQ(stripWhitespace(TBDv3Swift3), stripWhitespace(Buffer.c_str()));
719b978c51cSJuergen Ributzka }
720b978c51cSJuergen Ributzka 
TEST(TBDv3,Swift_4_0)721b978c51cSJuergen Ributzka TEST(TBDv3, Swift_4_0) {
7226d2372ceSCyndy Ishida   static const char TBDv3Swift4[] = "--- !tapi-tbd-v3\n"
723b978c51cSJuergen Ributzka                                     "archs: [ arm64 ]\n"
724b978c51cSJuergen Ributzka                                     "platform: ios\n"
725b978c51cSJuergen Ributzka                                     "install-name: Test.dylib\n"
726b978c51cSJuergen Ributzka                                     "swift-abi-version: 4.0\n"
727b978c51cSJuergen Ributzka                                     "...\n";
728b978c51cSJuergen Ributzka 
7292ba32084SCyndy Ishida   Expected<TBDFile> Result =
7302ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift4, "Test.tbd"));
731b978c51cSJuergen Ributzka   EXPECT_FALSE(!!Result);
7322ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
733b978c51cSJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:5:20: error: invalid Swift ABI "
734b978c51cSJuergen Ributzka             "version.\nswift-abi-version: 4.0\n                   ^~~\n",
7352ba32084SCyndy Ishida             ErrorMessage);
736b978c51cSJuergen Ributzka }
737b978c51cSJuergen Ributzka 
TEST(TBDv3,Swift_5)738b978c51cSJuergen Ributzka TEST(TBDv3, Swift_5) {
7396d2372ceSCyndy Ishida   static const char TBDv3Swift5[] = "--- !tapi-tbd-v3\n"
740b978c51cSJuergen Ributzka                                     "archs: [ arm64 ]\n"
741b978c51cSJuergen Ributzka                                     "platform: ios\n"
742b978c51cSJuergen Ributzka                                     "install-name: Test.dylib\n"
743b978c51cSJuergen Ributzka                                     "swift-abi-version: 5\n"
744b978c51cSJuergen Ributzka                                     "...\n";
745b978c51cSJuergen Ributzka 
7462ba32084SCyndy Ishida   Expected<TBDFile> Result =
7472ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift5, "Test.tbd"));
748b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
7492ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
750b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
751b978c51cSJuergen Ributzka   EXPECT_EQ(5U, File->getSwiftABIVersion());
752b978c51cSJuergen Ributzka }
753b978c51cSJuergen Ributzka 
TEST(TBDv3,Swift_99)754b978c51cSJuergen Ributzka TEST(TBDv3, Swift_99) {
7556d2372ceSCyndy Ishida   static const char TBDv3Swift99[] = "--- !tapi-tbd-v3\n"
756b978c51cSJuergen Ributzka                                      "archs: [ arm64 ]\n"
757b978c51cSJuergen Ributzka                                      "platform: ios\n"
758b978c51cSJuergen Ributzka                                      "install-name: Test.dylib\n"
759b978c51cSJuergen Ributzka                                      "swift-abi-version: 99\n"
760b978c51cSJuergen Ributzka                                      "...\n";
761b978c51cSJuergen Ributzka 
7622ba32084SCyndy Ishida   Expected<TBDFile> Result =
7632ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3Swift99, "Test.tbd"));
764b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
7652ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
766b978c51cSJuergen Ributzka   EXPECT_EQ(FileType::TBD_V3, File->getFileType());
767b978c51cSJuergen Ributzka   EXPECT_EQ(99U, File->getSwiftABIVersion());
768b978c51cSJuergen Ributzka }
769b978c51cSJuergen Ributzka 
TEST(TBDv3,UnknownArchitecture)770b978c51cSJuergen Ributzka TEST(TBDv3, UnknownArchitecture) {
7716d2372ceSCyndy Ishida   static const char TBDv3FileUnknownArch[] = "--- !tapi-tbd-v3\n"
772b978c51cSJuergen Ributzka                                              "archs: [ foo ]\n"
773b978c51cSJuergen Ributzka                                              "platform: macosx\n"
774b978c51cSJuergen Ributzka                                              "install-name: Test.dylib\n"
775b978c51cSJuergen Ributzka                                              "...\n";
776b978c51cSJuergen Ributzka 
7772ba32084SCyndy Ishida   Expected<TBDFile> Result =
7786d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3FileUnknownArch, "Test.tbd"));
779b978c51cSJuergen Ributzka   EXPECT_TRUE(!!Result);
780b978c51cSJuergen Ributzka }
781b978c51cSJuergen Ributzka 
TEST(TBDv3,UnknownPlatform)782b978c51cSJuergen Ributzka TEST(TBDv3, UnknownPlatform) {
7836d2372ceSCyndy Ishida   static const char TBDv3FileUnknownPlatform[] = "--- !tapi-tbd-v3\n"
784b978c51cSJuergen Ributzka                                                  "archs: [ i386 ]\n"
785b978c51cSJuergen Ributzka                                                  "platform: newOS\n"
786b978c51cSJuergen Ributzka                                                  "...\n";
787b978c51cSJuergen Ributzka 
7882ba32084SCyndy Ishida   Expected<TBDFile> Result =
7896d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3FileUnknownPlatform, "Test.tbd"));
790b978c51cSJuergen Ributzka   EXPECT_FALSE(!!Result);
7912ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
792b978c51cSJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:3:11: error: unknown platform\nplatform: "
793b978c51cSJuergen Ributzka             "newOS\n          ^~~~~\n",
7942ba32084SCyndy Ishida             ErrorMessage);
795b978c51cSJuergen Ributzka }
796b978c51cSJuergen Ributzka 
TEST(TBDv3,MalformedFile1)797b978c51cSJuergen Ributzka TEST(TBDv3, MalformedFile1) {
7986d2372ceSCyndy Ishida   static const char TBDv3FileMalformed1[] = "--- !tapi-tbd-v3\n"
799b978c51cSJuergen Ributzka                                             "archs: [ arm64 ]\n"
800b978c51cSJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
801b978c51cSJuergen Ributzka                                             "...\n";
802b978c51cSJuergen Ributzka 
8032ba32084SCyndy Ishida   Expected<TBDFile> Result =
8046d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3FileMalformed1, "Test.tbd"));
805b978c51cSJuergen Ributzka   EXPECT_FALSE(!!Result);
8062ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
807b978c51cSJuergen Ributzka   ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
808b978c51cSJuergen Ributzka             "'platform'\narchs: [ arm64 ]\n^\n",
8092ba32084SCyndy Ishida             ErrorMessage);
810b978c51cSJuergen Ributzka }
811b978c51cSJuergen Ributzka 
TEST(TBDv3,MalformedFile2)812b978c51cSJuergen Ributzka TEST(TBDv3, MalformedFile2) {
8136d2372ceSCyndy Ishida   static const char TBDv3FileMalformed2[] = "--- !tapi-tbd-v3\n"
814b978c51cSJuergen Ributzka                                             "archs: [ arm64 ]\n"
815b978c51cSJuergen Ributzka                                             "platform: ios\n"
816b978c51cSJuergen Ributzka                                             "install-name: Test.dylib\n"
817b978c51cSJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
818b978c51cSJuergen Ributzka                                             "...\n";
819b978c51cSJuergen Ributzka 
8202ba32084SCyndy Ishida   Expected<TBDFile> Result =
8216d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv3FileMalformed2, "Test.tbd"));
822b978c51cSJuergen Ributzka   EXPECT_FALSE(!!Result);
8232ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
824b978c51cSJuergen Ributzka   ASSERT_EQ(
825d380c38eSNathan James       "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
826d380c38eSNathan James       "\"Unsupported key\"\n^~~~~~\n",
8272ba32084SCyndy Ishida       ErrorMessage);
828b978c51cSJuergen Ributzka }
829b978c51cSJuergen Ributzka 
TEST(TBDv3,InterfaceEquality)830eb2eeeb7SSam Powell TEST(TBDv3, InterfaceEquality) {
831eb2eeeb7SSam Powell   static const char TBDv3File[] =
832eb2eeeb7SSam Powell       "--- !tapi-tbd-v3\n"
833eb2eeeb7SSam Powell       "archs: [ armv7, arm64 ]\n"
834eb2eeeb7SSam Powell       "uuids: [ 'armv7: 00000000-0000-0000-0000-000000000000',\n"
835eb2eeeb7SSam Powell       "         'arm64: 11111111-1111-1111-1111-111111111111']\n"
836eb2eeeb7SSam Powell       "platform: ios\n"
837eb2eeeb7SSam Powell       "flags: [ installapi ]\n"
838eb2eeeb7SSam Powell       "install-name: Test.dylib\n"
839eb2eeeb7SSam Powell       "current-version: 2.3.4\n"
840eb2eeeb7SSam Powell       "compatibility-version: 1.0\n"
841eb2eeeb7SSam Powell       "swift-abi-version: 1.1\n"
842eb2eeeb7SSam Powell       "parent-umbrella: Umbrella.dylib\n"
843eb2eeeb7SSam Powell       "exports:\n"
844eb2eeeb7SSam Powell       "  - archs: [ armv7, arm64 ]\n"
845eb2eeeb7SSam Powell       "    allowable-clients: [ clientA ]\n"
846eb2eeeb7SSam Powell       "    re-exports: [ /usr/lib/libfoo.dylib ]\n"
847eb2eeeb7SSam Powell       "    symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
848eb2eeeb7SSam Powell       "    objc-classes: [ class1, class2 ]\n"
849eb2eeeb7SSam Powell       "    objc-eh-types: [ class1 ]\n"
850eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar1, class1._ivar2 ]\n"
851eb2eeeb7SSam Powell       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
852eb2eeeb7SSam Powell       "    thread-local-symbols: [ _tlv1, _tlv3 ]\n"
853eb2eeeb7SSam Powell       "  - archs: [ armv7 ]\n"
854eb2eeeb7SSam Powell       "    symbols: [ _sym5 ]\n"
855eb2eeeb7SSam Powell       "    objc-classes: [ class3 ]\n"
856eb2eeeb7SSam Powell       "    objc-ivars: [ class1._ivar3 ]\n"
857eb2eeeb7SSam Powell       "    weak-def-symbols: [ _weak3 ]\n"
858eb2eeeb7SSam Powell       "    thread-local-symbols: [ _tlv3 ]\n"
859eb2eeeb7SSam Powell       "--- !tapi-tbd-v3\n"
860eb2eeeb7SSam Powell       "archs:           [ i386 ]\n"
861eb2eeeb7SSam Powell       "platform:        macosx\n"
862eb2eeeb7SSam Powell       "install-name:    '/usr/lib/libbar.dylib'\n"
863eb2eeeb7SSam Powell       "current-version: 0\n"
864eb2eeeb7SSam Powell       "compatibility-version: 0\n"
865eb2eeeb7SSam Powell       "swift-abi-version: 5\n"
866eb2eeeb7SSam Powell       "objc-constraint: none\n"
867eb2eeeb7SSam Powell       "exports:\n"
868eb2eeeb7SSam Powell       "  - archs:           [ i386 ]\n"
869eb2eeeb7SSam Powell       "    symbols:         [ _sym3, _sym4 ]\n"
870eb2eeeb7SSam Powell       "...\n";
871eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
872eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestA.tbd"));
873eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
874eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
875eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
876eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestB.tbd"));
877eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
878eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
879eb2eeeb7SSam Powell   EXPECT_FALSE(FileA.getPath() == FileB.getPath());
880eb2eeeb7SSam Powell   EXPECT_TRUE(FileA == FileB);
881eb2eeeb7SSam Powell }
882eb2eeeb7SSam Powell 
883eb2eeeb7SSam Powell 
884eb2eeeb7SSam Powell 
TEST(TBDv3,InterfaceInequality)885eb2eeeb7SSam Powell TEST(TBDv3, InterfaceInequality) {
886eb2eeeb7SSam Powell   static const char TBDv3File[] = "--- !tapi-tbd-v3\n"
887eb2eeeb7SSam Powell                                   "archs: [ armv7, arm64 ]\n"
888eb2eeeb7SSam Powell                                   "platform: ios\n"
889eb2eeeb7SSam Powell                                   "install-name: Test.dylib\n"
890eb2eeeb7SSam Powell                                   "...\n";
891eb2eeeb7SSam Powell 
892eb2eeeb7SSam Powell   Expected<TBDFile> ResultA =
893eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestA.tbd"));
894eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultA);
895eb2eeeb7SSam Powell   InterfaceFile FileA = std::move(*ResultA.get());
896eb2eeeb7SSam Powell   Expected<TBDFile> ResultB =
897eb2eeeb7SSam Powell       TextAPIReader::get(MemoryBufferRef(TBDv3File, "TestB.tbd"));
898eb2eeeb7SSam Powell   EXPECT_TRUE(!!ResultB);
899eb2eeeb7SSam Powell   InterfaceFile FileB = std::move(*ResultB.get());
900eb2eeeb7SSam Powell 
901eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9023025c3edSJuergen Ributzka     File->addTarget(Target(AK_x86_64, PLATFORM_IOS));
903eb2eeeb7SSam Powell   }));
904eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
905eb2eeeb7SSam Powell     File->setCurrentVersion(PackedVersion(1, 2, 3));
906eb2eeeb7SSam Powell     File->setCompatibilityVersion(PackedVersion(1, 0, 0));
907eb2eeeb7SSam Powell   }));
908eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(
909eb2eeeb7SSam Powell       FileA, FileB, [](InterfaceFile *File) { File->setSwiftABIVersion(5); }));
910eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
911eb2eeeb7SSam Powell     File->setTwoLevelNamespace(false);
912eb2eeeb7SSam Powell   }));
913eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
914eb2eeeb7SSam Powell     File->setApplicationExtensionSafe(false);
915eb2eeeb7SSam Powell   }));
916eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9173025c3edSJuergen Ributzka     File->addParentUmbrella(Target(AK_armv7, PLATFORM_IOS), "Umbrella.dylib");
918eb2eeeb7SSam Powell   }));
919eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
9203025c3edSJuergen Ributzka     File->addAllowableClient("ClientA", Target(AK_armv7, PLATFORM_IOS));
921eb2eeeb7SSam Powell   }));
922eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
923eb2eeeb7SSam Powell     File->addReexportedLibrary("/System/Library/Frameworks/A.framework/A",
9243025c3edSJuergen Ributzka                                Target(AK_armv7, PLATFORM_IOS));
925eb2eeeb7SSam Powell   }));
926eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
927*d9a9872eSCyndy Ishida     File->addSymbol(EncodeKind::GlobalSymbol, "_symA",
9283025c3edSJuergen Ributzka                     {Target(AK_arm64, PLATFORM_IOS)});
929eb2eeeb7SSam Powell   }));
930eb2eeeb7SSam Powell   EXPECT_TRUE(checkEqualityOnTransform(FileA, FileB, [](InterfaceFile *File) {
931eb2eeeb7SSam Powell     InterfaceFile Document;
932e61e7616SCyndy Ishida     Document.setFileType(FileType::TBD_V3);
9333025c3edSJuergen Ributzka     Document.addTargets(TargetList{Target(AK_armv7, PLATFORM_IOS),
9343025c3edSJuergen Ributzka                                    Target(AK_arm64, PLATFORM_IOS)});
935eb2eeeb7SSam Powell     Document.setInstallName("/System/Library/Frameworks/A.framework/A");
936eb2eeeb7SSam Powell     File->addDocument(std::make_shared<InterfaceFile>(std::move(Document)));
937eb2eeeb7SSam Powell   }));
938eb2eeeb7SSam Powell }
939eb2eeeb7SSam Powell 
940b978c51cSJuergen Ributzka } // namespace TBDv3
941