
This patch adds support for expected InstallAPI inputs. InstallAPI accepts a well defined filelist of headers and how those headers represent a single library. InstallAPI captures header files to determine linkable symbols to then compare against what was compiled in a binary dylib and generate TBD files.
147 lines
3.8 KiB
C++
147 lines
3.8 KiB
C++
//===- unittests/InstallAPI/FileList.cpp - File List Tests ---------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/InstallAPI/FileList.h"
|
|
#include "clang/InstallAPI/HeaderFile.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/MemoryBuffer.h"
|
|
#include "llvm/Testing/Support/Error.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace llvm;
|
|
using namespace clang::installapi;
|
|
|
|
namespace FileListTests {
|
|
|
|
static inline void testValidFileList(std::string Input, HeaderSeq &Expected) {
|
|
auto InputBuf = MemoryBuffer::getMemBuffer(Input);
|
|
HeaderSeq Headers;
|
|
llvm::Error Err = FileListReader::loadHeaders(std::move(InputBuf), Headers);
|
|
ASSERT_THAT_ERROR(std::move(Err), Succeeded());
|
|
|
|
EXPECT_EQ(Expected.size(), Headers.size());
|
|
EXPECT_EQ(Headers, Expected);
|
|
}
|
|
|
|
TEST(FileList, Version3) {
|
|
static const char Input[] = R"({
|
|
"version" : "3",
|
|
"headers" : [
|
|
{
|
|
"type" : "public",
|
|
"path" : "/tmp/dst/usr/include/foo.h",
|
|
"language" : "objective-c"
|
|
},
|
|
{
|
|
"type" : "private",
|
|
"path" : "/tmp/dst/usr/local/include/bar.h",
|
|
"language" : "objective-c++"
|
|
},
|
|
{
|
|
"type" : "project",
|
|
"path" : "/tmp/src/baz.h"
|
|
}
|
|
]
|
|
})";
|
|
|
|
HeaderSeq Expected = {
|
|
{"/tmp/dst/usr/include/foo.h", HeaderType::Public, "foo.h",
|
|
clang::Language::ObjC},
|
|
{"/tmp/dst/usr/local/include/bar.h", HeaderType::Private, "bar.h",
|
|
clang::Language::ObjCXX},
|
|
{"/tmp/src/baz.h", HeaderType::Project, "", std::nullopt}};
|
|
|
|
testValidFileList(Input, Expected);
|
|
}
|
|
|
|
TEST(FileList, Version1) {
|
|
static const char Input[] = R"({
|
|
"version" : "1",
|
|
"headers" : [
|
|
{
|
|
"type" : "public",
|
|
"path" : "/usr/include/foo.h"
|
|
},
|
|
{
|
|
"type" : "private",
|
|
"path" : "/usr/local/include/bar.h"
|
|
}
|
|
]
|
|
})";
|
|
|
|
HeaderSeq Expected = {
|
|
{"/usr/include/foo.h", HeaderType::Public, "foo.h", std::nullopt},
|
|
{"/usr/local/include/bar.h", HeaderType::Private, "bar.h", std::nullopt},
|
|
};
|
|
|
|
testValidFileList(Input, Expected);
|
|
}
|
|
|
|
TEST(FileList, Version2) {
|
|
static const auto Input = R"({
|
|
"version" : "2",
|
|
"headers" : [
|
|
{
|
|
"type" : "public",
|
|
"path" : "/usr/include/foo.h"
|
|
},
|
|
{
|
|
"type" : "project",
|
|
"path" : "src/bar.h"
|
|
}
|
|
]
|
|
})";
|
|
HeaderSeq Expected = {
|
|
{"/usr/include/foo.h", HeaderType::Public, "foo.h", std::nullopt},
|
|
{"src/bar.h", HeaderType::Project, "", std::nullopt},
|
|
};
|
|
|
|
testValidFileList(Input, Expected);
|
|
}
|
|
|
|
TEST(FileList, MissingVersion) {
|
|
static const char Input[] = R"({
|
|
"headers" : [
|
|
{
|
|
"type" : "public",
|
|
"path" : "/usr/include/foo.h"
|
|
},
|
|
{
|
|
"type" : "private",
|
|
"path" : "/usr/local/include/bar.h"
|
|
}
|
|
]
|
|
})";
|
|
auto InputBuf = MemoryBuffer::getMemBuffer(Input);
|
|
HeaderSeq Headers;
|
|
llvm::Error Err = FileListReader::loadHeaders(std::move(InputBuf), Headers);
|
|
EXPECT_THAT_ERROR(
|
|
std::move(Err),
|
|
FailedWithMessage(
|
|
"invalid input format: required field 'version' not specified\n"));
|
|
}
|
|
|
|
TEST(FileList, InvalidTypes) {
|
|
static const char Input[] = R"({
|
|
"version" : "1",
|
|
"headers" : [
|
|
{
|
|
"type" : "project",
|
|
"path" : "/usr/include/foo.h"
|
|
}
|
|
]
|
|
})";
|
|
auto InputBuf = MemoryBuffer::getMemBuffer(Input);
|
|
HeaderSeq Headers;
|
|
llvm::Error Err = FileListReader::loadHeaders(std::move(InputBuf), Headers);
|
|
EXPECT_THAT_ERROR(
|
|
std::move(Err),
|
|
FailedWithMessage("invalid input format: unsupported header type\n"));
|
|
}
|
|
} // namespace FileListTests
|