HeaderSearchTest.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //===- unittests/Lex/HeaderSearchTest.cpp ------ HeaderSearch 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. #include "clang/Lex/HeaderSearch.h"
  9. #include "clang/Basic/Diagnostic.h"
  10. #include "clang/Basic/DiagnosticOptions.h"
  11. #include "clang/Basic/FileManager.h"
  12. #include "clang/Basic/LangOptions.h"
  13. #include "clang/Basic/SourceManager.h"
  14. #include "clang/Basic/TargetInfo.h"
  15. #include "clang/Basic/TargetOptions.h"
  16. #include "clang/Lex/HeaderSearch.h"
  17. #include "clang/Lex/HeaderSearchOptions.h"
  18. #include "clang/Serialization/InMemoryModuleCache.h"
  19. #include "gtest/gtest.h"
  20. namespace clang {
  21. namespace {
  22. // The test fixture.
  23. class HeaderSearchTest : public ::testing::Test {
  24. protected:
  25. HeaderSearchTest()
  26. : VFS(new llvm::vfs::InMemoryFileSystem), FileMgr(FileMgrOpts, VFS),
  27. DiagID(new DiagnosticIDs()),
  28. Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
  29. SourceMgr(Diags, FileMgr), TargetOpts(new TargetOptions),
  30. Search(std::make_shared<HeaderSearchOptions>(), SourceMgr, Diags,
  31. LangOpts, Target.get()) {
  32. TargetOpts->Triple = "x86_64-apple-darwin11.1.0";
  33. Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
  34. }
  35. void addSearchDir(llvm::StringRef Dir) {
  36. VFS->addFile(Dir, 0, llvm::MemoryBuffer::getMemBuffer(""), /*User=*/None,
  37. /*Group=*/None, llvm::sys::fs::file_type::directory_file);
  38. auto DE = FileMgr.getOptionalDirectoryRef(Dir);
  39. assert(DE);
  40. auto DL = DirectoryLookup(*DE, SrcMgr::C_User, /*isFramework=*/false);
  41. Search.AddSearchPath(DL, /*isAngled=*/false);
  42. }
  43. IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> VFS;
  44. FileSystemOptions FileMgrOpts;
  45. FileManager FileMgr;
  46. IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
  47. DiagnosticsEngine Diags;
  48. SourceManager SourceMgr;
  49. LangOptions LangOpts;
  50. std::shared_ptr<TargetOptions> TargetOpts;
  51. IntrusiveRefCntPtr<TargetInfo> Target;
  52. HeaderSearch Search;
  53. };
  54. TEST_F(HeaderSearchTest, NoSearchDir) {
  55. EXPECT_EQ(Search.search_dir_size(), 0u);
  56. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", /*WorkingDir=*/"",
  57. /*MainFile=*/""),
  58. "/x/y/z");
  59. }
  60. TEST_F(HeaderSearchTest, SimpleShorten) {
  61. addSearchDir("/x");
  62. addSearchDir("/x/y");
  63. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/z", /*WorkingDir=*/"",
  64. /*MainFile=*/""),
  65. "z");
  66. addSearchDir("/a/b/");
  67. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c", /*WorkingDir=*/"",
  68. /*MainFile=*/""),
  69. "c");
  70. }
  71. TEST_F(HeaderSearchTest, ShortenWithWorkingDir) {
  72. addSearchDir("x/y");
  73. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/a/b/c/x/y/z",
  74. /*WorkingDir=*/"/a/b/c",
  75. /*MainFile=*/""),
  76. "z");
  77. }
  78. TEST_F(HeaderSearchTest, Dots) {
  79. addSearchDir("/x/./y/");
  80. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/x/y/./z",
  81. /*WorkingDir=*/"",
  82. /*MainFile=*/""),
  83. "z");
  84. addSearchDir("a/.././c/");
  85. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/m/n/./c/z",
  86. /*WorkingDir=*/"/m/n/",
  87. /*MainFile=*/""),
  88. "z");
  89. }
  90. #ifdef _WIN32
  91. TEST_F(HeaderSearchTest, BackSlash) {
  92. addSearchDir("C:\\x\\y\\");
  93. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("C:\\x\\y\\z\\t",
  94. /*WorkingDir=*/"",
  95. /*MainFile=*/""),
  96. "z/t");
  97. }
  98. TEST_F(HeaderSearchTest, BackSlashWithDotDot) {
  99. addSearchDir("..\\y");
  100. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("C:\\x\\y\\z\\t",
  101. /*WorkingDir=*/"C:/x/y/",
  102. /*MainFile=*/""),
  103. "z/t");
  104. }
  105. #endif
  106. TEST_F(HeaderSearchTest, DotDotsWithAbsPath) {
  107. addSearchDir("/x/../y/");
  108. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/y/z",
  109. /*WorkingDir=*/"",
  110. /*MainFile=*/""),
  111. "z");
  112. }
  113. TEST_F(HeaderSearchTest, IncludeFromSameDirectory) {
  114. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/y/z/t.h",
  115. /*WorkingDir=*/"",
  116. /*MainFile=*/"/y/a.cc"),
  117. "z/t.h");
  118. addSearchDir("/");
  119. EXPECT_EQ(Search.suggestPathToFileForDiagnostics("/y/z/t.h",
  120. /*WorkingDir=*/"",
  121. /*MainFile=*/"/y/a.cc"),
  122. "y/z/t.h");
  123. }
  124. } // namespace
  125. } // namespace clang