xref: /llvm-project/llvm/unittests/TextAPI/TextStubV2Tests.cpp (revision d9a9872ec4760762fdc467ef283cea302a3742e5)
132cb5941SJuergen Ributzka //===-- TextStubV2Tests.cpp - TBD V2 File Test ----------------------------===//
232cb5941SJuergen Ributzka //
332cb5941SJuergen Ributzka // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
432cb5941SJuergen Ributzka // See https://llvm.org/LICENSE.txt for license information.
532cb5941SJuergen Ributzka // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
632cb5941SJuergen Ributzka //
732cb5941SJuergen 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"
1232cb5941SJuergen Ributzka #include "gtest/gtest.h"
1332cb5941SJuergen Ributzka #include <string>
1432cb5941SJuergen Ributzka #include <vector>
1532cb5941SJuergen Ributzka 
1632cb5941SJuergen Ributzka using namespace llvm;
1732cb5941SJuergen Ributzka using namespace llvm::MachO;
1832cb5941SJuergen Ributzka 
1932cb5941SJuergen Ributzka static ExportedSymbol TBDv2Symbols[] = {
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, "_tlv2", false, true},
28*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_tlv3", false, true},
29*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak1", true, false},
30*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak2", true, false},
31*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak3", true, false},
32*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class1", false, false},
33*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class2", false, false},
34*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class3", 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},
3832cb5941SJuergen Ributzka };
3932cb5941SJuergen Ributzka 
4032cb5941SJuergen Ributzka namespace TBDv2 {
4132cb5941SJuergen Ributzka 
TEST(TBDv2,ReadFile)4232cb5941SJuergen Ributzka TEST(TBDv2, ReadFile) {
436d2372ceSCyndy Ishida   static const char TBDv2File1[] =
4432cb5941SJuergen Ributzka       "--- !tapi-tbd-v2\n"
4532cb5941SJuergen Ributzka       "archs: [ armv7, armv7s, armv7k, arm64 ]\n"
4632cb5941SJuergen Ributzka       "platform: ios\n"
4732cb5941SJuergen Ributzka       "flags: [ installapi ]\n"
4832cb5941SJuergen Ributzka       "install-name: Test.dylib\n"
4932cb5941SJuergen Ributzka       "current-version: 2.3.4\n"
5032cb5941SJuergen Ributzka       "compatibility-version: 1.0\n"
5132cb5941SJuergen Ributzka       "swift-version: 1.1\n"
5232cb5941SJuergen Ributzka       "parent-umbrella: Umbrella.dylib\n"
5332cb5941SJuergen Ributzka       "exports:\n"
5432cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k, arm64 ]\n"
5532cb5941SJuergen Ributzka       "    allowable-clients: [ clientA ]\n"
5632cb5941SJuergen Ributzka       "    re-exports: [ /usr/lib/libfoo.dylib ]\n"
5732cb5941SJuergen Ributzka       "    symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
5832cb5941SJuergen Ributzka       "    objc-classes: [ _class1, _class2 ]\n"
5932cb5941SJuergen Ributzka       "    objc-ivars: [ _class1._ivar1, _class1._ivar2 ]\n"
6032cb5941SJuergen Ributzka       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
6132cb5941SJuergen Ributzka       "    thread-local-symbols: [ _tlv1, _tlv2 ]\n"
6232cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k ]\n"
6332cb5941SJuergen Ributzka       "    symbols: [ _sym5 ]\n"
6432cb5941SJuergen Ributzka       "    objc-classes: [ _class3 ]\n"
6532cb5941SJuergen Ributzka       "    objc-ivars: [ _class1._ivar3 ]\n"
6632cb5941SJuergen Ributzka       "    weak-def-symbols: [ _weak3 ]\n"
6732cb5941SJuergen Ributzka       "    thread-local-symbols: [ _tlv3 ]\n"
6832cb5941SJuergen Ributzka       "...\n";
6932cb5941SJuergen Ributzka 
702ba32084SCyndy Ishida   Expected<TBDFile> Result =
712ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2File1, "Test.tbd"));
7232cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
732ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
7432cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
75875565e5SJuergen Ributzka   auto Archs = AK_armv7 | AK_armv7s | AK_armv7k | AK_arm64;
763025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
7781669d5eSCyndy Ishida   TargetList Targets;
7881669d5eSCyndy Ishida   for (auto &&arch : Archs)
7981669d5eSCyndy Ishida     Targets.emplace_back(Target(arch, Platform));
8032cb5941SJuergen Ributzka   EXPECT_EQ(Archs, File->getArchitectures());
8181669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
8281669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
8332cb5941SJuergen Ributzka   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
8432cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(2, 3, 4), File->getCurrentVersion());
8532cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
8632cb5941SJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
8732cb5941SJuergen Ributzka   EXPECT_EQ(ObjCConstraintType::Retain_Release, File->getObjCConstraint());
8832cb5941SJuergen Ributzka   EXPECT_TRUE(File->isTwoLevelNamespace());
8932cb5941SJuergen Ributzka   EXPECT_TRUE(File->isApplicationExtensionSafe());
9081669d5eSCyndy Ishida   InterfaceFileRef client("clientA", Targets);
9181669d5eSCyndy Ishida   InterfaceFileRef reexport("/usr/lib/libfoo.dylib", Targets);
9232cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->allowableClients().size());
9332cb5941SJuergen Ributzka   EXPECT_EQ(client, File->allowableClients().front());
9432cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->reexportedLibraries().size());
9532cb5941SJuergen Ributzka   EXPECT_EQ(reexport, File->reexportedLibraries().front());
9632cb5941SJuergen Ributzka 
9732cb5941SJuergen Ributzka   ExportedSymbolSeq Exports;
9832cb5941SJuergen Ributzka   for (const auto *Sym : File->symbols()) {
9932cb5941SJuergen Ributzka     EXPECT_FALSE(Sym->isWeakReferenced());
10032cb5941SJuergen Ributzka     EXPECT_FALSE(Sym->isUndefined());
101adcd0268SBenjamin Kramer     Exports.emplace_back(
102adcd0268SBenjamin Kramer         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
103adcd0268SBenjamin Kramer                        Sym->isWeakDefined(), Sym->isThreadLocalValue()});
10432cb5941SJuergen Ributzka   }
105cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
10632cb5941SJuergen Ributzka 
107589725f6SKazu Hirata   EXPECT_EQ(std::size(TBDv2Symbols), Exports.size());
10832cb5941SJuergen Ributzka   EXPECT_TRUE(
10932cb5941SJuergen Ributzka       std::equal(Exports.begin(), Exports.end(), std::begin(TBDv2Symbols)));
11032cb5941SJuergen Ributzka }
11132cb5941SJuergen Ributzka 
TEST(TBDv2,ReadFile2)11232cb5941SJuergen Ributzka TEST(TBDv2, ReadFile2) {
1136d2372ceSCyndy Ishida   static const char TBDv2File2[] =
11432cb5941SJuergen Ributzka       "--- !tapi-tbd-v2\n"
11532cb5941SJuergen Ributzka       "archs: [ armv7, armv7s, armv7k, arm64 ]\n"
11632cb5941SJuergen Ributzka       "platform: ios\n"
11732cb5941SJuergen Ributzka       "flags: [ flat_namespace, not_app_extension_safe ]\n"
11832cb5941SJuergen Ributzka       "install-name: Test.dylib\n"
11932cb5941SJuergen Ributzka       "swift-version: 1.1\n"
12032cb5941SJuergen Ributzka       "exports:\n"
12132cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k, arm64 ]\n"
12232cb5941SJuergen Ributzka       "    symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
12332cb5941SJuergen Ributzka       "    objc-classes: [ _class1, _class2 ]\n"
12432cb5941SJuergen Ributzka       "    objc-ivars: [ _class1._ivar1, _class1._ivar2 ]\n"
12532cb5941SJuergen Ributzka       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
12632cb5941SJuergen Ributzka       "    thread-local-symbols: [ _tlv1, _tlv2 ]\n"
12732cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k ]\n"
12832cb5941SJuergen Ributzka       "    symbols: [ _sym5 ]\n"
12932cb5941SJuergen Ributzka       "    objc-classes: [ _class3 ]\n"
13032cb5941SJuergen Ributzka       "    objc-ivars: [ _class1._ivar3 ]\n"
13132cb5941SJuergen Ributzka       "    weak-def-symbols: [ _weak3 ]\n"
13232cb5941SJuergen Ributzka       "    thread-local-symbols: [ _tlv3 ]\n"
13332cb5941SJuergen Ributzka       "undefineds:\n"
13432cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k, arm64 ]\n"
13532cb5941SJuergen Ributzka       "    symbols: [ _undefSym1, _undefSym2, _undefSym3 ]\n"
13632cb5941SJuergen Ributzka       "    objc-classes: [ _undefClass1, _undefClass2 ]\n"
13732cb5941SJuergen Ributzka       "    objc-ivars: [ _undefClass1._ivar1, _undefClass1._ivar2 ]\n"
13832cb5941SJuergen Ributzka       "    weak-ref-symbols: [ _undefWeak1, _undefWeak2 ]\n"
13932cb5941SJuergen Ributzka       "...\n";
14032cb5941SJuergen Ributzka 
1412ba32084SCyndy Ishida   Expected<TBDFile> Result =
1422ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2File2, "Test.tbd"));
14332cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
1442ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
14532cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
146875565e5SJuergen Ributzka   auto Archs = AK_armv7 | AK_armv7s | AK_armv7k | AK_arm64;
1473025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
14881669d5eSCyndy Ishida   TargetList Targets;
14981669d5eSCyndy Ishida   for (auto &&arch : Archs)
15081669d5eSCyndy Ishida     Targets.emplace_back(Target(arch, Platform));
15132cb5941SJuergen Ributzka   EXPECT_EQ(Archs, File->getArchitectures());
15281669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
15381669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
15432cb5941SJuergen Ributzka   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
15532cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion());
15632cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
15732cb5941SJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
15832cb5941SJuergen Ributzka   EXPECT_EQ(ObjCConstraintType::Retain_Release, File->getObjCConstraint());
15932cb5941SJuergen Ributzka   EXPECT_FALSE(File->isTwoLevelNamespace());
16032cb5941SJuergen Ributzka   EXPECT_FALSE(File->isApplicationExtensionSafe());
16132cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->allowableClients().size());
16232cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->reexportedLibraries().size());
16332cb5941SJuergen Ributzka }
16432cb5941SJuergen Ributzka 
TEST(TBDv2,WriteFile)16532cb5941SJuergen Ributzka TEST(TBDv2, WriteFile) {
1666d2372ceSCyndy Ishida   static const char TBDv2File3[] =
16732cb5941SJuergen Ributzka       "--- !tapi-tbd-v2\n"
16832cb5941SJuergen Ributzka       "archs:           [ i386, x86_64 ]\n"
16932cb5941SJuergen Ributzka       "platform:        macosx\n"
17032cb5941SJuergen Ributzka       "install-name:    '/usr/lib/libfoo.dylib'\n"
17132cb5941SJuergen Ributzka       "current-version: 1.2.3\n"
17232cb5941SJuergen Ributzka       "compatibility-version: 0\n"
17332cb5941SJuergen Ributzka       "swift-version:   5\n"
17432cb5941SJuergen Ributzka       "exports:\n"
17532cb5941SJuergen Ributzka       "  - archs:           [ i386 ]\n"
17632cb5941SJuergen Ributzka       "    symbols:         [ _sym1 ]\n"
17732cb5941SJuergen Ributzka       "    weak-def-symbols: [ _sym2 ]\n"
17832cb5941SJuergen Ributzka       "    thread-local-symbols: [ _sym3 ]\n"
17932cb5941SJuergen Ributzka       "  - archs:           [ x86_64 ]\n"
18032cb5941SJuergen Ributzka       "    allowable-clients: [ clientA ]\n"
18132cb5941SJuergen Ributzka       "    re-exports:      [ '/usr/lib/libfoo.dylib' ]\n"
18232cb5941SJuergen Ributzka       "    symbols:         [ '_OBJC_EHTYPE_$_Class1' ]\n"
18332cb5941SJuergen Ributzka       "    objc-classes:    [ _Class1 ]\n"
18432cb5941SJuergen Ributzka       "    objc-ivars:      [ _Class1._ivar1 ]\n"
18532cb5941SJuergen Ributzka       "...\n";
18632cb5941SJuergen Ributzka 
18732cb5941SJuergen Ributzka   InterfaceFile File;
18881669d5eSCyndy Ishida   TargetList Targets;
18981669d5eSCyndy Ishida   for (auto &&arch : AK_i386 | AK_x86_64)
1903025c3edSJuergen Ributzka     Targets.emplace_back(Target(arch, PLATFORM_MACOS));
19132cb5941SJuergen Ributzka   File.setPath("libfoo.dylib");
19232cb5941SJuergen Ributzka   File.setInstallName("/usr/lib/libfoo.dylib");
19332cb5941SJuergen Ributzka   File.setFileType(FileType::TBD_V2);
19481669d5eSCyndy Ishida   File.addTargets(Targets);
19532cb5941SJuergen Ributzka   File.setCurrentVersion(PackedVersion(1, 2, 3));
19632cb5941SJuergen Ributzka   File.setTwoLevelNamespace();
19732cb5941SJuergen Ributzka   File.setApplicationExtensionSafe();
19832cb5941SJuergen Ributzka   File.setSwiftABIVersion(5);
19932cb5941SJuergen Ributzka   File.setObjCConstraint(ObjCConstraintType::Retain_Release);
20081669d5eSCyndy Ishida   File.addAllowableClient("clientA", Targets[1]);
20181669d5eSCyndy Ishida   File.addReexportedLibrary("/usr/lib/libfoo.dylib", Targets[1]);
202*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym1", {Targets[0]});
203*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym2", {Targets[0]},
20432cb5941SJuergen Ributzka                  SymbolFlags::WeakDefined);
205*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym3", {Targets[0]},
20632cb5941SJuergen Ributzka                  SymbolFlags::ThreadLocalValue);
207*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "Class1", {Targets[1]});
208*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
209*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "Class1._ivar1",
21081669d5eSCyndy Ishida                  {Targets[1]});
21132cb5941SJuergen Ributzka 
21232cb5941SJuergen Ributzka   SmallString<4096> Buffer;
21332cb5941SJuergen Ributzka   raw_svector_ostream OS(Buffer);
2142ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
21532cb5941SJuergen Ributzka   EXPECT_FALSE(Result);
2166d2372ceSCyndy Ishida   EXPECT_STREQ(TBDv2File3, Buffer.c_str());
21732cb5941SJuergen Ributzka }
21832cb5941SJuergen Ributzka 
TEST(TBDv2,Platform_macOS)21932cb5941SJuergen Ributzka TEST(TBDv2, Platform_macOS) {
2206d2372ceSCyndy Ishida   static const char TBDv2PlatformMacOS[] = "--- !tapi-tbd-v2\n"
22132cb5941SJuergen Ributzka                                            "archs: [ x86_64 ]\n"
22232cb5941SJuergen Ributzka                                            "platform: macosx\n"
22332cb5941SJuergen Ributzka                                            "install-name: Test.dylib\n"
22432cb5941SJuergen Ributzka                                            "...\n";
22532cb5941SJuergen Ributzka 
2262ba32084SCyndy Ishida   Expected<TBDFile> Result =
2276d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2PlatformMacOS, "Test.tbd"));
22832cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2292ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
2303025c3edSJuergen Ributzka   auto Platform = PLATFORM_MACOS;
23132cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
23281669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
23381669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
23432cb5941SJuergen Ributzka }
23532cb5941SJuergen Ributzka 
TEST(TBDv2,Platform_iOS)23632cb5941SJuergen Ributzka TEST(TBDv2, Platform_iOS) {
2376d2372ceSCyndy Ishida   static const char TBDv2PlatformiOS[] = "--- !tapi-tbd-v2\n"
23832cb5941SJuergen Ributzka                                          "archs: [ arm64 ]\n"
23932cb5941SJuergen Ributzka                                          "platform: ios\n"
24032cb5941SJuergen Ributzka                                          "install-name: Test.dylib\n"
24132cb5941SJuergen Ributzka                                          "...\n";
24232cb5941SJuergen Ributzka 
2432ba32084SCyndy Ishida   Expected<TBDFile> Result =
2446d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2PlatformiOS, "Test.tbd"));
24532cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2463025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
2472ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
24832cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
24981669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
25081669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
25132cb5941SJuergen Ributzka }
25232cb5941SJuergen Ributzka 
TEST(TBDv2,Platform_watchOS)25332cb5941SJuergen Ributzka TEST(TBDv2, Platform_watchOS) {
2546d2372ceSCyndy Ishida   static const char TBDv2PlatformWatchOS[] = "--- !tapi-tbd-v2\n"
25532cb5941SJuergen Ributzka                                              "archs: [ armv7k ]\n"
25632cb5941SJuergen Ributzka                                              "platform: watchos\n"
25732cb5941SJuergen Ributzka                                              "install-name: Test.dylib\n"
25832cb5941SJuergen Ributzka                                              "...\n";
25932cb5941SJuergen Ributzka 
2602ba32084SCyndy Ishida   Expected<TBDFile> Result =
2616d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2PlatformWatchOS, "Test.tbd"));
26232cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2633025c3edSJuergen Ributzka   auto Platform = PLATFORM_WATCHOS;
2642ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
26532cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
26681669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
26781669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
26832cb5941SJuergen Ributzka }
26932cb5941SJuergen Ributzka 
TEST(TBDv2,Platform_tvOS)27032cb5941SJuergen Ributzka TEST(TBDv2, Platform_tvOS) {
2716d2372ceSCyndy Ishida   static const char TBDv2PlatformtvOS[] = "--- !tapi-tbd-v2\n"
27232cb5941SJuergen Ributzka                                           "archs: [ arm64 ]\n"
27332cb5941SJuergen Ributzka                                           "platform: tvos\n"
27432cb5941SJuergen Ributzka                                           "install-name: Test.dylib\n"
27532cb5941SJuergen Ributzka                                           "...\n";
27632cb5941SJuergen Ributzka 
2772ba32084SCyndy Ishida   Expected<TBDFile> Result =
2786d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2PlatformtvOS, "Test.tbd"));
27932cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2803025c3edSJuergen Ributzka   auto Platform = PLATFORM_TVOS;
2812ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
28232cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
28381669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
28481669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
28532cb5941SJuergen Ributzka }
28632cb5941SJuergen Ributzka 
TEST(TBDv2,Platform_bridgeOS)28732cb5941SJuergen Ributzka TEST(TBDv2, Platform_bridgeOS) {
2886d2372ceSCyndy Ishida   static const char TBDv2BridgeOS[] = "--- !tapi-tbd-v2\n"
28932cb5941SJuergen Ributzka                                       "archs: [ armv7k ]\n"
29032cb5941SJuergen Ributzka                                       "platform: bridgeos\n"
29132cb5941SJuergen Ributzka                                       "install-name: Test.dylib\n"
29232cb5941SJuergen Ributzka                                       "...\n";
29332cb5941SJuergen Ributzka 
2942ba32084SCyndy Ishida   Expected<TBDFile> Result =
2952ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2BridgeOS, "Test.tbd"));
29632cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2973025c3edSJuergen Ributzka   auto Platform = PLATFORM_BRIDGEOS;
2982ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
29932cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
30081669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
30181669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
30232cb5941SJuergen Ributzka }
30332cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_1_0)30432cb5941SJuergen Ributzka TEST(TBDv2, Swift_1_0) {
3056d2372ceSCyndy Ishida   static const char TBDv2Swift1[] = "--- !tapi-tbd-v2\n"
30632cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
30732cb5941SJuergen Ributzka                                     "platform: ios\n"
30832cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
30932cb5941SJuergen Ributzka                                     "swift-version: 1.0\n"
31032cb5941SJuergen Ributzka                                     "...\n";
31132cb5941SJuergen Ributzka 
3122ba32084SCyndy Ishida   Expected<TBDFile> Result =
3132ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2Swift1, "Test.tbd"));
31432cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3152ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
31632cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
31732cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->getSwiftABIVersion());
31832cb5941SJuergen Ributzka }
31932cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_1_1)32032cb5941SJuergen Ributzka TEST(TBDv2, Swift_1_1) {
3216d2372ceSCyndy Ishida   static const char TBDv2Swift1dot[] = "--- !tapi-tbd-v2\n"
32232cb5941SJuergen Ributzka                                        "archs: [ arm64 ]\n"
32332cb5941SJuergen Ributzka                                        "platform: ios\n"
32432cb5941SJuergen Ributzka                                        "install-name: Test.dylib\n"
32532cb5941SJuergen Ributzka                                        "swift-version: 1.1\n"
32632cb5941SJuergen Ributzka                                        "...\n";
32732cb5941SJuergen Ributzka 
3282ba32084SCyndy Ishida   Expected<TBDFile> Result =
3292ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2Swift1dot, "Test.tbd"));
33032cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3312ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
33232cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
33332cb5941SJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
33432cb5941SJuergen Ributzka }
33532cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_2_0)33632cb5941SJuergen Ributzka TEST(TBDv2, Swift_2_0) {
337b14937cdSJonas Devlieghere   static const char tbd_v2_swift_2_0[] = "--- !tapi-tbd-v2\n"
33832cb5941SJuergen Ributzka                                          "archs: [ arm64 ]\n"
33932cb5941SJuergen Ributzka                                          "platform: ios\n"
34032cb5941SJuergen Ributzka                                          "install-name: Test.dylib\n"
34132cb5941SJuergen Ributzka                                          "swift-version: 2.0\n"
34232cb5941SJuergen Ributzka                                          "...\n";
34332cb5941SJuergen Ributzka 
3442ba32084SCyndy Ishida   Expected<TBDFile> Result =
345b14937cdSJonas Devlieghere       TextAPIReader::get(MemoryBufferRef(tbd_v2_swift_2_0, "Test.tbd"));
34632cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3472ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
34832cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
34932cb5941SJuergen Ributzka   EXPECT_EQ(3U, File->getSwiftABIVersion());
35032cb5941SJuergen Ributzka }
35132cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_3_0)35232cb5941SJuergen Ributzka TEST(TBDv2, Swift_3_0) {
3536d2372ceSCyndy Ishida   static const char TBDv2Swift3[] = "--- !tapi-tbd-v2\n"
35432cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
35532cb5941SJuergen Ributzka                                     "platform: ios\n"
35632cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
35732cb5941SJuergen Ributzka                                     "swift-version: 3.0\n"
35832cb5941SJuergen Ributzka                                     "...\n";
35932cb5941SJuergen Ributzka 
3602ba32084SCyndy Ishida   Expected<TBDFile> Result =
3612ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2Swift3, "Test.tbd"));
36232cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3632ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
36432cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
36532cb5941SJuergen Ributzka   EXPECT_EQ(4U, File->getSwiftABIVersion());
36632cb5941SJuergen Ributzka }
36732cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_4_0)36832cb5941SJuergen Ributzka TEST(TBDv2, Swift_4_0) {
3696d2372ceSCyndy Ishida   static const char TBDv2Swift4[] = "--- !tapi-tbd-v2\n"
37032cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
37132cb5941SJuergen Ributzka                                     "platform: ios\n"
37232cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
37332cb5941SJuergen Ributzka                                     "swift-version: 4.0\n"
37432cb5941SJuergen Ributzka                                     "...\n";
37532cb5941SJuergen Ributzka 
3762ba32084SCyndy Ishida   Expected<TBDFile> Result =
3772ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2Swift4, "Test.tbd"));
37832cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
3792ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
38032cb5941SJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:5:16: error: invalid Swift ABI "
38132cb5941SJuergen Ributzka             "version.\nswift-version: 4.0\n               ^~~\n",
3822ba32084SCyndy Ishida             ErrorMessage);
38332cb5941SJuergen Ributzka }
38432cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_5)38532cb5941SJuergen Ributzka TEST(TBDv2, Swift_5) {
3866d2372ceSCyndy Ishida   static const char TBDv2Swift5[] = "--- !tapi-tbd-v2\n"
38732cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
38832cb5941SJuergen Ributzka                                     "platform: ios\n"
38932cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
39032cb5941SJuergen Ributzka                                     "swift-version: 5\n"
39132cb5941SJuergen Ributzka                                     "...\n";
39232cb5941SJuergen Ributzka 
3932ba32084SCyndy Ishida   Expected<TBDFile> Result =
3942ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2Swift5, "Test.tbd"));
39532cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3962ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
39732cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
39832cb5941SJuergen Ributzka   EXPECT_EQ(5U, File->getSwiftABIVersion());
39932cb5941SJuergen Ributzka }
40032cb5941SJuergen Ributzka 
TEST(TBDv2,Swift_99)40132cb5941SJuergen Ributzka TEST(TBDv2, Swift_99) {
4026d2372ceSCyndy Ishida   static const char TBDv2Swift99[] = "--- !tapi-tbd-v2\n"
40332cb5941SJuergen Ributzka                                      "archs: [ arm64 ]\n"
40432cb5941SJuergen Ributzka                                      "platform: ios\n"
40532cb5941SJuergen Ributzka                                      "install-name: Test.dylib\n"
40632cb5941SJuergen Ributzka                                      "swift-version: 99\n"
40732cb5941SJuergen Ributzka                                      "...\n";
40832cb5941SJuergen Ributzka 
4092ba32084SCyndy Ishida   Expected<TBDFile> Result =
4102ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2Swift99, "Test.tbd"));
41132cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
4122ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
41332cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V2, File->getFileType());
41432cb5941SJuergen Ributzka   EXPECT_EQ(99U, File->getSwiftABIVersion());
41532cb5941SJuergen Ributzka }
41632cb5941SJuergen Ributzka 
TEST(TBDv2,UnknownArchitecture)41732cb5941SJuergen Ributzka TEST(TBDv2, UnknownArchitecture) {
4186d2372ceSCyndy Ishida   static const char TBDv2FileUnknownArch[] = "--- !tapi-tbd-v2\n"
41932cb5941SJuergen Ributzka                                              "archs: [ foo ]\n"
42032cb5941SJuergen Ributzka                                              "platform: macosx\n"
42132cb5941SJuergen Ributzka                                              "install-name: Test.dylib\n"
42232cb5941SJuergen Ributzka                                              "...\n";
4232ba32084SCyndy Ishida   Expected<TBDFile> Result =
4246d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2FileUnknownArch, "Test.tbd"));
42532cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
42632cb5941SJuergen Ributzka }
42732cb5941SJuergen Ributzka 
TEST(TBDv2,UnknownPlatform)42832cb5941SJuergen Ributzka TEST(TBDv2, UnknownPlatform) {
4296d2372ceSCyndy Ishida   static const char TBDv2FileUnknownPlatform[] = "--- !tapi-tbd-v2\n"
43032cb5941SJuergen Ributzka                                                  "archs: [ i386 ]\n"
43132cb5941SJuergen Ributzka                                                  "platform: newOS\n"
43232cb5941SJuergen Ributzka                                                  "...\n";
43332cb5941SJuergen Ributzka 
4342ba32084SCyndy Ishida   Expected<TBDFile> Result =
4356d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2FileUnknownPlatform, "Test.tbd"));
43632cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4372ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
43832cb5941SJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:3:11: error: unknown platform\nplatform: "
43932cb5941SJuergen Ributzka             "newOS\n          ^~~~~\n",
4402ba32084SCyndy Ishida             ErrorMessage);
44132cb5941SJuergen Ributzka }
44232cb5941SJuergen Ributzka 
TEST(TBDv2,InvalidPlatform)443d8d99d95SCyndy Ishida TEST(TBDv2, InvalidPlatform) {
4446d2372ceSCyndy Ishida   static const char TBDv2FileInvalidPlatform[] = "--- !tapi-tbd-v2\n"
445d8d99d95SCyndy Ishida                                                  "archs: [ i386 ]\n"
446d8d99d95SCyndy Ishida                                                  "platform: iosmac\n"
447d8d99d95SCyndy Ishida                                                  "install-name: Test.dylib\n"
448d8d99d95SCyndy Ishida                                                  "...\n";
449d8d99d95SCyndy Ishida 
4502ba32084SCyndy Ishida   Expected<TBDFile> Result =
4516d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2FileInvalidPlatform, "Test.tbd"));
452d8d99d95SCyndy Ishida   EXPECT_FALSE(!!Result);
4532ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
454d8d99d95SCyndy Ishida   EXPECT_EQ("malformed file\nTest.tbd:3:11: error: invalid platform\nplatform: "
455d8d99d95SCyndy Ishida             "iosmac\n          ^~~~~~\n",
4562ba32084SCyndy Ishida             ErrorMessage);
457d8d99d95SCyndy Ishida }
458d8d99d95SCyndy Ishida 
TEST(TBDv2,MalformedFile1)45932cb5941SJuergen Ributzka TEST(TBDv2, MalformedFile1) {
4606d2372ceSCyndy Ishida   static const char TBDv2FileMalformed1[] = "--- !tapi-tbd-v2\n"
46132cb5941SJuergen Ributzka                                             "archs: [ arm64 ]\n"
46232cb5941SJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
46332cb5941SJuergen Ributzka                                             "...\n";
46432cb5941SJuergen Ributzka 
4652ba32084SCyndy Ishida   Expected<TBDFile> Result =
4666d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2FileMalformed1, "Test.tbd"));
46732cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4682ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
46932cb5941SJuergen Ributzka   ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
47032cb5941SJuergen Ributzka             "'platform'\narchs: [ arm64 ]\n^\n",
4712ba32084SCyndy Ishida             ErrorMessage);
47232cb5941SJuergen Ributzka }
47332cb5941SJuergen Ributzka 
TEST(TBDv2,MalformedFile2)47432cb5941SJuergen Ributzka TEST(TBDv2, MalformedFile2) {
4756d2372ceSCyndy Ishida   static const char TBDv2FileMalformed2[] = "--- !tapi-tbd-v2\n"
47632cb5941SJuergen Ributzka                                             "archs: [ arm64 ]\n"
47732cb5941SJuergen Ributzka                                             "platform: ios\n"
47832cb5941SJuergen Ributzka                                             "install-name: Test.dylib\n"
47932cb5941SJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
48032cb5941SJuergen Ributzka                                             "...\n";
48132cb5941SJuergen Ributzka 
4822ba32084SCyndy Ishida   Expected<TBDFile> Result =
4836d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv2FileMalformed2, "Test.tbd"));
48432cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4852ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
48632cb5941SJuergen Ributzka   ASSERT_EQ(
487d380c38eSNathan James       "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
488d380c38eSNathan James       "\"Unsupported key\"\n^~~~~~\n",
4892ba32084SCyndy Ishida       ErrorMessage);
49032cb5941SJuergen Ributzka }
49132cb5941SJuergen Ributzka 
49232cb5941SJuergen Ributzka } // namespace TBDv2
493