#pragma once #ifndef MESSMER_FSPP_FSTEST_FSPPDIRTEST_H_ #define MESSMER_FSPP_FSTEST_FSPPDIRTEST_H_ template class FsppDirTest: public FileSystemTest { public: void InitDirStructure() { this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir")->createAndOpenFile("myfile2", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir/mysubdir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir/mysubdir")->createDir("mysubsubdir", this->MODE_PUBLIC, 0, 0); } void EXPECT_CHILDREN_ARE(const boost::filesystem::path &path, const std::initializer_list expected) { EXPECT_CHILDREN_ARE(*this->LoadDir(path), expected); } void EXPECT_CHILDREN_ARE(const fspp::Dir &dir, const std::initializer_list expected) { std::vector expectedChildren = expected; expectedChildren.push_back(fspp::Dir::Entry(fspp::Dir::EntryType::DIR, ".")); expectedChildren.push_back(fspp::Dir::Entry(fspp::Dir::EntryType::DIR, "..")); EXPECT_UNORDERED_EQ(expectedChildren, *dir.children()); } template void EXPECT_UNORDERED_EQ(const std::vector &expected, std::vector actual) { EXPECT_EQ(expected.size(), actual.size()); for (const Entry &expectedEntry : expected) { removeOne(&actual, expectedEntry); } } template void removeOne(std::vector *entries, const Entry &toRemove) { for (auto iter = entries->begin(); iter != entries->end(); ++iter) { if (iter->type == toRemove.type && iter->name == toRemove.name) { entries->erase(iter); return; } } EXPECT_TRUE(false); } }; TYPED_TEST_CASE_P(FsppDirTest); fspp::Dir::Entry DirEntry(const std::string &name) { return fspp::Dir::Entry(fspp::Dir::EntryType::DIR, name); } fspp::Dir::Entry FileEntry(const std::string &name) { return fspp::Dir::Entry(fspp::Dir::EntryType::FILE, name); } TYPED_TEST_P(FsppDirTest, Children_RootDir_Empty) { this->EXPECT_CHILDREN_ARE("/", {}); } TYPED_TEST_P(FsppDirTest, Children_RootDir_OneFile_Directly) { auto rootdir = this->LoadDir("/"); rootdir->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE(*rootdir, { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_RootDir_OneFile_AfterReloadingDir) { this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_RootDir_OneDir_Directly) { auto rootdir = this->LoadDir("/"); rootdir->createDir("mydir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE(*rootdir, { DirEntry("mydir") }); } TYPED_TEST_P(FsppDirTest, Children_RootDir_OneDir_AfterReloadingDir) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/", { DirEntry("mydir") }); } TYPED_TEST_P(FsppDirTest, Children_RootDir_LargerStructure) { this->InitDirStructure(); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile"), DirEntry("mydir"), DirEntry("myemptydir") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_Empty) { this->LoadDir("/")->createDir("myemptydir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/myemptydir", {}); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneFile_Directly) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); auto dir = this->LoadDir("/mydir"); dir->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE(*dir, { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneFile_AfterReloadingDir) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneDir_Directly) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); auto dir = this->LoadDir("/mydir"); dir->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE(*dir, { DirEntry("mysubdir") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_OneDir_AfterReloadingDir) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir")->createDir("mysubdir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/mydir", { DirEntry("mysubdir") }); } TYPED_TEST_P(FsppDirTest, Children_Nested_LargerStructure_Empty) { this->InitDirStructure(); this->EXPECT_CHILDREN_ARE("/myemptydir", {}); } TYPED_TEST_P(FsppDirTest, Children_Nested_LargerStructure) { this->InitDirStructure(); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile"), FileEntry("myfile2"), DirEntry("mysubdir") }); } TYPED_TEST_P(FsppDirTest, Children_Nested2_LargerStructure) { this->InitDirStructure(); this->EXPECT_CHILDREN_ARE("/mydir/mysubdir", { FileEntry("myfile"), DirEntry("mysubsubdir") }); } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InEmptyRoot) { this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); this->LoadFile("/myfile"); } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InNonemptyRoot) { this->InitDirStructure(); this->LoadDir("/")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile"), DirEntry("mydir"), DirEntry("myemptydir"), FileEntry("mynewfile") }); } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InEmptyNestedDir) { this->InitDirStructure(); this->LoadDir("/myemptydir")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/myemptydir", { FileEntry("mynewfile") }); } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_InNonemptyNestedDir) { this->InitDirStructure(); this->LoadDir("/mydir")->createAndOpenFile("mynewfile", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile"), FileEntry("myfile2"), DirEntry("mysubdir"), FileEntry("mynewfile") }); } TYPED_TEST_P(FsppDirTest, CreateAndOpenFile_AlreadyExisting) { this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); //TODO Change, once we know which way of error reporting we want for such errors EXPECT_ANY_THROW( this->LoadDir("/")->createAndOpenFile("myfile", this->MODE_PUBLIC, 0, 0); ); } TYPED_TEST_P(FsppDirTest, CreateDir_InEmptyRoot) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); this->LoadDir("/mydir"); } TYPED_TEST_P(FsppDirTest, CreateDir_InNonemptyRoot) { this->InitDirStructure(); this->LoadDir("/")->createDir("mynewdir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/", { FileEntry("myfile"), DirEntry("mydir"), DirEntry("myemptydir"), DirEntry("mynewdir") }); } TYPED_TEST_P(FsppDirTest, CreateDir_InEmptyNestedDir) { this->InitDirStructure(); this->LoadDir("/myemptydir")->createDir("mynewdir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/myemptydir", { DirEntry("mynewdir") }); } TYPED_TEST_P(FsppDirTest, CreateDir_InNonemptyNestedDir) { this->InitDirStructure(); this->LoadDir("/mydir")->createDir("mynewdir", this->MODE_PUBLIC, 0, 0); this->EXPECT_CHILDREN_ARE("/mydir", { FileEntry("myfile"), FileEntry("myfile2"), DirEntry("mysubdir"), DirEntry("mynewdir") }); } TYPED_TEST_P(FsppDirTest, CreateDir_AlreadyExisting) { this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); //TODO Change, once we know which way of error reporting we want for such errors EXPECT_ANY_THROW( this->LoadDir("/")->createDir("mydir", this->MODE_PUBLIC, 0, 0); ); } REGISTER_TYPED_TEST_CASE_P(FsppDirTest, Children_RootDir_Empty, Children_RootDir_OneFile_Directly, Children_RootDir_OneFile_AfterReloadingDir, Children_RootDir_OneDir_Directly, Children_RootDir_OneDir_AfterReloadingDir, Children_RootDir_LargerStructure, Children_Nested_Empty, Children_Nested_OneFile_Directly, Children_Nested_OneFile_AfterReloadingDir, Children_Nested_OneDir_Directly, Children_Nested_OneDir_AfterReloadingDir, Children_Nested_LargerStructure, Children_Nested_LargerStructure_Empty, Children_Nested2_LargerStructure, CreateAndOpenFile_InEmptyRoot, CreateAndOpenFile_InNonemptyRoot, CreateAndOpenFile_InEmptyNestedDir, CreateAndOpenFile_InNonemptyNestedDir, CreateAndOpenFile_AlreadyExisting, CreateDir_InEmptyRoot, CreateDir_InNonemptyRoot, CreateDir_InEmptyNestedDir, CreateDir_InNonemptyNestedDir, CreateDir_AlreadyExisting ); //TODO stat //TODO access //TODO rename //TODO utimens //TODO rmdir //TODO chmod //TODO chown //TODO mkdir with uid/gid //TODO Test permission flags #endif