From 6e05240cb6aac138c250d3d62ad9e5706067c282 Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Thu, 20 Nov 2014 21:23:35 +0100 Subject: [PATCH] Added testcases for open() --- src/test/fspp/fuse/FuseOpenTest.cpp | 24 ----------- .../fspp/fuse/openFile/FuseOpenErrorTest.cpp | 33 +++++++++++++++ .../openFile/FuseOpenFileDescriptorTest.cpp | 42 +++++++++++++++++++ .../fuse/openFile/FuseOpenFilenameTest.cpp | 38 +++++++++++++++++ .../fspp/fuse/openFile/FuseOpenFlagsTest.cpp | 18 ++++++++ .../fuse/openFile/testutils/FuseOpenTest.cpp | 14 +++++++ .../fuse/openFile/testutils/FuseOpenTest.h | 19 +++++++++ src/test/testutils/FuseTest.h | 4 -- 8 files changed, 164 insertions(+), 28 deletions(-) delete mode 100644 src/test/fspp/fuse/FuseOpenTest.cpp create mode 100644 src/test/fspp/fuse/openFile/FuseOpenErrorTest.cpp create mode 100644 src/test/fspp/fuse/openFile/FuseOpenFileDescriptorTest.cpp create mode 100644 src/test/fspp/fuse/openFile/FuseOpenFilenameTest.cpp create mode 100644 src/test/fspp/fuse/openFile/FuseOpenFlagsTest.cpp create mode 100644 src/test/fspp/fuse/openFile/testutils/FuseOpenTest.cpp create mode 100644 src/test/fspp/fuse/openFile/testutils/FuseOpenTest.h diff --git a/src/test/fspp/fuse/FuseOpenTest.cpp b/src/test/fspp/fuse/FuseOpenTest.cpp deleted file mode 100644 index 569de0b6..00000000 --- a/src/test/fspp/fuse/FuseOpenTest.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "gtest/gtest.h" -#include "gmock/gmock.h" - -#include "test/testutils/FuseTest.h" - -using namespace fspp; -using namespace fspp::fuse; - -using ::testing::_; -using ::testing::StrEq; - -typedef FuseTest FuseOpenTest; - -TEST_F(FuseOpenTest, openFile) { - const char *filename = "/myfile"; - ReturnIsFileOnLstat(filename); - EXPECT_CALL(fsimpl, openFile(StrEq(filename), OpenFlagsEq(O_RDWR))) - .Times(1); - - auto fs = TestFS(); - - auto realpath = fs->mountDir() / filename; - ::open(realpath.c_str(), O_RDWR); -} diff --git a/src/test/fspp/fuse/openFile/FuseOpenErrorTest.cpp b/src/test/fspp/fuse/openFile/FuseOpenErrorTest.cpp new file mode 100644 index 00000000..7f53ecd0 --- /dev/null +++ b/src/test/fspp/fuse/openFile/FuseOpenErrorTest.cpp @@ -0,0 +1,33 @@ +#include "testutils/FuseOpenTest.h" + +#include "fspp/impl/FuseErrnoException.h" + +using ::testing::WithParamInterface; +using ::testing::Values; +using ::testing::Return; +using ::testing::Throw; +using ::testing::StrEq; +using ::testing::_; + +using namespace fspp; + +class FuseOpenErrorTest: public FuseOpenTest, public WithParamInterface { +}; +INSTANTIATE_TEST_CASE_P(OpenErrorCodes, FuseOpenErrorTest, Values(EACCES, EDQUOT, EEXIST, EFAULT, EFBIG, EINTR, EOVERFLOW, EINVAL, EISDIR, ELOOP, EMFILE, ENAMETOOLONG, ENFILE, ENODEV, ENOENT, ENOMEM, ENOSPC, ENOTDIR, ENXIO, EOPNOTSUPP, EPERM, EROFS, ETXTBSY, EWOULDBLOCK, EBADF, ENOTDIR)); + +TEST_F(FuseOpenErrorTest, ReturnNoError) { + ReturnIsFileOnLstat(FILENAME); + EXPECT_CALL(fsimpl, openFile(StrEq(FILENAME), _)).Times(1).WillOnce(Return(1)); + errno = 0; + int retval = OpenFileAllowError(FILENAME, O_RDONLY); + EXPECT_EQ(errno, 0); + EXPECT_GE(retval, 0); +} + +TEST_P(FuseOpenErrorTest, ReturnError) { + ReturnIsFileOnLstat(FILENAME); + EXPECT_CALL(fsimpl, openFile(StrEq(FILENAME), _)).Times(1).WillOnce(Throw(FuseErrnoException(GetParam()))); + int retval = OpenFileAllowError(FILENAME, O_RDONLY); + EXPECT_EQ(retval, -1); + EXPECT_EQ(GetParam(), errno); +} diff --git a/src/test/fspp/fuse/openFile/FuseOpenFileDescriptorTest.cpp b/src/test/fspp/fuse/openFile/FuseOpenFileDescriptorTest.cpp new file mode 100644 index 00000000..ee511b17 --- /dev/null +++ b/src/test/fspp/fuse/openFile/FuseOpenFileDescriptorTest.cpp @@ -0,0 +1,42 @@ +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +#include "testutils/FuseOpenTest.h" + +using ::testing::_; +using ::testing::StrEq; +using ::testing::WithParamInterface; +using ::testing::Values; +using ::testing::Return; + +class FuseOpenFileDescriptorTest: public FuseOpenTest, public WithParamInterface { +public: + void OpenAndReadFile(const char *filename) { + auto fs = TestFS(); + + int fd = OpenFile(fs.get(), filename); + ReadFile(fd); + } + +private: + int OpenFile(const TempTestFS *fs, const char *filename) { + auto realpath = fs->mountDir() / filename; + int fd = ::open(realpath.c_str(), O_RDONLY); + EXPECT_GE(fd, 0) << "Opening file failed"; + return fd; + } + void ReadFile(int fd) { + int retval = ::read(fd, nullptr, 0); + EXPECT_EQ(0, retval) << "Reading file failed"; + } +}; +INSTANTIATE_TEST_CASE_P(FuseOpenFileDescriptorTest, FuseOpenFileDescriptorTest, Values(0, 2, 5, 1000, 1024*1024*1024)); + +TEST_P(FuseOpenFileDescriptorTest, TestReturnedFileDescriptor) { + ReturnIsFileOnLstat(FILENAME); + EXPECT_CALL(fsimpl, openFile(StrEq(FILENAME), _)) + .Times(1).WillOnce(Return(GetParam())); + EXPECT_CALL(fsimpl, read(GetParam(), _, _, _)).Times(1); + + OpenAndReadFile(FILENAME); +} diff --git a/src/test/fspp/fuse/openFile/FuseOpenFilenameTest.cpp b/src/test/fspp/fuse/openFile/FuseOpenFilenameTest.cpp new file mode 100644 index 00000000..3ed45e17 --- /dev/null +++ b/src/test/fspp/fuse/openFile/FuseOpenFilenameTest.cpp @@ -0,0 +1,38 @@ +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +#include "testutils/FuseOpenTest.h" + +using ::testing::_; +using ::testing::StrEq; + +class FuseOpenFilenameTest: public FuseOpenTest { +public: +}; + +TEST_F(FuseOpenFilenameTest, OpenFile) { + ReturnIsFileOnLstat("/myfile"); + EXPECT_CALL(fsimpl, openFile(StrEq("/myfile"), _)) + .Times(1); + + OpenFile("/myfile", O_RDONLY); +} + +TEST_F(FuseOpenFilenameTest, OpenFileNested) { + ReturnIsDirOnLstat("/mydir"); + ReturnIsFileOnLstat("/mydir/myfile"); + EXPECT_CALL(fsimpl, openFile(StrEq("/mydir/myfile"), _)) + .Times(1); + + OpenFile("/mydir/myfile", O_RDONLY); +} + +TEST_F(FuseOpenFilenameTest, OpenFileNested2) { + ReturnIsDirOnLstat("/mydir"); + ReturnIsDirOnLstat("/mydir/mydir2"); + ReturnIsFileOnLstat("/mydir/mydir2/myfile"); + EXPECT_CALL(fsimpl, openFile(StrEq("/mydir/mydir2/myfile"), _)) + .Times(1); + + OpenFile("/mydir/mydir2/myfile", O_RDONLY); +} diff --git a/src/test/fspp/fuse/openFile/FuseOpenFlagsTest.cpp b/src/test/fspp/fuse/openFile/FuseOpenFlagsTest.cpp new file mode 100644 index 00000000..22701bdc --- /dev/null +++ b/src/test/fspp/fuse/openFile/FuseOpenFlagsTest.cpp @@ -0,0 +1,18 @@ +#include "testutils/FuseOpenTest.h" + +using ::testing::_; +using ::testing::StrEq; +using ::testing::WithParamInterface; +using ::testing::Values; + +class FuseOpenFlagsTest: public FuseOpenTest, public WithParamInterface { +}; +INSTANTIATE_TEST_CASE_P(FuseOpenFlagsTest, FuseOpenFlagsTest, Values(O_RDWR, O_RDONLY, O_WRONLY)); + +TEST_P(FuseOpenFlagsTest, testFlags) { + ReturnIsFileOnLstat(FILENAME); + EXPECT_CALL(fsimpl, openFile(StrEq(FILENAME), OpenFlagsEq(GetParam()))) + .Times(1); + + OpenFile(FILENAME, GetParam()); +} diff --git a/src/test/fspp/fuse/openFile/testutils/FuseOpenTest.cpp b/src/test/fspp/fuse/openFile/testutils/FuseOpenTest.cpp new file mode 100644 index 00000000..176aaaf7 --- /dev/null +++ b/src/test/fspp/fuse/openFile/testutils/FuseOpenTest.cpp @@ -0,0 +1,14 @@ +#include "FuseOpenTest.h" + +int FuseOpenTest::OpenFile(const char *filename, int flags) { + int fd = OpenFileAllowError(filename, flags); + EXPECT_GE(fd, 0); + return fd; +} + +int FuseOpenTest::OpenFileAllowError(const char *filename, int flags) { + auto fs = TestFS(); + + auto realpath = fs->mountDir() / filename; + return ::open(realpath.c_str(), flags); +} diff --git a/src/test/fspp/fuse/openFile/testutils/FuseOpenTest.h b/src/test/fspp/fuse/openFile/testutils/FuseOpenTest.h new file mode 100644 index 00000000..943e9650 --- /dev/null +++ b/src/test/fspp/fuse/openFile/testutils/FuseOpenTest.h @@ -0,0 +1,19 @@ +#pragma once +#ifndef TEST_FSPP_FUSE_OPENFILE_TESTUTILS_FUSEOPENTEST_H_ +#define TEST_FSPP_FUSE_OPENFILE_TESTUTILS_FUSEOPENTEST_H_ + +#include "test/testutils/FuseTest.h" + +class FuseOpenTest: public FuseTest { +public: + const char *FILENAME = "/myfile"; + + int OpenFile(const char *FILENAME, int flags); + int OpenFileAllowError(const char *FILENAME, int flags); +}; + +MATCHER_P(OpenFlagsEq, expectedFlags, "") { + return expectedFlags == (O_ACCMODE & arg); +} + +#endif diff --git a/src/test/testutils/FuseTest.h b/src/test/testutils/FuseTest.h index 9258bd22..9fd8d3e3 100644 --- a/src/test/testutils/FuseTest.h +++ b/src/test/testutils/FuseTest.h @@ -142,8 +142,4 @@ public: } }; -MATCHER_P(OpenFlagsEq, expectedFlags, "") { - return expectedFlags == (O_ACCMODE & arg); -} - #endif