154 lines · cpp
1//===-- RealpathPrefixesTest.cpp2//--------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7//8//===----------------------------------------------------------------------===//9 10#include "gtest/gtest.h"11 12#include "MockSymlinkFileSystem.h"13#include "lldb/Utility/FileSpecList.h"14#include "lldb/Utility/RealpathPrefixes.h"15 16using namespace lldb_private;17 18static FileSpec PosixSpec(llvm::StringRef path) {19 return FileSpec(path, FileSpec::Style::posix);20}21 22static FileSpec WindowsSpec(llvm::StringRef path) {23 return FileSpec(path, FileSpec::Style::windows);24}25 26// Should resolve a symlink which match an absolute prefix27TEST(RealpathPrefixesTest, MatchingAbsolutePrefix) {28 // Prepare FS29 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(30 PosixSpec("/dir1/link.h"), PosixSpec("/dir2/real.h"),31 FileSpec::Style::posix));32 33 // Prepare RealpathPrefixes34 FileSpecList file_spec_list;35 file_spec_list.Append(PosixSpec("/dir1"));36 RealpathPrefixes prefixes(file_spec_list, fs);37 38 // Test39 std::optional<FileSpec> ret =40 prefixes.ResolveSymlinks(PosixSpec("/dir1/link.h"));41 EXPECT_EQ(ret, PosixSpec("/dir2/real.h"));42}43 44// Should resolve a symlink which match a relative prefix45TEST(RealpathPrefixesTest, MatchingRelativePrefix) {46 // Prepare FS47 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(48 PosixSpec("dir1/link.h"), PosixSpec("dir2/real.h"),49 FileSpec::Style::posix));50 51 // Prepare RealpathPrefixes52 FileSpecList file_spec_list;53 file_spec_list.Append(PosixSpec("dir1"));54 RealpathPrefixes prefixes(file_spec_list, fs);55 56 // Test57 std::optional<FileSpec> ret =58 prefixes.ResolveSymlinks(PosixSpec("dir1/link.h"));59 EXPECT_EQ(ret, PosixSpec("dir2/real.h"));60}61 62// Should resolve in Windows and/or with a case-insensitive support file63TEST(RealpathPrefixesTest, WindowsAndCaseInsensitive) {64 // Prepare FS65 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(66 WindowsSpec("f:\\dir1\\link.h"), WindowsSpec("f:\\dir2\\real.h"),67 FileSpec::Style::windows));68 69 // Prepare RealpathPrefixes70 FileSpecList file_spec_list;71 file_spec_list.Append(WindowsSpec("f:\\dir1"));72 RealpathPrefixes prefixes(file_spec_list, fs);73 74 // Test75 std::optional<FileSpec> ret =76 prefixes.ResolveSymlinks(WindowsSpec("F:\\DIR1\\LINK.H"));77 EXPECT_EQ(ret, WindowsSpec("f:\\dir2\\real.h"));78}79 80// Should resolve a symlink when there is mixture of matching and mismatching81// prefixex82TEST(RealpathPrefixesTest, MatchingAndMismatchingPrefix) {83 // Prepare FS84 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(85 PosixSpec("/dir1/link.h"), PosixSpec("/dir2/real.h"),86 FileSpec::Style::posix));87 88 // Prepare RealpathPrefixes89 FileSpecList file_spec_list;90 file_spec_list.Append(PosixSpec("/fake/path1"));91 file_spec_list.Append(PosixSpec("/dir1")); // Matching prefix92 file_spec_list.Append(PosixSpec("/fake/path2"));93 RealpathPrefixes prefixes(file_spec_list, fs);94 95 // Test96 std::optional<FileSpec> ret =97 prefixes.ResolveSymlinks(PosixSpec("/dir1/link.h"));98 EXPECT_EQ(ret, PosixSpec("/dir2/real.h"));99}100 101// Should resolve a symlink when the prefixes matches after normalization102TEST(RealpathPrefixesTest, ComplexPrefixes) {103 // Prepare FS104 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(105 PosixSpec("dir1/link.h"), PosixSpec("dir2/real.h"),106 FileSpec::Style::posix));107 108 // Prepare RealpathPrefixes109 FileSpecList file_spec_list;110 file_spec_list.Append(111 PosixSpec("./dir1/foo/../bar/..")); // Equivalent to "/dir1"112 RealpathPrefixes prefixes(file_spec_list, fs);113 114 // Test115 std::optional<FileSpec> ret =116 prefixes.ResolveSymlinks(PosixSpec("dir1/link.h"));117 EXPECT_EQ(ret, PosixSpec("dir2/real.h"));118}119 120// Should not resolve a symlink which doesn't match any prefixes121TEST(RealpathPrefixesTest, MismatchingPrefixes) {122 // Prepare FS123 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(new MockSymlinkFileSystem(124 PosixSpec("/dir1/link.h"), PosixSpec("/dir2/real.h"),125 FileSpec::Style::posix));126 127 // Prepare RealpathPrefixes128 FileSpecList file_spec_list;129 file_spec_list.Append(PosixSpec("/dir3"));130 RealpathPrefixes prefixes(file_spec_list, fs);131 132 // Test133 std::optional<FileSpec> ret =134 prefixes.ResolveSymlinks(PosixSpec("/dir1/link.h"));135 EXPECT_EQ(ret, std::nullopt);136}137 138// Should not resolve a realpath139TEST(RealpathPrefixesTest, Realpath) {140 // Prepare FS141 llvm::IntrusiveRefCntPtr<MockSymlinkFileSystem> fs(142 new MockSymlinkFileSystem());143 144 // Prepare RealpathPrefixes145 FileSpecList file_spec_list;146 file_spec_list.Append(PosixSpec("/symlink_dir"));147 RealpathPrefixes prefixes(file_spec_list, fs);148 149 // Test150 std::optional<FileSpec> ret =151 prefixes.ResolveSymlinks(PosixSpec("/dir/real.h"));152 EXPECT_EQ(ret, std::nullopt);153}154