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[] = {
2132cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "$ld$hide$os9.0$_sym1", false, false},
2232cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_sym1", false, false},
2332cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_sym2", false, false},
2432cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_sym3", false, false},
2532cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_sym4", false, false},
2632cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_sym5", false, false},
2732cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_tlv1", false, true},
2832cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_tlv2", false, true},
2932cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_tlv3", false, true},
3032cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_weak1", true, false},
3132cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_weak2", true, false},
3232cb5941SJuergen Ributzka     {SymbolKind::GlobalSymbol, "_weak3", true, false},
3332cb5941SJuergen Ributzka     {SymbolKind::ObjectiveCClass, "class1", false, false},
3432cb5941SJuergen Ributzka     {SymbolKind::ObjectiveCClass, "class2", false, false},
3532cb5941SJuergen Ributzka     {SymbolKind::ObjectiveCClass, "class3", false, false},
3632cb5941SJuergen Ributzka     {SymbolKind::ObjectiveCInstanceVariable, "class1._ivar1", false, false},
3732cb5941SJuergen Ributzka     {SymbolKind::ObjectiveCInstanceVariable, "class1._ivar2", false, false},
3832cb5941SJuergen Ributzka     {SymbolKind::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());
8932cb5941SJuergen Ributzka   EXPECT_FALSE(File->isInstallAPI());
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   }
105*cd9a5cfdSDmitri Gribenko   llvm::sort(Exports);
10632cb5941SJuergen Ributzka 
10732cb5941SJuergen Ributzka   EXPECT_EQ(sizeof(TBDv1Symbols) / sizeof(ExportedSymbol), Exports.size());
10832cb5941SJuergen Ributzka   EXPECT_TRUE(
10932cb5941SJuergen Ributzka       std::equal(Exports.begin(), Exports.end(), std::begin(TBDv1Symbols)));
11081669d5eSCyndy Ishida 
11181669d5eSCyndy Ishida   File->addSymbol(SymbolKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
11281669d5eSCyndy Ishida   File->addSymbol(SymbolKind::ObjectiveCInstanceVariable, "Class1._ivar1",
11381669d5eSCyndy Ishida                   {Targets[1]});
11432cb5941SJuergen Ributzka }
11532cb5941SJuergen Ributzka 
TEST(TBDv1,ReadFile2)11632cb5941SJuergen Ributzka TEST(TBDv1, ReadFile2) {
1176d2372ceSCyndy Ishida   static const char TBDv1File2[] = "--- !tapi-tbd-v1\n"
11832cb5941SJuergen Ributzka                                    "archs: [ armv7, armv7s, armv7k, arm64 ]\n"
11932cb5941SJuergen Ributzka                                    "platform: ios\n"
12032cb5941SJuergen Ributzka                                    "install-name: Test.dylib\n"
12132cb5941SJuergen Ributzka                                    "...\n";
12232cb5941SJuergen Ributzka 
1232ba32084SCyndy Ishida   Expected<TBDFile> Result =
1242ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1File2, "Test.tbd"));
12532cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
1262ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
12732cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
128875565e5SJuergen Ributzka   auto Archs = AK_armv7 | AK_armv7s | AK_armv7k | AK_arm64;
1293025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
13081669d5eSCyndy Ishida   TargetList Targets;
13181669d5eSCyndy Ishida   for (auto &&arch : Archs)
13281669d5eSCyndy Ishida     Targets.emplace_back(Target(arch, Platform));
13332cb5941SJuergen Ributzka   EXPECT_EQ(Archs, File->getArchitectures());
13481669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
13581669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
13632cb5941SJuergen Ributzka   EXPECT_EQ(std::string("Test.dylib"), File->getInstallName());
13732cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion());
13832cb5941SJuergen Ributzka   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
13932cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->getSwiftABIVersion());
14032cb5941SJuergen Ributzka   EXPECT_EQ(ObjCConstraintType::None, File->getObjCConstraint());
14132cb5941SJuergen Ributzka   EXPECT_TRUE(File->isTwoLevelNamespace());
14232cb5941SJuergen Ributzka   EXPECT_TRUE(File->isApplicationExtensionSafe());
14332cb5941SJuergen Ributzka   EXPECT_FALSE(File->isInstallAPI());
14432cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->allowableClients().size());
14532cb5941SJuergen Ributzka   EXPECT_EQ(0U, File->reexportedLibraries().size());
14632cb5941SJuergen Ributzka }
14732cb5941SJuergen Ributzka 
TEST(TBDv1,WriteFile)14832cb5941SJuergen Ributzka TEST(TBDv1, WriteFile) {
1496d2372ceSCyndy Ishida   static const char TBDv1File3[] =
15032cb5941SJuergen Ributzka       "---\n"
15132cb5941SJuergen Ributzka       "archs:           [ i386, x86_64 ]\n"
15232cb5941SJuergen Ributzka       "platform:        macosx\n"
15332cb5941SJuergen Ributzka       "install-name:    '/usr/lib/libfoo.dylib'\n"
15432cb5941SJuergen Ributzka       "current-version: 1.2.3\n"
15532cb5941SJuergen Ributzka       "compatibility-version: 0\n"
15632cb5941SJuergen Ributzka       "swift-version:   5\n"
15732cb5941SJuergen Ributzka       "objc-constraint: retain_release\n"
15832cb5941SJuergen Ributzka       "exports:\n"
15932cb5941SJuergen Ributzka       "  - archs:           [ i386 ]\n"
16032cb5941SJuergen Ributzka       "    symbols:         [ _sym1 ]\n"
16132cb5941SJuergen Ributzka       "    weak-def-symbols: [ _sym2 ]\n"
16232cb5941SJuergen Ributzka       "    thread-local-symbols: [ _sym3 ]\n"
16332cb5941SJuergen Ributzka       "  - archs:           [ x86_64 ]\n"
16432cb5941SJuergen Ributzka       "    allowed-clients: [ clientA ]\n"
16532cb5941SJuergen Ributzka       "    re-exports:      [ '/usr/lib/libfoo.dylib' ]\n"
16632cb5941SJuergen Ributzka       "    symbols:         [ '_OBJC_EHTYPE_$_Class1' ]\n"
16732cb5941SJuergen Ributzka       "    objc-classes:    [ _Class1 ]\n"
16832cb5941SJuergen Ributzka       "    objc-ivars:      [ _Class1._ivar1 ]\n"
16932cb5941SJuergen Ributzka       "...\n";
17032cb5941SJuergen Ributzka 
17132cb5941SJuergen Ributzka   InterfaceFile File;
17281669d5eSCyndy Ishida   TargetList Targets;
17381669d5eSCyndy Ishida   for (auto &&arch : AK_i386 | AK_x86_64)
1743025c3edSJuergen Ributzka     Targets.emplace_back(Target(arch, PLATFORM_MACOS));
17532cb5941SJuergen Ributzka   File.setPath("libfoo.dylib");
17632cb5941SJuergen Ributzka   File.setInstallName("/usr/lib/libfoo.dylib");
17732cb5941SJuergen Ributzka   File.setFileType(FileType::TBD_V1);
17881669d5eSCyndy Ishida   File.addTargets(Targets);
17932cb5941SJuergen Ributzka   File.setCurrentVersion(PackedVersion(1, 2, 3));
18032cb5941SJuergen Ributzka   File.setSwiftABIVersion(5);
18132cb5941SJuergen Ributzka   File.setObjCConstraint(ObjCConstraintType::Retain_Release);
18281669d5eSCyndy Ishida   File.addAllowableClient("clientA", Targets[1]);
18381669d5eSCyndy Ishida   File.addReexportedLibrary("/usr/lib/libfoo.dylib", Targets[1]);
18481669d5eSCyndy Ishida   File.addSymbol(SymbolKind::GlobalSymbol, "_sym1", {Targets[0]});
18581669d5eSCyndy Ishida   File.addSymbol(SymbolKind::GlobalSymbol, "_sym2", {Targets[0]},
18632cb5941SJuergen Ributzka                  SymbolFlags::WeakDefined);
18781669d5eSCyndy Ishida   File.addSymbol(SymbolKind::GlobalSymbol, "_sym3", {Targets[0]},
18832cb5941SJuergen Ributzka                  SymbolFlags::ThreadLocalValue);
18981669d5eSCyndy Ishida   File.addSymbol(SymbolKind::ObjectiveCClass, "Class1", {Targets[1]});
19081669d5eSCyndy Ishida   File.addSymbol(SymbolKind::ObjectiveCClassEHType, "Class1", {Targets[1]});
19132cb5941SJuergen Ributzka   File.addSymbol(SymbolKind::ObjectiveCInstanceVariable, "Class1._ivar1",
19281669d5eSCyndy Ishida                  {Targets[1]});
19332cb5941SJuergen Ributzka 
19432cb5941SJuergen Ributzka   SmallString<4096> Buffer;
19532cb5941SJuergen Ributzka   raw_svector_ostream OS(Buffer);
1962ba32084SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
19732cb5941SJuergen Ributzka   EXPECT_FALSE(Result);
1986d2372ceSCyndy Ishida   EXPECT_STREQ(TBDv1File3, Buffer.c_str());
19932cb5941SJuergen Ributzka }
20032cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_macOS)20132cb5941SJuergen Ributzka TEST(TBDv1, Platform_macOS) {
2026d2372ceSCyndy Ishida   static const char TBDv1PlatformMacOS[] = "---\n"
20332cb5941SJuergen Ributzka                                            "archs: [ x86_64 ]\n"
20432cb5941SJuergen Ributzka                                            "platform: macosx\n"
20532cb5941SJuergen Ributzka                                            "install-name: Test.dylib\n"
20632cb5941SJuergen Ributzka                                            "...\n";
20732cb5941SJuergen Ributzka 
2082ba32084SCyndy Ishida   Expected<TBDFile> Result =
2096d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformMacOS, "Test.tbd"));
21032cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2113025c3edSJuergen Ributzka   auto Platform = PLATFORM_MACOS;
2122ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
21332cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
21481669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
21581669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
21632cb5941SJuergen Ributzka }
21732cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_iOS)21832cb5941SJuergen Ributzka TEST(TBDv1, Platform_iOS) {
2196d2372ceSCyndy Ishida   static const char TBDv1PlatformiOS[] = "---\n"
22032cb5941SJuergen Ributzka                                          "archs: [ arm64 ]\n"
22132cb5941SJuergen Ributzka                                          "platform: ios\n"
22232cb5941SJuergen Ributzka                                          "install-name: Test.dylib\n"
22332cb5941SJuergen Ributzka                                          "...\n";
22432cb5941SJuergen Ributzka 
2252ba32084SCyndy Ishida   Expected<TBDFile> Result =
2266d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformiOS, "Test.tbd"));
22732cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2283025c3edSJuergen Ributzka   auto Platform = PLATFORM_IOS;
2292ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
23032cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
23181669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
23281669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
23332cb5941SJuergen Ributzka }
23432cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_watchOS)23532cb5941SJuergen Ributzka TEST(TBDv1, Platform_watchOS) {
2366d2372ceSCyndy Ishida   static const char TBDv1PlatformWatchOS[] = "---\n"
23732cb5941SJuergen Ributzka                                              "archs: [ armv7k ]\n"
23832cb5941SJuergen Ributzka                                              "platform: watchos\n"
23932cb5941SJuergen Ributzka                                              "install-name: Test.dylib\n"
24032cb5941SJuergen Ributzka                                              "...\n";
24132cb5941SJuergen Ributzka 
2422ba32084SCyndy Ishida   Expected<TBDFile> Result =
2436d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformWatchOS, "Test.tbd"));
24432cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2453025c3edSJuergen Ributzka   auto Platform = PLATFORM_WATCHOS;
2462ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
24732cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
24881669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
24981669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
25032cb5941SJuergen Ributzka }
25132cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_tvOS)25232cb5941SJuergen Ributzka TEST(TBDv1, Platform_tvOS) {
2536d2372ceSCyndy Ishida   static const char TBDv1PlatformtvOS[] = "---\n"
25432cb5941SJuergen Ributzka                                           "archs: [ arm64 ]\n"
25532cb5941SJuergen Ributzka                                           "platform: tvos\n"
25632cb5941SJuergen Ributzka                                           "install-name: Test.dylib\n"
25732cb5941SJuergen Ributzka                                           "...\n";
25832cb5941SJuergen Ributzka 
2592ba32084SCyndy Ishida   Expected<TBDFile> Result =
2606d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1PlatformtvOS, "Test.tbd"));
26132cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2623025c3edSJuergen Ributzka   auto Platform = PLATFORM_TVOS;
2632ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
26432cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
26581669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
26681669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
26732cb5941SJuergen Ributzka }
26832cb5941SJuergen Ributzka 
TEST(TBDv1,Platform_bridgeOS)26932cb5941SJuergen Ributzka TEST(TBDv1, Platform_bridgeOS) {
2706d2372ceSCyndy Ishida   static const char TBDv1BridgeOS[] = "---\n"
27132cb5941SJuergen Ributzka                                       "archs: [ armv7k ]\n"
27232cb5941SJuergen Ributzka                                       "platform: bridgeos\n"
27332cb5941SJuergen Ributzka                                       "install-name: Test.dylib\n"
27432cb5941SJuergen Ributzka                                       "...\n";
27532cb5941SJuergen Ributzka 
2762ba32084SCyndy Ishida   Expected<TBDFile> Result =
2772ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1BridgeOS, "Test.tbd"));
27832cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2793025c3edSJuergen Ributzka   auto Platform = PLATFORM_BRIDGEOS;
2802ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
28132cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
28281669d5eSCyndy Ishida   EXPECT_EQ(File->getPlatforms().size(), 1U);
28381669d5eSCyndy Ishida   EXPECT_EQ(Platform, *File->getPlatforms().begin());
28432cb5941SJuergen Ributzka }
28532cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_1_0)28632cb5941SJuergen Ributzka TEST(TBDv1, Swift_1_0) {
2876d2372ceSCyndy Ishida   static const char TBDv1Swift1[] = "---\n"
28832cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
28932cb5941SJuergen Ributzka                                     "platform: ios\n"
29032cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
29132cb5941SJuergen Ributzka                                     "swift-version: 1.0\n"
29232cb5941SJuergen Ributzka                                     "...\n";
29332cb5941SJuergen Ributzka 
2942ba32084SCyndy Ishida   Expected<TBDFile> Result =
2952ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift1, "Test.tbd"));
29632cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
2972ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
29832cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
29932cb5941SJuergen Ributzka   EXPECT_EQ(1U, File->getSwiftABIVersion());
30032cb5941SJuergen Ributzka }
30132cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_1_1)30232cb5941SJuergen Ributzka TEST(TBDv1, Swift_1_1) {
3036d2372ceSCyndy Ishida   static const char TBDv1Swift1dot[] = "---\n"
30432cb5941SJuergen Ributzka                                        "archs: [ arm64 ]\n"
30532cb5941SJuergen Ributzka                                        "platform: ios\n"
30632cb5941SJuergen Ributzka                                        "install-name: Test.dylib\n"
30732cb5941SJuergen Ributzka                                        "swift-version: 1.1\n"
30832cb5941SJuergen Ributzka                                        "...\n";
30932cb5941SJuergen Ributzka 
3102ba32084SCyndy Ishida   Expected<TBDFile> Result =
3112ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift1dot, "Test.tbd"));
31232cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3132ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
31432cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
31532cb5941SJuergen Ributzka   EXPECT_EQ(2U, File->getSwiftABIVersion());
31632cb5941SJuergen Ributzka }
31732cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_2_0)31832cb5941SJuergen Ributzka TEST(TBDv1, Swift_2_0) {
3196d2372ceSCyndy Ishida   static const char TBDv1Swift2[] = "---\n"
32032cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
32132cb5941SJuergen Ributzka                                     "platform: ios\n"
32232cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
32332cb5941SJuergen Ributzka                                     "swift-version: 2.0\n"
32432cb5941SJuergen Ributzka                                     "...\n";
32532cb5941SJuergen Ributzka 
3262ba32084SCyndy Ishida   Expected<TBDFile> Result =
3272ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift2, "Test.tbd"));
32832cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3292ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
33032cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
33132cb5941SJuergen Ributzka   EXPECT_EQ(3U, File->getSwiftABIVersion());
33232cb5941SJuergen Ributzka }
33332cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_3_0)33432cb5941SJuergen Ributzka TEST(TBDv1, Swift_3_0) {
3356d2372ceSCyndy Ishida   static const char TBDv1Swift3[] = "---\n"
33632cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
33732cb5941SJuergen Ributzka                                     "platform: ios\n"
33832cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
33932cb5941SJuergen Ributzka                                     "swift-version: 3.0\n"
34032cb5941SJuergen Ributzka                                     "...\n";
34132cb5941SJuergen Ributzka 
3422ba32084SCyndy Ishida   Expected<TBDFile> Result =
3432ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift3, "Test.tbd"));
34432cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3452ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
34632cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
34732cb5941SJuergen Ributzka   EXPECT_EQ(4U, File->getSwiftABIVersion());
34832cb5941SJuergen Ributzka }
34932cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_4_0)35032cb5941SJuergen Ributzka TEST(TBDv1, Swift_4_0) {
3516d2372ceSCyndy Ishida   static const char TBDv1Swift4[] = "---\n"
35232cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
35332cb5941SJuergen Ributzka                                     "platform: ios\n"
35432cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
35532cb5941SJuergen Ributzka                                     "swift-version: 4.0\n"
35632cb5941SJuergen Ributzka                                     "...\n";
35732cb5941SJuergen Ributzka 
3582ba32084SCyndy Ishida   Expected<TBDFile> Result =
3592ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift4, "Test.tbd"));
36032cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
3612ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
36232cb5941SJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:5:16: error: invalid Swift ABI "
36332cb5941SJuergen Ributzka             "version.\nswift-version: 4.0\n               ^~~\n",
3642ba32084SCyndy Ishida             ErrorMessage);
36532cb5941SJuergen Ributzka }
36632cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_5)36732cb5941SJuergen Ributzka TEST(TBDv1, Swift_5) {
3686d2372ceSCyndy Ishida   static const char TBDv1Swift5[] = "---\n"
36932cb5941SJuergen Ributzka                                     "archs: [ arm64 ]\n"
37032cb5941SJuergen Ributzka                                     "platform: ios\n"
37132cb5941SJuergen Ributzka                                     "install-name: Test.dylib\n"
37232cb5941SJuergen Ributzka                                     "swift-version: 5\n"
37332cb5941SJuergen Ributzka                                     "...\n";
37432cb5941SJuergen Ributzka 
3752ba32084SCyndy Ishida   Expected<TBDFile> Result =
3762ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift5, "Test.tbd"));
37732cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3782ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
37932cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
38032cb5941SJuergen Ributzka   EXPECT_EQ(5U, File->getSwiftABIVersion());
38132cb5941SJuergen Ributzka }
38232cb5941SJuergen Ributzka 
TEST(TBDv1,Swift_99)38332cb5941SJuergen Ributzka TEST(TBDv1, Swift_99) {
3846d2372ceSCyndy Ishida   static const char TBDv1Swift99[] = "---\n"
38532cb5941SJuergen Ributzka                                      "archs: [ arm64 ]\n"
38632cb5941SJuergen Ributzka                                      "platform: ios\n"
38732cb5941SJuergen Ributzka                                      "install-name: Test.dylib\n"
38832cb5941SJuergen Ributzka                                      "swift-version: 99\n"
38932cb5941SJuergen Ributzka                                      "...\n";
39032cb5941SJuergen Ributzka 
3912ba32084SCyndy Ishida   Expected<TBDFile> Result =
3922ba32084SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1Swift99, "Test.tbd"));
39332cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
3942ba32084SCyndy Ishida   TBDFile File = std::move(Result.get());
39532cb5941SJuergen Ributzka   EXPECT_EQ(FileType::TBD_V1, File->getFileType());
39632cb5941SJuergen Ributzka   EXPECT_EQ(99U, File->getSwiftABIVersion());
39732cb5941SJuergen Ributzka }
39832cb5941SJuergen Ributzka 
TEST(TBDv1,UnknownArchitecture)39932cb5941SJuergen Ributzka TEST(TBDv1, UnknownArchitecture) {
4006d2372ceSCyndy Ishida   static const char TBDv1FileUnknownArch[] = "---\n"
40132cb5941SJuergen Ributzka                                              "archs: [ foo ]\n"
40232cb5941SJuergen Ributzka                                              "platform: macosx\n"
40332cb5941SJuergen Ributzka                                              "install-name: Test.dylib\n"
40432cb5941SJuergen Ributzka                                              "...\n";
40532cb5941SJuergen Ributzka 
4062ba32084SCyndy Ishida   Expected<TBDFile> Result =
4076d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileUnknownArch, "Test.tbd"));
40832cb5941SJuergen Ributzka   EXPECT_TRUE(!!Result);
40932cb5941SJuergen Ributzka }
41032cb5941SJuergen Ributzka 
TEST(TBDv1,UnknownPlatform)41132cb5941SJuergen Ributzka TEST(TBDv1, UnknownPlatform) {
4126d2372ceSCyndy Ishida   static const char TBDv1FileUnknownPlatform[] = "---\n"
41332cb5941SJuergen Ributzka                                                  "archs: [ i386 ]\n"
41432cb5941SJuergen Ributzka                                                  "platform: newOS\n"
41532cb5941SJuergen Ributzka                                                  "...\n";
41632cb5941SJuergen Ributzka 
4172ba32084SCyndy Ishida   Expected<TBDFile> Result =
4186d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileUnknownPlatform, "Test.tbd"));
41932cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4202ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
42132cb5941SJuergen Ributzka   EXPECT_EQ("malformed file\nTest.tbd:3:11: error: unknown platform\nplatform: "
42232cb5941SJuergen Ributzka             "newOS\n          ^~~~~\n",
4232ba32084SCyndy Ishida             ErrorMessage);
42432cb5941SJuergen Ributzka }
42532cb5941SJuergen Ributzka 
TEST(TBDv1,MalformedFile1)42632cb5941SJuergen Ributzka TEST(TBDv1, MalformedFile1) {
4276d2372ceSCyndy Ishida   static const char TBDv1FileMalformed1[] = "---\n"
42832cb5941SJuergen Ributzka                                             "archs: [ arm64 ]\n"
42932cb5941SJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
43032cb5941SJuergen Ributzka                                             "...\n";
43132cb5941SJuergen Ributzka 
4322ba32084SCyndy Ishida   Expected<TBDFile> Result =
4336d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileMalformed1, "Test.tbd"));
43432cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4352ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
43632cb5941SJuergen Ributzka   ASSERT_EQ("malformed file\nTest.tbd:2:1: error: missing required key "
43732cb5941SJuergen Ributzka             "'platform'\narchs: [ arm64 ]\n^\n",
4382ba32084SCyndy Ishida             ErrorMessage);
43932cb5941SJuergen Ributzka }
44032cb5941SJuergen Ributzka 
TEST(TBDv1,MalformedFile2)44132cb5941SJuergen Ributzka TEST(TBDv1, MalformedFile2) {
4426d2372ceSCyndy Ishida   static const char TBDv1FileMalformed2[] = "---\n"
44332cb5941SJuergen Ributzka                                             "archs: [ arm64 ]\n"
44432cb5941SJuergen Ributzka                                             "platform: ios\n"
44532cb5941SJuergen Ributzka                                             "install-name: Test.dylib\n"
44632cb5941SJuergen Ributzka                                             "foobar: \"Unsupported key\"\n"
44732cb5941SJuergen Ributzka                                             "...\n";
44832cb5941SJuergen Ributzka 
4492ba32084SCyndy Ishida   Expected<TBDFile> Result =
4506d2372ceSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv1FileMalformed2, "Test.tbd"));
45132cb5941SJuergen Ributzka   EXPECT_FALSE(!!Result);
4522ba32084SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
45332cb5941SJuergen Ributzka   ASSERT_EQ(
454d380c38eSNathan James       "malformed file\nTest.tbd:5:1: error: unknown key 'foobar'\nfoobar: "
455d380c38eSNathan James       "\"Unsupported key\"\n^~~~~~\n",
4562ba32084SCyndy Ishida       ErrorMessage);
45732cb5941SJuergen Ributzka }
45832cb5941SJuergen Ributzka 
45932cb5941SJuergen Ributzka } // end namespace TBDv1.
460