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