xref: /llvm-project/clang/unittests/InstallAPI/FileListTest.cpp (revision 4c6043de0b837d23699424d875057d00956d80ac)
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 
16 using namespace llvm;
17 using namespace clang::installapi;
18 
19 namespace FileListTests {
20 
testValidFileList(std::string Input,HeaderSeq & Expected)21 static 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 
TEST(FileList,Version3)31 TEST(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 
TEST(FileList,Version1)62 TEST(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 
TEST(FileList,Version2)85 TEST(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 
TEST(FileList,MissingVersion)107 TEST(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 
TEST(FileList,InvalidTypes)129 TEST(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 FileListTests
147