From e4382ab2ed8be52b481f007d331e72421d18877f Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Tue, 25 Nov 2014 18:54:33 +0100 Subject: [PATCH] Test cases for ftruncate --- .../fuse/ftruncate/FuseFTruncateErrorTest.cpp | 30 +++++++++++++++++++ .../FuseFTruncateFileDescriptorTest.cpp | 29 ++++++++++++++++++ .../fuse/ftruncate/FuseFTruncateSizeTest.cpp | 27 +++++++++++++++++ .../ftruncate/testutils/FuseFTruncateTest.cpp | 20 +++++++++++++ .../ftruncate/testutils/FuseFTruncateTest.h | 18 +++++++++++ .../fuse/truncate/FuseTruncateErrorTest.cpp | 6 ++-- 6 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/test/fspp/fuse/ftruncate/FuseFTruncateErrorTest.cpp create mode 100644 src/test/fspp/fuse/ftruncate/FuseFTruncateFileDescriptorTest.cpp create mode 100644 src/test/fspp/fuse/ftruncate/FuseFTruncateSizeTest.cpp create mode 100644 src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.cpp create mode 100644 src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.h diff --git a/src/test/fspp/fuse/ftruncate/FuseFTruncateErrorTest.cpp b/src/test/fspp/fuse/ftruncate/FuseFTruncateErrorTest.cpp new file mode 100644 index 00000000..c1793370 --- /dev/null +++ b/src/test/fspp/fuse/ftruncate/FuseFTruncateErrorTest.cpp @@ -0,0 +1,30 @@ +#include "testutils/FuseFTruncateTest.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" + +#include "fspp/impl/FuseErrnoException.h" + +using ::testing::_; +using ::testing::StrEq; +using ::testing::Throw; +using ::testing::WithParamInterface; +using ::testing::Values; + +using namespace fspp; + +class FuseFTruncateErrorTest: public FuseFTruncateTest, public WithParamInterface { +}; +INSTANTIATE_TEST_CASE_P(FuseFTruncateErrorTest, FuseFTruncateErrorTest, Values(EACCES, EFAULT, EFBIG, EINTR, EINVAL, EIO, EISDIR, ELOOP, ENAMETOOLONG, ENOENT, ENOTDIR, EPERM, EROFS, ETXTBSY, EBADF)); + +TEST_P(FuseFTruncateErrorTest, ReturnedErrorIsCorrect) { + ReturnIsFileOnLstat(FILENAME); + OnOpenReturnFileDescriptor(FILENAME, 0); + EXPECT_CALL(fsimpl, ftruncate(0, GetParam())) + .Times(1).WillOnce(Throw(FuseErrnoException(GetParam()))); + //Needed to make ::ftruncate system call return successfully + ReturnIsFileOnFstat(0); + + int retval = FTruncateFileAllowError(FILENAME, GetParam()); + EXPECT_EQ(GetParam(), errno); + EXPECT_EQ(-1, retval); +} diff --git a/src/test/fspp/fuse/ftruncate/FuseFTruncateFileDescriptorTest.cpp b/src/test/fspp/fuse/ftruncate/FuseFTruncateFileDescriptorTest.cpp new file mode 100644 index 00000000..a1190b95 --- /dev/null +++ b/src/test/fspp/fuse/ftruncate/FuseFTruncateFileDescriptorTest.cpp @@ -0,0 +1,29 @@ +#include "testutils/FuseFTruncateTest.h" + +#include "fspp/impl/FuseErrnoException.h" + +using ::testing::_; +using ::testing::StrEq; +using ::testing::WithParamInterface; +using ::testing::Values; +using ::testing::Eq; +using ::testing::Return; +using ::testing::Throw; + +using namespace fspp; + +class FuseFTruncateFileDescriptorTest: public FuseFTruncateTest, public WithParamInterface { +}; +INSTANTIATE_TEST_CASE_P(FuseFTruncateFileDescriptorTest, FuseFTruncateFileDescriptorTest, Values(0,1,10,1000,1024*1024*1024)); + + +TEST_P(FuseFTruncateFileDescriptorTest, FileDescriptorIsCorrect) { + ReturnIsFileOnLstat(FILENAME); + OnOpenReturnFileDescriptor(FILENAME, GetParam()); + EXPECT_CALL(fsimpl, ftruncate(Eq(GetParam()), _)) + .Times(1).WillOnce(Return()); + //Needed to make ::ftruncate system call return successfully + ReturnIsFileOnFstat(GetParam()); + + FTruncateFile(FILENAME, GetParam()); +} diff --git a/src/test/fspp/fuse/ftruncate/FuseFTruncateSizeTest.cpp b/src/test/fspp/fuse/ftruncate/FuseFTruncateSizeTest.cpp new file mode 100644 index 00000000..4015dc89 --- /dev/null +++ b/src/test/fspp/fuse/ftruncate/FuseFTruncateSizeTest.cpp @@ -0,0 +1,27 @@ +#include "testutils/FuseFTruncateTest.h" +#include "gtest/gtest.h" +#include "gmock/gmock.h" + + +using ::testing::_; +using ::testing::StrEq; +using ::testing::Eq; +using ::testing::Return; +using ::testing::WithParamInterface; +using ::testing::Values; + +class FuseFTruncateSizeTest: public FuseFTruncateTest, public WithParamInterface { +}; +INSTANTIATE_TEST_CASE_P(FuseFTruncateSizeTest, FuseFTruncateSizeTest, Values(0, 1, 10, 1024, 1024*1024*1024)); + + +TEST_P(FuseFTruncateSizeTest, FTruncateFile) { + ReturnIsFileOnLstat(FILENAME); + OnOpenReturnFileDescriptor(FILENAME, 0); + EXPECT_CALL(fsimpl, ftruncate(Eq(0), GetParam())) + .Times(1).WillOnce(Return()); + //Needed to make ::ftruncate system call return successfully + ReturnIsFileOnFstat(0); + + FTruncateFile(FILENAME, GetParam()); +} diff --git a/src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.cpp b/src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.cpp new file mode 100644 index 00000000..36178401 --- /dev/null +++ b/src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.cpp @@ -0,0 +1,20 @@ +#include "FuseFTruncateTest.h" + +void FuseFTruncateTest::FTruncateFile(const char *filename, off_t size) { + int retval = FTruncateFileAllowError(filename, size); + EXPECT_EQ(0, retval); +} + +int FuseFTruncateTest::FTruncateFileAllowError(const char *filename, off_t size) { + auto fs = TestFS(); + + int fd = OpenFile(fs.get(), filename); + return ::ftruncate(fd, size); +} + +int FuseFTruncateTest::OpenFile(const TempTestFS *fs, const char *filename) { + auto realpath = fs->mountDir() / filename; + int fd = ::open(realpath.c_str(), O_RDWR); + EXPECT_GE(fd, 0) << "Error opening file"; + return fd; +} diff --git a/src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.h b/src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.h new file mode 100644 index 00000000..b27cec5c --- /dev/null +++ b/src/test/fspp/fuse/ftruncate/testutils/FuseFTruncateTest.h @@ -0,0 +1,18 @@ +#pragma once +#ifndef TEST_FSPP_FUSE_FTRUNCATE_TESTUTILS_FUSEFTRUNCATETEST_H_ +#define TEST_FSPP_FUSE_FTRUNCATE_TESTUTILS_FUSEFTRUNCATETEST_H_ + +#include "test/testutils/FuseTest.h" + +class FuseFTruncateTest: public FuseTest { +public: + const char *FILENAME = "/myfile"; + + void FTruncateFile(const char *filename, off_t size); + int FTruncateFileAllowError(const char *filename, off_t size); + +private: + int OpenFile(const TempTestFS *fs, const char *filename); +}; + +#endif diff --git a/src/test/fspp/fuse/truncate/FuseTruncateErrorTest.cpp b/src/test/fspp/fuse/truncate/FuseTruncateErrorTest.cpp index eaf53f0d..976b98b2 100644 --- a/src/test/fspp/fuse/truncate/FuseTruncateErrorTest.cpp +++ b/src/test/fspp/fuse/truncate/FuseTruncateErrorTest.cpp @@ -16,12 +16,12 @@ class FuseTruncateErrorTest: public FuseTruncateTest, public WithParamInterface< }; INSTANTIATE_TEST_CASE_P(FuseTruncateErrorTest, FuseTruncateErrorTest, Values(EACCES, EFAULT, EFBIG, EINTR, EINVAL, EIO, EISDIR, ELOOP, ENAMETOOLONG, ENOENT, ENOTDIR, EPERM, EROFS, ETXTBSY)); -TEST_P(FuseTruncateErrorTest, TruncateFile) { +TEST_P(FuseTruncateErrorTest, ReturnedErrorIsCorrect) { ReturnIsFileOnLstat(FILENAME); EXPECT_CALL(fsimpl, truncate(StrEq(FILENAME), _)) .Times(1).WillOnce(Throw(FuseErrnoException(GetParam()))); - int fd = TruncateFileAllowError(FILENAME, 0); + int retval = TruncateFileAllowError(FILENAME, 0); EXPECT_EQ(GetParam(), errno); - EXPECT_EQ(-1, fd); + EXPECT_EQ(-1, retval); }