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