1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "fspp/impl/FuseOpenFileList.h"
#include <stdexcept>
using cpputils::make_unique_ref;
using namespace fspp;
class MockOpenFile: public OpenFile {
public:
MockOpenFile(int fileid_, int flags_): fileid(fileid_), flags(flags_), destructed(false) {}
int fileid, flags;
bool destructed;
~MockOpenFile() override {destructed = true;}
MOCK_METHOD(fspp::num_bytes_t, read, (void*, fspp::num_bytes_t, fspp::num_bytes_t), (const, override));
MOCK_METHOD(void, write, (const void*, fspp::num_bytes_t, fspp::num_bytes_t), (override));
MOCK_METHOD(void, flush, (), (override));
MOCK_METHOD(void, fsync, (), (override));
MOCK_METHOD(void, fdatasync, (), (override));
};
struct FuseOpenFileListTest: public ::testing::Test {
static constexpr int FILEID1 = 4;
static constexpr int FLAGS1 = 5;
static constexpr int FILEID2 = 6;
static constexpr int FLAGS2 = 7;
static constexpr int FILEID3 = 8;
static constexpr int FLAGS3 = 9;
FuseOpenFileListTest(): list() {}
FuseOpenFileList list;
int open(int fileid, int flags) {
return list.open(make_unique_ref<MockOpenFile>(fileid, flags));
}
int open() {
return open(FILEID1, FILEID2);
}
void check(int id, int fileid, int flags) {
list.load(id, [=](OpenFile* _openFile) {
MockOpenFile *openFile = dynamic_cast<MockOpenFile*>(_openFile);
EXPECT_EQ(fileid, openFile->fileid);
EXPECT_EQ(flags, openFile->flags);
});
}
};
TEST_F(FuseOpenFileListTest, EmptyList1) {
ASSERT_THROW(list.load(0, [](OpenFile*) {}), fspp::fuse::FuseErrnoException);
}
TEST_F(FuseOpenFileListTest, EmptyList2) {
ASSERT_THROW(list.load(3, [](OpenFile*) {}), fspp::fuse::FuseErrnoException);
}
TEST_F(FuseOpenFileListTest, InvalidId) {
const int valid_id = open();
const int invalid_id = valid_id + 1;
ASSERT_THROW(list.load(invalid_id, [](OpenFile*) {}), fspp::fuse::FuseErrnoException);
}
TEST_F(FuseOpenFileListTest, Open1AndGet) {
const int id = open(FILEID1, FLAGS1);
check(id, FILEID1, FLAGS1);
}
TEST_F(FuseOpenFileListTest, Open2AndGet) {
const int id1 = open(FILEID1, FLAGS1);
const int id2 = open(FILEID2, FLAGS2);
check(id1, FILEID1, FLAGS1);
check(id2, FILEID2, FLAGS2);
}
TEST_F(FuseOpenFileListTest, Open3AndGet) {
const int id1 = open(FILEID1, FLAGS1);
const int id2 = open(FILEID2, FLAGS2);
const int id3 = open(FILEID3, FLAGS3);
check(id1, FILEID1, FLAGS1);
check(id3, FILEID3, FLAGS3);
check(id2, FILEID2, FLAGS2);
}
//TODO Test case fails. Disabled it. Figure out why and reenable.
/*TEST_F(FuseOpenFileListTest, DestructOnClose) {
int id = open();
MockOpenFile *openFile = dynamic_cast<MockOpenFile*>(list.get(id));
EXPECT_FALSE(openFile->destructed);
list.close(id);
EXPECT_TRUE(openFile->destructed);
}*/
TEST_F(FuseOpenFileListTest, GetClosedItemOnEmptyList) {
const int id = open();
ASSERT_NO_THROW(list.load(id, [](OpenFile*) {}));
list.close(id);
ASSERT_THROW(list.load(id, [](OpenFile*) {}), fspp::fuse::FuseErrnoException);
}
TEST_F(FuseOpenFileListTest, GetClosedItemOnNonEmptyList) {
const int id = open();
open();
ASSERT_NO_THROW(list.load(id, [](OpenFile*) {}));
list.close(id);
ASSERT_THROW(list.load(id, [](OpenFile*) {}), fspp::fuse::FuseErrnoException);
}
TEST_F(FuseOpenFileListTest, CloseOnEmptyList1) {
ASSERT_THROW(list.close(0), std::out_of_range);
}
TEST_F(FuseOpenFileListTest, CloseOnEmptyList2) {
ASSERT_THROW(list.close(4), std::out_of_range);
}
TEST_F(FuseOpenFileListTest, RemoveInvalidId) {
const int valid_id = open();
const int invalid_id = valid_id + 1;
ASSERT_THROW(list.close(invalid_id), std::out_of_range);
}
|