xref: /llvm-project/lldb/unittests/Utility/MockSymlinkFileSystem.h (revision efdb3ae23247850d3886e3708400f0d991ed59e1)
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