xref: /llvm-project/llvm/unittests/TextAPI/TextStubV5Tests.cpp (revision 03506bc0a99fd53d0f4e3d0bd77eb2f7bad96102)
179320a0cSCyndy Ishida //===-- TextStubV5Tests.cpp - TBD V5 File Test ----------------------------===//
279320a0cSCyndy Ishida //
379320a0cSCyndy Ishida // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
479320a0cSCyndy Ishida // See https://llvm.org/LICENSE.txt for license information.
579320a0cSCyndy Ishida // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
679320a0cSCyndy Ishida //
779320a0cSCyndy Ishida //===-----------------------------------------------------------------------===/
879320a0cSCyndy Ishida 
979320a0cSCyndy Ishida #include "TextStubHelpers.h"
1079320a0cSCyndy Ishida #include "llvm/TextAPI/InterfaceFile.h"
1179320a0cSCyndy Ishida #include "llvm/TextAPI/TextAPIReader.h"
1279320a0cSCyndy Ishida #include "llvm/TextAPI/TextAPIWriter.h"
1379320a0cSCyndy Ishida #include "gtest/gtest.h"
1479320a0cSCyndy Ishida #include <string>
1579320a0cSCyndy Ishida #include <vector>
1679320a0cSCyndy Ishida 
1779320a0cSCyndy Ishida using namespace llvm;
1879320a0cSCyndy Ishida using namespace llvm::MachO;
1979320a0cSCyndy Ishida 
2079320a0cSCyndy Ishida namespace TBDv5 {
2179320a0cSCyndy Ishida 
2279320a0cSCyndy Ishida TEST(TBDv5, ReadFile) {
2379320a0cSCyndy Ishida   static const char TBDv5File[] = R"({
2479320a0cSCyndy Ishida "tapi_tbd_version": 5,
2579320a0cSCyndy Ishida "main_library": {
2679320a0cSCyndy Ishida   "target_info": [
2779320a0cSCyndy Ishida     {
2879320a0cSCyndy Ishida       "target": "x86_64-macos",
2979320a0cSCyndy Ishida       "min_deployment": "10.14"
3079320a0cSCyndy Ishida     },
3179320a0cSCyndy Ishida     {
3279320a0cSCyndy Ishida       "target": "arm64-macos",
3379320a0cSCyndy Ishida       "min_deployment": "10.14"
3479320a0cSCyndy Ishida     },
3579320a0cSCyndy Ishida     {
3679320a0cSCyndy Ishida       "target": "arm64-maccatalyst",
3779320a0cSCyndy Ishida       "min_deployment": "12.1"
3879320a0cSCyndy Ishida     }
3979320a0cSCyndy Ishida   ],
4079320a0cSCyndy Ishida   "flags": [
4179320a0cSCyndy Ishida     {
4279320a0cSCyndy Ishida       "targets": [
4379320a0cSCyndy Ishida             "x86_64-macos"
4479320a0cSCyndy Ishida         ],
4579320a0cSCyndy Ishida       "attributes": [
4679320a0cSCyndy Ishida             "flat_namespace"
4779320a0cSCyndy Ishida         ]
4879320a0cSCyndy Ishida     }
4979320a0cSCyndy Ishida   ],
5079320a0cSCyndy Ishida   "install_names": [
5179320a0cSCyndy Ishida     {
5279320a0cSCyndy Ishida         "name": "/S/L/F/Foo.framework/Foo"
5379320a0cSCyndy Ishida     }
5479320a0cSCyndy Ishida   ],
5579320a0cSCyndy Ishida   "current_versions": [
5679320a0cSCyndy Ishida     {
5779320a0cSCyndy Ishida         "version": "1.2"
5879320a0cSCyndy Ishida     }
5979320a0cSCyndy Ishida   ],
6079320a0cSCyndy Ishida   "compatibility_versions": [
6179320a0cSCyndy Ishida     { "version": "1.1" }
6279320a0cSCyndy Ishida   ],
6379320a0cSCyndy Ishida   "rpaths": [
6479320a0cSCyndy Ishida     {
6579320a0cSCyndy Ishida       "targets": [
6679320a0cSCyndy Ishida           "x86_64-macos"
6779320a0cSCyndy Ishida       ],
6879320a0cSCyndy Ishida       "paths": [
6979320a0cSCyndy Ishida           "@executable_path/.../Frameworks"
7079320a0cSCyndy Ishida       ]
7179320a0cSCyndy Ishida     }
7279320a0cSCyndy Ishida   ],
7379320a0cSCyndy Ishida   "parent_umbrellas": [
7479320a0cSCyndy Ishida     {
7579320a0cSCyndy Ishida       "umbrella": "System"
7679320a0cSCyndy Ishida     }
7779320a0cSCyndy Ishida   ],
7879320a0cSCyndy Ishida   "allowable_clients": [
7979320a0cSCyndy Ishida     {
8079320a0cSCyndy Ishida         "clients": [
8179320a0cSCyndy Ishida             "ClientA",
8279320a0cSCyndy Ishida             "ClientB"
8379320a0cSCyndy Ishida         ]
8479320a0cSCyndy Ishida     }
8579320a0cSCyndy Ishida   ],
8679320a0cSCyndy Ishida   "reexported_libraries": [
8779320a0cSCyndy Ishida     {
8879320a0cSCyndy Ishida         "names": [
8979320a0cSCyndy Ishida             "/u/l/l/libfoo.dylib",
9079320a0cSCyndy Ishida             "/u/l/l/libbar.dylib"
9179320a0cSCyndy Ishida         ]
9279320a0cSCyndy Ishida     }
9379320a0cSCyndy Ishida   ],
9479320a0cSCyndy Ishida   "exported_symbols": [
9579320a0cSCyndy Ishida     {
9679320a0cSCyndy Ishida         "targets": [
9779320a0cSCyndy Ishida             "x86_64-macos",
9879320a0cSCyndy Ishida             "arm64-macos"
9979320a0cSCyndy Ishida         ],
10079320a0cSCyndy Ishida         "data": {
10179320a0cSCyndy Ishida             "global": [
10279320a0cSCyndy Ishida                 "_global"
10379320a0cSCyndy Ishida             ],
10479320a0cSCyndy Ishida             "objc_class": [
10579320a0cSCyndy Ishida                 "ClassA"
10679320a0cSCyndy Ishida             ],
10779320a0cSCyndy Ishida             "weak": [],
10879320a0cSCyndy Ishida             "thread_local": []
10979320a0cSCyndy Ishida         },
11079320a0cSCyndy Ishida         "text": {
11179320a0cSCyndy Ishida             "global": [
11279320a0cSCyndy Ishida                 "_func"
11379320a0cSCyndy Ishida             ],
11479320a0cSCyndy Ishida             "weak": [],
11579320a0cSCyndy Ishida             "thread_local": []
11679320a0cSCyndy Ishida         }
11779320a0cSCyndy Ishida     },
11879320a0cSCyndy Ishida     {
11979320a0cSCyndy Ishida       "targets": [
12079320a0cSCyndy Ishida           "x86_64-macos"
12179320a0cSCyndy Ishida       ],
12279320a0cSCyndy Ishida       "data": {
12379320a0cSCyndy Ishida           "global": [
12479320a0cSCyndy Ishida               "_globalVar"
12579320a0cSCyndy Ishida           ],
12679320a0cSCyndy Ishida           "objc_class": [
1270882c70dSCyndy Ishida               "ClassA",
1280882c70dSCyndy Ishida               "ClassB",
12979320a0cSCyndy Ishida               "ClassData"
13079320a0cSCyndy Ishida           ],
13179320a0cSCyndy Ishida           "objc_eh_type": [
13279320a0cSCyndy Ishida               "ClassA",
13379320a0cSCyndy Ishida               "ClassB"
13479320a0cSCyndy Ishida           ],
13579320a0cSCyndy Ishida           "objc_ivar": [
13679320a0cSCyndy Ishida               "ClassA.ivar1",
13779320a0cSCyndy Ishida               "ClassA.ivar2",
13879320a0cSCyndy Ishida               "ClassC.ivar1"
13979320a0cSCyndy Ishida           ]
14079320a0cSCyndy Ishida       },
14179320a0cSCyndy Ishida       "text": {
14279320a0cSCyndy Ishida           "global": [
14379320a0cSCyndy Ishida               "_funcFoo"
14479320a0cSCyndy Ishida           ]
14579320a0cSCyndy Ishida       }
14679320a0cSCyndy Ishida     }
14779320a0cSCyndy Ishida   ],
14879320a0cSCyndy Ishida   "reexported_symbols": [
14979320a0cSCyndy Ishida     {
15079320a0cSCyndy Ishida         "targets": [
15179320a0cSCyndy Ishida             "x86_64-macos",
15279320a0cSCyndy Ishida             "arm64-macos"
15379320a0cSCyndy Ishida         ],
15479320a0cSCyndy Ishida         "data": {
15579320a0cSCyndy Ishida             "global": [
15679320a0cSCyndy Ishida                 "_globalRe"
15779320a0cSCyndy Ishida             ],
15879320a0cSCyndy Ishida             "objc_class": [
15979320a0cSCyndy Ishida                 "ClassRexport"
16079320a0cSCyndy Ishida             ]
16179320a0cSCyndy Ishida         },
16279320a0cSCyndy Ishida         "text": {
16379320a0cSCyndy Ishida             "global": [
16479320a0cSCyndy Ishida                 "_funcA"
16579320a0cSCyndy Ishida             ]
16679320a0cSCyndy Ishida         }
16779320a0cSCyndy Ishida     }
16879320a0cSCyndy Ishida   ],
16979320a0cSCyndy Ishida   "undefined_symbols": [
17079320a0cSCyndy Ishida     {
17179320a0cSCyndy Ishida         "targets": [
17279320a0cSCyndy Ishida             "x86_64-macos"
17379320a0cSCyndy Ishida         ],
17479320a0cSCyndy Ishida         "data": {
17579320a0cSCyndy Ishida             "global": [
17679320a0cSCyndy Ishida                 "_globalBind"
17779320a0cSCyndy Ishida             ],
17879320a0cSCyndy Ishida             "weak": [
17979320a0cSCyndy Ishida                 "referenced_sym"
18079320a0cSCyndy Ishida             ]
18179320a0cSCyndy Ishida         }
18279320a0cSCyndy Ishida     }
18379320a0cSCyndy Ishida   ]
18479320a0cSCyndy Ishida },
18579320a0cSCyndy Ishida "libraries": []
18679320a0cSCyndy Ishida })";
18779320a0cSCyndy Ishida 
188455bf3d1SCyndy Ishida   MemoryBufferRef InputBuf = MemoryBufferRef(TBDv5File, "Test.tbd");
189455bf3d1SCyndy Ishida   Expected<FileType> ExpectedFT = TextAPIReader::canRead(InputBuf);
190455bf3d1SCyndy Ishida   EXPECT_TRUE(!!ExpectedFT);
191455bf3d1SCyndy Ishida 
192455bf3d1SCyndy Ishida   Expected<TBDFile> Result = TextAPIReader::get(InputBuf);
19379320a0cSCyndy Ishida   EXPECT_TRUE(!!Result);
19479320a0cSCyndy Ishida   TBDFile File = std::move(Result.get());
19579320a0cSCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
196455bf3d1SCyndy Ishida   EXPECT_EQ(*ExpectedFT, File->getFileType());
19779320a0cSCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName());
19879320a0cSCyndy Ishida 
19979320a0cSCyndy Ishida   TargetList AllTargets = {
200b70d87bcSCyndy Ishida       Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)),
201f991f308SCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)),
202f991f308SCyndy Ishida       Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)),
20379320a0cSCyndy Ishida   };
204f9fe6032SCyndy Ishida   std::set<Target> FileTargets{File->targets().begin(), File->targets().end()};
20579320a0cSCyndy Ishida   EXPECT_EQ(mapToPlatformSet(AllTargets), File->getPlatforms());
20679320a0cSCyndy Ishida   EXPECT_EQ(mapToArchitectureSet(AllTargets), File->getArchitectures());
207f9fe6032SCyndy Ishida   EXPECT_EQ(FileTargets.size(), AllTargets.size());
208f9fe6032SCyndy Ishida   for (const auto &Targ : AllTargets) {
209f9fe6032SCyndy Ishida     auto FileTarg = FileTargets.find(Targ);
210f9fe6032SCyndy Ishida     EXPECT_FALSE(FileTarg == FileTargets.end());
211f9fe6032SCyndy Ishida     EXPECT_EQ(*FileTarg, Targ);
212f9fe6032SCyndy Ishida     PackedVersion MD = Targ.MinDeployment;
213f9fe6032SCyndy Ishida     PackedVersion FileMD = FileTarg->MinDeployment;
214f9fe6032SCyndy Ishida     EXPECT_EQ(MD, FileMD);
215f9fe6032SCyndy Ishida   }
21679320a0cSCyndy Ishida 
21779320a0cSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), File->getCurrentVersion());
21879320a0cSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 1, 0), File->getCompatibilityVersion());
21979320a0cSCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
22079320a0cSCyndy Ishida   EXPECT_FALSE(File->isTwoLevelNamespace());
221e17efa60SCyndy Ishida   EXPECT_FALSE(File->isOSLibNotForSharedCache());
22279320a0cSCyndy Ishida   EXPECT_EQ(0U, File->documents().size());
22379320a0cSCyndy Ishida 
22479320a0cSCyndy Ishida   InterfaceFileRef ClientA("ClientA", AllTargets);
22579320a0cSCyndy Ishida   InterfaceFileRef ClientB("ClientB", AllTargets);
22679320a0cSCyndy Ishida   EXPECT_EQ(2U, File->allowableClients().size());
22779320a0cSCyndy Ishida   EXPECT_EQ(ClientA, File->allowableClients().at(0));
22879320a0cSCyndy Ishida   EXPECT_EQ(ClientB, File->allowableClients().at(1));
22979320a0cSCyndy Ishida 
23079320a0cSCyndy Ishida   InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets);
23179320a0cSCyndy Ishida   InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets);
23279320a0cSCyndy Ishida   EXPECT_EQ(2U, File->reexportedLibraries().size());
23379320a0cSCyndy Ishida   EXPECT_EQ(ReexportA, File->reexportedLibraries().at(0));
23479320a0cSCyndy Ishida   EXPECT_EQ(ReexportB, File->reexportedLibraries().at(1));
23579320a0cSCyndy Ishida 
236b70d87bcSCyndy Ishida   TargetToAttr RPaths = {
237b70d87bcSCyndy Ishida       {Target(AK_x86_64, PLATFORM_MACOS), "@executable_path/.../Frameworks"},
238b70d87bcSCyndy Ishida   };
239b70d87bcSCyndy Ishida   EXPECT_EQ(RPaths, File->rpaths());
240b70d87bcSCyndy Ishida 
241b70d87bcSCyndy Ishida   TargetToAttr Umbrellas = {{Target(AK_x86_64, PLATFORM_MACOS), "System"},
24279320a0cSCyndy Ishida                             {Target(AK_arm64, PLATFORM_MACOS), "System"},
24379320a0cSCyndy Ishida                             {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}};
24479320a0cSCyndy Ishida   EXPECT_EQ(Umbrellas, File->umbrellas());
24579320a0cSCyndy Ishida 
24679320a0cSCyndy Ishida   ExportedSymbolSeq Exports, Reexports, Undefineds;
24779320a0cSCyndy Ishida   for (const auto *Sym : File->symbols()) {
24879320a0cSCyndy Ishida     TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()};
24979320a0cSCyndy Ishida     ExportedSymbol Temp =
250b70d87bcSCyndy Ishida         ExportedSymbol{Sym->getKind(),
251b70d87bcSCyndy Ishida                        std::string(Sym->getName()),
25279320a0cSCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
253b70d87bcSCyndy Ishida                        Sym->isThreadLocalValue(),
254b70d87bcSCyndy Ishida                        Sym->isData(),
255b70d87bcSCyndy Ishida                        SymTargets};
25679320a0cSCyndy Ishida     if (Sym->isUndefined())
25779320a0cSCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
25879320a0cSCyndy Ishida     else
25979320a0cSCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(Temp))
26079320a0cSCyndy Ishida                           : Exports.emplace_back(std::move(Temp));
26179320a0cSCyndy Ishida   }
26279320a0cSCyndy Ishida   llvm::sort(Exports);
26379320a0cSCyndy Ishida   llvm::sort(Reexports);
26479320a0cSCyndy Ishida   llvm::sort(Undefineds);
26579320a0cSCyndy Ishida 
26679320a0cSCyndy Ishida   TargetList MacOSTargets = {Target(AK_x86_64, PLATFORM_MACOS),
26779320a0cSCyndy Ishida                              Target(AK_arm64, PLATFORM_MACOS)};
26879320a0cSCyndy Ishida 
26979320a0cSCyndy Ishida   std::vector<ExportedSymbol> ExpectedExportedSymbols = {
270d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets},
271d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
27279320a0cSCyndy Ishida        "_funcFoo",
27379320a0cSCyndy Ishida        false,
27479320a0cSCyndy Ishida        false,
275b70d87bcSCyndy Ishida        false,
27679320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
277d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets},
278d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
27979320a0cSCyndy Ishida        "_globalVar",
28079320a0cSCyndy Ishida        false,
28179320a0cSCyndy Ishida        false,
282b70d87bcSCyndy Ishida        true,
28379320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
284d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
2850882c70dSCyndy Ishida        "ClassA",
2860882c70dSCyndy Ishida        false,
2870882c70dSCyndy Ishida        false,
2880882c70dSCyndy Ishida        true,
2890882c70dSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
290d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
2910882c70dSCyndy Ishida        "ClassB",
2920882c70dSCyndy Ishida        false,
2930882c70dSCyndy Ishida        false,
2940882c70dSCyndy Ishida        true,
2950882c70dSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
296d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
29779320a0cSCyndy Ishida        "ClassData",
29879320a0cSCyndy Ishida        false,
29979320a0cSCyndy Ishida        false,
300b70d87bcSCyndy Ishida        true,
30179320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
302d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
30379320a0cSCyndy Ishida        "ClassA",
30479320a0cSCyndy Ishida        false,
30579320a0cSCyndy Ishida        false,
306b70d87bcSCyndy Ishida        true,
30779320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
308d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
30979320a0cSCyndy Ishida        "ClassB",
31079320a0cSCyndy Ishida        false,
31179320a0cSCyndy Ishida        false,
312b70d87bcSCyndy Ishida        true,
31379320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
314d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
31579320a0cSCyndy Ishida        "ClassA.ivar1",
31679320a0cSCyndy Ishida        false,
31779320a0cSCyndy Ishida        false,
318b70d87bcSCyndy Ishida        true,
31979320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
320d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
32179320a0cSCyndy Ishida        "ClassA.ivar2",
32279320a0cSCyndy Ishida        false,
32379320a0cSCyndy Ishida        false,
324b70d87bcSCyndy Ishida        true,
32579320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
326d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
32779320a0cSCyndy Ishida        "ClassC.ivar1",
32879320a0cSCyndy Ishida        false,
32979320a0cSCyndy Ishida        false,
330b70d87bcSCyndy Ishida        true,
33179320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
33279320a0cSCyndy Ishida   };
33379320a0cSCyndy Ishida   std::vector<ExportedSymbol> ExpectedReexportedSymbols = {
334d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets},
335d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets},
336d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true,
337b70d87bcSCyndy Ishida        MacOSTargets},
33879320a0cSCyndy Ishida   };
33979320a0cSCyndy Ishida 
34079320a0cSCyndy Ishida   std::vector<ExportedSymbol> ExpectedUndefinedSymbols = {
341d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
34279320a0cSCyndy Ishida        "_globalBind",
34379320a0cSCyndy Ishida        false,
34479320a0cSCyndy Ishida        false,
345b70d87bcSCyndy Ishida        true,
34679320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
347d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
34879320a0cSCyndy Ishida        "referenced_sym",
34979320a0cSCyndy Ishida        true,
35079320a0cSCyndy Ishida        false,
351b70d87bcSCyndy Ishida        true,
35279320a0cSCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
35379320a0cSCyndy Ishida   };
35479320a0cSCyndy Ishida 
35579320a0cSCyndy Ishida   EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size());
35679320a0cSCyndy Ishida   EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size());
35779320a0cSCyndy Ishida   EXPECT_EQ(ExpectedUndefinedSymbols.size(), Undefineds.size());
35879320a0cSCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
35979320a0cSCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
36079320a0cSCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
36179320a0cSCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
36279320a0cSCyndy Ishida   EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(),
36379320a0cSCyndy Ishida                          std::begin(ExpectedUndefinedSymbols)));
3640882c70dSCyndy Ishida 
3650882c70dSCyndy Ishida   EXPECT_TRUE(
366d9a9872eSCyndy Ishida       File->getSymbol(EncodeKind::GlobalSymbol, "_globalBind").has_value());
36779320a0cSCyndy Ishida }
36879320a0cSCyndy Ishida 
36979320a0cSCyndy Ishida TEST(TBDv5, ReadMultipleTargets) {
37079320a0cSCyndy Ishida   static const char TBDv5File[] = R"({
37179320a0cSCyndy Ishida "tapi_tbd_version": 5,
37279320a0cSCyndy Ishida "main_library":  {
37379320a0cSCyndy Ishida   "target_info": [
37479320a0cSCyndy Ishida       {
37579320a0cSCyndy Ishida           "target": "x86_64-macos",
37679320a0cSCyndy Ishida           "min_deployment": "10.14"
37779320a0cSCyndy Ishida       },
37879320a0cSCyndy Ishida       {
37979320a0cSCyndy Ishida           "target": "arm64-macos",
38079320a0cSCyndy Ishida           "min_deployment": "10.14"
38179320a0cSCyndy Ishida       },
38279320a0cSCyndy Ishida       {
38379320a0cSCyndy Ishida           "target": "arm64-maccatalyst",
38479320a0cSCyndy Ishida           "min_deployment": "12.1"
38579320a0cSCyndy Ishida       }
38679320a0cSCyndy Ishida   ],
38779320a0cSCyndy Ishida   "install_names":[
38879320a0cSCyndy Ishida       { "name":"/usr/lib/libFoo.dylib" }
38979320a0cSCyndy Ishida   ],
39079320a0cSCyndy Ishida   "swift_abi":[ { "abi":8 } ],
39179320a0cSCyndy Ishida   "reexported_libraries": [
39279320a0cSCyndy Ishida       {
39379320a0cSCyndy Ishida           "targets": [ "x86_64-maccatalyst" ],
39479320a0cSCyndy Ishida           "names": [
39579320a0cSCyndy Ishida               "/u/l/l/libfoo.dylib",
39679320a0cSCyndy Ishida               "/u/l/l/libbar.dylib"
39779320a0cSCyndy Ishida           ]
39879320a0cSCyndy Ishida       },
39979320a0cSCyndy Ishida       {
40079320a0cSCyndy Ishida           "targets": [ "arm64-maccatalyst" ],
40179320a0cSCyndy Ishida           "names": [ "/u/l/l/libArmOnly.dylib" ]
40279320a0cSCyndy Ishida       }
40379320a0cSCyndy Ishida   ]
40479320a0cSCyndy Ishida }
40579320a0cSCyndy Ishida })";
40679320a0cSCyndy Ishida 
40779320a0cSCyndy Ishida   Expected<TBDFile> Result =
40879320a0cSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
40979320a0cSCyndy Ishida   EXPECT_TRUE(!!Result);
41079320a0cSCyndy Ishida   TBDFile File = std::move(Result.get());
41179320a0cSCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
41279320a0cSCyndy Ishida   EXPECT_EQ(std::string("/usr/lib/libFoo.dylib"), File->getInstallName());
41379320a0cSCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
41479320a0cSCyndy Ishida   EXPECT_TRUE(File->isTwoLevelNamespace());
41579320a0cSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCurrentVersion());
41679320a0cSCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), File->getCompatibilityVersion());
41779320a0cSCyndy Ishida   EXPECT_EQ(8U, File->getSwiftABIVersion());
41879320a0cSCyndy Ishida 
41979320a0cSCyndy Ishida   TargetList AllTargets = {
420b70d87bcSCyndy Ishida       Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)),
421b70d87bcSCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(10, 14)),
422b70d87bcSCyndy Ishida       Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(12, 1)),
42379320a0cSCyndy Ishida   };
42479320a0cSCyndy Ishida   EXPECT_EQ(mapToPlatformSet(AllTargets), File->getPlatforms());
42579320a0cSCyndy Ishida   EXPECT_EQ(mapToArchitectureSet(AllTargets), File->getArchitectures());
42679320a0cSCyndy Ishida 
42779320a0cSCyndy Ishida   InterfaceFileRef ReexportA("/u/l/l/libArmOnly.dylib",
42879320a0cSCyndy Ishida                              {Target(AK_arm64, PLATFORM_MACCATALYST)});
42979320a0cSCyndy Ishida   InterfaceFileRef ReexportB("/u/l/l/libbar.dylib",
43079320a0cSCyndy Ishida                              {Target(AK_x86_64, PLATFORM_MACCATALYST)});
43179320a0cSCyndy Ishida   InterfaceFileRef ReexportC("/u/l/l/libfoo.dylib",
43279320a0cSCyndy Ishida                              {Target(AK_x86_64, PLATFORM_MACCATALYST)});
43379320a0cSCyndy Ishida   EXPECT_EQ(3U, File->reexportedLibraries().size());
43479320a0cSCyndy Ishida   EXPECT_EQ(ReexportA, File->reexportedLibraries().at(0));
43579320a0cSCyndy Ishida   EXPECT_EQ(ReexportB, File->reexportedLibraries().at(1));
43679320a0cSCyndy Ishida   EXPECT_EQ(ReexportC, File->reexportedLibraries().at(2));
43779320a0cSCyndy Ishida }
43879320a0cSCyndy Ishida 
43979320a0cSCyndy Ishida TEST(TBDv5, ReadMultipleDocuments) {
44079320a0cSCyndy Ishida   static const char TBDv5File[] = R"({
44179320a0cSCyndy Ishida "tapi_tbd_version": 5,
44279320a0cSCyndy Ishida "main_library": {
44379320a0cSCyndy Ishida   "target_info": [
44479320a0cSCyndy Ishida     {
44579320a0cSCyndy Ishida       "target": "armv7-ios",
44679320a0cSCyndy Ishida       "min_deployment": "11.0"
44779320a0cSCyndy Ishida     }
44879320a0cSCyndy Ishida   ],
44979320a0cSCyndy Ishida   "install_names":[
45079320a0cSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
45179320a0cSCyndy Ishida   ],
45279320a0cSCyndy Ishida   "reexported_libraries": [
45379320a0cSCyndy Ishida     { "names": ["/u/l/l/libfoo.dylib"] }
45479320a0cSCyndy Ishida   ]
45579320a0cSCyndy Ishida },
45679320a0cSCyndy Ishida "libraries": [
45779320a0cSCyndy Ishida   {
45879320a0cSCyndy Ishida     "target_info": [
45979320a0cSCyndy Ishida       {
46079320a0cSCyndy Ishida         "target": "armv7-ios",
46179320a0cSCyndy Ishida         "min_deployment": "11.0"
46279320a0cSCyndy Ishida       }
46379320a0cSCyndy Ishida     ],
46479320a0cSCyndy Ishida     "install_names":[
46579320a0cSCyndy Ishida       { "name":"/u/l/l/libfoo.dylib" }
46679320a0cSCyndy Ishida     ],
46779320a0cSCyndy Ishida     "flags":[
46879320a0cSCyndy Ishida       { "attributes": ["not_app_extension_safe"] }
46979320a0cSCyndy Ishida     ],
47079320a0cSCyndy Ishida     "exported_symbols": [
47179320a0cSCyndy Ishida       {
47279320a0cSCyndy Ishida         "data": {
47379320a0cSCyndy Ishida           "thread_local": [ "_globalVar" ],
4740882c70dSCyndy Ishida           "objc_class": [ "ClassData", "ClassA", "ClassB"],
47579320a0cSCyndy Ishida           "objc_eh_type": [ "ClassA", "ClassB" ]
47679320a0cSCyndy Ishida         },
47779320a0cSCyndy Ishida         "text": {
47879320a0cSCyndy Ishida           "global": [ "_funcFoo" ]
47979320a0cSCyndy Ishida         }
48079320a0cSCyndy Ishida       }
48179320a0cSCyndy Ishida     ]
48279320a0cSCyndy Ishida   }
48379320a0cSCyndy Ishida ]})";
48479320a0cSCyndy Ishida 
48579320a0cSCyndy Ishida   Expected<TBDFile> Result =
48679320a0cSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
48779320a0cSCyndy Ishida   EXPECT_TRUE(!!Result);
48879320a0cSCyndy Ishida   TBDFile File = std::move(Result.get());
48979320a0cSCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
49079320a0cSCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName());
49179320a0cSCyndy Ishida   EXPECT_TRUE(File->isTwoLevelNamespace());
49279320a0cSCyndy Ishida   EXPECT_TRUE(File->isApplicationExtensionSafe());
49379320a0cSCyndy Ishida 
49479320a0cSCyndy Ishida   TargetList Targets(File->targets().begin(), File->targets().end());
495b70d87bcSCyndy Ishida   Target iOSTarget(AK_armv7, PLATFORM_IOS, VersionTuple(11, 0));
49679320a0cSCyndy Ishida   EXPECT_EQ(TargetList{iOSTarget}, Targets);
49779320a0cSCyndy Ishida   std::vector<const Symbol *> Symbols(File->symbols().begin(),
49879320a0cSCyndy Ishida                                       File->symbols().end());
49979320a0cSCyndy Ishida   EXPECT_EQ(0U, Symbols.size());
50079320a0cSCyndy Ishida 
50179320a0cSCyndy Ishida   InterfaceFileRef Reexport("/u/l/l/libfoo.dylib", {iOSTarget});
50279320a0cSCyndy Ishida   EXPECT_EQ(1U, File->reexportedLibraries().size());
50379320a0cSCyndy Ishida   EXPECT_EQ(Reexport, File->reexportedLibraries().at(0));
50479320a0cSCyndy Ishida 
50579320a0cSCyndy Ishida   // Check inlined library.
50679320a0cSCyndy Ishida   EXPECT_EQ(1U, File->documents().size());
50779320a0cSCyndy Ishida   TBDReexportFile Document = File->documents().front();
50879320a0cSCyndy Ishida   Targets = {Document->targets().begin(), Document->targets().end()};
50979320a0cSCyndy Ishida   EXPECT_EQ(TargetList{iOSTarget}, Targets);
51079320a0cSCyndy Ishida   EXPECT_EQ(std::string("/u/l/l/libfoo.dylib"), Document->getInstallName());
51179320a0cSCyndy Ishida   EXPECT_EQ(0U, Document->getSwiftABIVersion());
51279320a0cSCyndy Ishida   EXPECT_TRUE(Document->isTwoLevelNamespace());
51379320a0cSCyndy Ishida   EXPECT_FALSE(Document->isApplicationExtensionSafe());
51479320a0cSCyndy Ishida 
51579320a0cSCyndy Ishida   ExportedSymbolSeq Exports;
51679320a0cSCyndy Ishida   for (const auto *Sym : Document->symbols())
51779320a0cSCyndy Ishida     Exports.emplace_back(
51879320a0cSCyndy Ishida         ExportedSymbol{Sym->getKind(),
51979320a0cSCyndy Ishida                        std::string(Sym->getName()),
52079320a0cSCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
52179320a0cSCyndy Ishida                        Sym->isThreadLocalValue(),
522b70d87bcSCyndy Ishida                        Sym->isData(),
52379320a0cSCyndy Ishida                        {iOSTarget}});
52479320a0cSCyndy Ishida 
52579320a0cSCyndy Ishida   llvm::sort(Exports);
52679320a0cSCyndy Ishida   ExportedSymbolSeq ExpectedExports = {
527d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_funcFoo", false, false, false, {iOSTarget}},
528d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_globalVar", false, true, true, {iOSTarget}},
529d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, {iOSTarget}},
530d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassB", false, false, true, {iOSTarget}},
531d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
532b70d87bcSCyndy Ishida        "ClassData",
533b70d87bcSCyndy Ishida        false,
534b70d87bcSCyndy Ishida        false,
535b70d87bcSCyndy Ishida        true,
536b70d87bcSCyndy Ishida        {iOSTarget}},
537d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
538b70d87bcSCyndy Ishida        "ClassA",
539b70d87bcSCyndy Ishida        false,
540b70d87bcSCyndy Ishida        false,
541b70d87bcSCyndy Ishida        true,
542b70d87bcSCyndy Ishida        {iOSTarget}},
543d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
544b70d87bcSCyndy Ishida        "ClassB",
545b70d87bcSCyndy Ishida        false,
546b70d87bcSCyndy Ishida        false,
547b70d87bcSCyndy Ishida        true,
548b70d87bcSCyndy Ishida        {iOSTarget}},
54979320a0cSCyndy Ishida   };
55079320a0cSCyndy Ishida 
55179320a0cSCyndy Ishida   EXPECT_EQ(ExpectedExports.size(), Exports.size());
55279320a0cSCyndy Ishida   EXPECT_TRUE(
55379320a0cSCyndy Ishida       std::equal(Exports.begin(), Exports.end(), std::begin(ExpectedExports)));
55479320a0cSCyndy Ishida }
55579320a0cSCyndy Ishida 
556d6f9b97bSCyndy Ishida TEST(TBDv5, WriteFile) {
557d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
558d6f9b97bSCyndy Ishida "tapi_tbd_version": 5,
559d6f9b97bSCyndy Ishida "main_library": {
560d6f9b97bSCyndy Ishida   "target_info": [
561d6f9b97bSCyndy Ishida     {
562d6f9b97bSCyndy Ishida       "target": "x86_64-macos",
563d6f9b97bSCyndy Ishida       "min_deployment": "10.14"
564d6f9b97bSCyndy Ishida     },
565d6f9b97bSCyndy Ishida     {
566d6f9b97bSCyndy Ishida       "target": "arm64-macos",
567d6f9b97bSCyndy Ishida       "min_deployment": "10.14"
568d6f9b97bSCyndy Ishida     },
569d6f9b97bSCyndy Ishida     {
570d6f9b97bSCyndy Ishida       "target": "arm64-maccatalyst",
571d6f9b97bSCyndy Ishida       "min_deployment": "12.1"
572d6f9b97bSCyndy Ishida     }
573d6f9b97bSCyndy Ishida   ],
574d6f9b97bSCyndy Ishida   "install_names": [
575d6f9b97bSCyndy Ishida     {
576d6f9b97bSCyndy Ishida         "name": "@rpath/S/L/F/Foo.framework/Foo"
577d6f9b97bSCyndy Ishida     }
578d6f9b97bSCyndy Ishida   ],
579d6f9b97bSCyndy Ishida   "current_versions": [
580d6f9b97bSCyndy Ishida     {
581d6f9b97bSCyndy Ishida         "version": "1.2"
582d6f9b97bSCyndy Ishida     }
583d6f9b97bSCyndy Ishida   ],
584d6f9b97bSCyndy Ishida   "compatibility_versions": [
585d6f9b97bSCyndy Ishida     { "version": "1.1" }
586d6f9b97bSCyndy Ishida   ],
587d6f9b97bSCyndy Ishida   "flags": [
588d6f9b97bSCyndy Ishida     {
589d6f9b97bSCyndy Ishida       "attributes": [
590d6f9b97bSCyndy Ishida             "flat_namespace"
591d6f9b97bSCyndy Ishida         ]
592d6f9b97bSCyndy Ishida     }
593d6f9b97bSCyndy Ishida   ],
594d6f9b97bSCyndy Ishida   "rpaths": [
595d6f9b97bSCyndy Ishida     {
596d6f9b97bSCyndy Ishida       "targets": [
597d6f9b97bSCyndy Ishida           "x86_64-macos"
598d6f9b97bSCyndy Ishida       ],
599d6f9b97bSCyndy Ishida       "paths": [
600d6f9b97bSCyndy Ishida           "@executable_path/.../Frameworks"
601d6f9b97bSCyndy Ishida       ]
602d6f9b97bSCyndy Ishida     }
603d6f9b97bSCyndy Ishida   ],
604d6f9b97bSCyndy Ishida   "parent_umbrellas": [
605d6f9b97bSCyndy Ishida     {
606d6f9b97bSCyndy Ishida       "umbrella": "System"
607d6f9b97bSCyndy Ishida     }
608d6f9b97bSCyndy Ishida   ],
609d6f9b97bSCyndy Ishida   "allowable_clients": [
610d6f9b97bSCyndy Ishida     {
611d6f9b97bSCyndy Ishida         "clients": [
612d6f9b97bSCyndy Ishida             "ClientA",
613d6f9b97bSCyndy Ishida             "ClientB"
614d6f9b97bSCyndy Ishida         ]
615d6f9b97bSCyndy Ishida     }
616d6f9b97bSCyndy Ishida   ],
617d6f9b97bSCyndy Ishida   "reexported_libraries": [
618d6f9b97bSCyndy Ishida     {
619d6f9b97bSCyndy Ishida         "names": [
620d6f9b97bSCyndy Ishida             "/u/l/l/libfoo.dylib",
621d6f9b97bSCyndy Ishida             "/u/l/l/libbar.dylib"
622d6f9b97bSCyndy Ishida         ]
623d6f9b97bSCyndy Ishida     }
624d6f9b97bSCyndy Ishida   ],
625d6f9b97bSCyndy Ishida   "exported_symbols": [
626d6f9b97bSCyndy Ishida     {
627d6f9b97bSCyndy Ishida         "targets": [
628d6f9b97bSCyndy Ishida             "x86_64-macos",
629d6f9b97bSCyndy Ishida             "arm64-macos"
630d6f9b97bSCyndy Ishida         ],
631d6f9b97bSCyndy Ishida         "data": {
632d6f9b97bSCyndy Ishida             "global": [
633d6f9b97bSCyndy Ishida                 "_global"
634d6f9b97bSCyndy Ishida             ],
635d6f9b97bSCyndy Ishida             "objc_class": [
636d6f9b97bSCyndy Ishida                 "ClassA"
637d6f9b97bSCyndy Ishida             ],
638d6f9b97bSCyndy Ishida             "weak": [],
639d6f9b97bSCyndy Ishida             "thread_local": []
640d6f9b97bSCyndy Ishida         },
641d6f9b97bSCyndy Ishida         "text": {
642d6f9b97bSCyndy Ishida             "global": [
643d6f9b97bSCyndy Ishida                 "_func"
644d6f9b97bSCyndy Ishida             ],
645d6f9b97bSCyndy Ishida             "weak": [],
646d6f9b97bSCyndy Ishida             "thread_local": []
647d6f9b97bSCyndy Ishida         }
648d6f9b97bSCyndy Ishida     },
649d6f9b97bSCyndy Ishida     {
650d6f9b97bSCyndy Ishida       "targets": [
651d6f9b97bSCyndy Ishida           "x86_64-macos"
652d6f9b97bSCyndy Ishida       ],
653d6f9b97bSCyndy Ishida       "data": {
654d6f9b97bSCyndy Ishida           "global": [
655d6f9b97bSCyndy Ishida               "_globalVar"
656d6f9b97bSCyndy Ishida           ],
657d6f9b97bSCyndy Ishida           "objc_class": [
6580882c70dSCyndy Ishida               "ClassA",
6590882c70dSCyndy Ishida               "ClassB",
660d6f9b97bSCyndy Ishida               "ClassData"
661d6f9b97bSCyndy Ishida           ],
662d6f9b97bSCyndy Ishida           "objc_eh_type": [
663d6f9b97bSCyndy Ishida               "ClassA",
664d6f9b97bSCyndy Ishida               "ClassB"
665d6f9b97bSCyndy Ishida           ],
666d6f9b97bSCyndy Ishida           "objc_ivar": [
667d6f9b97bSCyndy Ishida               "ClassA.ivar1",
668d6f9b97bSCyndy Ishida               "ClassA.ivar2",
669d6f9b97bSCyndy Ishida               "ClassC.ivar1"
670d6f9b97bSCyndy Ishida           ]
671d6f9b97bSCyndy Ishida       },
672d6f9b97bSCyndy Ishida       "text": {
673d6f9b97bSCyndy Ishida           "global": [
674d6f9b97bSCyndy Ishida               "_funcFoo"
675d6f9b97bSCyndy Ishida           ]
676d6f9b97bSCyndy Ishida       }
677d6f9b97bSCyndy Ishida     }
678d6f9b97bSCyndy Ishida   ],
679d6f9b97bSCyndy Ishida   "reexported_symbols": [
680d6f9b97bSCyndy Ishida     {
681d6f9b97bSCyndy Ishida         "data": {
682d6f9b97bSCyndy Ishida             "global": [
683d6f9b97bSCyndy Ishida                 "_globalRe"
684d6f9b97bSCyndy Ishida             ],
685d6f9b97bSCyndy Ishida             "objc_class": [
686d6f9b97bSCyndy Ishida                 "ClassRexport"
687d6f9b97bSCyndy Ishida             ]
688d6f9b97bSCyndy Ishida         },
689d6f9b97bSCyndy Ishida         "text": {
690d6f9b97bSCyndy Ishida             "global": [
691d6f9b97bSCyndy Ishida                 "_funcA"
692d6f9b97bSCyndy Ishida             ]
693d6f9b97bSCyndy Ishida         }
694d6f9b97bSCyndy Ishida     }
695d6f9b97bSCyndy Ishida   ],
696d6f9b97bSCyndy Ishida   "undefined_symbols": [
697d6f9b97bSCyndy Ishida     {
698d6f9b97bSCyndy Ishida         "targets": [
699d6f9b97bSCyndy Ishida             "x86_64-macos"
700d6f9b97bSCyndy Ishida         ],
701d6f9b97bSCyndy Ishida         "data": {
702d6f9b97bSCyndy Ishida             "global": [
703d6f9b97bSCyndy Ishida                 "_globalBind"
704d6f9b97bSCyndy Ishida             ],
705d6f9b97bSCyndy Ishida             "weak": [
706d6f9b97bSCyndy Ishida                 "referenced_sym"
707d6f9b97bSCyndy Ishida             ]
708d6f9b97bSCyndy Ishida         }
709d6f9b97bSCyndy Ishida     }
710d6f9b97bSCyndy Ishida   ]
711d6f9b97bSCyndy Ishida }})";
712d6f9b97bSCyndy Ishida 
713d6f9b97bSCyndy Ishida   InterfaceFile File;
714d6f9b97bSCyndy Ishida   File.setFileType(FileType::TBD_V5);
715d6f9b97bSCyndy Ishida 
716d6f9b97bSCyndy Ishida   TargetList AllTargets = {
717d6f9b97bSCyndy Ishida       Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)),
718d6f9b97bSCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(10, 14)),
719d6f9b97bSCyndy Ishida       Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(12, 1)),
720d6f9b97bSCyndy Ishida   };
721d6f9b97bSCyndy Ishida   File.addTargets(AllTargets);
722d6f9b97bSCyndy Ishida   File.setInstallName("@rpath/S/L/F/Foo.framework/Foo");
723d6f9b97bSCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 2, 0));
724d6f9b97bSCyndy Ishida   File.setCompatibilityVersion(PackedVersion(1, 1, 0));
725515d3f7dSCyndy Ishida   File.addRPath("@executable_path/.../Frameworks", AllTargets[0]);
726d6f9b97bSCyndy Ishida 
727d6f9b97bSCyndy Ishida   for (const auto &Targ : AllTargets) {
728d6f9b97bSCyndy Ishida     File.addParentUmbrella(Targ, "System");
729d6f9b97bSCyndy Ishida     File.addAllowableClient("ClientA", Targ);
730d6f9b97bSCyndy Ishida     File.addAllowableClient("ClientB", Targ);
731d6f9b97bSCyndy Ishida     File.addReexportedLibrary("/u/l/l/libfoo.dylib", Targ);
732d6f9b97bSCyndy Ishida     File.addReexportedLibrary("/u/l/l/libbar.dylib", Targ);
733d6f9b97bSCyndy Ishida   }
734d6f9b97bSCyndy Ishida 
735d6f9b97bSCyndy Ishida   SymbolFlags Flags = SymbolFlags::None;
736d6f9b97bSCyndy Ishida   // Exports.
737d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_global",
738d6f9b97bSCyndy Ishida                  {AllTargets[0], AllTargets[1]}, Flags | SymbolFlags::Data);
739d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_func",
740d6f9b97bSCyndy Ishida                  {AllTargets[0], AllTargets[1]}, Flags | SymbolFlags::Text);
741d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "ClassA",
742d6f9b97bSCyndy Ishida                  {AllTargets[0], AllTargets[1]}, Flags | SymbolFlags::Data);
743d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_funcFoo", {AllTargets[0]},
744d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Text);
745d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_globalVar", {AllTargets[0]},
746d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
747d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "ClassData", {AllTargets[0]},
748d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
749d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClassEHType, "ClassA", {AllTargets[0]},
750d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
751d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClassEHType, "ClassB", {AllTargets[0]},
752d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
753d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "ClassA.ivar1",
754d6f9b97bSCyndy Ishida                  {AllTargets[0]}, Flags | SymbolFlags::Data);
755d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "ClassA.ivar2",
756d6f9b97bSCyndy Ishida                  {AllTargets[0]}, Flags | SymbolFlags::Data);
757d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCInstanceVariable, "ClassC.ivar1",
758d6f9b97bSCyndy Ishida                  {AllTargets[0]}, Flags | SymbolFlags::Data);
759d6f9b97bSCyndy Ishida 
760d6f9b97bSCyndy Ishida   // Reexports.
761d6f9b97bSCyndy Ishida   Flags = SymbolFlags::Rexported;
762d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_globalRe", AllTargets,
763d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
764d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_funcA", AllTargets,
765d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Text);
766d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::ObjectiveCClass, "ClassRexport", AllTargets,
767d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
768d6f9b97bSCyndy Ishida 
769d6f9b97bSCyndy Ishida   // Undefineds.
770d6f9b97bSCyndy Ishida   Flags = SymbolFlags::Undefined;
771d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "_globalBind", {AllTargets[0]},
772d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data);
773d9a9872eSCyndy Ishida   File.addSymbol(EncodeKind::GlobalSymbol, "referenced_sym", {AllTargets[0]},
774d6f9b97bSCyndy Ishida                  Flags | SymbolFlags::Data | SymbolFlags::WeakReferenced);
775d6f9b97bSCyndy Ishida 
776d6f9b97bSCyndy Ishida   File.setTwoLevelNamespace(false);
777d6f9b97bSCyndy Ishida   File.setApplicationExtensionSafe(true);
778d6f9b97bSCyndy Ishida 
779d6f9b97bSCyndy Ishida   // Write out file then process it back into IF and compare equality
780d6f9b97bSCyndy Ishida   // against TBDv5File.
781d6f9b97bSCyndy Ishida   SmallString<4096> Buffer;
782d6f9b97bSCyndy Ishida   raw_svector_ostream OS(Buffer);
783d6f9b97bSCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File);
784d6f9b97bSCyndy Ishida   EXPECT_FALSE(Result);
785d6f9b97bSCyndy Ishida 
786d6f9b97bSCyndy Ishida   Expected<TBDFile> Input =
787d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Input.tbd"));
788d6f9b97bSCyndy Ishida   EXPECT_TRUE(!!Input);
789d6f9b97bSCyndy Ishida   TBDFile InputFile = std::move(Input.get());
790d6f9b97bSCyndy Ishida 
791d6f9b97bSCyndy Ishida   Expected<TBDFile> Output =
792d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd"));
793d6f9b97bSCyndy Ishida   EXPECT_TRUE(!!Output);
794d6f9b97bSCyndy Ishida   TBDFile OutputFile = std::move(Output.get());
795d6f9b97bSCyndy Ishida   EXPECT_EQ(*InputFile, *OutputFile);
796d6f9b97bSCyndy Ishida }
797d6f9b97bSCyndy Ishida 
798d6f9b97bSCyndy Ishida TEST(TBDv5, WriteMultipleDocuments) {
799d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
800d6f9b97bSCyndy Ishida "tapi_tbd_version": 5,
801d6f9b97bSCyndy Ishida "main_library": {
802d6f9b97bSCyndy Ishida   "target_info": [
803d6f9b97bSCyndy Ishida     {
804d6f9b97bSCyndy Ishida       "target": "armv7-ios",
805d6f9b97bSCyndy Ishida       "min_deployment": "11.0"
806d6f9b97bSCyndy Ishida     }
807d6f9b97bSCyndy Ishida   ],
808d6f9b97bSCyndy Ishida   "install_names":[
809d6f9b97bSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
810d6f9b97bSCyndy Ishida   ],
811d6f9b97bSCyndy Ishida   "reexported_libraries": [
812d6f9b97bSCyndy Ishida     { "names": ["/u/l/l/libfoo.dylib"]
813d6f9b97bSCyndy Ishida     }
814d6f9b97bSCyndy Ishida   ]
815d6f9b97bSCyndy Ishida },
816d6f9b97bSCyndy Ishida "libraries": [
817d6f9b97bSCyndy Ishida   {
818d6f9b97bSCyndy Ishida     "target_info": [
819d6f9b97bSCyndy Ishida       {
820d6f9b97bSCyndy Ishida         "target": "armv7-ios",
821d6f9b97bSCyndy Ishida         "min_deployment": "11.0"
822d6f9b97bSCyndy Ishida       },
823d6f9b97bSCyndy Ishida       {
824d6f9b97bSCyndy Ishida         "target": "armv7s-ios",
825d6f9b97bSCyndy Ishida         "min_deployment": "11.0"
826d6f9b97bSCyndy Ishida       }
827d6f9b97bSCyndy Ishida     ],
828d6f9b97bSCyndy Ishida     "install_names":[
829d6f9b97bSCyndy Ishida       { "name":"/u/l/l/libfoo.dylib" }
830d6f9b97bSCyndy Ishida     ],
831d6f9b97bSCyndy Ishida     "current_versions": [
832d6f9b97bSCyndy Ishida       {
833d6f9b97bSCyndy Ishida           "version": "2.1.1"
834d6f9b97bSCyndy Ishida       }
835d6f9b97bSCyndy Ishida     ],
836d6f9b97bSCyndy Ishida     "rpaths": [
837d6f9b97bSCyndy Ishida       {
838d6f9b97bSCyndy Ishida         "targets": [
839d6f9b97bSCyndy Ishida             "armv7-ios"
840d6f9b97bSCyndy Ishida         ],
841d6f9b97bSCyndy Ishida         "paths": [
842d6f9b97bSCyndy Ishida             "@executable_path/.../Frameworks"
843d6f9b97bSCyndy Ishida         ]
844d6f9b97bSCyndy Ishida       }],
845d6f9b97bSCyndy Ishida     "reexported_libraries": [ { "names": ["@rpath/libfoo.dylib"] } ],
846d6f9b97bSCyndy Ishida     "flags":[
847d6f9b97bSCyndy Ishida       { "attributes": ["not_app_extension_safe"] }
848d6f9b97bSCyndy Ishida     ],
849d6f9b97bSCyndy Ishida     "exported_symbols": [
850d6f9b97bSCyndy Ishida       {
851d6f9b97bSCyndy Ishida         "text": {
852d6f9b97bSCyndy Ishida           "global": [ "_funcFoo" ]
853d6f9b97bSCyndy Ishida         }
854d6f9b97bSCyndy Ishida       }
855d6f9b97bSCyndy Ishida     ]
856d6f9b97bSCyndy Ishida   },
857d6f9b97bSCyndy Ishida   {
858d6f9b97bSCyndy Ishida     "target_info": [
859d6f9b97bSCyndy Ishida       {
860d6f9b97bSCyndy Ishida         "target": "armv7-ios",
861d6f9b97bSCyndy Ishida         "min_deployment": "11.0"
862d6f9b97bSCyndy Ishida       }
863d6f9b97bSCyndy Ishida     ],
864d6f9b97bSCyndy Ishida     "install_names":[
865d6f9b97bSCyndy Ishida       { "name":"@rpath/libfoo.dylib" }
866d6f9b97bSCyndy Ishida     ],
867d6f9b97bSCyndy Ishida     "exported_symbols": [
868d6f9b97bSCyndy Ishida       {
869d6f9b97bSCyndy Ishida         "data": {
870d6f9b97bSCyndy Ishida           "global": [ "_varFooBaz" ]
871d6f9b97bSCyndy Ishida         }
872d6f9b97bSCyndy Ishida       }
873d6f9b97bSCyndy Ishida     ]
874d6f9b97bSCyndy Ishida   }
875d6f9b97bSCyndy Ishida ]})";
876d6f9b97bSCyndy Ishida 
877d6f9b97bSCyndy Ishida   InterfaceFile File;
878d6f9b97bSCyndy Ishida   File.setFileType(FileType::TBD_V5);
879d6f9b97bSCyndy Ishida 
880d6f9b97bSCyndy Ishida   TargetList AllTargets = {
881d6f9b97bSCyndy Ishida       Target(AK_armv7, PLATFORM_IOS, VersionTuple(11, 0)),
882d6f9b97bSCyndy Ishida       Target(AK_armv7s, PLATFORM_IOS, VersionTuple(11, 0)),
883d6f9b97bSCyndy Ishida   };
884d6f9b97bSCyndy Ishida   File.setInstallName("/S/L/F/Foo.framework/Foo");
885d6f9b97bSCyndy Ishida   File.addTarget(AllTargets[0]);
886d6f9b97bSCyndy Ishida   File.setCurrentVersion(PackedVersion(1, 0, 0));
887d6f9b97bSCyndy Ishida   File.setCompatibilityVersion(PackedVersion(1, 0, 0));
888d6f9b97bSCyndy Ishida   File.addReexportedLibrary("/u/l/l/libfoo.dylib", AllTargets[0]);
889d6f9b97bSCyndy Ishida   File.setTwoLevelNamespace();
890d6f9b97bSCyndy Ishida   File.setApplicationExtensionSafe(true);
891d6f9b97bSCyndy Ishida 
892d6f9b97bSCyndy Ishida   InterfaceFile NestedFile;
893d6f9b97bSCyndy Ishida   NestedFile.setFileType(FileType::TBD_V5);
894d6f9b97bSCyndy Ishida   NestedFile.setInstallName("/u/l/l/libfoo.dylib");
895d6f9b97bSCyndy Ishida   NestedFile.addTargets(AllTargets);
896d6f9b97bSCyndy Ishida   NestedFile.setCompatibilityVersion(PackedVersion(1, 0, 0));
897d6f9b97bSCyndy Ishida   NestedFile.setTwoLevelNamespace();
898d6f9b97bSCyndy Ishida   NestedFile.setApplicationExtensionSafe(false);
899d6f9b97bSCyndy Ishida   NestedFile.setCurrentVersion(PackedVersion(2, 1, 1));
900515d3f7dSCyndy Ishida   NestedFile.addRPath("@executable_path/.../Frameworks", AllTargets[0]);
901d6f9b97bSCyndy Ishida   for (const auto &Targ : AllTargets)
902d6f9b97bSCyndy Ishida     NestedFile.addReexportedLibrary("@rpath/libfoo.dylib", Targ);
903d9a9872eSCyndy Ishida   NestedFile.addSymbol(EncodeKind::GlobalSymbol, "_funcFoo", AllTargets,
904d6f9b97bSCyndy Ishida                        SymbolFlags::Text);
905d6f9b97bSCyndy Ishida   File.addDocument(std::make_shared<InterfaceFile>(std::move(NestedFile)));
906d6f9b97bSCyndy Ishida 
907d6f9b97bSCyndy Ishida   InterfaceFile NestedFileB;
908d6f9b97bSCyndy Ishida   NestedFileB.setFileType(FileType::TBD_V5);
909d6f9b97bSCyndy Ishida   NestedFileB.setInstallName("@rpath/libfoo.dylib");
910d6f9b97bSCyndy Ishida   NestedFileB.addTarget(AllTargets[0]);
911d6f9b97bSCyndy Ishida   NestedFileB.setCompatibilityVersion(PackedVersion(1, 0, 0));
912d6f9b97bSCyndy Ishida   NestedFileB.setCurrentVersion(PackedVersion(1, 0, 0));
913d6f9b97bSCyndy Ishida   NestedFileB.setTwoLevelNamespace();
914d6f9b97bSCyndy Ishida   NestedFileB.setApplicationExtensionSafe(true);
915d9a9872eSCyndy Ishida   NestedFileB.addSymbol(EncodeKind::GlobalSymbol, "_varFooBaz", {AllTargets[0]},
916d6f9b97bSCyndy Ishida                         SymbolFlags::Data);
917d6f9b97bSCyndy Ishida   File.addDocument(std::make_shared<InterfaceFile>(std::move(NestedFileB)));
918d6f9b97bSCyndy Ishida 
919d6f9b97bSCyndy Ishida   // Write out file then process it back into IF and compare equality
920d6f9b97bSCyndy Ishida   // against TBDv5File.
921d6f9b97bSCyndy Ishida   SmallString<4096> Buffer;
922d6f9b97bSCyndy Ishida   raw_svector_ostream OS(Buffer);
923455bf3d1SCyndy Ishida   Error Result = TextAPIWriter::writeToStream(OS, File, FileType::Invalid,
924455bf3d1SCyndy Ishida                                               /*Compact=*/true);
925d6f9b97bSCyndy Ishida   EXPECT_FALSE(Result);
926d6f9b97bSCyndy Ishida 
927d6f9b97bSCyndy Ishida   Expected<TBDFile> Input =
928d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Input.tbd"));
929d6f9b97bSCyndy Ishida   EXPECT_TRUE(!!Input);
930d6f9b97bSCyndy Ishida   TBDFile InputFile = std::move(Input.get());
931d6f9b97bSCyndy Ishida 
932d6f9b97bSCyndy Ishida   Expected<TBDFile> Output =
933d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd"));
934d6f9b97bSCyndy Ishida   EXPECT_TRUE(!!Output);
935d6f9b97bSCyndy Ishida   TBDFile OutputFile = std::move(Output.get());
936d6f9b97bSCyndy Ishida   EXPECT_EQ(*InputFile, *OutputFile);
937d6f9b97bSCyndy Ishida }
938d6f9b97bSCyndy Ishida 
939d6f9b97bSCyndy Ishida TEST(TBDv5, Target_Simulator) {
940d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
941d6f9b97bSCyndy Ishida "tapi_tbd_version": 5,
942d6f9b97bSCyndy Ishida "main_library": {
943d6f9b97bSCyndy Ishida   "target_info": [
944d6f9b97bSCyndy Ishida     {
945d6f9b97bSCyndy Ishida       "target": "arm64-ios-simulator",
946d6f9b97bSCyndy Ishida       "min_deployment": "11.0"
947d6f9b97bSCyndy Ishida     },
948d6f9b97bSCyndy Ishida     {
949d6f9b97bSCyndy Ishida       "target": "x86_64-ios-simulator",
950d6f9b97bSCyndy Ishida       "min_deployment": "11.3"
951d6f9b97bSCyndy Ishida     }
952d6f9b97bSCyndy Ishida   ],
953d6f9b97bSCyndy Ishida   "install_names":[
954d6f9b97bSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
955d6f9b97bSCyndy Ishida   ]
956d6f9b97bSCyndy Ishida }})";
957d6f9b97bSCyndy Ishida 
958d6f9b97bSCyndy Ishida   Expected<TBDFile> Result =
959d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
960d6f9b97bSCyndy Ishida   EXPECT_TRUE(!!Result);
961d6f9b97bSCyndy Ishida   TBDFile File = std::move(Result.get());
962d6f9b97bSCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
963d6f9b97bSCyndy Ishida   TargetList ExpectedTargets = {
964d6f9b97bSCyndy Ishida       Target(AK_x86_64, PLATFORM_IOSSIMULATOR, VersionTuple(11, 3)),
965f991f308SCyndy Ishida       Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(14, 0)),
966d6f9b97bSCyndy Ishida   };
967d6f9b97bSCyndy Ishida   TargetList Targets{File->targets().begin(), File->targets().end()};
968d6f9b97bSCyndy Ishida   llvm::sort(Targets);
969d6f9b97bSCyndy Ishida   EXPECT_EQ(Targets, ExpectedTargets);
970d6f9b97bSCyndy Ishida 
971d6f9b97bSCyndy Ishida   SmallString<4096> Buffer;
972d6f9b97bSCyndy Ishida   raw_svector_ostream OS(Buffer);
973d6f9b97bSCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
974d6f9b97bSCyndy Ishida   EXPECT_TRUE(!WriteResult);
975d6f9b97bSCyndy Ishida 
976d6f9b97bSCyndy Ishida   Expected<TBDFile> Output =
977d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd"));
978d6f9b97bSCyndy Ishida   EXPECT_TRUE(!!Output);
979d6f9b97bSCyndy Ishida   TBDFile WriteResultFile = std::move(Output.get());
980d6f9b97bSCyndy Ishida   EXPECT_EQ(*File, *WriteResultFile);
981d6f9b97bSCyndy Ishida }
982d6f9b97bSCyndy Ishida 
98339748656SCyndy Ishida TEST(TBDv5, Target_UnsupportedMinOS) {
98439748656SCyndy Ishida   static const char TBDv5File[] = R"({
98539748656SCyndy Ishida "tapi_tbd_version": 5,
98639748656SCyndy Ishida "main_library": {
98739748656SCyndy Ishida   "target_info": [
98839748656SCyndy Ishida     {
98939748656SCyndy Ishida       "target": "arm64-macos",
99039748656SCyndy Ishida       "min_deployment": "10.14"
99139748656SCyndy Ishida     },
99239748656SCyndy Ishida     {
99339748656SCyndy Ishida       "target": "x86_64-macos",
99439748656SCyndy Ishida       "min_deployment": "10.14"
99539748656SCyndy Ishida     }
99639748656SCyndy Ishida   ],
99739748656SCyndy Ishida   "install_names":[
99839748656SCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
99939748656SCyndy Ishida   ]
100039748656SCyndy Ishida }})";
100139748656SCyndy Ishida 
100239748656SCyndy Ishida   Expected<TBDFile> Result =
100339748656SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
100439748656SCyndy Ishida   EXPECT_TRUE(!!Result);
100539748656SCyndy Ishida   TBDFile File = std::move(Result.get());
100639748656SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
100739748656SCyndy Ishida   TargetList ExpectedTargets = {
100839748656SCyndy Ishida       Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)),
100939748656SCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0)),
101039748656SCyndy Ishida   };
101139748656SCyndy Ishida   TargetList Targets{File->targets().begin(), File->targets().end()};
101239748656SCyndy Ishida   llvm::sort(Targets);
101339748656SCyndy Ishida   EXPECT_EQ(Targets, ExpectedTargets);
101439748656SCyndy Ishida 
101539748656SCyndy Ishida   SmallString<4096> Buffer;
101639748656SCyndy Ishida   raw_svector_ostream OS(Buffer);
101739748656SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
101839748656SCyndy Ishida   EXPECT_TRUE(!WriteResult);
101939748656SCyndy Ishida 
102039748656SCyndy Ishida   Expected<TBDFile> Output =
102139748656SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd"));
102239748656SCyndy Ishida   EXPECT_TRUE(!!Output);
102339748656SCyndy Ishida   TBDFile WriteResultFile = std::move(Output.get());
102439748656SCyndy Ishida   EXPECT_EQ(*File, *WriteResultFile);
102539748656SCyndy Ishida }
102639748656SCyndy Ishida 
1027d6f9b97bSCyndy Ishida TEST(TBDv5, MisspelledKey) {
1028d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
1029d6f9b97bSCyndy Ishida "tapi_tbd_version": 5,
1030d6f9b97bSCyndy Ishida "main_library": {
1031d6f9b97bSCyndy Ishida   "target_info": [
1032d6f9b97bSCyndy Ishida     {
1033d6f9b97bSCyndy Ishida       "target": "arm64-ios-simulator",
1034d6f9b97bSCyndy Ishida       "min_deployment": "11.0"
1035d6f9b97bSCyndy Ishida     }
1036d6f9b97bSCyndy Ishida   ],
1037d6f9b97bSCyndy Ishida   "intall_names":[
1038d6f9b97bSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
1039d6f9b97bSCyndy Ishida   ]
1040d6f9b97bSCyndy Ishida }})";
1041d6f9b97bSCyndy Ishida 
1042d6f9b97bSCyndy Ishida   Expected<TBDFile> Result =
1043d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
1044d6f9b97bSCyndy Ishida   EXPECT_FALSE(!!Result);
1045d6f9b97bSCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
1046d6f9b97bSCyndy Ishida   EXPECT_EQ("invalid install_names section\n", ErrorMessage);
1047d6f9b97bSCyndy Ishida }
1048d6f9b97bSCyndy Ishida 
1049d6f9b97bSCyndy Ishida TEST(TBDv5, InvalidVersion) {
1050d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
1051d6f9b97bSCyndy Ishida "tapi_tbd_version": 11,
1052d6f9b97bSCyndy Ishida "main_library": {
1053d6f9b97bSCyndy Ishida   "target_info": [
1054d6f9b97bSCyndy Ishida     {
1055d6f9b97bSCyndy Ishida       "target": "arm64-ios-simulator",
1056d6f9b97bSCyndy Ishida       "min_deployment": "11.0"
1057d6f9b97bSCyndy Ishida     }
1058d6f9b97bSCyndy Ishida   ],
1059d6f9b97bSCyndy Ishida   "install_names":[
1060d6f9b97bSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
1061d6f9b97bSCyndy Ishida   ]
1062d6f9b97bSCyndy Ishida }})";
1063d6f9b97bSCyndy Ishida 
1064d6f9b97bSCyndy Ishida   Expected<TBDFile> Result =
1065d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
1066d6f9b97bSCyndy Ishida   EXPECT_FALSE(!!Result);
1067d6f9b97bSCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
1068d6f9b97bSCyndy Ishida   EXPECT_EQ("invalid tapi_tbd_version section\n", ErrorMessage);
1069d6f9b97bSCyndy Ishida }
1070d6f9b97bSCyndy Ishida 
1071d6f9b97bSCyndy Ishida TEST(TBDv5, MissingRequiredKey) {
1072d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
1073d6f9b97bSCyndy Ishida "main_library": {
1074d6f9b97bSCyndy Ishida   "target_info": [
1075d6f9b97bSCyndy Ishida     {
1076d6f9b97bSCyndy Ishida       "target": "arm64-ios-simulator",
1077d6f9b97bSCyndy Ishida       "min_deployment": "11.0"
1078d6f9b97bSCyndy Ishida     }
1079d6f9b97bSCyndy Ishida   ],
1080d6f9b97bSCyndy Ishida   "install_names":[
1081d6f9b97bSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
1082d6f9b97bSCyndy Ishida   ]
1083d6f9b97bSCyndy Ishida }})";
1084d6f9b97bSCyndy Ishida 
1085d6f9b97bSCyndy Ishida   Expected<TBDFile> Result =
1086d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
1087d6f9b97bSCyndy Ishida   EXPECT_FALSE(!!Result);
1088d6f9b97bSCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
1089d6f9b97bSCyndy Ishida   EXPECT_EQ("invalid tapi_tbd_version section\n", ErrorMessage);
1090d6f9b97bSCyndy Ishida }
1091d6f9b97bSCyndy Ishida 
1092d6f9b97bSCyndy Ishida TEST(TBDv5, InvalidSymbols) {
1093d6f9b97bSCyndy Ishida   static const char TBDv5File[] = R"({
1094d6f9b97bSCyndy Ishida "tapi_tbd_version": 5,
1095d6f9b97bSCyndy Ishida "main_library": {
1096d6f9b97bSCyndy Ishida   "target_info": [
1097d6f9b97bSCyndy Ishida     {
1098d6f9b97bSCyndy Ishida       "target": "arm64-driverkit",
1099d6f9b97bSCyndy Ishida       "min_deployment": "11.0"
1100d6f9b97bSCyndy Ishida     }
1101d6f9b97bSCyndy Ishida   ],
1102d6f9b97bSCyndy Ishida   "install_names":[
1103d6f9b97bSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
1104d6f9b97bSCyndy Ishida   ],
1105d6f9b97bSCyndy Ishida   "exported_symbols": [
1106d6f9b97bSCyndy Ishida     {
1107d6f9b97bSCyndy Ishida       "daa": {
1108d6f9b97bSCyndy Ishida         "global": {
1109d6f9b97bSCyndy Ishida             "weak": []
1110d6f9b97bSCyndy Ishida           }
1111d6f9b97bSCyndy Ishida       }
1112d6f9b97bSCyndy Ishida     }
1113d6f9b97bSCyndy Ishida   ]
1114d6f9b97bSCyndy Ishida }})";
1115d6f9b97bSCyndy Ishida 
1116d6f9b97bSCyndy Ishida   Expected<TBDFile> Result =
1117d6f9b97bSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
1118d6f9b97bSCyndy Ishida   EXPECT_FALSE(!!Result);
1119d6f9b97bSCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
1120d6f9b97bSCyndy Ishida   EXPECT_EQ("invalid exported_symbols section\n", ErrorMessage);
1121d6f9b97bSCyndy Ishida }
1122d6f9b97bSCyndy Ishida 
11233b731391SCyndy Ishida TEST(TBDv5, DefaultMinOS) {
11243b731391SCyndy Ishida   static const char TBDv5File[] = R"({
11253b731391SCyndy Ishida "tapi_tbd_version": 5,
11263b731391SCyndy Ishida "main_library": {
11273b731391SCyndy Ishida   "target_info": [
11283b731391SCyndy Ishida     {
11293b731391SCyndy Ishida       "target": "arm64-ios-simulator"
11303b731391SCyndy Ishida     }
11313b731391SCyndy Ishida   ],
11323b731391SCyndy Ishida   "install_names":[
11333b731391SCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
11343b731391SCyndy Ishida   ]
11353b731391SCyndy Ishida }})";
11363b731391SCyndy Ishida 
11373b731391SCyndy Ishida   Expected<TBDFile> Result =
11383b731391SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
11393b731391SCyndy Ishida   EXPECT_TRUE(!!Result);
11403b731391SCyndy Ishida   TBDFile File = std::move(Result.get());
11413b731391SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
11423b731391SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"), File->getInstallName());
11433b731391SCyndy Ishida   EXPECT_TRUE(File->targets().begin() != File->targets().end());
11443b731391SCyndy Ishida   EXPECT_EQ(*File->targets().begin(),
11453b731391SCyndy Ishida             Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(0, 0)));
11463b731391SCyndy Ishida }
11473b731391SCyndy Ishida 
11483b731391SCyndy Ishida TEST(TBDv5, InvalidMinOS) {
11493b731391SCyndy Ishida   static const char TBDv5File[] = R"({
11503b731391SCyndy Ishida "tapi_tbd_version": 5,
11513b731391SCyndy Ishida "main_library": {
11523b731391SCyndy Ishida   "target_info": [
11533b731391SCyndy Ishida     {
11543b731391SCyndy Ishida       "target": "arm64-ios-simulator",
11553b731391SCyndy Ishida       "min_deployment": "swift-abi"
11563b731391SCyndy Ishida     }
11573b731391SCyndy Ishida   ],
11583b731391SCyndy Ishida   "install_names":[
11593b731391SCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
11603b731391SCyndy Ishida   ]
11613b731391SCyndy Ishida }})";
11623b731391SCyndy Ishida 
11633b731391SCyndy Ishida   Expected<TBDFile> Result =
11643b731391SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
11653b731391SCyndy Ishida   EXPECT_FALSE(!!Result);
11663b731391SCyndy Ishida   std::string ErrorMessage = toString(Result.takeError());
11673b731391SCyndy Ishida   EXPECT_EQ("invalid min_deployment section\n", ErrorMessage);
11683b731391SCyndy Ishida }
11693b731391SCyndy Ishida 
1170913f21aeSCyndy Ishida TEST(TBDv5, SimSupport) {
1171913f21aeSCyndy Ishida   static const char TBDv5File[] = R"({
1172913f21aeSCyndy Ishida "tapi_tbd_version": 5,
1173913f21aeSCyndy Ishida "main_library": {
1174913f21aeSCyndy Ishida   "target_info": [
1175913f21aeSCyndy Ishida     {
1176913f21aeSCyndy Ishida       "target": "arm64-macos",
1177913f21aeSCyndy Ishida       "min_deployment": "11.1"
1178913f21aeSCyndy Ishida     }
1179913f21aeSCyndy Ishida   ],
1180913f21aeSCyndy Ishida   "install_names":[
1181913f21aeSCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
1182913f21aeSCyndy Ishida   ],
1183913f21aeSCyndy Ishida   "flags":[
1184913f21aeSCyndy Ishida     { "attributes": ["sim_support"] }
1185913f21aeSCyndy Ishida   ]
1186913f21aeSCyndy Ishida }})";
1187913f21aeSCyndy Ishida 
1188913f21aeSCyndy Ishida   Expected<TBDFile> Result =
1189913f21aeSCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
1190913f21aeSCyndy Ishida   EXPECT_TRUE(!!Result);
1191913f21aeSCyndy Ishida   Target ExpectedTarget = Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 1));
1192913f21aeSCyndy Ishida   TBDFile ReadFile = std::move(Result.get());
1193913f21aeSCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, ReadFile->getFileType());
1194913f21aeSCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
1195913f21aeSCyndy Ishida             ReadFile->getInstallName());
1196913f21aeSCyndy Ishida   EXPECT_TRUE(ReadFile->targets().begin() != ReadFile->targets().end());
1197913f21aeSCyndy Ishida   EXPECT_EQ(*ReadFile->targets().begin(), ExpectedTarget);
1198913f21aeSCyndy Ishida   EXPECT_TRUE(ReadFile->hasSimulatorSupport());
1199913f21aeSCyndy Ishida }
1200913f21aeSCyndy Ishida 
1201e17efa60SCyndy Ishida TEST(TBDv5, NotForSharedCache) {
1202e17efa60SCyndy Ishida   static const char TBDv5File[] = R"({
1203e17efa60SCyndy Ishida "tapi_tbd_version": 5,
1204e17efa60SCyndy Ishida "main_library": {
1205e17efa60SCyndy Ishida   "target_info": [
1206e17efa60SCyndy Ishida     {
1207e17efa60SCyndy Ishida       "target": "arm64-macos",
1208e17efa60SCyndy Ishida       "min_deployment": "11.1"
1209e17efa60SCyndy Ishida     }
1210e17efa60SCyndy Ishida   ],
1211e17efa60SCyndy Ishida   "install_names":[
1212e17efa60SCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
1213e17efa60SCyndy Ishida   ],
1214e17efa60SCyndy Ishida   "flags":[
1215e17efa60SCyndy Ishida     { "attributes": ["not_for_dyld_shared_cache"] }
1216e17efa60SCyndy Ishida   ]
1217e17efa60SCyndy Ishida }})";
1218e17efa60SCyndy Ishida 
1219e17efa60SCyndy Ishida   Expected<TBDFile> Result =
1220e17efa60SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
1221e17efa60SCyndy Ishida   EXPECT_TRUE(!!Result);
1222e17efa60SCyndy Ishida   Target ExpectedTarget = Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 1));
1223e17efa60SCyndy Ishida   TBDFile ReadFile = std::move(Result.get());
1224e17efa60SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, ReadFile->getFileType());
1225e17efa60SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
1226e17efa60SCyndy Ishida             ReadFile->getInstallName());
1227e17efa60SCyndy Ishida   EXPECT_TRUE(ReadFile->targets().begin() != ReadFile->targets().end());
1228e17efa60SCyndy Ishida   EXPECT_EQ(*ReadFile->targets().begin(), ExpectedTarget);
1229e17efa60SCyndy Ishida   EXPECT_FALSE(ReadFile->hasSimulatorSupport());
1230e17efa60SCyndy Ishida   EXPECT_TRUE(ReadFile->isOSLibNotForSharedCache());
1231e17efa60SCyndy Ishida }
1232e17efa60SCyndy Ishida 
12334460fa88SCyndy Ishida TEST(TBDv5, ObjCInterfaces) {
12344460fa88SCyndy Ishida   static const char TBDv5File[] = R"({
12354460fa88SCyndy Ishida "tapi_tbd_version": 5,
12364460fa88SCyndy Ishida "main_library": {
12374460fa88SCyndy Ishida   "target_info": [
12384460fa88SCyndy Ishida     {
12394460fa88SCyndy Ishida       "target": "arm64-ios-simulator",
12404460fa88SCyndy Ishida       "min_deployment": "14.0"
12414460fa88SCyndy Ishida     }
12424460fa88SCyndy Ishida   ],
12434460fa88SCyndy Ishida   "install_names":[
12444460fa88SCyndy Ishida     { "name":"/S/L/F/Foo.framework/Foo" }
12454460fa88SCyndy Ishida   ],
12464460fa88SCyndy Ishida   "exported_symbols": [
12474460fa88SCyndy Ishida     {
12484460fa88SCyndy Ishida       "data": {
12494460fa88SCyndy Ishida          "global": [
12504460fa88SCyndy Ishida               "_global",
12514460fa88SCyndy Ishida               "_OBJC_METACLASS_$_Standalone",
12524460fa88SCyndy Ishida               "_OBJC_CLASS_$_Standalone2"
12534460fa88SCyndy Ishida           ],
12544460fa88SCyndy Ishida           "weak": ["_OBJC_EHTYPE_$_NSObject"],
12554460fa88SCyndy Ishida           "objc_class": [
12564460fa88SCyndy Ishida               "ClassA",
12574460fa88SCyndy Ishida               "ClassB"
12584460fa88SCyndy Ishida           ],
12594460fa88SCyndy Ishida           "objc_eh_type": ["ClassA"]
12604460fa88SCyndy Ishida       }
12614460fa88SCyndy Ishida     }]
12624460fa88SCyndy Ishida }})";
12634460fa88SCyndy Ishida 
12644460fa88SCyndy Ishida   Expected<TBDFile> Result =
12654460fa88SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
12664460fa88SCyndy Ishida   EXPECT_TRUE(!!Result);
12674460fa88SCyndy Ishida   TBDFile File = std::move(Result.get());
12684460fa88SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, File->getFileType());
12694460fa88SCyndy Ishida   Target ExpectedTarget =
12704460fa88SCyndy Ishida       Target(AK_arm64, PLATFORM_IOSSIMULATOR, VersionTuple(14, 0));
12714460fa88SCyndy Ishida   EXPECT_EQ(*File->targets().begin(), ExpectedTarget);
12724460fa88SCyndy Ishida 
12734460fa88SCyndy Ishida   // Check Symbols.
12744460fa88SCyndy Ishida   ExportedSymbolSeq Exports;
12754460fa88SCyndy Ishida   for (const auto *Sym : File->symbols()) {
12764460fa88SCyndy Ishida     ExportedSymbol Temp =
12774460fa88SCyndy Ishida         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
12784460fa88SCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
12794460fa88SCyndy Ishida                        Sym->isThreadLocalValue(), Sym->isData()};
12804460fa88SCyndy Ishida     Exports.emplace_back(std::move(Temp));
12814460fa88SCyndy Ishida   }
12824460fa88SCyndy Ishida   llvm::sort(Exports);
12834460fa88SCyndy Ishida 
12844460fa88SCyndy Ishida   std::vector<ExportedSymbol> ExpectedExports = {
12854460fa88SCyndy Ishida       {EncodeKind::GlobalSymbol, "_OBJC_CLASS_$_Standalone2", false, false,
12864460fa88SCyndy Ishida        true},
12874460fa88SCyndy Ishida       {EncodeKind::GlobalSymbol, "_OBJC_EHTYPE_$_NSObject", true, false, true},
12884460fa88SCyndy Ishida       {EncodeKind::GlobalSymbol, "_OBJC_METACLASS_$_Standalone", false, false,
12894460fa88SCyndy Ishida        true},
12904460fa88SCyndy Ishida       {EncodeKind::GlobalSymbol, "_global", false, false, true},
12914460fa88SCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassA", false, false, true},
12924460fa88SCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassB", false, false, true},
12934460fa88SCyndy Ishida       {EncodeKind::ObjectiveCClassEHType, "ClassA", false, false, true}};
12944460fa88SCyndy Ishida 
12954460fa88SCyndy Ishida   EXPECT_EQ(ExpectedExports.size(), Exports.size());
12964460fa88SCyndy Ishida   EXPECT_TRUE(
12974460fa88SCyndy Ishida       std::equal(Exports.begin(), Exports.end(), std::begin(ExpectedExports)));
12984460fa88SCyndy Ishida 
12994460fa88SCyndy Ishida   SmallString<4096> Buffer;
13004460fa88SCyndy Ishida   raw_svector_ostream OS(Buffer);
13014460fa88SCyndy Ishida   Error WriteResult = TextAPIWriter::writeToStream(OS, *File);
13024460fa88SCyndy Ishida   EXPECT_TRUE(!WriteResult);
13034460fa88SCyndy Ishida 
13044460fa88SCyndy Ishida   Expected<TBDFile> Output =
13054460fa88SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(Buffer, "Output.tbd"));
13064460fa88SCyndy Ishida   EXPECT_TRUE(!!Output);
13074460fa88SCyndy Ishida   TBDFile WriteResultFile = std::move(Output.get());
13084460fa88SCyndy Ishida   EXPECT_EQ(*File, *WriteResultFile);
13094460fa88SCyndy Ishida }
13104460fa88SCyndy Ishida 
131116c1f436SCyndy Ishida TEST(TBDv5, MergeIF) {
131216c1f436SCyndy Ishida   static const char TBDv5FileA[] = R"({
131316c1f436SCyndy Ishida "tapi_tbd_version": 5,
131416c1f436SCyndy Ishida "main_library": {
131516c1f436SCyndy Ishida   "target_info": [
131616c1f436SCyndy Ishida     {
131716c1f436SCyndy Ishida       "target": "x86_64-macos",
131816c1f436SCyndy Ishida       "min_deployment": "10.14"
131916c1f436SCyndy Ishida     },
132016c1f436SCyndy Ishida     {
132116c1f436SCyndy Ishida       "target": "arm64-macos",
132216c1f436SCyndy Ishida       "min_deployment": "10.14"
132316c1f436SCyndy Ishida     },
132416c1f436SCyndy Ishida     {
132516c1f436SCyndy Ishida       "target": "arm64-maccatalyst",
132616c1f436SCyndy Ishida       "min_deployment": "12.1"
132716c1f436SCyndy Ishida     }
132816c1f436SCyndy Ishida   ],
132916c1f436SCyndy Ishida   "flags": [
133016c1f436SCyndy Ishida     {
133116c1f436SCyndy Ishida       "targets": [
133216c1f436SCyndy Ishida             "x86_64-macos"
133316c1f436SCyndy Ishida         ],
133416c1f436SCyndy Ishida       "attributes": [
133516c1f436SCyndy Ishida             "flat_namespace"
133616c1f436SCyndy Ishida         ]
133716c1f436SCyndy Ishida     }
133816c1f436SCyndy Ishida   ],
133916c1f436SCyndy Ishida   "install_names": [
134016c1f436SCyndy Ishida     {
134116c1f436SCyndy Ishida         "name": "/S/L/F/Foo.framework/Foo"
134216c1f436SCyndy Ishida     }
134316c1f436SCyndy Ishida   ],
134416c1f436SCyndy Ishida   "current_versions": [
134516c1f436SCyndy Ishida     {
134616c1f436SCyndy Ishida         "version": "1.2"
134716c1f436SCyndy Ishida     }
134816c1f436SCyndy Ishida   ],
134916c1f436SCyndy Ishida   "compatibility_versions": [
135016c1f436SCyndy Ishida     { "version": "1.1" }
135116c1f436SCyndy Ishida   ],
135216c1f436SCyndy Ishida   "rpaths": [
135316c1f436SCyndy Ishida     {
135416c1f436SCyndy Ishida       "targets": [
135516c1f436SCyndy Ishida           "x86_64-macos"
135616c1f436SCyndy Ishida       ],
135716c1f436SCyndy Ishida       "paths": [
135816c1f436SCyndy Ishida           "@executable_path/.../Frameworks"
135916c1f436SCyndy Ishida       ]
136016c1f436SCyndy Ishida     }
136116c1f436SCyndy Ishida   ],
136216c1f436SCyndy Ishida   "parent_umbrellas": [
136316c1f436SCyndy Ishida     {
136416c1f436SCyndy Ishida       "umbrella": "System"
136516c1f436SCyndy Ishida     }
136616c1f436SCyndy Ishida   ],
136716c1f436SCyndy Ishida   "allowable_clients": [
136816c1f436SCyndy Ishida     {
136916c1f436SCyndy Ishida         "clients": [
137016c1f436SCyndy Ishida             "ClientA",
137116c1f436SCyndy Ishida             "ClientB"
137216c1f436SCyndy Ishida         ]
137316c1f436SCyndy Ishida     }
137416c1f436SCyndy Ishida   ],
137516c1f436SCyndy Ishida   "reexported_libraries": [
137616c1f436SCyndy Ishida     {
137716c1f436SCyndy Ishida         "names": [
137816c1f436SCyndy Ishida             "/u/l/l/libfoo.dylib",
137916c1f436SCyndy Ishida             "/u/l/l/libbar.dylib"
138016c1f436SCyndy Ishida         ]
138116c1f436SCyndy Ishida     }
138216c1f436SCyndy Ishida   ],
138316c1f436SCyndy Ishida   "exported_symbols": [
138416c1f436SCyndy Ishida     {
138516c1f436SCyndy Ishida         "targets": [
138616c1f436SCyndy Ishida             "x86_64-macos",
138716c1f436SCyndy Ishida             "arm64-macos"
138816c1f436SCyndy Ishida         ],
138916c1f436SCyndy Ishida         "data": {
139016c1f436SCyndy Ishida             "global": [
139116c1f436SCyndy Ishida                 "_global"
139216c1f436SCyndy Ishida             ],
139316c1f436SCyndy Ishida             "objc_class": [
139416c1f436SCyndy Ishida                 "ClassA"
139516c1f436SCyndy Ishida             ],
139616c1f436SCyndy Ishida             "weak": [],
139716c1f436SCyndy Ishida             "thread_local": []
139816c1f436SCyndy Ishida         },
139916c1f436SCyndy Ishida         "text": {
140016c1f436SCyndy Ishida             "global": [
140116c1f436SCyndy Ishida                 "_func"
140216c1f436SCyndy Ishida             ],
140316c1f436SCyndy Ishida             "weak": [],
140416c1f436SCyndy Ishida             "thread_local": []
140516c1f436SCyndy Ishida         }
140616c1f436SCyndy Ishida     },
140716c1f436SCyndy Ishida     {
140816c1f436SCyndy Ishida       "targets": [
140916c1f436SCyndy Ishida           "x86_64-macos"
141016c1f436SCyndy Ishida       ],
141116c1f436SCyndy Ishida       "data": {
141216c1f436SCyndy Ishida           "global": [
141316c1f436SCyndy Ishida               "_globalVar"
141416c1f436SCyndy Ishida           ],
141516c1f436SCyndy Ishida           "objc_class": [
141616c1f436SCyndy Ishida               "ClassA",
141716c1f436SCyndy Ishida               "ClassB",
141816c1f436SCyndy Ishida               "ClassData"
141916c1f436SCyndy Ishida           ],
142016c1f436SCyndy Ishida           "objc_eh_type": [
142116c1f436SCyndy Ishida               "ClassA",
142216c1f436SCyndy Ishida               "ClassB"
142316c1f436SCyndy Ishida           ],
142416c1f436SCyndy Ishida           "objc_ivar": [
142516c1f436SCyndy Ishida               "ClassA.ivar1",
142616c1f436SCyndy Ishida               "ClassA.ivar2",
142716c1f436SCyndy Ishida               "ClassC.ivar1"
142816c1f436SCyndy Ishida           ]
142916c1f436SCyndy Ishida       },
143016c1f436SCyndy Ishida       "text": {
143116c1f436SCyndy Ishida           "global": [
143216c1f436SCyndy Ishida               "_funcFoo"
143316c1f436SCyndy Ishida           ]
143416c1f436SCyndy Ishida       }
143516c1f436SCyndy Ishida     }
143616c1f436SCyndy Ishida   ],
143716c1f436SCyndy Ishida   "reexported_symbols": [
143816c1f436SCyndy Ishida     {
143916c1f436SCyndy Ishida         "targets": [
144016c1f436SCyndy Ishida             "x86_64-macos",
144116c1f436SCyndy Ishida             "arm64-macos"
144216c1f436SCyndy Ishida         ],
144316c1f436SCyndy Ishida         "data": {
144416c1f436SCyndy Ishida             "global": [
144516c1f436SCyndy Ishida                 "_globalRe"
144616c1f436SCyndy Ishida             ],
144716c1f436SCyndy Ishida             "objc_class": [
144816c1f436SCyndy Ishida                 "ClassRexport"
144916c1f436SCyndy Ishida             ]
145016c1f436SCyndy Ishida         },
145116c1f436SCyndy Ishida         "text": {
145216c1f436SCyndy Ishida             "global": [
145316c1f436SCyndy Ishida                 "_funcA"
145416c1f436SCyndy Ishida             ]
145516c1f436SCyndy Ishida         }
145616c1f436SCyndy Ishida     }
145716c1f436SCyndy Ishida   ],
145816c1f436SCyndy Ishida   "undefined_symbols": [
145916c1f436SCyndy Ishida     {
146016c1f436SCyndy Ishida         "targets": [
146116c1f436SCyndy Ishida             "x86_64-macos"
146216c1f436SCyndy Ishida         ],
146316c1f436SCyndy Ishida         "data": {
146416c1f436SCyndy Ishida             "global": [
146516c1f436SCyndy Ishida                 "_globalBind"
146616c1f436SCyndy Ishida             ],
146716c1f436SCyndy Ishida             "weak": [
146816c1f436SCyndy Ishida                 "referenced_sym"
146916c1f436SCyndy Ishida             ]
147016c1f436SCyndy Ishida         }
147116c1f436SCyndy Ishida     }
147216c1f436SCyndy Ishida   ]
147316c1f436SCyndy Ishida },
147416c1f436SCyndy Ishida "libraries": []
147516c1f436SCyndy Ishida })";
147616c1f436SCyndy Ishida 
147716c1f436SCyndy Ishida   static const char TBDv5FileB[] = R"({
147816c1f436SCyndy Ishida "tapi_tbd_version": 5,
147916c1f436SCyndy Ishida "main_library": {
148016c1f436SCyndy Ishida   "target_info": [
148116c1f436SCyndy Ishida     {
148216c1f436SCyndy Ishida       "target": "x86_64-macos",
148316c1f436SCyndy Ishida       "min_deployment": "10.14"
148416c1f436SCyndy Ishida     },
148516c1f436SCyndy Ishida     {
148616c1f436SCyndy Ishida       "target": "arm64-macos",
148716c1f436SCyndy Ishida       "min_deployment": "10.14"
148816c1f436SCyndy Ishida     },
148916c1f436SCyndy Ishida     {
149016c1f436SCyndy Ishida       "target": "arm64-maccatalyst",
149116c1f436SCyndy Ishida       "min_deployment": "12.1"
149216c1f436SCyndy Ishida     }
149316c1f436SCyndy Ishida   ],
149416c1f436SCyndy Ishida   "flags": [
149516c1f436SCyndy Ishida     {
149616c1f436SCyndy Ishida       "targets": [
149716c1f436SCyndy Ishida             "x86_64-macos"
149816c1f436SCyndy Ishida         ],
149916c1f436SCyndy Ishida       "attributes": [
150016c1f436SCyndy Ishida             "flat_namespace"
150116c1f436SCyndy Ishida         ]
150216c1f436SCyndy Ishida     }
150316c1f436SCyndy Ishida   ],
150416c1f436SCyndy Ishida   "install_names": [
150516c1f436SCyndy Ishida     {
150616c1f436SCyndy Ishida         "name": "/S/L/F/Foo.framework/Foo"
150716c1f436SCyndy Ishida     }
150816c1f436SCyndy Ishida   ],
150916c1f436SCyndy Ishida   "current_versions": [
151016c1f436SCyndy Ishida     {
151116c1f436SCyndy Ishida         "version": "1.2"
151216c1f436SCyndy Ishida     }
151316c1f436SCyndy Ishida   ],
151416c1f436SCyndy Ishida   "compatibility_versions": [
151516c1f436SCyndy Ishida     { "version": "1.1" }
151616c1f436SCyndy Ishida   ],
151716c1f436SCyndy Ishida   "exported_symbols": [
151816c1f436SCyndy Ishida     {
151916c1f436SCyndy Ishida         "targets": [
152016c1f436SCyndy Ishida             "x86_64-macos",
152116c1f436SCyndy Ishida             "arm64-macos"
152216c1f436SCyndy Ishida         ],
152316c1f436SCyndy Ishida         "data": {
152416c1f436SCyndy Ishida             "global": [
152516c1f436SCyndy Ishida                 "_globalZ"
152616c1f436SCyndy Ishida             ],
152716c1f436SCyndy Ishida             "objc_class": [
152816c1f436SCyndy Ishida                 "ClassZ"
152916c1f436SCyndy Ishida             ],
153016c1f436SCyndy Ishida             "weak": [],
153116c1f436SCyndy Ishida             "thread_local": []
153216c1f436SCyndy Ishida         },
153316c1f436SCyndy Ishida         "text": {
153416c1f436SCyndy Ishida             "global": [
153516c1f436SCyndy Ishida                 "_funcZ"
153616c1f436SCyndy Ishida             ],
153716c1f436SCyndy Ishida             "weak": [],
153816c1f436SCyndy Ishida             "thread_local": []
153916c1f436SCyndy Ishida         }
154016c1f436SCyndy Ishida     },
154116c1f436SCyndy Ishida     {
154216c1f436SCyndy Ishida       "targets": [
154316c1f436SCyndy Ishida           "x86_64-macos"
154416c1f436SCyndy Ishida       ],
154516c1f436SCyndy Ishida       "data": {
154616c1f436SCyndy Ishida           "global": [
154716c1f436SCyndy Ishida               "_globalVarZ"
154816c1f436SCyndy Ishida           ],
154916c1f436SCyndy Ishida           "objc_class": [
155016c1f436SCyndy Ishida               "ClassZ",
155116c1f436SCyndy Ishida               "ClassF"
155216c1f436SCyndy Ishida           ],
155316c1f436SCyndy Ishida           "objc_eh_type": [
155416c1f436SCyndy Ishida               "ClassZ",
155516c1f436SCyndy Ishida               "ClassF"
155616c1f436SCyndy Ishida           ],
155716c1f436SCyndy Ishida           "objc_ivar": [
155816c1f436SCyndy Ishida               "ClassZ.ivar1",
155916c1f436SCyndy Ishida               "ClassZ.ivar2",
156016c1f436SCyndy Ishida               "ClassF.ivar1"
156116c1f436SCyndy Ishida           ]
156216c1f436SCyndy Ishida       },
156316c1f436SCyndy Ishida       "text": {
156416c1f436SCyndy Ishida           "global": [
156516c1f436SCyndy Ishida               "_funcFooZ"
156616c1f436SCyndy Ishida           ]
156716c1f436SCyndy Ishida       }
156816c1f436SCyndy Ishida     }
156916c1f436SCyndy Ishida   ]
157016c1f436SCyndy Ishida },
157116c1f436SCyndy Ishida "libraries": []
157216c1f436SCyndy Ishida })";
157316c1f436SCyndy Ishida 
157416c1f436SCyndy Ishida   Expected<TBDFile> ResultA =
157516c1f436SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5FileA, "Test.tbd"));
157616c1f436SCyndy Ishida   EXPECT_TRUE(!!ResultA);
157716c1f436SCyndy Ishida   TBDFile FileA = std::move(ResultA.get());
157816c1f436SCyndy Ishida 
157916c1f436SCyndy Ishida   Expected<TBDFile> ResultB =
158016c1f436SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5FileB, "Test.tbd"));
158116c1f436SCyndy Ishida   EXPECT_TRUE(!!ResultB);
158216c1f436SCyndy Ishida   TBDFile FileB = std::move(ResultB.get());
158316c1f436SCyndy Ishida 
158416c1f436SCyndy Ishida   Expected<TBDFile> MergedResult = FileA->merge(FileB.get());
158516c1f436SCyndy Ishida   EXPECT_TRUE(!!MergedResult);
158616c1f436SCyndy Ishida   TBDFile MergedFile = std::move(MergedResult.get());
158716c1f436SCyndy Ishida 
158816c1f436SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, MergedFile->getFileType());
158916c1f436SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
159016c1f436SCyndy Ishida             MergedFile->getInstallName());
159116c1f436SCyndy Ishida   TargetList AllTargets = {
159216c1f436SCyndy Ishida       Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)),
159316c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)),
159416c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)),
159516c1f436SCyndy Ishida   };
159616c1f436SCyndy Ishida   EXPECT_EQ(mapToPlatformSet(AllTargets), MergedFile->getPlatforms());
159716c1f436SCyndy Ishida   EXPECT_EQ(mapToArchitectureSet(AllTargets), MergedFile->getArchitectures());
159816c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), MergedFile->getCurrentVersion());
159916c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 1, 0), MergedFile->getCompatibilityVersion());
160016c1f436SCyndy Ishida   EXPECT_TRUE(MergedFile->isApplicationExtensionSafe());
160116c1f436SCyndy Ishida   EXPECT_FALSE(MergedFile->isTwoLevelNamespace());
160216c1f436SCyndy Ishida   EXPECT_EQ(0U, MergedFile->documents().size());
160316c1f436SCyndy Ishida   InterfaceFileRef ClientA("ClientA", AllTargets);
160416c1f436SCyndy Ishida   InterfaceFileRef ClientB("ClientB", AllTargets);
160516c1f436SCyndy Ishida   EXPECT_EQ(2U, MergedFile->allowableClients().size());
160616c1f436SCyndy Ishida   EXPECT_EQ(ClientA, MergedFile->allowableClients().at(0));
160716c1f436SCyndy Ishida   EXPECT_EQ(ClientB, MergedFile->allowableClients().at(1));
160816c1f436SCyndy Ishida 
160916c1f436SCyndy Ishida   InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets);
161016c1f436SCyndy Ishida   InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets);
161116c1f436SCyndy Ishida   EXPECT_EQ(2U, MergedFile->reexportedLibraries().size());
161216c1f436SCyndy Ishida   EXPECT_EQ(ReexportA, MergedFile->reexportedLibraries().at(0));
161316c1f436SCyndy Ishida   EXPECT_EQ(ReexportB, MergedFile->reexportedLibraries().at(1));
161416c1f436SCyndy Ishida 
161516c1f436SCyndy Ishida   TargetToAttr RPaths = {
161616c1f436SCyndy Ishida       {Target(AK_x86_64, PLATFORM_MACOS), "@executable_path/.../Frameworks"},
161716c1f436SCyndy Ishida   };
161816c1f436SCyndy Ishida   EXPECT_EQ(RPaths, MergedFile->rpaths());
161916c1f436SCyndy Ishida 
162016c1f436SCyndy Ishida   TargetToAttr Umbrellas = {{Target(AK_x86_64, PLATFORM_MACOS), "System"},
162116c1f436SCyndy Ishida                             {Target(AK_arm64, PLATFORM_MACOS), "System"},
162216c1f436SCyndy Ishida                             {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}};
162316c1f436SCyndy Ishida   EXPECT_EQ(Umbrellas, MergedFile->umbrellas());
162416c1f436SCyndy Ishida 
162516c1f436SCyndy Ishida   ExportedSymbolSeq Exports, Reexports, Undefineds;
162616c1f436SCyndy Ishida   for (const auto *Sym : MergedFile->symbols()) {
162716c1f436SCyndy Ishida     TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()};
162816c1f436SCyndy Ishida     ExportedSymbol Temp =
162916c1f436SCyndy Ishida         ExportedSymbol{Sym->getKind(),
163016c1f436SCyndy Ishida                        std::string(Sym->getName()),
163116c1f436SCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
163216c1f436SCyndy Ishida                        Sym->isThreadLocalValue(),
163316c1f436SCyndy Ishida                        Sym->isData(),
163416c1f436SCyndy Ishida                        SymTargets};
163516c1f436SCyndy Ishida     if (Sym->isUndefined())
163616c1f436SCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
163716c1f436SCyndy Ishida     else
163816c1f436SCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(Temp))
163916c1f436SCyndy Ishida                           : Exports.emplace_back(std::move(Temp));
164016c1f436SCyndy Ishida   }
164116c1f436SCyndy Ishida   llvm::sort(Exports);
164216c1f436SCyndy Ishida   llvm::sort(Reexports);
164316c1f436SCyndy Ishida   llvm::sort(Undefineds);
164416c1f436SCyndy Ishida 
164516c1f436SCyndy Ishida   TargetList MacOSTargets = {Target(AK_x86_64, PLATFORM_MACOS),
164616c1f436SCyndy Ishida                              Target(AK_arm64, PLATFORM_MACOS)};
164716c1f436SCyndy Ishida 
164816c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedExportedSymbols = {
1649d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets},
1650d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
165116c1f436SCyndy Ishida        "_funcFoo",
165216c1f436SCyndy Ishida        false,
165316c1f436SCyndy Ishida        false,
165416c1f436SCyndy Ishida        false,
165516c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1656d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
165716c1f436SCyndy Ishida        "_funcFooZ",
165816c1f436SCyndy Ishida        false,
165916c1f436SCyndy Ishida        false,
166016c1f436SCyndy Ishida        false,
166116c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1662d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_funcZ", false, false, false, MacOSTargets},
1663d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets},
1664d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
166516c1f436SCyndy Ishida        "_globalVar",
166616c1f436SCyndy Ishida        false,
166716c1f436SCyndy Ishida        false,
166816c1f436SCyndy Ishida        true,
166916c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1670d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
167116c1f436SCyndy Ishida        "_globalVarZ",
167216c1f436SCyndy Ishida        false,
167316c1f436SCyndy Ishida        false,
167416c1f436SCyndy Ishida        true,
167516c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1676d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_globalZ", false, false, true, MacOSTargets},
1677d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
167816c1f436SCyndy Ishida        "ClassA",
167916c1f436SCyndy Ishida        false,
168016c1f436SCyndy Ishida        false,
168116c1f436SCyndy Ishida        true,
168216c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1683d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
168416c1f436SCyndy Ishida        "ClassB",
168516c1f436SCyndy Ishida        false,
168616c1f436SCyndy Ishida        false,
168716c1f436SCyndy Ishida        true,
168816c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1689d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
169016c1f436SCyndy Ishida        "ClassData",
169116c1f436SCyndy Ishida        false,
169216c1f436SCyndy Ishida        false,
169316c1f436SCyndy Ishida        true,
169416c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1695d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
169616c1f436SCyndy Ishida        "ClassF",
169716c1f436SCyndy Ishida        false,
169816c1f436SCyndy Ishida        false,
169916c1f436SCyndy Ishida        true,
170016c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1701d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass,
170216c1f436SCyndy Ishida        "ClassZ",
170316c1f436SCyndy Ishida        false,
170416c1f436SCyndy Ishida        false,
170516c1f436SCyndy Ishida        true,
170616c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1707d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
170816c1f436SCyndy Ishida        "ClassA",
170916c1f436SCyndy Ishida        false,
171016c1f436SCyndy Ishida        false,
171116c1f436SCyndy Ishida        true,
171216c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1713d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
171416c1f436SCyndy Ishida        "ClassB",
171516c1f436SCyndy Ishida        false,
171616c1f436SCyndy Ishida        false,
171716c1f436SCyndy Ishida        true,
171816c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1719d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
172016c1f436SCyndy Ishida        "ClassF",
172116c1f436SCyndy Ishida        false,
172216c1f436SCyndy Ishida        false,
172316c1f436SCyndy Ishida        true,
172416c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1725d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClassEHType,
172616c1f436SCyndy Ishida        "ClassZ",
172716c1f436SCyndy Ishida        false,
172816c1f436SCyndy Ishida        false,
172916c1f436SCyndy Ishida        true,
173016c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1731d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
173216c1f436SCyndy Ishida        "ClassA.ivar1",
173316c1f436SCyndy Ishida        false,
173416c1f436SCyndy Ishida        false,
173516c1f436SCyndy Ishida        true,
173616c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1737d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
173816c1f436SCyndy Ishida        "ClassA.ivar2",
173916c1f436SCyndy Ishida        false,
174016c1f436SCyndy Ishida        false,
174116c1f436SCyndy Ishida        true,
174216c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1743d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
174416c1f436SCyndy Ishida        "ClassC.ivar1",
174516c1f436SCyndy Ishida        false,
174616c1f436SCyndy Ishida        false,
174716c1f436SCyndy Ishida        true,
174816c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1749d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
175016c1f436SCyndy Ishida        "ClassF.ivar1",
175116c1f436SCyndy Ishida        false,
175216c1f436SCyndy Ishida        false,
175316c1f436SCyndy Ishida        true,
175416c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1755d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
175616c1f436SCyndy Ishida        "ClassZ.ivar1",
175716c1f436SCyndy Ishida        false,
175816c1f436SCyndy Ishida        false,
175916c1f436SCyndy Ishida        true,
176016c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1761d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCInstanceVariable,
176216c1f436SCyndy Ishida        "ClassZ.ivar2",
176316c1f436SCyndy Ishida        false,
176416c1f436SCyndy Ishida        false,
176516c1f436SCyndy Ishida        true,
176616c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
176716c1f436SCyndy Ishida   };
176816c1f436SCyndy Ishida 
176916c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedReexportedSymbols = {
1770d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets},
1771d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets},
1772d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true,
177316c1f436SCyndy Ishida        MacOSTargets},
177416c1f436SCyndy Ishida   };
177516c1f436SCyndy Ishida 
177616c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedUndefinedSymbols = {
1777d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
177816c1f436SCyndy Ishida        "_globalBind",
177916c1f436SCyndy Ishida        false,
178016c1f436SCyndy Ishida        false,
178116c1f436SCyndy Ishida        true,
178216c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
1783d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol,
178416c1f436SCyndy Ishida        "referenced_sym",
178516c1f436SCyndy Ishida        true,
178616c1f436SCyndy Ishida        false,
178716c1f436SCyndy Ishida        true,
178816c1f436SCyndy Ishida        {Target(AK_x86_64, PLATFORM_MACOS)}},
178916c1f436SCyndy Ishida   };
179016c1f436SCyndy Ishida 
179116c1f436SCyndy Ishida   EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size());
179216c1f436SCyndy Ishida   EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size());
179316c1f436SCyndy Ishida   EXPECT_EQ(ExpectedUndefinedSymbols.size(), Undefineds.size());
179416c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
179516c1f436SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
179616c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
179716c1f436SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
179816c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Undefineds.begin(), Undefineds.end(),
179916c1f436SCyndy Ishida                          std::begin(ExpectedUndefinedSymbols)));
180016c1f436SCyndy Ishida }
180116c1f436SCyndy Ishida 
180216c1f436SCyndy Ishida TEST(TBDv5, ExtractIF) {
180316c1f436SCyndy Ishida   static const char TBDv5File[] = R"({
180416c1f436SCyndy Ishida "tapi_tbd_version": 5,
180516c1f436SCyndy Ishida "main_library": {
180616c1f436SCyndy Ishida   "target_info": [
180716c1f436SCyndy Ishida     {
180816c1f436SCyndy Ishida       "target": "x86_64-macos",
180916c1f436SCyndy Ishida       "min_deployment": "10.14"
181016c1f436SCyndy Ishida     },
181116c1f436SCyndy Ishida     {
181216c1f436SCyndy Ishida       "target": "arm64-macos",
181316c1f436SCyndy Ishida       "min_deployment": "10.14"
181416c1f436SCyndy Ishida     },
181516c1f436SCyndy Ishida     {
181616c1f436SCyndy Ishida       "target": "arm64-maccatalyst",
181716c1f436SCyndy Ishida       "min_deployment": "12.1"
181816c1f436SCyndy Ishida     }
181916c1f436SCyndy Ishida   ],
182016c1f436SCyndy Ishida   "flags": [
182116c1f436SCyndy Ishida     {
182216c1f436SCyndy Ishida       "targets": [
182316c1f436SCyndy Ishida             "x86_64-macos"
182416c1f436SCyndy Ishida         ],
182516c1f436SCyndy Ishida       "attributes": [
182616c1f436SCyndy Ishida             "flat_namespace"
182716c1f436SCyndy Ishida         ]
182816c1f436SCyndy Ishida     }
182916c1f436SCyndy Ishida   ],
183016c1f436SCyndy Ishida   "install_names": [
183116c1f436SCyndy Ishida     {
183216c1f436SCyndy Ishida         "name": "/S/L/F/Foo.framework/Foo"
183316c1f436SCyndy Ishida     }
183416c1f436SCyndy Ishida   ],
183516c1f436SCyndy Ishida   "current_versions": [
183616c1f436SCyndy Ishida     {
183716c1f436SCyndy Ishida         "version": "1.2"
183816c1f436SCyndy Ishida     }
183916c1f436SCyndy Ishida   ],
184016c1f436SCyndy Ishida   "compatibility_versions": [
184116c1f436SCyndy Ishida     { "version": "1.1" }
184216c1f436SCyndy Ishida   ],
184316c1f436SCyndy Ishida   "rpaths": [
184416c1f436SCyndy Ishida     {
184516c1f436SCyndy Ishida       "targets": [
184616c1f436SCyndy Ishida           "x86_64-macos"
184716c1f436SCyndy Ishida       ],
184816c1f436SCyndy Ishida       "paths": [
184916c1f436SCyndy Ishida           "@executable_path/.../Frameworks"
185016c1f436SCyndy Ishida       ]
185116c1f436SCyndy Ishida     }
185216c1f436SCyndy Ishida   ],
185316c1f436SCyndy Ishida   "parent_umbrellas": [
185416c1f436SCyndy Ishida     {
185516c1f436SCyndy Ishida       "umbrella": "System"
185616c1f436SCyndy Ishida     }
185716c1f436SCyndy Ishida   ],
185816c1f436SCyndy Ishida   "allowable_clients": [
185916c1f436SCyndy Ishida     {
186016c1f436SCyndy Ishida         "clients": [
186116c1f436SCyndy Ishida             "ClientA",
186216c1f436SCyndy Ishida             "ClientB"
186316c1f436SCyndy Ishida         ]
186416c1f436SCyndy Ishida     }
186516c1f436SCyndy Ishida   ],
186616c1f436SCyndy Ishida   "reexported_libraries": [
186716c1f436SCyndy Ishida     {
186816c1f436SCyndy Ishida         "names": [
186916c1f436SCyndy Ishida             "/u/l/l/libfoo.dylib",
187016c1f436SCyndy Ishida             "/u/l/l/libbar.dylib"
187116c1f436SCyndy Ishida         ]
187216c1f436SCyndy Ishida     }
187316c1f436SCyndy Ishida   ],
187416c1f436SCyndy Ishida   "exported_symbols": [
187516c1f436SCyndy Ishida     {
187616c1f436SCyndy Ishida         "targets": [
187716c1f436SCyndy Ishida             "x86_64-macos",
187816c1f436SCyndy Ishida             "arm64-macos"
187916c1f436SCyndy Ishida         ],
188016c1f436SCyndy Ishida         "data": {
188116c1f436SCyndy Ishida             "global": [
188216c1f436SCyndy Ishida                 "_global"
188316c1f436SCyndy Ishida             ],
188416c1f436SCyndy Ishida             "objc_class": [
188516c1f436SCyndy Ishida                 "ClassA"
188616c1f436SCyndy Ishida             ],
188716c1f436SCyndy Ishida             "weak": [],
188816c1f436SCyndy Ishida             "thread_local": []
188916c1f436SCyndy Ishida         },
189016c1f436SCyndy Ishida         "text": {
189116c1f436SCyndy Ishida             "global": [
189216c1f436SCyndy Ishida                 "_func"
189316c1f436SCyndy Ishida             ],
189416c1f436SCyndy Ishida             "weak": [],
189516c1f436SCyndy Ishida             "thread_local": []
189616c1f436SCyndy Ishida         }
189716c1f436SCyndy Ishida     },
189816c1f436SCyndy Ishida     {
189916c1f436SCyndy Ishida       "targets": [
190016c1f436SCyndy Ishida           "x86_64-macos"
190116c1f436SCyndy Ishida       ],
190216c1f436SCyndy Ishida       "data": {
190316c1f436SCyndy Ishida           "global": [
190416c1f436SCyndy Ishida               "_globalVar"
190516c1f436SCyndy Ishida           ],
190616c1f436SCyndy Ishida           "objc_class": [
190716c1f436SCyndy Ishida               "ClassA",
190816c1f436SCyndy Ishida               "ClassB",
190916c1f436SCyndy Ishida               "ClassData"
191016c1f436SCyndy Ishida           ],
191116c1f436SCyndy Ishida           "objc_eh_type": [
191216c1f436SCyndy Ishida               "ClassA",
191316c1f436SCyndy Ishida               "ClassB"
191416c1f436SCyndy Ishida           ],
191516c1f436SCyndy Ishida           "objc_ivar": [
191616c1f436SCyndy Ishida               "ClassA.ivar1",
191716c1f436SCyndy Ishida               "ClassA.ivar2",
191816c1f436SCyndy Ishida               "ClassC.ivar1"
191916c1f436SCyndy Ishida           ]
192016c1f436SCyndy Ishida       },
192116c1f436SCyndy Ishida       "text": {
192216c1f436SCyndy Ishida           "global": [
192316c1f436SCyndy Ishida               "_funcFoo"
192416c1f436SCyndy Ishida           ]
192516c1f436SCyndy Ishida       }
192616c1f436SCyndy Ishida     }
192716c1f436SCyndy Ishida   ],
192816c1f436SCyndy Ishida   "reexported_symbols": [
192916c1f436SCyndy Ishida     {
193016c1f436SCyndy Ishida         "targets": [
193116c1f436SCyndy Ishida             "x86_64-macos",
193216c1f436SCyndy Ishida             "arm64-macos"
193316c1f436SCyndy Ishida         ],
193416c1f436SCyndy Ishida         "data": {
193516c1f436SCyndy Ishida             "global": [
193616c1f436SCyndy Ishida                 "_globalRe"
193716c1f436SCyndy Ishida             ],
193816c1f436SCyndy Ishida             "objc_class": [
193916c1f436SCyndy Ishida                 "ClassRexport"
194016c1f436SCyndy Ishida             ]
194116c1f436SCyndy Ishida         },
194216c1f436SCyndy Ishida         "text": {
194316c1f436SCyndy Ishida             "global": [
194416c1f436SCyndy Ishida                 "_funcA"
194516c1f436SCyndy Ishida             ]
194616c1f436SCyndy Ishida         }
194716c1f436SCyndy Ishida     }
194816c1f436SCyndy Ishida   ],
194916c1f436SCyndy Ishida   "undefined_symbols": [
195016c1f436SCyndy Ishida     {
195116c1f436SCyndy Ishida         "targets": [
195216c1f436SCyndy Ishida             "x86_64-macos"
195316c1f436SCyndy Ishida         ],
195416c1f436SCyndy Ishida         "data": {
195516c1f436SCyndy Ishida             "global": [
195616c1f436SCyndy Ishida                 "_globalBind"
195716c1f436SCyndy Ishida             ],
195816c1f436SCyndy Ishida             "weak": [
195916c1f436SCyndy Ishida                 "referenced_sym"
196016c1f436SCyndy Ishida             ]
196116c1f436SCyndy Ishida         }
196216c1f436SCyndy Ishida     }
196316c1f436SCyndy Ishida   ]
196416c1f436SCyndy Ishida },
196516c1f436SCyndy Ishida "libraries": []
196616c1f436SCyndy Ishida })";
196716c1f436SCyndy Ishida 
196816c1f436SCyndy Ishida   Expected<TBDFile> Result =
196916c1f436SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
197016c1f436SCyndy Ishida   EXPECT_TRUE(!!Result);
197116c1f436SCyndy Ishida   TBDFile File = std::move(Result.get());
197216c1f436SCyndy Ishida 
197316c1f436SCyndy Ishida   Expected<TBDFile> ExtractedResult = File->extract(AK_arm64);
197416c1f436SCyndy Ishida   EXPECT_TRUE(!!ExtractedResult);
197516c1f436SCyndy Ishida   TBDFile ExtractedFile = std::move(ExtractedResult.get());
197616c1f436SCyndy Ishida 
197716c1f436SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, ExtractedFile->getFileType());
197816c1f436SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
197916c1f436SCyndy Ishida             ExtractedFile->getInstallName());
198016c1f436SCyndy Ishida 
198116c1f436SCyndy Ishida   TargetList AllTargets = {
198216c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)),
198316c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)),
198416c1f436SCyndy Ishida   };
198516c1f436SCyndy Ishida   EXPECT_EQ(mapToPlatformSet(AllTargets), ExtractedFile->getPlatforms());
198616c1f436SCyndy Ishida   EXPECT_EQ(mapToArchitectureSet(AllTargets),
198716c1f436SCyndy Ishida             ExtractedFile->getArchitectures());
198816c1f436SCyndy Ishida 
198916c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), ExtractedFile->getCurrentVersion());
199016c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 1, 0), ExtractedFile->getCompatibilityVersion());
199116c1f436SCyndy Ishida   EXPECT_TRUE(ExtractedFile->isApplicationExtensionSafe());
199216c1f436SCyndy Ishida   EXPECT_FALSE(ExtractedFile->isTwoLevelNamespace());
199316c1f436SCyndy Ishida   EXPECT_EQ(0U, ExtractedFile->documents().size());
199416c1f436SCyndy Ishida 
199516c1f436SCyndy Ishida   InterfaceFileRef ClientA("ClientA", AllTargets);
199616c1f436SCyndy Ishida   InterfaceFileRef ClientB("ClientB", AllTargets);
199716c1f436SCyndy Ishida   EXPECT_EQ(2U, ExtractedFile->allowableClients().size());
199816c1f436SCyndy Ishida   EXPECT_EQ(ClientA, ExtractedFile->allowableClients().at(0));
199916c1f436SCyndy Ishida   EXPECT_EQ(ClientB, ExtractedFile->allowableClients().at(1));
200016c1f436SCyndy Ishida 
200116c1f436SCyndy Ishida   InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets);
200216c1f436SCyndy Ishida   InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets);
200316c1f436SCyndy Ishida   EXPECT_EQ(2U, ExtractedFile->reexportedLibraries().size());
200416c1f436SCyndy Ishida   EXPECT_EQ(ReexportA, ExtractedFile->reexportedLibraries().at(0));
200516c1f436SCyndy Ishida   EXPECT_EQ(ReexportB, ExtractedFile->reexportedLibraries().at(1));
200616c1f436SCyndy Ishida 
200716c1f436SCyndy Ishida   EXPECT_EQ(0u, ExtractedFile->rpaths().size());
200816c1f436SCyndy Ishida 
200916c1f436SCyndy Ishida   TargetToAttr Umbrellas = {{Target(AK_arm64, PLATFORM_MACOS), "System"},
201016c1f436SCyndy Ishida                             {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}};
201116c1f436SCyndy Ishida   EXPECT_EQ(Umbrellas, ExtractedFile->umbrellas());
201216c1f436SCyndy Ishida 
201316c1f436SCyndy Ishida   ExportedSymbolSeq Exports, Reexports, Undefineds;
201416c1f436SCyndy Ishida   for (const auto *Sym : ExtractedFile->symbols()) {
201516c1f436SCyndy Ishida     TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()};
201616c1f436SCyndy Ishida     ExportedSymbol Temp =
201716c1f436SCyndy Ishida         ExportedSymbol{Sym->getKind(),
201816c1f436SCyndy Ishida                        std::string(Sym->getName()),
201916c1f436SCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
202016c1f436SCyndy Ishida                        Sym->isThreadLocalValue(),
202116c1f436SCyndy Ishida                        Sym->isData(),
202216c1f436SCyndy Ishida                        SymTargets};
202316c1f436SCyndy Ishida     if (Sym->isUndefined())
202416c1f436SCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
202516c1f436SCyndy Ishida     else
202616c1f436SCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(Temp))
202716c1f436SCyndy Ishida                           : Exports.emplace_back(std::move(Temp));
202816c1f436SCyndy Ishida   }
202916c1f436SCyndy Ishida   llvm::sort(Exports);
203016c1f436SCyndy Ishida   llvm::sort(Reexports);
203116c1f436SCyndy Ishida   llvm::sort(Undefineds);
203216c1f436SCyndy Ishida 
203316c1f436SCyndy Ishida   TargetList MacOSTargets = {Target(AK_arm64, PLATFORM_MACOS)};
203416c1f436SCyndy Ishida 
203516c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedExportedSymbols = {
2036d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets},
2037d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets},
2038d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, MacOSTargets},
203916c1f436SCyndy Ishida   };
204016c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedReexportedSymbols = {
2041d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets},
2042d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets},
2043d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true,
204416c1f436SCyndy Ishida        MacOSTargets},
204516c1f436SCyndy Ishida   };
204616c1f436SCyndy Ishida 
204716c1f436SCyndy Ishida   EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size());
204816c1f436SCyndy Ishida   EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size());
204916c1f436SCyndy Ishida   EXPECT_EQ(0U, Undefineds.size());
205016c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
205116c1f436SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
205216c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
205316c1f436SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
205416c1f436SCyndy Ishida }
205516c1f436SCyndy Ishida 
205616c1f436SCyndy Ishida TEST(TBDv5, RemoveIF) {
205716c1f436SCyndy Ishida   static const char TBDv5File[] = R"({
205816c1f436SCyndy Ishida "tapi_tbd_version": 5,
205916c1f436SCyndy Ishida "main_library": {
206016c1f436SCyndy Ishida   "target_info": [
206116c1f436SCyndy Ishida     {
206216c1f436SCyndy Ishida       "target": "x86_64-macos",
206316c1f436SCyndy Ishida       "min_deployment": "10.14"
206416c1f436SCyndy Ishida     },
206516c1f436SCyndy Ishida     {
206616c1f436SCyndy Ishida       "target": "arm64-macos",
206716c1f436SCyndy Ishida       "min_deployment": "10.14"
206816c1f436SCyndy Ishida     },
206916c1f436SCyndy Ishida     {
207016c1f436SCyndy Ishida       "target": "arm64-maccatalyst",
207116c1f436SCyndy Ishida       "min_deployment": "12.1"
207216c1f436SCyndy Ishida     }
207316c1f436SCyndy Ishida   ],
207416c1f436SCyndy Ishida   "flags": [
207516c1f436SCyndy Ishida     {
207616c1f436SCyndy Ishida       "targets": [
207716c1f436SCyndy Ishida             "x86_64-macos"
207816c1f436SCyndy Ishida         ],
207916c1f436SCyndy Ishida       "attributes": [
2080*03506bc0SCyndy Ishida             "flat_namespace",
2081*03506bc0SCyndy Ishida             "not_for_dyld_shared_cache"
208216c1f436SCyndy Ishida         ]
208316c1f436SCyndy Ishida     }
208416c1f436SCyndy Ishida   ],
208516c1f436SCyndy Ishida   "install_names": [
208616c1f436SCyndy Ishida     {
208716c1f436SCyndy Ishida         "name": "/S/L/F/Foo.framework/Foo"
208816c1f436SCyndy Ishida     }
208916c1f436SCyndy Ishida   ],
209016c1f436SCyndy Ishida   "current_versions": [
209116c1f436SCyndy Ishida     {
209216c1f436SCyndy Ishida         "version": "1.2"
209316c1f436SCyndy Ishida     }
209416c1f436SCyndy Ishida   ],
209516c1f436SCyndy Ishida   "compatibility_versions": [
209616c1f436SCyndy Ishida     { "version": "1.1" }
209716c1f436SCyndy Ishida   ],
209816c1f436SCyndy Ishida   "rpaths": [
209916c1f436SCyndy Ishida     {
210016c1f436SCyndy Ishida       "targets": [
210116c1f436SCyndy Ishida           "x86_64-macos"
210216c1f436SCyndy Ishida       ],
210316c1f436SCyndy Ishida       "paths": [
210416c1f436SCyndy Ishida           "@executable_path/.../Frameworks"
210516c1f436SCyndy Ishida       ]
210616c1f436SCyndy Ishida     }
210716c1f436SCyndy Ishida   ],
210816c1f436SCyndy Ishida   "parent_umbrellas": [
210916c1f436SCyndy Ishida     {
211016c1f436SCyndy Ishida       "umbrella": "System"
211116c1f436SCyndy Ishida     }
211216c1f436SCyndy Ishida   ],
211316c1f436SCyndy Ishida   "allowable_clients": [
211416c1f436SCyndy Ishida     {
211516c1f436SCyndy Ishida         "clients": [
211616c1f436SCyndy Ishida             "ClientA",
211716c1f436SCyndy Ishida             "ClientB"
211816c1f436SCyndy Ishida         ]
211916c1f436SCyndy Ishida     }
212016c1f436SCyndy Ishida   ],
212116c1f436SCyndy Ishida   "reexported_libraries": [
212216c1f436SCyndy Ishida     {
212316c1f436SCyndy Ishida         "names": [
212416c1f436SCyndy Ishida             "/u/l/l/libfoo.dylib",
212516c1f436SCyndy Ishida             "/u/l/l/libbar.dylib"
212616c1f436SCyndy Ishida         ]
212716c1f436SCyndy Ishida     }
212816c1f436SCyndy Ishida   ],
212916c1f436SCyndy Ishida   "exported_symbols": [
213016c1f436SCyndy Ishida     {
213116c1f436SCyndy Ishida         "targets": [
213216c1f436SCyndy Ishida             "x86_64-macos",
213316c1f436SCyndy Ishida             "arm64-macos"
213416c1f436SCyndy Ishida         ],
213516c1f436SCyndy Ishida         "data": {
213616c1f436SCyndy Ishida             "global": [
213716c1f436SCyndy Ishida                 "_global"
213816c1f436SCyndy Ishida             ],
213916c1f436SCyndy Ishida             "objc_class": [
214016c1f436SCyndy Ishida                 "ClassA"
214116c1f436SCyndy Ishida             ],
214216c1f436SCyndy Ishida             "weak": [],
214316c1f436SCyndy Ishida             "thread_local": []
214416c1f436SCyndy Ishida         },
214516c1f436SCyndy Ishida         "text": {
214616c1f436SCyndy Ishida             "global": [
214716c1f436SCyndy Ishida                 "_func"
214816c1f436SCyndy Ishida             ],
214916c1f436SCyndy Ishida             "weak": [],
215016c1f436SCyndy Ishida             "thread_local": []
215116c1f436SCyndy Ishida         }
215216c1f436SCyndy Ishida     },
215316c1f436SCyndy Ishida     {
215416c1f436SCyndy Ishida       "targets": [
215516c1f436SCyndy Ishida           "x86_64-macos"
215616c1f436SCyndy Ishida       ],
215716c1f436SCyndy Ishida       "data": {
215816c1f436SCyndy Ishida           "global": [
215916c1f436SCyndy Ishida               "_globalVar"
216016c1f436SCyndy Ishida           ],
216116c1f436SCyndy Ishida           "objc_class": [
216216c1f436SCyndy Ishida               "ClassA",
216316c1f436SCyndy Ishida               "ClassB",
216416c1f436SCyndy Ishida               "ClassData"
216516c1f436SCyndy Ishida           ],
216616c1f436SCyndy Ishida           "objc_eh_type": [
216716c1f436SCyndy Ishida               "ClassA",
216816c1f436SCyndy Ishida               "ClassB"
216916c1f436SCyndy Ishida           ],
217016c1f436SCyndy Ishida           "objc_ivar": [
217116c1f436SCyndy Ishida               "ClassA.ivar1",
217216c1f436SCyndy Ishida               "ClassA.ivar2",
217316c1f436SCyndy Ishida               "ClassC.ivar1"
217416c1f436SCyndy Ishida           ]
217516c1f436SCyndy Ishida       },
217616c1f436SCyndy Ishida       "text": {
217716c1f436SCyndy Ishida           "global": [
217816c1f436SCyndy Ishida               "_funcFoo"
217916c1f436SCyndy Ishida           ]
218016c1f436SCyndy Ishida       }
218116c1f436SCyndy Ishida     }
218216c1f436SCyndy Ishida   ],
218316c1f436SCyndy Ishida   "reexported_symbols": [
218416c1f436SCyndy Ishida     {
218516c1f436SCyndy Ishida         "targets": [
218616c1f436SCyndy Ishida             "x86_64-macos",
218716c1f436SCyndy Ishida             "arm64-macos"
218816c1f436SCyndy Ishida         ],
218916c1f436SCyndy Ishida         "data": {
219016c1f436SCyndy Ishida             "global": [
219116c1f436SCyndy Ishida                 "_globalRe"
219216c1f436SCyndy Ishida             ],
219316c1f436SCyndy Ishida             "objc_class": [
219416c1f436SCyndy Ishida                 "ClassRexport"
219516c1f436SCyndy Ishida             ]
219616c1f436SCyndy Ishida         },
219716c1f436SCyndy Ishida         "text": {
219816c1f436SCyndy Ishida             "global": [
219916c1f436SCyndy Ishida                 "_funcA"
220016c1f436SCyndy Ishida             ]
220116c1f436SCyndy Ishida         }
220216c1f436SCyndy Ishida     }
220316c1f436SCyndy Ishida   ],
220416c1f436SCyndy Ishida   "undefined_symbols": [
220516c1f436SCyndy Ishida     {
220616c1f436SCyndy Ishida         "targets": [
220716c1f436SCyndy Ishida             "x86_64-macos"
220816c1f436SCyndy Ishida         ],
220916c1f436SCyndy Ishida         "data": {
221016c1f436SCyndy Ishida             "global": [
221116c1f436SCyndy Ishida                 "_globalBind"
221216c1f436SCyndy Ishida             ],
221316c1f436SCyndy Ishida             "weak": [
221416c1f436SCyndy Ishida                 "referenced_sym"
221516c1f436SCyndy Ishida             ]
221616c1f436SCyndy Ishida         }
221716c1f436SCyndy Ishida     }
221816c1f436SCyndy Ishida   ]
221916c1f436SCyndy Ishida },
222016c1f436SCyndy Ishida "libraries": []
222116c1f436SCyndy Ishida })";
222216c1f436SCyndy Ishida 
222316c1f436SCyndy Ishida   Expected<TBDFile> Result =
222416c1f436SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(TBDv5File, "Test.tbd"));
222516c1f436SCyndy Ishida   EXPECT_TRUE(!!Result);
222616c1f436SCyndy Ishida   TBDFile File = std::move(Result.get());
222716c1f436SCyndy Ishida 
222816c1f436SCyndy Ishida   Expected<TBDFile> RemovedResult = File->remove(AK_x86_64);
222916c1f436SCyndy Ishida   EXPECT_TRUE(!!RemovedResult);
223016c1f436SCyndy Ishida   TBDFile RemovedFile = std::move(RemovedResult.get());
223116c1f436SCyndy Ishida 
223216c1f436SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, RemovedFile->getFileType());
223316c1f436SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
223416c1f436SCyndy Ishida             RemovedFile->getInstallName());
223516c1f436SCyndy Ishida 
223616c1f436SCyndy Ishida   TargetList AllTargets = {
223716c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)),
223816c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACCATALYST, VersionTuple(14, 0)),
223916c1f436SCyndy Ishida   };
224016c1f436SCyndy Ishida   EXPECT_EQ(mapToPlatformSet(AllTargets), RemovedFile->getPlatforms());
224116c1f436SCyndy Ishida   EXPECT_EQ(mapToArchitectureSet(AllTargets), RemovedFile->getArchitectures());
224216c1f436SCyndy Ishida 
224316c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), RemovedFile->getCurrentVersion());
224416c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 1, 0), RemovedFile->getCompatibilityVersion());
224516c1f436SCyndy Ishida   EXPECT_TRUE(RemovedFile->isApplicationExtensionSafe());
2246*03506bc0SCyndy Ishida   EXPECT_TRUE(RemovedFile->isOSLibNotForSharedCache());
224716c1f436SCyndy Ishida   EXPECT_FALSE(RemovedFile->isTwoLevelNamespace());
224816c1f436SCyndy Ishida   EXPECT_EQ(0U, RemovedFile->documents().size());
224916c1f436SCyndy Ishida 
225016c1f436SCyndy Ishida   InterfaceFileRef ClientA("ClientA", AllTargets);
225116c1f436SCyndy Ishida   InterfaceFileRef ClientB("ClientB", AllTargets);
225216c1f436SCyndy Ishida   EXPECT_EQ(2U, RemovedFile->allowableClients().size());
225316c1f436SCyndy Ishida   EXPECT_EQ(ClientA, RemovedFile->allowableClients().at(0));
225416c1f436SCyndy Ishida   EXPECT_EQ(ClientB, RemovedFile->allowableClients().at(1));
225516c1f436SCyndy Ishida 
225616c1f436SCyndy Ishida   InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets);
225716c1f436SCyndy Ishida   InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets);
225816c1f436SCyndy Ishida   EXPECT_EQ(2U, RemovedFile->reexportedLibraries().size());
225916c1f436SCyndy Ishida   EXPECT_EQ(ReexportA, RemovedFile->reexportedLibraries().at(0));
226016c1f436SCyndy Ishida   EXPECT_EQ(ReexportB, RemovedFile->reexportedLibraries().at(1));
226116c1f436SCyndy Ishida 
226216c1f436SCyndy Ishida   EXPECT_EQ(0u, RemovedFile->rpaths().size());
226316c1f436SCyndy Ishida 
226416c1f436SCyndy Ishida   TargetToAttr Umbrellas = {{Target(AK_arm64, PLATFORM_MACOS), "System"},
226516c1f436SCyndy Ishida                             {Target(AK_arm64, PLATFORM_MACCATALYST), "System"}};
226616c1f436SCyndy Ishida   EXPECT_EQ(Umbrellas, RemovedFile->umbrellas());
226716c1f436SCyndy Ishida 
226816c1f436SCyndy Ishida   ExportedSymbolSeq Exports, Reexports, Undefineds;
226916c1f436SCyndy Ishida   for (const auto *Sym : RemovedFile->symbols()) {
227016c1f436SCyndy Ishida     TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()};
227116c1f436SCyndy Ishida     ExportedSymbol Temp =
227216c1f436SCyndy Ishida         ExportedSymbol{Sym->getKind(),
227316c1f436SCyndy Ishida                        std::string(Sym->getName()),
227416c1f436SCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
227516c1f436SCyndy Ishida                        Sym->isThreadLocalValue(),
227616c1f436SCyndy Ishida                        Sym->isData(),
227716c1f436SCyndy Ishida                        SymTargets};
227816c1f436SCyndy Ishida     if (Sym->isUndefined())
227916c1f436SCyndy Ishida       Undefineds.emplace_back(std::move(Temp));
228016c1f436SCyndy Ishida     else
228116c1f436SCyndy Ishida       Sym->isReexported() ? Reexports.emplace_back(std::move(Temp))
228216c1f436SCyndy Ishida                           : Exports.emplace_back(std::move(Temp));
228316c1f436SCyndy Ishida   }
228416c1f436SCyndy Ishida   llvm::sort(Exports);
228516c1f436SCyndy Ishida   llvm::sort(Reexports);
228616c1f436SCyndy Ishida   llvm::sort(Undefineds);
228716c1f436SCyndy Ishida 
228816c1f436SCyndy Ishida   TargetList MacOSTargets = {Target(AK_arm64, PLATFORM_MACOS)};
228916c1f436SCyndy Ishida 
229016c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedExportedSymbols = {
2291d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_func", false, false, false, MacOSTargets},
2292d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_global", false, false, true, MacOSTargets},
2293d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, MacOSTargets},
229416c1f436SCyndy Ishida   };
229516c1f436SCyndy Ishida   std::vector<ExportedSymbol> ExpectedReexportedSymbols = {
2296d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_funcA", false, false, false, MacOSTargets},
2297d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_globalRe", false, false, true, MacOSTargets},
2298d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassRexport", false, false, true,
229916c1f436SCyndy Ishida        MacOSTargets},
230016c1f436SCyndy Ishida   };
230116c1f436SCyndy Ishida 
230216c1f436SCyndy Ishida   EXPECT_EQ(ExpectedExportedSymbols.size(), Exports.size());
230316c1f436SCyndy Ishida   EXPECT_EQ(ExpectedReexportedSymbols.size(), Reexports.size());
230416c1f436SCyndy Ishida   EXPECT_EQ(0U, Undefineds.size());
230516c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Exports.begin(), Exports.end(),
230616c1f436SCyndy Ishida                          std::begin(ExpectedExportedSymbols)));
230716c1f436SCyndy Ishida   EXPECT_TRUE(std::equal(Reexports.begin(), Reexports.end(),
230816c1f436SCyndy Ishida                          std::begin(ExpectedReexportedSymbols)));
230916c1f436SCyndy Ishida }
231016c1f436SCyndy Ishida 
231116c1f436SCyndy Ishida TEST(TBDv5, InlineIF) {
231216c1f436SCyndy Ishida   static const char UmbrellaFile[] = R"({
231316c1f436SCyndy Ishida "tapi_tbd_version": 5,
231416c1f436SCyndy Ishida "main_library": {
231516c1f436SCyndy Ishida   "target_info": [
231616c1f436SCyndy Ishida     {
231716c1f436SCyndy Ishida       "target": "x86_64-macos",
231816c1f436SCyndy Ishida       "min_deployment": "10.14"
231916c1f436SCyndy Ishida     },
232016c1f436SCyndy Ishida     {
232116c1f436SCyndy Ishida       "target": "arm64-macos",
232216c1f436SCyndy Ishida       "min_deployment": "10.14"
232316c1f436SCyndy Ishida     }
232416c1f436SCyndy Ishida   ],
232516c1f436SCyndy Ishida   "install_names": [
232616c1f436SCyndy Ishida     {
232716c1f436SCyndy Ishida         "name": "/S/L/F/Foo.framework/Foo"
232816c1f436SCyndy Ishida     }
232916c1f436SCyndy Ishida   ],
233016c1f436SCyndy Ishida   "current_versions": [
233116c1f436SCyndy Ishida     {
233216c1f436SCyndy Ishida         "version": "1.2"
233316c1f436SCyndy Ishida     }
233416c1f436SCyndy Ishida   ],
233516c1f436SCyndy Ishida   "reexported_libraries": [
233616c1f436SCyndy Ishida     {
233716c1f436SCyndy Ishida         "names": [
233816c1f436SCyndy Ishida             "/u/l/l/libfoo.dylib",
233916c1f436SCyndy Ishida             "/u/l/l/libbar.dylib"
234016c1f436SCyndy Ishida         ]
234116c1f436SCyndy Ishida     }
234216c1f436SCyndy Ishida   ]
234316c1f436SCyndy Ishida }})";
234416c1f436SCyndy Ishida 
234516c1f436SCyndy Ishida   static const char ReexportFile[] = R"({
234616c1f436SCyndy Ishida "tapi_tbd_version": 5,
234716c1f436SCyndy Ishida "main_library": {
234816c1f436SCyndy Ishida   "target_info": [
234916c1f436SCyndy Ishida     {
235016c1f436SCyndy Ishida       "target": "x86_64-macos",
235116c1f436SCyndy Ishida       "min_deployment": "10.14"
235216c1f436SCyndy Ishida     },
235316c1f436SCyndy Ishida     {
235416c1f436SCyndy Ishida       "target": "arm64-macos",
235516c1f436SCyndy Ishida       "min_deployment": "10.14"
235616c1f436SCyndy Ishida     }
235716c1f436SCyndy Ishida   ],
235816c1f436SCyndy Ishida   "install_names": [
235916c1f436SCyndy Ishida     {
236016c1f436SCyndy Ishida         "name" : "/u/l/l/libfoo.dylib"
236116c1f436SCyndy Ishida     }
236216c1f436SCyndy Ishida   ],
236316c1f436SCyndy Ishida   "current_versions": [
236416c1f436SCyndy Ishida     {
236516c1f436SCyndy Ishida         "version": "1"
236616c1f436SCyndy Ishida     }
236716c1f436SCyndy Ishida   ],
236816c1f436SCyndy Ishida   "rpaths": [
236916c1f436SCyndy Ishida     {
237016c1f436SCyndy Ishida       "targets": [
237116c1f436SCyndy Ishida           "x86_64-macos"
237216c1f436SCyndy Ishida       ],
237316c1f436SCyndy Ishida       "paths": [
237416c1f436SCyndy Ishida           "@executable_path/.../Frameworks"
237516c1f436SCyndy Ishida       ]
237616c1f436SCyndy Ishida     }
237716c1f436SCyndy Ishida   ],
237816c1f436SCyndy Ishida   "exported_symbols": [
237916c1f436SCyndy Ishida     {
238016c1f436SCyndy Ishida         "targets": [
238116c1f436SCyndy Ishida             "x86_64-macos",
238216c1f436SCyndy Ishida             "arm64-macos"
238316c1f436SCyndy Ishida         ],
238416c1f436SCyndy Ishida         "data": {
238516c1f436SCyndy Ishida             "global": [
238616c1f436SCyndy Ishida                 "_global"
238716c1f436SCyndy Ishida             ],
238816c1f436SCyndy Ishida             "objc_class": [
238916c1f436SCyndy Ishida                 "ClassA"
239016c1f436SCyndy Ishida             ],
239116c1f436SCyndy Ishida             "weak": [],
239216c1f436SCyndy Ishida             "thread_local": []
239316c1f436SCyndy Ishida         }
239416c1f436SCyndy Ishida     }
239516c1f436SCyndy Ishida   ]}})";
239616c1f436SCyndy Ishida 
239716c1f436SCyndy Ishida   Expected<TBDFile> UmbrellaResult =
239816c1f436SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(UmbrellaFile, "Test.tbd"));
239916c1f436SCyndy Ishida   EXPECT_TRUE(!!UmbrellaResult);
240016c1f436SCyndy Ishida   TBDFile Umbrella = std::move(UmbrellaResult.get());
240116c1f436SCyndy Ishida 
240216c1f436SCyndy Ishida   Expected<TBDFile> ReexportResult =
240316c1f436SCyndy Ishida       TextAPIReader::get(MemoryBufferRef(ReexportFile, "Test.tbd"));
240416c1f436SCyndy Ishida   EXPECT_TRUE(!!ReexportResult);
240516c1f436SCyndy Ishida   TBDReexportFile Reexport = std::move(ReexportResult.get());
240616c1f436SCyndy Ishida   Umbrella->inlineLibrary(Reexport);
240716c1f436SCyndy Ishida 
240816c1f436SCyndy Ishida   EXPECT_EQ(FileType::TBD_V5, Umbrella->getFileType());
240916c1f436SCyndy Ishida   EXPECT_EQ(std::string("/S/L/F/Foo.framework/Foo"),
241016c1f436SCyndy Ishida             Umbrella->getInstallName());
241116c1f436SCyndy Ishida 
241216c1f436SCyndy Ishida   TargetList AllTargets = {
241316c1f436SCyndy Ishida       Target(AK_x86_64, PLATFORM_MACOS, VersionTuple(10, 14)),
241416c1f436SCyndy Ishida       Target(AK_arm64, PLATFORM_MACOS, VersionTuple(11, 0, 0)),
241516c1f436SCyndy Ishida   };
241616c1f436SCyndy Ishida   EXPECT_EQ(mapToPlatformSet(AllTargets), Umbrella->getPlatforms());
241716c1f436SCyndy Ishida   EXPECT_EQ(mapToArchitectureSet(AllTargets), Umbrella->getArchitectures());
241816c1f436SCyndy Ishida 
241916c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 2, 0), Umbrella->getCurrentVersion());
242016c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), Umbrella->getCompatibilityVersion());
242116c1f436SCyndy Ishida   InterfaceFileRef ReexportA("/u/l/l/libbar.dylib", AllTargets);
242216c1f436SCyndy Ishida   InterfaceFileRef ReexportB("/u/l/l/libfoo.dylib", AllTargets);
242316c1f436SCyndy Ishida   EXPECT_EQ(2U, Umbrella->reexportedLibraries().size());
242416c1f436SCyndy Ishida   EXPECT_EQ(ReexportA, Umbrella->reexportedLibraries().at(0));
242516c1f436SCyndy Ishida   EXPECT_EQ(ReexportB, Umbrella->reexportedLibraries().at(1));
242616c1f436SCyndy Ishida   EXPECT_EQ(1U, Umbrella->documents().size());
242716c1f436SCyndy Ishida 
242816c1f436SCyndy Ishida   TBDReexportFile Document = Umbrella->documents().front();
242916c1f436SCyndy Ishida   EXPECT_EQ(std::string("/u/l/l/libfoo.dylib"), Document->getInstallName());
243016c1f436SCyndy Ishida   EXPECT_EQ(0U, Document->getSwiftABIVersion());
243116c1f436SCyndy Ishida   EXPECT_TRUE(Document->isTwoLevelNamespace());
243216c1f436SCyndy Ishida   EXPECT_TRUE(Document->isApplicationExtensionSafe());
243316c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCurrentVersion());
243416c1f436SCyndy Ishida   EXPECT_EQ(PackedVersion(1, 0, 0), Document->getCompatibilityVersion());
243516c1f436SCyndy Ishida 
243616c1f436SCyndy Ishida   ExportedSymbolSeq Exports;
243716c1f436SCyndy Ishida   for (const auto *Sym : Document->symbols()) {
243816c1f436SCyndy Ishida     TargetList SymTargets{Sym->targets().begin(), Sym->targets().end()};
243916c1f436SCyndy Ishida     Exports.emplace_back(
244016c1f436SCyndy Ishida         ExportedSymbol{Sym->getKind(), std::string(Sym->getName()),
244116c1f436SCyndy Ishida                        Sym->isWeakDefined() || Sym->isWeakReferenced(),
244216c1f436SCyndy Ishida                        Sym->isThreadLocalValue(), Sym->isData(), SymTargets});
244316c1f436SCyndy Ishida   }
244416c1f436SCyndy Ishida   llvm::sort(Exports);
244516c1f436SCyndy Ishida 
244616c1f436SCyndy Ishida   ExportedSymbolSeq ExpectedExports = {
2447d9a9872eSCyndy Ishida       {EncodeKind::GlobalSymbol, "_global", false, false, true, AllTargets},
2448d9a9872eSCyndy Ishida       {EncodeKind::ObjectiveCClass, "ClassA", false, false, true, AllTargets},
244916c1f436SCyndy Ishida   };
245016c1f436SCyndy Ishida   EXPECT_EQ(ExpectedExports.size(), Exports.size());
245116c1f436SCyndy Ishida   EXPECT_TRUE(
245216c1f436SCyndy Ishida       std::equal(Exports.begin(), Exports.end(), std::begin(ExpectedExports)));
245316c1f436SCyndy Ishida }
245479320a0cSCyndy Ishida } // end namespace TBDv5
2455