147721d46Sroyitaqi //===-- MockSymlinkFileSystem.h 247721d46Sroyitaqi //--------------------------------------------------===// 347721d46Sroyitaqi // 447721d46Sroyitaqi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 547721d46Sroyitaqi // See https://llvm.org/LICENSE.txt for license information. 647721d46Sroyitaqi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 747721d46Sroyitaqi // 847721d46Sroyitaqi //===----------------------------------------------------------------------===// 947721d46Sroyitaqi 1047721d46Sroyitaqi #include "lldb/Utility/FileSpec.h" 1147721d46Sroyitaqi #include "llvm/Support/VirtualFileSystem.h" 1247721d46Sroyitaqi 1347721d46Sroyitaqi namespace lldb_private { 1447721d46Sroyitaqi 1547721d46Sroyitaqi // A mock file system that realpath's a given symlink to a given realpath. 1647721d46Sroyitaqi class MockSymlinkFileSystem : public llvm::vfs::FileSystem { 1747721d46Sroyitaqi public: 1847721d46Sroyitaqi // Treat all files as non-symlinks. 1947721d46Sroyitaqi MockSymlinkFileSystem() = default; 2047721d46Sroyitaqi 2147721d46Sroyitaqi /// Treat \a symlink as a symlink to \a realpath. Treat all other files as 2247721d46Sroyitaqi /// non-symlinks. 2347721d46Sroyitaqi MockSymlinkFileSystem(FileSpec &&symlink, FileSpec &&realpath, 2447721d46Sroyitaqi FileSpec::Style style = FileSpec::Style::native) 2547721d46Sroyitaqi : m_symlink(std::move(symlink)), m_realpath(std::move(realpath)), 2647721d46Sroyitaqi m_style(style) {} 2747721d46Sroyitaqi 2847721d46Sroyitaqi /// If \a Path matches the symlink given in the ctor, put the realpath given 2947721d46Sroyitaqi /// in the ctor into \a Output. 3047721d46Sroyitaqi std::error_code getRealPath(const llvm::Twine &Path, 3147721d46Sroyitaqi llvm::SmallVectorImpl<char> &Output) override { 3247721d46Sroyitaqi if (FileSpec(Path.str(), m_style) == m_symlink) { 3347721d46Sroyitaqi std::string path = m_realpath.GetPath(); 3447721d46Sroyitaqi Output.assign(path.begin(), path.end()); 3547721d46Sroyitaqi } else { 3647721d46Sroyitaqi Path.toVector(Output); 3747721d46Sroyitaqi } 3847721d46Sroyitaqi return {}; 3947721d46Sroyitaqi } 4047721d46Sroyitaqi 4147721d46Sroyitaqi // Implement the rest of the interface 4247721d46Sroyitaqi llvm::ErrorOr<llvm::vfs::Status> status(const llvm::Twine &Path) override { 4347721d46Sroyitaqi return llvm::errc::operation_not_permitted; 4447721d46Sroyitaqi } 4547721d46Sroyitaqi llvm::ErrorOr<std::unique_ptr<llvm::vfs::File>> 46*efdb3ae2SAbhina Sreeskantharajan openFileForRead(const llvm::Twine &Path) override { 4747721d46Sroyitaqi return llvm::errc::operation_not_permitted; 4847721d46Sroyitaqi } 4947721d46Sroyitaqi llvm::vfs::directory_iterator dir_begin(const llvm::Twine &Dir, 5047721d46Sroyitaqi std::error_code &EC) override { 5147721d46Sroyitaqi return llvm::vfs::directory_iterator(); 5247721d46Sroyitaqi } 5347721d46Sroyitaqi std::error_code setCurrentWorkingDirectory(const llvm::Twine &Path) override { 5447721d46Sroyitaqi return llvm::errc::operation_not_permitted; 5547721d46Sroyitaqi } 5647721d46Sroyitaqi llvm::ErrorOr<std::string> getCurrentWorkingDirectory() const override { 5747721d46Sroyitaqi return llvm::errc::operation_not_permitted; 5847721d46Sroyitaqi } 5947721d46Sroyitaqi 6047721d46Sroyitaqi private: 6147721d46Sroyitaqi FileSpec m_symlink; 6247721d46Sroyitaqi FileSpec m_realpath; 6347721d46Sroyitaqi FileSpec::Style m_style; 6447721d46Sroyitaqi }; 6547721d46Sroyitaqi 6647721d46Sroyitaqi } // namespace lldb_private 67