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