| //===- 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 |