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