xref: /llvm-project/llvm/unittests/TextAPI/TextStubV1Tests.cpp (revision d9a9872ec4760762fdc467ef283cea302a3742e5)
132cb5941SJuergen Ributzka //===-- TextStubV1Tests.cpp - TBD V1 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 //===-----------------------------------------------------------------------===/
832cb5941SJuergen Ributzka 
95810ed51SJonas Devlieghere #include "TextStubHelpers.h"
100116d04dSCyndy Ishida #include "llvm/TextAPI/InterfaceFile.h"
110116d04dSCyndy Ishida #include "llvm/TextAPI/TextAPIReader.h"
120116d04dSCyndy Ishida #include "llvm/TextAPI/TextAPIWriter.h"
1332cb5941SJuergen Ributzka #include "gtest/gtest.h"
1432cb5941SJuergen Ributzka #include <string>
1532cb5941SJuergen Ributzka #include <vector>
1632cb5941SJuergen Ributzka 
1732cb5941SJuergen Ributzka using namespace llvm;
1832cb5941SJuergen Ributzka using namespace llvm::MachO;
1932cb5941SJuergen Ributzka 
2032cb5941SJuergen Ributzka static ExportedSymbol TBDv1Symbols[] = {
21*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "$ld$hide$os9.0$_sym1", false, false},
22*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym1", false, false},
23*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym2", false, false},
24*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym3", false, false},
25*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym4", false, false},
26*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_sym5", false, false},
27*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_tlv1", false, true},
28*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_tlv2", false, true},
29*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_tlv3", false, true},
30*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak1", true, false},
31*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak2", true, false},
32*d9a9872eSCyndy Ishida     {EncodeKind::GlobalSymbol, "_weak3", true, false},
33*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class1", false, false},
34*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class2", false, false},
35*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCClass, "class3", false, false},
36*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCInstanceVariable, "class1._ivar1", false, false},
37*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCInstanceVariable, "class1._ivar2", false, false},
38*d9a9872eSCyndy Ishida     {EncodeKind::ObjectiveCInstanceVariable, "class1._ivar3", false, false},
3932cb5941SJuergen Ributzka };
4032cb5941SJuergen Ributzka 
4132cb5941SJuergen Ributzka namespace TBDv1 {
4232cb5941SJuergen Ributzka 
TEST(TBDv1,ReadFile)4332cb5941SJuergen Ributzka TEST(TBDv1, ReadFile) {
446d2372ceSCyndy Ishida   static const char TBDv1File1[] =
4532cb5941SJuergen Ributzka       "---\n"
4632cb5941SJuergen Ributzka       "archs: [ armv7, armv7s, armv7k, arm64 ]\n"
4732cb5941SJuergen Ributzka       "platform: ios\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       "exports:\n"
5332cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k, arm64 ]\n"
5432cb5941SJuergen Ributzka       "    allowed-clients: [ clientA ]\n"
5532cb5941SJuergen Ributzka       "    re-exports: [ /usr/lib/libfoo.dylib ]\n"
5632cb5941SJuergen Ributzka       "    symbols: [ _sym1, _sym2, _sym3, _sym4, $ld$hide$os9.0$_sym1 ]\n"
5732cb5941SJuergen Ributzka       "    objc-classes: [ _class1, _class2 ]\n"
5832cb5941SJuergen Ributzka       "    objc-ivars: [ _class1._ivar1, _class1._ivar2 ]\n"
5932cb5941SJuergen Ributzka       "    weak-def-symbols: [ _weak1, _weak2 ]\n"
6032cb5941SJuergen Ributzka       "    thread-local-symbols: [ _tlv1, _tlv2 ]\n"
6132cb5941SJuergen Ributzka       "  - archs: [ armv7, armv7s, armv7k ]\n"
6232cb5941SJuergen Ributzka       "    symbols: [ _sym5 ]\n"
6332cb5941SJuergen Ributzka       "    objc-classes: [ _class3 ]\n"
6432cb5941SJuergen Ributzka       "    objc-ivars: [ _class1._ivar3 ]\n"
6532cb5941SJuergen Ributzka       "    weak-def-symbols: [ _weak3 ]\n"
6632cb5941SJuergen Ributzka       "    thread-local-symbols: [ _tlv3 ]\n"
6732cb5941SJuergen Ributzka       "...\n";
6832cb5941SJuergen Ributzka 
692ba32084SCyndy Ishida   Expected<TBDFile> Result =
702ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1File1, "Test.tbd"));
7132cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
722ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
7332cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
74875565e5SJuergen Ributzka   auto Archs = AK_armv7 | AK_armv7s | AK_armv7k | AK_arm64;
753025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
7681669d5eSCyndy Ishida   TargetList Targets;
7781669d5eSCyndy Ishida   for (auto &&arch : Archs)
7881669d5eSCyndy Ishida     Targets.emplace_back(Target(arch, Platform));
7932cb5941SJuergen Ributzka   EXPECT_EQ(Archs, File->getArchitectures());
8081669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
8181669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
8232cb5941SJuergen Ributzka   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
8332cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(2, 3, 4), File->getCurrentVersion());
8432cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
8532cb5941SJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
8632cb5941SJuergen Ributzka   EXPECT_EQ(ObjCConstraintType::None, File->getObjCConstraint());
8732cb5941SJuergen Ributzka   EXPECT_TRUE(File->isTwoLevelNamespace());
8832cb5941SJuergen Ributzka   EXPECT_TRUE(File->isApplicationExtensionSafe());
8981669d5eSCyndy Ishida   InterfaceFileRef client("clientA", Targets);
9081669d5eSCyndy Ishida   InterfaceFileRef reexport("/usr/lib/libfoo.dylib", Targets);
9132cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->allowableClients().size());
9232cb5941SJuergen Ributzka   EXPECT_EQ(client, File->allowableClients().front());
9332cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->reexportedLibraries().size());
9432cb5941SJuergen Ributzka   EXPECT_EQ(reexport, File->reexportedLibraries().front());
9532cb5941SJuergen Ributzka 
9632cb5941SJuergen Ributzka   ExportedSymbolSeq Exports;
9732cb5941SJuergen Ributzka   for (const auto *Sym : File->symbols()) {
9832cb5941SJuergen Ributzka     EXPECT_FALSE(Sym->isWeakReferenced());
9932cb5941SJuergen Ributzka     EXPECT_FALSE(Sym->isUndefined());
100adcd0268SBenjamin Kramer     Exports.emplace_back(
101adcd0268SBenjamin Kramer         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
102adcd0268SBenjamin Kramer                        Sym->isWeakDefined(), Sym->isThreadLocalValue()});
10332cb5941SJuergen Ributzka   }
104cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
10532cb5941SJuergen Ributzka 
106589725f6SKazu Hirata   EXPECT_EQ(std::size(TBDv1Symbols), Exports.size());
10732cb5941SJuergen Ributzka   EXPECT_TRUE(
10832cb5941SJuergen Ributzka       std::equal(Exports.begin(), Exports.end(), std::begin(TBDv1Symbols)));
10981669d5eSCyndy Ishida 
110*d9a9872eSCyndy Ishida   File->addSymbol(EncodeKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
111*d9a9872eSCyndy Ishida   File->addSymbol(EncodeKind::ObjectiveCInstanceVariable, "Class1._ivar1",
11281669d5eSCyndy Ishida                   {Targets[1]});
11332cb5941SJuergen Ributzka }
11432cb5941SJuergen Ributzka 
TEST(TBDv1,ReadFile2)11532cb5941SJuergen Ributzka TEST(TBDv1, ReadFile2) {
1166d2372ceSCyndy Ishida   static const char TBDv1File2[] = "--- !tapi-tbd-v1\n"
11732cb5941SJuergen Ributzka                                    "archs: [ armv7, armv7s, armv7k, arm64 ]\n"
11832cb5941SJuergen Ributzka                                    "platform: ios\n"
11932cb5941SJuergen Ributzka                                    "install-name: Test.dylib\n"
12032cb5941SJuergen Ributzka                                    "...\n";
12132cb5941SJuergen Ributzka 
1222ba32084SCyndy Ishida   Expected<TBDFile> Result =
1232ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1File2, "Test.tbd"));
12432cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
1252ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
12632cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
127875565e5SJuergen Ributzka   auto Archs = AK_armv7 | AK_armv7s | AK_armv7k | AK_arm64;
1283025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
12981669d5eSCyndy Ishida   TargetList Targets;
13081669d5eSCyndy Ishida   for (auto &&arch : Archs)
13181669d5eSCyndy Ishida     Targets.emplace_back(Target(arch, Platform));
13232cb5941SJuergen Ributzka   EXPECT_EQ(Archs, File->getArchitectures());
13381669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
13481669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
13532cb5941SJuergen Ributzka   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
13632cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion());
13732cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
13832cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->getSwiftABIVersion());
13932cb5941SJuergen Ributzka   EXPECT_EQ(ObjCConstraintType::None, File->getObjCConstraint());
14032cb5941SJuergen Ributzka   EXPECT_TRUE(File->isTwoLevelNamespace());
14132cb5941SJuergen Ributzka   EXPECT_TRUE(File->isApplicationExtensionSafe());
14232cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->allowableClients().size());
14332cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->reexportedLibraries().size());
14432cb5941SJuergen Ributzka }
14532cb5941SJuergen Ributzka 
TEST(TBDv1,WriteFile)14632cb5941SJuergen Ributzka TEST(TBDv1, WriteFile) {
1476d2372ceSCyndy Ishida   static const char TBDv1File3[] =
14832cb5941SJuergen Ributzka       "---\n"
14932cb5941SJuergen Ributzka       "archs:           [ i386, x86_64 ]\n"
15032cb5941SJuergen Ributzka       "platform:        macosx\n"
15132cb5941SJuergen Ributzka       "install-name:    '/usr/lib/libfoo.dylib'\n"
15232cb5941SJuergen Ributzka       "current-version: 1.2.3\n"
15332cb5941SJuergen Ributzka       "compatibility-version: 0\n"
15432cb5941SJuergen Ributzka       "swift-version:   5\n"
15532cb5941SJuergen Ributzka       "objc-constraint: retain_release\n"
15632cb5941SJuergen Ributzka       "exports:\n"
15732cb5941SJuergen Ributzka       "  - archs:           [ i386 ]\n"
15832cb5941SJuergen Ributzka       "    symbols:         [ _sym1 ]\n"
15932cb5941SJuergen Ributzka       "    weak-def-symbols: [ _sym2 ]\n"
16032cb5941SJuergen Ributzka       "    thread-local-symbols: [ _sym3 ]\n"
16132cb5941SJuergen Ributzka       "  - archs:           [ x86_64 ]\n"
16232cb5941SJuergen Ributzka       "    allowed-clients: [ clientA ]\n"
16332cb5941SJuergen Ributzka       "    re-exports:      [ '/usr/lib/libfoo.dylib' ]\n"
16432cb5941SJuergen Ributzka       "    symbols:         [ '_OBJC_EHTYPE_$_Class1' ]\n"
16532cb5941SJuergen Ributzka       "    objc-classes:    [ _Class1 ]\n"
16632cb5941SJuergen Ributzka       "    objc-ivars:      [ _Class1._ivar1 ]\n"
16732cb5941SJuergen Ributzka       "...\n";
16832cb5941SJuergen Ributzka 
16932cb5941SJuergen Ributzka   InterfaceFile File;
17081669d5eSCyndy Ishida   TargetList Targets;
17181669d5eSCyndy Ishida   for (auto &&arch : AK_i386 | AK_x86_64)
1723025c3edSJuergen Ributzka     Targets.emplace_back(Target(arch, PLATFORM_MACOS));
17332cb5941SJuergen Ributzka   File.setPath("libfoo.dylib");
17432cb5941SJuergen Ributzka   File.setInstallName("/usr/lib/libfoo.dylib");
17532cb5941SJuergen Ributzka   File.setFileType(FileType::TBD_V1);
17681669d5eSCyndy Ishida   File.addTargets(Targets);
17732cb5941SJuergen Ributzka   File.setCurrentVersion(PackedVersion(1, 2, 3));
17832cb5941SJuergen Ributzka   File.setSwiftABIVersion(5);
17932cb5941SJuergen Ributzka   File.setObjCConstraint(ObjCConstraintType::Retain_Release);
18081669d5eSCyndy Ishida   File.addAllowableClient("clientA", Targets[1]);
18181669d5eSCyndy Ishida   File.addReexportedLibrary("/usr/lib/libfoo.dylib", Targets[1]);
182*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym1", {Targets[0]});
183*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym2", {Targets[0]},
18432cb5941SJuergen Ributzka                  SymbolFlags::WeakDefined);
185*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_sym3", {Targets[0]},
18632cb5941SJuergen Ributzka                  SymbolFlags::ThreadLocalValue);
187*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "Class1", {Targets[1]});
188*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
189*d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "Class1._ivar1",
19081669d5eSCyndy Ishida                  {Targets[1]});
19132cb5941SJuergen Ributzka 
19232cb5941SJuergen Ributzka   SmallString<4096> Buffer;
19332cb5941SJuergen Ributzka   raw_svector_ostream OS(Buffer);
1942ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
19532cb5941SJuergen Ributzka   EXPECT_FALSE(Result);
1966d2372ceSCyndy Ishida   EXPECT_STREQ(TBDv1File3, Buffer.c_str());
19732cb5941SJuergen Ributzka }
19832cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_macOS)19932cb5941SJuergen Ributzka TEST(TBDv1, Platform_macOS) {
2006d2372ceSCyndy Ishida   static const char TBDv1PlatformMacOS[] = "---\n"
20132cb5941SJuergen Ributzka                                            "archs: [ x86_64 ]\n"
20232cb5941SJuergen Ributzka                                            "platform: macosx\n"
20332cb5941SJuergen Ributzka                                            "install-name: Test.dylib\n"
20432cb5941SJuergen Ributzka                                            "...\n";
20532cb5941SJuergen Ributzka 
2062ba32084SCyndy Ishida   Expected<TBDFile> Result =
2076d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformMacOS, "Test.tbd"));
20832cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2093025c3edSJuergen Ributzka   auto Platform = PLATFORM_MACOS;
2102ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
21132cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
21281669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
21381669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
21432cb5941SJuergen Ributzka }
21532cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_iOS)21632cb5941SJuergen Ributzka TEST(TBDv1, Platform_iOS) {
2176d2372ceSCyndy Ishida   static const char TBDv1PlatformiOS[] = "---\n"
21832cb5941SJuergen Ributzka                                          "archs: [ arm64 ]\n"
21932cb5941SJuergen Ributzka                                          "platform: ios\n"
22032cb5941SJuergen Ributzka                                          "install-name: Test.dylib\n"
22132cb5941SJuergen Ributzka                                          "...\n";
22232cb5941SJuergen Ributzka 
2232ba32084SCyndy Ishida   Expected<TBDFile> Result =
2246d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformiOS, "Test.tbd"));
22532cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2263025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
2272ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
22832cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
22981669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
23081669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
23132cb5941SJuergen Ributzka }
23232cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_watchOS)23332cb5941SJuergen Ributzka TEST(TBDv1, Platform_watchOS) {
2346d2372ceSCyndy Ishida   static const char TBDv1PlatformWatchOS[] = "---\n"
23532cb5941SJuergen Ributzka                                              "archs: [ armv7k ]\n"
23632cb5941SJuergen Ributzka                                              "platform: watchos\n"
23732cb5941SJuergen Ributzka                                              "install-name: Test.dylib\n"
23832cb5941SJuergen Ributzka                                              "...\n";
23932cb5941SJuergen Ributzka 
2402ba32084SCyndy Ishida   Expected<TBDFile> Result =
2416d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformWatchOS, "Test.tbd"));
24232cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2433025c3edSJuergen Ributzka   auto Platform = PLATFORM_WATCHOS;
2442ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
24532cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
24681669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
24781669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
24832cb5941SJuergen Ributzka }
24932cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_tvOS)25032cb5941SJuergen Ributzka TEST(TBDv1, Platform_tvOS) {
2516d2372ceSCyndy Ishida   static const char TBDv1PlatformtvOS[] = "---\n"
25232cb5941SJuergen Ributzka                                           "archs: [ arm64 ]\n"
25332cb5941SJuergen Ributzka                                           "platform: tvos\n"
25432cb5941SJuergen Ributzka                                           "install-name: Test.dylib\n"
25532cb5941SJuergen Ributzka                                           "...\n";
25632cb5941SJuergen Ributzka 
2572ba32084SCyndy Ishida   Expected<TBDFile> Result =
2586d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformtvOS, "Test.tbd"));
25932cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2603025c3edSJuergen Ributzka   auto Platform = PLATFORM_TVOS;
2612ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
26232cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
26381669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
26481669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
26532cb5941SJuergen Ributzka }
26632cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_bridgeOS)26732cb5941SJuergen Ributzka TEST(TBDv1, Platform_bridgeOS) {
2686d2372ceSCyndy Ishida   static const char TBDv1BridgeOS[] = "---\n"
26932cb5941SJuergen Ributzka                                       "archs: [ armv7k ]\n"
27032cb5941SJuergen Ributzka                                       "platform: bridgeos\n"
27132cb5941SJuergen Ributzka                                       "install-name: Test.dylib\n"
27232cb5941SJuergen Ributzka                                       "...\n";
27332cb5941SJuergen Ributzka 
2742ba32084SCyndy Ishida   Expected<TBDFile> Result =
2752ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1BridgeOS, "Test.tbd"));
27632cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2773025c3edSJuergen Ributzka   auto Platform = PLATFORM_BRIDGEOS;
2782ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
27932cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
28081669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
28181669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
28232cb5941SJuergen Ributzka }
28332cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_1_0)28432cb5941SJuergen Ributzka TEST(TBDv1, Swift_1_0) {
2856d2372ceSCyndy Ishida   static const char TBDv1Swift1[] = "---\n"
28632cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
28732cb5941SJuergen Ributzka                                     "platform: ios\n"
28832cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
28932cb5941SJuergen Ributzka                                     "swift-version: 1.0\n"
29032cb5941SJuergen Ributzka                                     "...\n";
29132cb5941SJuergen Ributzka 
2922ba32084SCyndy Ishida   Expected<TBDFile> Result =
2932ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift1, "Test.tbd"));
29432cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2952ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
29632cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
29732cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->getSwiftABIVersion());
29832cb5941SJuergen Ributzka }
29932cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_1_1)30032cb5941SJuergen Ributzka TEST(TBDv1, Swift_1_1) {
3016d2372ceSCyndy Ishida   static const char TBDv1Swift1dot[] = "---\n"
30232cb5941SJuergen Ributzka                                        "archs: [ arm64 ]\n"
30332cb5941SJuergen Ributzka                                        "platform: ios\n"
30432cb5941SJuergen Ributzka                                        "install-name: Test.dylib\n"
30532cb5941SJuergen Ributzka                                        "swift-version: 1.1\n"
30632cb5941SJuergen Ributzka                                        "...\n";
30732cb5941SJuergen Ributzka 
3082ba32084SCyndy Ishida   Expected<TBDFile> Result =
3092ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift1dot, "Test.tbd"));
31032cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3112ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
31232cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
31332cb5941SJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
31432cb5941SJuergen Ributzka }
31532cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_2_0)31632cb5941SJuergen Ributzka TEST(TBDv1, Swift_2_0) {
3176d2372ceSCyndy Ishida   static const char TBDv1Swift2[] = "---\n"
31832cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
31932cb5941SJuergen Ributzka                                     "platform: ios\n"
32032cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
32132cb5941SJuergen Ributzka                                     "swift-version: 2.0\n"
32232cb5941SJuergen Ributzka                                     "...\n";
32332cb5941SJuergen Ributzka 
3242ba32084SCyndy Ishida   Expected<TBDFile> Result =
3252ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift2, "Test.tbd"));
32632cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3272ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
32832cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
32932cb5941SJuergen Ributzka   EXPECT_EQ(3U, File->getSwiftABIVersion());
33032cb5941SJuergen Ributzka }
33132cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_3_0)33232cb5941SJuergen Ributzka TEST(TBDv1, Swift_3_0) {
3336d2372ceSCyndy Ishida   static const char TBDv1Swift3[] = "---\n"
33432cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
33532cb5941SJuergen Ributzka                                     "platform: ios\n"
33632cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
33732cb5941SJuergen Ributzka                                     "swift-version: 3.0\n"
33832cb5941SJuergen Ributzka                                     "...\n";
33932cb5941SJuergen Ributzka 
3402ba32084SCyndy Ishida   Expected<TBDFile> Result =
3412ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift3, "Test.tbd"));
34232cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3432ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
34432cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
34532cb5941SJuergen Ributzka   EXPECT_EQ(4U, File->getSwiftABIVersion());
34632cb5941SJuergen Ributzka }
34732cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_4_0)34832cb5941SJuergen Ributzka TEST(TBDv1, Swift_4_0) {
3496d2372ceSCyndy Ishida   static const char TBDv1Swift4[] = "---\n"
35032cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
35132cb5941SJuergen Ributzka                                     "platform: ios\n"
35232cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
35332cb5941SJuergen Ributzka                                     "swift-version: 4.0\n"
35432cb5941SJuergen Ributzka                                     "...\n";
35532cb5941SJuergen Ributzka 
3562ba32084SCyndy Ishida   Expected<TBDFile> Result =
3572ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift4, "Test.tbd"));
35832cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
3592ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
36032cb5941SJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:5:16: error: invalid Swift ABI "
36132cb5941SJuergen Ributzka             "version.\nswift-version: 4.0\n               ^~~\n",
3622ba32084SCyndy Ishida             ErrorMessage);
36332cb5941SJuergen Ributzka }
36432cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_5)36532cb5941SJuergen Ributzka TEST(TBDv1, Swift_5) {
3666d2372ceSCyndy Ishida   static const char TBDv1Swift5[] = "---\n"
36732cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
36832cb5941SJuergen Ributzka                                     "platform: ios\n"
36932cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
37032cb5941SJuergen Ributzka                                     "swift-version: 5\n"
37132cb5941SJuergen Ributzka                                     "...\n";
37232cb5941SJuergen Ributzka 
3732ba32084SCyndy Ishida   Expected<TBDFile> Result =
3742ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift5, "Test.tbd"));
37532cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3762ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
37732cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
37832cb5941SJuergen Ributzka   EXPECT_EQ(5U, File->getSwiftABIVersion());
37932cb5941SJuergen Ributzka }
38032cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_99)38132cb5941SJuergen Ributzka TEST(TBDv1, Swift_99) {
3826d2372ceSCyndy Ishida   static const char TBDv1Swift99[] = "---\n"
38332cb5941SJuergen Ributzka                                      "archs: [ arm64 ]\n"
38432cb5941SJuergen Ributzka                                      "platform: ios\n"
38532cb5941SJuergen Ributzka                                      "install-name: Test.dylib\n"
38632cb5941SJuergen Ributzka                                      "swift-version: 99\n"
38732cb5941SJuergen Ributzka                                      "...\n";
38832cb5941SJuergen Ributzka 
3892ba32084SCyndy Ishida   Expected<TBDFile> Result =
3902ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift99, "Test.tbd"));
39132cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3922ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
39332cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
39432cb5941SJuergen Ributzka   EXPECT_EQ(99U, File->getSwiftABIVersion());
39532cb5941SJuergen Ributzka }
39632cb5941SJuergen Ributzka 
TEST(TBDv1,UnknownArchitecture)39732cb5941SJuergen Ributzka TEST(TBDv1, UnknownArchitecture) {
3986d2372ceSCyndy Ishida   static const char TBDv1FileUnknownArch[] = "---\n"
39932cb5941SJuergen Ributzka                                              "archs: [ foo ]\n"
40032cb5941SJuergen Ributzka                                              "platform: macosx\n"
40132cb5941SJuergen Ributzka                                              "install-name: Test.dylib\n"
40232cb5941SJuergen Ributzka                                              "...\n";
40332cb5941SJuergen Ributzka 
4042ba32084SCyndy Ishida   Expected<TBDFile> Result =
4056d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileUnknownArch, "Test.tbd"));
40632cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
40732cb5941SJuergen Ributzka }
40832cb5941SJuergen Ributzka 
TEST(TBDv1,UnknownPlatform)40932cb5941SJuergen Ributzka TEST(TBDv1, UnknownPlatform) {
4106d2372ceSCyndy Ishida   static const char TBDv1FileUnknownPlatform[] = "---\n"
41132cb5941SJuergen Ributzka                                                  "archs: [ i386 ]\n"
41232cb5941SJuergen Ributzka                                                  "platform: newOS\n"
41332cb5941SJuergen Ributzka                                                  "...\n";
41432cb5941SJuergen Ributzka 
4152ba32084SCyndy Ishida   Expected<TBDFile> Result =
4166d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileUnknownPlatform, "Test.tbd"));
41732cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4182ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
41932cb5941SJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:3:11: error: unknown platform\nplatform: "
42032cb5941SJuergen Ributzka             "newOS\n          ^~~~~\n",
4212ba32084SCyndy Ishida             ErrorMessage);
42232cb5941SJuergen Ributzka }
42332cb5941SJuergen Ributzka 
TEST(TBDv1,MalformedFile1)42432cb5941SJuergen Ributzka TEST(TBDv1, MalformedFile1) {
4256d2372ceSCyndy Ishida   static const char TBDv1FileMalformed1[] = "---\n"
42632cb5941SJuergen Ributzka                                             "archs: [ arm64 ]\n"
42732cb5941SJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
42832cb5941SJuergen Ributzka                                             "...\n";
42932cb5941SJuergen Ributzka 
4302ba32084SCyndy Ishida   Expected<TBDFile> Result =
4316d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileMalformed1, "Test.tbd"));
43232cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4332ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
43432cb5941SJuergen Ributzka   ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
43532cb5941SJuergen Ributzka             "'platform'\narchs: [ arm64 ]\n^\n",
4362ba32084SCyndy Ishida             ErrorMessage);
43732cb5941SJuergen Ributzka }
43832cb5941SJuergen Ributzka 
TEST(TBDv1,MalformedFile2)43932cb5941SJuergen Ributzka TEST(TBDv1, MalformedFile2) {
4406d2372ceSCyndy Ishida   static const char TBDv1FileMalformed2[] = "---\n"
44132cb5941SJuergen Ributzka                                             "archs: [ arm64 ]\n"
44232cb5941SJuergen Ributzka                                             "platform: ios\n"
44332cb5941SJuergen Ributzka                                             "install-name: Test.dylib\n"
44432cb5941SJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
44532cb5941SJuergen Ributzka                                             "...\n";
44632cb5941SJuergen Ributzka 
4472ba32084SCyndy Ishida   Expected<TBDFile> Result =
4486d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileMalformed2, "Test.tbd"));
44932cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4502ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
45132cb5941SJuergen Ributzka   ASSERT_EQ(
452d380c38eSNathan James       "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
453d380c38eSNathan James       "\"Unsupported key\"\n^~~~~~\n",
4542ba32084SCyndy Ishida       ErrorMessage);
45532cb5941SJuergen Ributzka }
45632cb5941SJuergen Ributzka 
45732cb5941SJuergen Ributzka } // end namespace TBDv1.
458