1 //===- unittests/Lex/HeaderSearchTest.cpp ------ HeaderSearch tests -------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "clang/Lex/HeaderSearch.h"
11 #include "clang/Basic/Diagnostic.h"
12 #include "clang/Basic/DiagnosticOptions.h"
13 #include "clang/Basic/FileManager.h"
14 #include "clang/Basic/LangOptions.h"
15 #include "clang/Basic/MemoryBufferCache.h"
16 #include "clang/Basic/SourceManager.h"
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/TargetOptions.h"
19 #include "clang/Lex/HeaderSearch.h"
20 #include "clang/Lex/HeaderSearchOptions.h"
21 #include "gtest/gtest.h"
22 
23 namespace clang {
24 namespace {
25 
26 // The test fixture.
27 class HeaderSearchTest : public ::testing::Test {
28 protected:
29   HeaderSearchTest()
30       : VFS(new llvm::vfs::InMemoryFileSystem), FileMgr(FileMgrOpts, VFS),
31         DiagID(new DiagnosticIDs()),
32         Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
33         SourceMgr(Diags, FileMgr), TargetOpts(new TargetOptions),
34         Search(std::make_shared<HeaderSearchOptions>(), SourceMgr, Diags,
35                LangOpts, Target.get()) {
36     TargetOpts->Triple = "x86_64-apple-darwin11.1.0";
37     Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
38   }
39 
40   void addSearchDir(llvm::StringRef Dir) {
41     VFS->addFile(Dir, 0, llvm::MemoryBuffer::getMemBuffer(""), /*User=*/None,
42                  /*Group=*/None, llvm::sys::fs::file_type::directory_file);
43     const DirectoryEntry *DE = FileMgr.getDirectory(Dir);
44     assert(DE);
45     auto DL = DirectoryLookup(DE, SrcMgr::C_User, /*isFramework=*/false);
46     Search.AddSearchPath(DL, /*isAngled=*/false);
47   }
48 
49   IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS;
50   FileSystemOptions FileMgrOpts;
51   FileManager FileMgr;
52   IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
53   DiagnosticsEngine Diags;
54   SourceManager SourceMgr;
55   LangOptions LangOpts;
56   std::shared_ptr<TargetOptions> TargetOpts;
57   IntrusiveRefCntPtr<TargetInfo> Target;
58   HeaderSearch Search;
59 };
60 
61 TEST_F(HeaderSearchTest, NoSearchDir) {
62   EXPECT_EQ(Search.search_dir_size(), 0u);
63   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", /*WorkingDir=*/""),
64             "/x/y/z");
65 }
66 
67 TEST_F(HeaderSearchTest, SimpleShorten) {
68   addSearchDir("/x");
69   addSearchDir("/x/y");
70   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", /*WorkingDir=*/""),
71             "z");
72   addSearchDir("/a/b/");
73   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c", /*WorkingDir=*/""),
74             "c");
75 }
76 
77 TEST_F(HeaderSearchTest, ShortenWithWorkingDir) {
78   addSearchDir("x/y");
79   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c/x/y/z",
80                                                    /*WorkingDir=*/"/a/b/c"),
81             "z");
82 }
83 
84 TEST_F(HeaderSearchTest, Dots) {
85   addSearchDir("/x/./y/");
86   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/./z",
87                                                    /*WorkingDir=*/""),
88             "z");
89   addSearchDir("a/.././c/");
90   EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/m/n/./c/z",
91                                                    /*WorkingDir=*/"/m/n/"),
92             "z");
93 }
94 
95 } // namespace
96 } // namespace clang
97