xref: /llvm-project/clang/unittests/InstallAPI/FileListTest.cpp (revision 4c6043de0b837d23699424d875057d00956d80ac)
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