brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · a4dc7d6 Raw
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