#ifndef FSFW_MOCKS_FILESYSTEMMOCK_H #define FSFW_MOCKS_FILESYSTEMMOCK_H #include #include #include #include #include #include "fsfw/filesystem.h" /** * This mock models a filesystem in the RAM. It can be used to verify correct behaviour of * a component using a filesystem without relying on an actual OS filesystem implementation. * * Please note that this object does not actually check paths for validity. The file API was * built in a way to allow reading a file back after it was written while also remembering * the specific file segments which were inserted in write calls. */ class FilesystemMock : public HasFileSystemIF { public: struct FileWriteInfo { FileWriteInfo(std::string filename, size_t offset, const uint8_t* data, size_t len) : filename(std::move(filename)), offset(offset) { this->data.insert(this->data.end(), data, data + len); } std::string filename; size_t offset; std::vector data; }; using FileSegmentQueue = std::queue; struct FileInfo { FileSegmentQueue fileSegQueue; std::vector fileRaw; }; std::map fileMap; struct DirInfo { size_t createCallCount = 0; size_t delCallCount = 0; std::queue wihParentDir; std::queue recursiveDeletion; }; std::map dirMap; struct RenameInfo { RenameInfo(std::string oldName, std::string newName) : oldName(std::move(oldName)), newName(std::move(newName)) {} std::string oldName; std::string newName; }; std::queue renameQueue; std::string truncateCalledOnFile; ReturnValue_t feedFile(const std::string& filename, std::ifstream& file); ReturnValue_t getBaseFilename(const char* path, char* nameBuf, size_t maxLen, size_t& baseNameLen) override; ReturnValue_t isDirectory(const char* path, bool& isDirectory) override; bool fileExists(const char* path, FileSystemArgsIF* args) override; ReturnValue_t truncateFile(const char* path, FileSystemArgsIF* args) override; ReturnValue_t getFileSize(const char* path, uint64_t& fileSize, FileSystemArgsIF* args) override; ReturnValue_t writeToFile(const char* path, size_t offset, const uint8_t* data, size_t size) override; ReturnValue_t readFromFile(const char* path, size_t offset, size_t size, uint8_t* buffer, size_t& readSize, size_t maxSize) override; ReturnValue_t createFile(const char* path, const uint8_t* data, size_t size) override; ReturnValue_t removeFile(const char* path, FileSystemArgsIF* args) override; ReturnValue_t createDirectory(const char* path, bool createParentDirs, FileSystemArgsIF* args) override; ReturnValue_t removeDirectory(const char* path, bool deleteRecurively, FileSystemArgsIF* args) override; ReturnValue_t rename(const char* oldPath, const char* newPath, FileSystemArgsIF* args) override; void reset(); using HasFileSystemIF::createDirectory; using HasFileSystemIF::createFile; using HasFileSystemIF::readFromFile; private: void createOrAddToFile(const char* path, size_t offset, const uint8_t* data, size_t dataSize); }; #endif // FSFW_MOCKS_FILESYSTEMMOCK_H