147 lines · cpp
1//===- unittests/InstallAPI/FileList.cpp - File List Tests ---------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/InstallAPI/FileList.h"10#include "clang/InstallAPI/HeaderFile.h"11#include "llvm/ADT/StringRef.h"12#include "llvm/Support/MemoryBuffer.h"13#include "llvm/Testing/Support/Error.h"14#include "gtest/gtest.h"15 16using namespace llvm;17using namespace clang::installapi;18 19namespace FileListTests {20 21static inline void testValidFileList(std::string Input, HeaderSeq &Expected) {22 auto InputBuf = MemoryBuffer::getMemBuffer(Input);23 HeaderSeq Headers;24 llvm::Error Err = FileListReader::loadHeaders(std::move(InputBuf), Headers);25 ASSERT_THAT_ERROR(std::move(Err), Succeeded());26 27 EXPECT_EQ(Expected.size(), Headers.size());28 EXPECT_EQ(Headers, Expected);29}30 31TEST(FileList, Version3) {32 static const char Input[] = R"({33 "version" : "3",34 "headers" : [35 {36 "type" : "public",37 "path" : "/tmp/dst/usr/include/foo.h",38 "language" : "objective-c"39 },40 {41 "type" : "private",42 "path" : "/tmp/dst/usr/local/include/bar.h",43 "language" : "objective-c++"44 },45 {46 "type" : "project",47 "path" : "/tmp/src/baz.h"48 }49 ]50 })";51 52 HeaderSeq Expected = {53 {"/tmp/dst/usr/include/foo.h", HeaderType::Public, "foo.h",54 clang::Language::ObjC},55 {"/tmp/dst/usr/local/include/bar.h", HeaderType::Private, "bar.h",56 clang::Language::ObjCXX},57 {"/tmp/src/baz.h", HeaderType::Project, "", std::nullopt}};58 59 testValidFileList(Input, Expected);60}61 62TEST(FileList, Version1) {63 static const char Input[] = R"({64 "version" : "1",65 "headers" : [66 {67 "type" : "public",68 "path" : "/usr/include/foo.h"69 },70 {71 "type" : "private",72 "path" : "/usr/local/include/bar.h"73 }74 ]75 })";76 77 HeaderSeq Expected = {78 {"/usr/include/foo.h", HeaderType::Public, "foo.h", std::nullopt},79 {"/usr/local/include/bar.h", HeaderType::Private, "bar.h", std::nullopt},80 };81 82 testValidFileList(Input, Expected);83}84 85TEST(FileList, Version2) {86 static const auto Input = R"({87 "version" : "2",88 "headers" : [89 {90 "type" : "public",91 "path" : "/usr/include/foo.h"92 },93 {94 "type" : "project",95 "path" : "src/bar.h"96 }97 ]98 })";99 HeaderSeq Expected = {100 {"/usr/include/foo.h", HeaderType::Public, "foo.h", std::nullopt},101 {"src/bar.h", HeaderType::Project, "", std::nullopt},102 };103 104 testValidFileList(Input, Expected);105}106 107TEST(FileList, MissingVersion) {108 static const char Input[] = R"({109 "headers" : [110 {111 "type" : "public",112 "path" : "/usr/include/foo.h"113 },114 {115 "type" : "private",116 "path" : "/usr/local/include/bar.h"117 }118 ]119 })";120 auto InputBuf = MemoryBuffer::getMemBuffer(Input);121 HeaderSeq Headers;122 llvm::Error Err = FileListReader::loadHeaders(std::move(InputBuf), Headers);123 EXPECT_THAT_ERROR(124 std::move(Err),125 FailedWithMessage(126 "invalid input format: required field 'version' not specified\n"));127}128 129TEST(FileList, InvalidTypes) {130 static const char Input[] = R"({131 "version" : "1",132 "headers" : [133 {134 "type" : "project",135 "path" : "/usr/include/foo.h"136 }137 ]138 })";139 auto InputBuf = MemoryBuffer::getMemBuffer(Input);140 HeaderSeq Headers;141 llvm::Error Err = FileListReader::loadHeaders(std::move(InputBuf), Headers);142 EXPECT_THAT_ERROR(143 std::move(Err),144 FailedWithMessage("invalid input format: unsupported header type\n"));145}146} // namespace FileListTests147