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-exception
6//
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(InputData: Input);
23 HeaderSeq Headers;
24 llvm::Error Err = FileListReader::loadHeaders(InputBuffer: std::move(InputBuf), Destination&: 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(InputData: Input);
121 HeaderSeq Headers;
122 llvm::Error Err = FileListReader::loadHeaders(InputBuffer: std::move(InputBuf), Destination&: 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(InputData: Input);
140 HeaderSeq Headers;
141 llvm::Error Err = FileListReader::loadHeaders(InputBuffer: std::move(InputBuf), Destination&: Headers);
142 EXPECT_THAT_ERROR(
143 std::move(Err),
144 FailedWithMessage("invalid input format: unsupported header type\n"));
145}
146} // namespace FileListTests
147

source code of clang/unittests/InstallAPI/FileListTest.cpp