331 lines · cpp
1//===-- FileSpecListTest.cpp ----------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "gtest/gtest.h"10 11#include "MockSymlinkFileSystem.h"12#include "lldb/Utility/FileSpecList.h"13#include "lldb/Utility/RealpathPrefixes.h"14 15using namespace lldb_private;16 17static FileSpec PosixSpec(llvm::StringRef path) {18 return FileSpec(path, FileSpec::Style::posix);19}20 21static FileSpec WindowsSpec(llvm::StringRef path) {22 return FileSpec(path, FileSpec::Style::windows);23}24 25TEST(SupportFileListTest, RelativePathMatchesPosix) {26 27 const FileSpec fullpath = PosixSpec("/build/src/main.cpp");28 const FileSpec relative = PosixSpec("./src/main.cpp");29 const FileSpec basename = PosixSpec("./main.cpp");30 const FileSpec full_wrong = PosixSpec("/other/wrong/main.cpp");31 const FileSpec rel_wrong = PosixSpec("./wrong/main.cpp");32 // Make sure these don't match "src/main.cpp" as we want to match full33 // directories only34 const FileSpec rel2_wrong = PosixSpec("asrc/main.cpp");35 const FileSpec rel3_wrong = PosixSpec("rc/main.cpp");36 37 SupportFileList files;38 files.Append(fullpath);39 files.Append(relative);40 files.Append(basename);41 files.Append(full_wrong);42 files.Append(rel_wrong);43 files.Append(rel2_wrong);44 files.Append(rel3_wrong);45 46 // Make sure the full path only matches the first entry47 EXPECT_EQ((size_t)0, files.FindCompatibleIndex(0, fullpath));48 EXPECT_EQ((size_t)1, files.FindCompatibleIndex(1, fullpath));49 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(2, fullpath));50 EXPECT_EQ((size_t)UINT32_MAX, files.FindCompatibleIndex(3, fullpath));51 // Make sure the relative path matches the all of the entries that contain52 // the relative path53 EXPECT_EQ((size_t)0, files.FindCompatibleIndex(0, relative));54 EXPECT_EQ((size_t)1, files.FindCompatibleIndex(1, relative));55 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(2, relative));56 EXPECT_EQ((size_t)UINT32_MAX, files.FindCompatibleIndex(3, relative));57 58 // Make sure looking file a file using the basename matches all entries59 EXPECT_EQ((size_t)0, files.FindCompatibleIndex(0, basename));60 EXPECT_EQ((size_t)1, files.FindCompatibleIndex(1, basename));61 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(2, basename));62 EXPECT_EQ((size_t)3, files.FindCompatibleIndex(3, basename));63 EXPECT_EQ((size_t)4, files.FindCompatibleIndex(4, basename));64 EXPECT_EQ((size_t)5, files.FindCompatibleIndex(5, basename));65 EXPECT_EQ((size_t)6, files.FindCompatibleIndex(6, basename));66 67 // Make sure that paths that have a common suffix don't return values that68 // don't match on directory delimiters.69 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(0, rel2_wrong));70 EXPECT_EQ((size_t)5, files.FindCompatibleIndex(3, rel2_wrong));71 EXPECT_EQ((size_t)UINT32_MAX, files.FindCompatibleIndex(6, rel2_wrong));72 73 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(0, rel3_wrong));74 EXPECT_EQ((size_t)6, files.FindCompatibleIndex(3, rel3_wrong));75}76 77TEST(SupportFileListTest, RelativePathMatchesWindows) {78 79 const FileSpec fullpath = WindowsSpec(R"(C:\build\src\main.cpp)");80 const FileSpec relative = WindowsSpec(R"(.\src\main.cpp)");81 const FileSpec basename = WindowsSpec(R"(.\main.cpp)");82 const FileSpec full_wrong = WindowsSpec(R"(\other\wrong\main.cpp)");83 const FileSpec rel_wrong = WindowsSpec(R"(.\wrong\main.cpp)");84 // Make sure these don't match "src\main.cpp" as we want to match full85 // directories only86 const FileSpec rel2_wrong = WindowsSpec(R"(asrc\main.cpp)");87 const FileSpec rel3_wrong = WindowsSpec(R"("rc\main.cpp)");88 89 SupportFileList files;90 files.Append(fullpath);91 files.Append(relative);92 files.Append(basename);93 files.Append(full_wrong);94 files.Append(rel_wrong);95 files.Append(rel2_wrong);96 files.Append(rel3_wrong);97 98 // Make sure the full path only matches the first entry99 EXPECT_EQ((size_t)0, files.FindCompatibleIndex(0, fullpath));100 EXPECT_EQ((size_t)1, files.FindCompatibleIndex(1, fullpath));101 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(2, fullpath));102 EXPECT_EQ((size_t)UINT32_MAX, files.FindCompatibleIndex(3, fullpath));103 // Make sure the relative path matches the all of the entries that contain104 // the relative path105 EXPECT_EQ((size_t)0, files.FindCompatibleIndex(0, relative));106 EXPECT_EQ((size_t)1, files.FindCompatibleIndex(1, relative));107 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(2, relative));108 EXPECT_EQ((size_t)UINT32_MAX, files.FindCompatibleIndex(3, relative));109 110 // Make sure looking file a file using the basename matches all entries111 EXPECT_EQ((size_t)0, files.FindCompatibleIndex(0, basename));112 EXPECT_EQ((size_t)1, files.FindCompatibleIndex(1, basename));113 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(2, basename));114 EXPECT_EQ((size_t)3, files.FindCompatibleIndex(3, basename));115 EXPECT_EQ((size_t)4, files.FindCompatibleIndex(4, basename));116 EXPECT_EQ((size_t)5, files.FindCompatibleIndex(5, basename));117 EXPECT_EQ((size_t)6, files.FindCompatibleIndex(6, basename));118 119 // Make sure that paths that have a common suffix don't return values that120 // don't match on directory delimiters.121 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(0, rel2_wrong));122 EXPECT_EQ((size_t)5, files.FindCompatibleIndex(3, rel2_wrong));123 EXPECT_EQ((size_t)UINT32_MAX, files.FindCompatibleIndex(6, rel2_wrong));124 125 EXPECT_EQ((size_t)2, files.FindCompatibleIndex(0, rel3_wrong));126 EXPECT_EQ((size_t)6, files.FindCompatibleIndex(3, rel3_wrong));127}128 129// Support file is a symlink to the breakpoint file.130// Absolute paths are used.131// A matching prefix is set.132// Should find it compatible.133TEST(SupportFileListTest, SymlinkedAbsolutePaths) {134 // Prepare FS135 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(136 PosixSpec("/symlink_dir/foo.h"), PosixSpec("/real_dir/foo.h"),137 FileSpec::Style::posix));138 139 // Prepare RealpathPrefixes140 FileSpecList file_spec_list;141 file_spec_list.Append(PosixSpec("/symlink_dir"));142 RealpathPrefixes prefixes(file_spec_list, fs);143 144 // Prepare support file list145 SupportFileList support_file_list;146 support_file_list.Append(PosixSpec("/symlink_dir/foo.h"));147 148 // Test149 size_t ret = support_file_list.FindCompatibleIndex(150 0, PosixSpec("/real_dir/foo.h"), &prefixes);151 EXPECT_EQ(ret, (size_t)0);152}153 154// Support file is a symlink to the breakpoint file.155// Absolute paths are used.156// A matching prefix is set, which is the root directory.157// Should find it compatible.158TEST(SupportFileListTest, RootDirectory) {159 // Prepare FS160 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(161 PosixSpec("/symlink_dir/foo.h"), PosixSpec("/real_dir/foo.h"),162 FileSpec::Style::posix));163 164 // Prepare RealpathPrefixes165 FileSpecList file_spec_list;166 file_spec_list.Append(PosixSpec("/"));167 RealpathPrefixes prefixes(file_spec_list, fs);168 169 // Prepare support file list170 SupportFileList support_file_list;171 support_file_list.Append(PosixSpec("/symlink_dir/foo.h"));172 173 // Test174 size_t ret = support_file_list.FindCompatibleIndex(175 0, PosixSpec("/real_dir/foo.h"), &prefixes);176 EXPECT_EQ(ret, (size_t)0);177}178 179// Support file is a symlink to the breakpoint file.180// Relative paths are used.181// A matching prefix is set.182// Should find it compatible.183TEST(SupportFileListTest, SymlinkedRelativePaths) {184 // Prepare FS185 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(186 PosixSpec("symlink_dir/foo.h"), PosixSpec("real_dir/foo.h"),187 FileSpec::Style::posix));188 189 // Prepare RealpathPrefixes190 FileSpecList file_spec_list;191 file_spec_list.Append(PosixSpec("symlink_dir"));192 RealpathPrefixes prefixes(file_spec_list, fs);193 194 // Prepare support file list195 SupportFileList support_file_list;196 support_file_list.Append(PosixSpec("symlink_dir/foo.h"));197 198 // Test199 size_t ret = support_file_list.FindCompatibleIndex(200 0, PosixSpec("real_dir/foo.h"), &prefixes);201 EXPECT_EQ(ret, (size_t)0);202}203 204// Support file is a symlink to the breakpoint file.205// A matching prefix is set.206// Input file only match basename and not directory.207// Should find it incompatible.208TEST(SupportFileListTest, RealpathOnlyMatchFileName) {209 // Prepare FS210 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(211 PosixSpec("symlink_dir/foo.h"), PosixSpec("real_dir/foo.h"),212 FileSpec::Style::posix));213 214 // Prepare RealpathPrefixes215 FileSpecList file_spec_list;216 file_spec_list.Append(PosixSpec("symlink_dir"));217 RealpathPrefixes prefixes(file_spec_list, fs);218 219 // Prepare support file list220 SupportFileList support_file_list;221 support_file_list.Append(PosixSpec("symlink_dir/foo.h"));222 223 // Test224 size_t ret = support_file_list.FindCompatibleIndex(225 0, PosixSpec("some_other_dir/foo.h"), &prefixes);226 EXPECT_EQ(ret, UINT32_MAX);227}228 229// Support file is a symlink to the breakpoint file.230// A prefix is set, which is a matching string prefix, but not a path prefix.231// Should find it incompatible.232TEST(SupportFileListTest, DirectoryMatchStringPrefixButNotWholeDirectoryName) {233 // Prepare FS234 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(235 PosixSpec("symlink_dir/foo.h"), PosixSpec("real_dir/foo.h"),236 FileSpec::Style::posix));237 238 // Prepare RealpathPrefixes239 FileSpecList file_spec_list;240 file_spec_list.Append(PosixSpec("symlink")); // This is a string prefix of the241 // symlink but not a path prefix.242 RealpathPrefixes prefixes(file_spec_list, fs);243 244 // Prepare support file list245 SupportFileList support_file_list;246 support_file_list.Append(PosixSpec("symlink_dir/foo.h"));247 248 // Test249 size_t ret = support_file_list.FindCompatibleIndex(250 0, PosixSpec("real_dir/foo.h"), &prefixes);251 EXPECT_EQ(ret, UINT32_MAX);252}253 254// Support file is a symlink to the breakpoint file.255// A matching prefix is set.256// However, the breakpoint is set with a partial path.257// Should find it compatible.258TEST(SupportFileListTest, PartialBreakpointPath) {259 // Prepare FS260 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(261 PosixSpec("symlink_dir/foo.h"), PosixSpec("/real_dir/foo.h"),262 FileSpec::Style::posix));263 264 // Prepare RealpathPrefixes265 FileSpecList file_spec_list;266 file_spec_list.Append(PosixSpec("symlink_dir"));267 RealpathPrefixes prefixes(file_spec_list, fs);268 269 // Prepare support file list270 SupportFileList support_file_list;271 support_file_list.Append(PosixSpec("symlink_dir/foo.h"));272 273 // Test274 size_t ret = support_file_list.FindCompatibleIndex(275 0, PosixSpec("real_dir/foo.h"), &prefixes);276 EXPECT_EQ(ret, (size_t)0);277}278 279// Support file is a symlink to the breakpoint file.280// A matching prefix is set.281// However, the basename is different between the symlink and its target.282// Should find it incompatible.283TEST(SupportFileListTest, DifferentBasename) {284 // Prepare FS285 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(286 PosixSpec("/symlink_dir/foo.h"), PosixSpec("/real_dir/bar.h"),287 FileSpec::Style::posix));288 289 // Prepare RealpathPrefixes290 FileSpecList file_spec_list;291 file_spec_list.Append(PosixSpec("/symlink_dir"));292 RealpathPrefixes prefixes(file_spec_list, fs);293 294 // Prepare support file list295 SupportFileList support_file_list;296 support_file_list.Append(PosixSpec("/symlink_dir/foo.h"));297 298 // Test299 size_t ret = support_file_list.FindCompatibleIndex(300 0, PosixSpec("real_dir/bar.h"), &prefixes);301 EXPECT_EQ(ret, UINT32_MAX);302}303 304// No prefixes are configured.305// The support file and the breakpoint file are different.306// Should find it incompatible.307TEST(SupportFileListTest, NoPrefixes) {308 // Prepare support file list309 SupportFileList support_file_list;310 support_file_list.Append(PosixSpec("/real_dir/bar.h"));311 312 // Test313 size_t ret = support_file_list.FindCompatibleIndex(314 0, PosixSpec("/real_dir/foo.h"), nullptr);315 EXPECT_EQ(ret, UINT32_MAX);316}317 318// No prefixes are configured.319// The support file and the breakpoint file are the same.320// Should find it compatible.321TEST(SupportFileListTest, SameFile) {322 // Prepare support file list323 SupportFileList support_file_list;324 support_file_list.Append(PosixSpec("/real_dir/foo.h"));325 326 // Test327 size_t ret = support_file_list.FindCompatibleIndex(328 0, PosixSpec("/real_dir/foo.h"), nullptr);329 EXPECT_EQ(ret, (size_t)0);330}331