From 9de2d9d04a60fbd810703628ea4bfa5c11ed0fec Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Sat, 25 Apr 2015 03:26:59 +0200 Subject: [PATCH] - Use cpputils::DataBlockFixture and cpputils::Data. - Fix test cases --- biicode.conf | 1 - fstest/FsppFileTest.h | 4 - fstest/testutils/FileTest.h | 2 +- fuse/Filesystem.h | 6 ++ .../FuseCreateAndOpenErrorTest.cpp | 4 +- .../FuseCreateAndOpenFileDescriptorTest.cpp | 2 +- .../FuseCreateAndOpenFilenameTest.cpp | 6 +- .../FuseCreateAndOpenFlagsTest.cpp | 2 +- test/fuse/fstat/testutils/FuseFstatTest.cpp | 2 +- test/fuse/mkdir/FuseMkdirDirnameTest.cpp | 24 ++--- test/fuse/mkdir/FuseMkdirErrorTest.cpp | 4 +- test/fuse/mkdir/FuseMkdirModeTest.cpp | 2 +- test/fuse/mkdir/testutils/FuseMkdirTest.cpp | 4 +- test/fuse/mkdir/testutils/FuseMkdirTest.h | 2 +- test/fuse/read/FuseReadReturnedDataTest.cpp | 3 +- test/fuse/write/FuseWriteDataTest.cpp | 4 +- test/fuse/write/FuseWriteOverflowTest.cpp | 4 +- test/impl/FuseOpenFileListTest.cpp | 2 +- test/testutils/DataBlockFixture.cpp | 87 ------------------- test/testutils/DataBlockFixture.h | 47 ---------- test/testutils/FuseTest.cpp | 12 ++- test/testutils/FuseTest.h | 17 +++- 22 files changed, 65 insertions(+), 176 deletions(-) delete mode 100644 test/testutils/DataBlockFixture.cpp delete mode 100644 test/testutils/DataBlockFixture.h diff --git a/biicode.conf b/biicode.conf index 9859681c..64d1be6f 100644 --- a/biicode.conf +++ b/biicode.conf @@ -3,7 +3,6 @@ [requirements] google/gmock: 2 google/gtest: 11 - messmer/blockstore: 1 messmer/cmake: 3 messmer/cpp-utils: 2 messmer/tempfile: 4 diff --git a/fstest/FsppFileTest.h b/fstest/FsppFileTest.h index 20df9d9b..22055d04 100644 --- a/fstest/FsppFileTest.h +++ b/fstest/FsppFileTest.h @@ -6,10 +6,6 @@ #include "testutils/FileTest.h" -//TODO I don't really want a dependency fspp -> blockstore. I probably should take the blockstore::Data class -// (which is the only reason for the dependency here) and put it into a different package (cpp-utils?) -#include - template class FsppFileTest: public FileTest { public: diff --git a/fstest/testutils/FileTest.h b/fstest/testutils/FileTest.h index 1f0d99f9..d8660518 100644 --- a/fstest/testutils/FileTest.h +++ b/fstest/testutils/FileTest.h @@ -39,7 +39,7 @@ public: } void EXPECT_NUMBYTES_READABLE(uint64_t expectedSize, const fspp::OpenFile &file) { - blockstore::Data data(expectedSize); + cpputils::Data data(expectedSize); //Try to read one byte more than the expected size ssize_t readBytes = file.read(data.data(), expectedSize+1, 0); //and check that it only read the expected size (but also not less) diff --git a/fuse/Filesystem.h b/fuse/Filesystem.h index 2468530a..b9e6eb67 100644 --- a/fuse/Filesystem.h +++ b/fuse/Filesystem.h @@ -14,13 +14,16 @@ class Filesystem { public: virtual ~Filesystem() {} + //TODO Test uid/gid parameters of createAndOpenFile virtual int createAndOpenFile(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) = 0; virtual int openFile(const boost::filesystem::path &path, int flags) = 0; virtual void flush(int descriptor) = 0; virtual void closeFile(int descriptor) = 0; virtual void lstat(const boost::filesystem::path &path, struct ::stat *stbuf) = 0; virtual void fstat(int descriptor, struct ::stat *stbuf) = 0; + //TODO Test chmod virtual void chmod(const boost::filesystem::path &path, mode_t mode) = 0; + //TODO Test chown virtual void chown(const boost::filesystem::path &path, uid_t uid, gid_t gid) = 0; virtual void truncate(const boost::filesystem::path &path, off_t size) = 0; virtual void ftruncate(int descriptor, off_t size) = 0; @@ -29,6 +32,7 @@ public: virtual void fsync(int descriptor) = 0; virtual void fdatasync(int descriptor) = 0; virtual void access(const boost::filesystem::path &path, int mask) = 0; + //TODO Test uid/gid parameters of mkdir virtual void mkdir(const boost::filesystem::path &path, mode_t mode, uid_t uid, gid_t gid) = 0; virtual void rmdir(const boost::filesystem::path &path) = 0; virtual void unlink(const boost::filesystem::path &path) = 0; @@ -37,7 +41,9 @@ public: virtual void statfs(const boost::filesystem::path &path, struct statvfs *fsstat) = 0; //TODO We shouldn't use Dir::Entry here, that's in another layer virtual std::unique_ptr> readDir(const boost::filesystem::path &path) = 0; + //TODO Test createSymlink virtual void createSymlink(const boost::filesystem::path &to, const boost::filesystem::path &from, uid_t uid, gid_t gid) = 0; + //TODO Test readSymlink virtual void readSymlink(const boost::filesystem::path &path, char *buf, size_t size) = 0; }; diff --git a/test/fuse/createAndOpenFile/FuseCreateAndOpenErrorTest.cpp b/test/fuse/createAndOpenFile/FuseCreateAndOpenErrorTest.cpp index 1d9f1b92..1711ad6c 100644 --- a/test/fuse/createAndOpenFile/FuseCreateAndOpenErrorTest.cpp +++ b/test/fuse/createAndOpenFile/FuseCreateAndOpenErrorTest.cpp @@ -17,7 +17,7 @@ INSTANTIATE_TEST_CASE_P(FuseCreateAndOpenErrorTest, FuseCreateAndOpenErrorTest, TEST_F(FuseCreateAndOpenErrorTest, ReturnNoError) { ReturnDoesntExistOnLstat(FILENAME); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), _)).Times(1).WillOnce(Return(1)); + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), _, _, _)).Times(1).WillOnce(Return(1)); //For the syscall to succeed, we also need to give an fstat implementation. ReturnIsFileOnFstat(1); @@ -27,7 +27,7 @@ TEST_F(FuseCreateAndOpenErrorTest, ReturnNoError) { TEST_P(FuseCreateAndOpenErrorTest, ReturnError) { ReturnDoesntExistOnLstat(FILENAME); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), _)).Times(1).WillOnce(Throw(FuseErrnoException(GetParam()))); + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), _, _, _)).Times(1).WillOnce(Throw(FuseErrnoException(GetParam()))); int error = CreateAndOpenFileReturnError(FILENAME, O_RDONLY); EXPECT_EQ(GetParam(), error); diff --git a/test/fuse/createAndOpenFile/FuseCreateAndOpenFileDescriptorTest.cpp b/test/fuse/createAndOpenFile/FuseCreateAndOpenFileDescriptorTest.cpp index 32b49dc9..5f642929 100644 --- a/test/fuse/createAndOpenFile/FuseCreateAndOpenFileDescriptorTest.cpp +++ b/test/fuse/createAndOpenFile/FuseCreateAndOpenFileDescriptorTest.cpp @@ -31,7 +31,7 @@ INSTANTIATE_TEST_CASE_P(FuseCreateAndOpenFileDescriptorTest, FuseCreateAndOpenFi TEST_P(FuseCreateAndOpenFileDescriptorTest, TestReturnedFileDescriptor) { ReturnDoesntExistOnLstat(FILENAME); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), _)) + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), _, _, _)) .Times(1).WillOnce(Return(GetParam())); EXPECT_CALL(fsimpl, read(GetParam(), _, _, _)).Times(1).WillOnce(Return(0)); //For the syscall to succeed, we also need to give an fstat implementation. diff --git a/test/fuse/createAndOpenFile/FuseCreateAndOpenFilenameTest.cpp b/test/fuse/createAndOpenFile/FuseCreateAndOpenFilenameTest.cpp index 545d682a..a9e3a900 100644 --- a/test/fuse/createAndOpenFile/FuseCreateAndOpenFilenameTest.cpp +++ b/test/fuse/createAndOpenFile/FuseCreateAndOpenFilenameTest.cpp @@ -10,7 +10,7 @@ public: TEST_F(FuseCreateAndOpenFilenameTest, CreateAndOpenFile) { ReturnDoesntExistOnLstat("/myfile"); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq("/myfile"), _)) + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq("/myfile"), _, _, _)) .Times(1).WillOnce(Return(0)); //For the syscall to succeed, we also need to give an fstat implementation. ReturnIsFileOnFstat(0); @@ -21,7 +21,7 @@ TEST_F(FuseCreateAndOpenFilenameTest, CreateAndOpenFile) { TEST_F(FuseCreateAndOpenFilenameTest, CreateAndOpenFileNested) { ReturnIsDirOnLstat("/mydir"); ReturnDoesntExistOnLstat("/mydir/myfile"); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq("/mydir/myfile"), _)) + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq("/mydir/myfile"), _, _, _)) .Times(1).WillOnce(Return(0)); //For the syscall to succeed, we also need to give an fstat implementation. ReturnIsFileOnFstat(0); @@ -33,7 +33,7 @@ TEST_F(FuseCreateAndOpenFilenameTest, CreateAndOpenFileNested2) { ReturnIsDirOnLstat("/mydir"); ReturnIsDirOnLstat("/mydir/mydir2"); ReturnDoesntExistOnLstat("/mydir/mydir2/myfile"); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq("/mydir/mydir2/myfile"), _)) + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq("/mydir/mydir2/myfile"), _, _, _)) .Times(1).WillOnce(Return(0)); //For the syscall to succeed, we also need to give an fstat implementation. ReturnIsFileOnFstat(0); diff --git a/test/fuse/createAndOpenFile/FuseCreateAndOpenFlagsTest.cpp b/test/fuse/createAndOpenFile/FuseCreateAndOpenFlagsTest.cpp index 3ba80def..b351c126 100644 --- a/test/fuse/createAndOpenFile/FuseCreateAndOpenFlagsTest.cpp +++ b/test/fuse/createAndOpenFile/FuseCreateAndOpenFlagsTest.cpp @@ -13,7 +13,7 @@ INSTANTIATE_TEST_CASE_P(FuseCreateAndOpenFlagsTest, FuseCreateAndOpenFlagsTest, //TODO Disabled because it doesn't seem to work. Fuse doesn't seem to pass flags to create(). Why? TEST_P(FuseCreateAndOpenFlagsTest, DISABLED_testFlags) { ReturnDoesntExistOnLstat(FILENAME); - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), OpenFlagsEq(GetParam()))) + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(FILENAME), OpenFlagsEq(GetParam()), _, _)) .Times(1).WillOnce(Return(0)); //For the syscall to succeed, we also need to give an fstat implementation. ReturnIsFileOnFstat(0); diff --git a/test/fuse/fstat/testutils/FuseFstatTest.cpp b/test/fuse/fstat/testutils/FuseFstatTest.cpp index 0953e26b..58e8ae26 100644 --- a/test/fuse/fstat/testutils/FuseFstatTest.cpp +++ b/test/fuse/fstat/testutils/FuseFstatTest.cpp @@ -30,5 +30,5 @@ int FuseFstatTest::CreateFileAllowErrors(const TempTestFS *fs, const std::string } void FuseFstatTest::OnCreateAndOpenReturnFileDescriptor(const char *filename, int descriptor) { - EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(filename), _)).Times(1).WillOnce(Return(descriptor)); + EXPECT_CALL(fsimpl, createAndOpenFile(StrEq(filename), _, _, _)).Times(1).WillOnce(Return(descriptor)); } diff --git a/test/fuse/mkdir/FuseMkdirDirnameTest.cpp b/test/fuse/mkdir/FuseMkdirDirnameTest.cpp index 0f3b9ee7..8dd3887b 100644 --- a/test/fuse/mkdir/FuseMkdirDirnameTest.cpp +++ b/test/fuse/mkdir/FuseMkdirDirnameTest.cpp @@ -11,10 +11,10 @@ class FuseMkdirDirnameTest: public FuseMkdirTest { TEST_F(FuseMkdirDirnameTest, Mkdir) { ReturnDoesntExistOnLstat("/mydir"); - EXPECT_CALL(fsimpl, mkdir(StrEq("/mydir"), _)) - // After mkdir was called, lstat should return that it is a dir. - // This is needed to make the ::mkdir() syscall pass. - .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); + EXPECT_CALL(fsimpl, mkdir(StrEq("/mydir"), _, _, _)) + // After mkdir was called, lstat should return that it is a dir. + // This is needed to make the ::mkdir() syscall pass. + .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); Mkdir("/mydir", 0); } @@ -22,10 +22,10 @@ TEST_F(FuseMkdirDirnameTest, Mkdir) { TEST_F(FuseMkdirDirnameTest, MkdirNested) { ReturnIsDirOnLstat("/mydir"); ReturnDoesntExistOnLstat("/mydir/mysubdir"); - EXPECT_CALL(fsimpl, mkdir(StrEq("/mydir/mysubdir"), _)) - // After mkdir was called, lstat should return that it is a dir. - // This is needed to make the ::mkdir() syscall pass. - .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); + EXPECT_CALL(fsimpl, mkdir(StrEq("/mydir/mysubdir"), _, _, _)) + // After mkdir was called, lstat should return that it is a dir. + // This is needed to make the ::mkdir() syscall pass. + .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); Mkdir("/mydir/mysubdir", 0); } @@ -34,10 +34,10 @@ TEST_F(FuseMkdirDirnameTest, MkdirNested2) { ReturnIsDirOnLstat("/mydir"); ReturnIsDirOnLstat("/mydir/mydir2"); ReturnDoesntExistOnLstat("/mydir/mydir2/mydir3"); - EXPECT_CALL(fsimpl, mkdir(StrEq("/mydir/mydir2/mydir3"), _)) - // After mkdir was called, lstat should return that it is a dir. - // This is needed to make the ::mkdir() syscall pass. - .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); + EXPECT_CALL(fsimpl, mkdir(StrEq("/mydir/mydir2/mydir3"), _, _, _)) + // After mkdir was called, lstat should return that it is a dir. + // This is needed to make the ::mkdir() syscall pass. + .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); Mkdir("/mydir/mydir2/mydir3", 0); } diff --git a/test/fuse/mkdir/FuseMkdirErrorTest.cpp b/test/fuse/mkdir/FuseMkdirErrorTest.cpp index 2effcf1a..cc9af14e 100644 --- a/test/fuse/mkdir/FuseMkdirErrorTest.cpp +++ b/test/fuse/mkdir/FuseMkdirErrorTest.cpp @@ -16,7 +16,7 @@ INSTANTIATE_TEST_CASE_P(FuseMkdirErrorTest, FuseMkdirErrorTest, Values(EACCES, E TEST_F(FuseMkdirErrorTest, NoError) { ReturnDoesntExistOnLstat(DIRNAME); - EXPECT_CALL(fsimpl, mkdir(StrEq(DIRNAME), _)) + EXPECT_CALL(fsimpl, mkdir(StrEq(DIRNAME), _, _, _)) .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); int error = MkdirReturnError(DIRNAME, 0); @@ -25,7 +25,7 @@ TEST_F(FuseMkdirErrorTest, NoError) { TEST_P(FuseMkdirErrorTest, ReturnedErrorIsCorrect) { ReturnDoesntExistOnLstat(DIRNAME); - EXPECT_CALL(fsimpl, mkdir(StrEq(DIRNAME), _)) + EXPECT_CALL(fsimpl, mkdir(StrEq(DIRNAME), _, _, _)) .Times(1).WillOnce(Throw(FuseErrnoException(GetParam()))); int error = MkdirReturnError(DIRNAME, 0); diff --git a/test/fuse/mkdir/FuseMkdirModeTest.cpp b/test/fuse/mkdir/FuseMkdirModeTest.cpp index 22f4dae6..ec4fa36f 100644 --- a/test/fuse/mkdir/FuseMkdirModeTest.cpp +++ b/test/fuse/mkdir/FuseMkdirModeTest.cpp @@ -13,7 +13,7 @@ INSTANTIATE_TEST_CASE_P(FuseMkdirModeTest, FuseMkdirModeTest, Values(0, S_IRUSR, TEST_P(FuseMkdirModeTest, Mkdir) { ReturnDoesntExistOnLstat(DIRNAME); - EXPECT_CALL(fsimpl, mkdir(StrEq(DIRNAME), GetParam())) + EXPECT_CALL(fsimpl, mkdir(StrEq(DIRNAME), GetParam(), _, _)) .Times(1).WillOnce(FromNowOnReturnIsDirOnLstat()); Mkdir(DIRNAME, GetParam()); diff --git a/test/fuse/mkdir/testutils/FuseMkdirTest.cpp b/test/fuse/mkdir/testutils/FuseMkdirTest.cpp index 0c279d16..05142ec6 100644 --- a/test/fuse/mkdir/testutils/FuseMkdirTest.cpp +++ b/test/fuse/mkdir/testutils/FuseMkdirTest.cpp @@ -20,8 +20,8 @@ int FuseMkdirTest::MkdirReturnError(const char *dirname, mode_t mode) { } } -Action FuseMkdirTest::FromNowOnReturnIsDirOnLstat() { - return Invoke([this](const char *dirname, mode_t) { +Action FuseMkdirTest::FromNowOnReturnIsDirOnLstat() { + return Invoke([this](const char *dirname, mode_t, uid_t, gid_t) { ReturnIsDirOnLstat(dirname); }); } diff --git a/test/fuse/mkdir/testutils/FuseMkdirTest.h b/test/fuse/mkdir/testutils/FuseMkdirTest.h index 4632f25c..06db44de 100644 --- a/test/fuse/mkdir/testutils/FuseMkdirTest.h +++ b/test/fuse/mkdir/testutils/FuseMkdirTest.h @@ -11,7 +11,7 @@ public: void Mkdir(const char *dirname, mode_t mode); int MkdirReturnError(const char *dirname, mode_t mode); - ::testing::Action FromNowOnReturnIsDirOnLstat(); + ::testing::Action FromNowOnReturnIsDirOnLstat(); }; #endif diff --git a/test/fuse/read/FuseReadReturnedDataTest.cpp b/test/fuse/read/FuseReadReturnedDataTest.cpp index a4aa8895..2b853f29 100644 --- a/test/fuse/read/FuseReadReturnedDataTest.cpp +++ b/test/fuse/read/FuseReadReturnedDataTest.cpp @@ -1,4 +1,4 @@ -#include "../../testutils/DataBlockFixture.h" +#include #include "testutils/FuseReadTest.h" #include "../../../fuse/FuseErrnoException.h" @@ -21,6 +21,7 @@ using std::get; using std::min; using std::unique_ptr; using std::make_unique; +using cpputils::DataBlockFixture; using namespace fspp::fuse; diff --git a/test/fuse/write/FuseWriteDataTest.cpp b/test/fuse/write/FuseWriteDataTest.cpp index e1d33c2e..9ce0dd5e 100644 --- a/test/fuse/write/FuseWriteDataTest.cpp +++ b/test/fuse/write/FuseWriteDataTest.cpp @@ -1,4 +1,4 @@ -#include "../../testutils/DataBlockFixture.h" +#include #include "testutils/FuseWriteTest.h" #include "../../../fuse/FuseErrnoException.h" @@ -21,6 +21,8 @@ using std::get; using std::min; using std::unique_ptr; using std::make_unique; +using cpputils::DataBlockFixture; +using cpputils::DataBlockFixtureWriteable; using namespace fspp::fuse; diff --git a/test/fuse/write/FuseWriteOverflowTest.cpp b/test/fuse/write/FuseWriteOverflowTest.cpp index 7ea10a24..a7b2f0dc 100644 --- a/test/fuse/write/FuseWriteOverflowTest.cpp +++ b/test/fuse/write/FuseWriteOverflowTest.cpp @@ -1,4 +1,4 @@ -#include "../../testutils/DataBlockFixture.h" +#include #include "testutils/FuseWriteTest.h" #include "../../../fuse/FuseErrnoException.h" @@ -11,6 +11,8 @@ using ::testing::Invoke; using ::testing::Action; using std::min; +using cpputils::DataBlockFixture; +using cpputils::DataBlockFixtureWriteable; using namespace fspp::fuse; diff --git a/test/impl/FuseOpenFileListTest.cpp b/test/impl/FuseOpenFileListTest.cpp index 9fe797e7..8b783820 100644 --- a/test/impl/FuseOpenFileListTest.cpp +++ b/test/impl/FuseOpenFileListTest.cpp @@ -20,7 +20,7 @@ public: MOCK_CONST_METHOD1(stat, void(struct ::stat*)); MOCK_CONST_METHOD1(truncate, void(off_t)); - MOCK_METHOD3(read, ssize_t(void*, size_t, off_t)); + MOCK_CONST_METHOD3(read, ssize_t(void*, size_t, off_t)); MOCK_METHOD3(write, void(const void*, size_t, off_t)); MOCK_METHOD0(flush, void()); MOCK_METHOD0(fsync, void()); diff --git a/test/testutils/DataBlockFixture.cpp b/test/testutils/DataBlockFixture.cpp deleted file mode 100644 index 252015b2..00000000 --- a/test/testutils/DataBlockFixture.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include "DataBlockFixture.h" -#include -#include - -using std::min; - -DataBlockFixture::DataBlockFixture(size_t size, long long int IV): _fileData(new char[size]), _size(size) { - fillFileWithRandomData(IV); -} - -DataBlockFixture::~DataBlockFixture() { - delete[] _fileData; -} - -void DataBlockFixture::fillFileWithRandomData(long long int IV) { - long long int val = IV; - for(size_t i=0; i<_size/sizeof(long long int); ++i) { - //MMIX linear congruential generator - val *= 6364136223846793005L; - val += 1442695040888963407; - reinterpret_cast(_fileData)[i] = val; - } - uint64_t alreadyWritten = (_size/sizeof(long long int))*sizeof(long long int); - val *= 6364136223846793005L; - val += 1442695040888963407; - char *remainingBytes = reinterpret_cast(&val); - //Fill remaining bytes - for(size_t i=0; i<_size-alreadyWritten; ++i) { - reinterpret_cast(_fileData)[alreadyWritten + i] = remainingBytes[i]; - } -} - -const char *DataBlockFixture::data() const { - return _fileData; -} - -int DataBlockFixture::read(void *buf, size_t count, off_t offset) { - size_t realCount = min(count, _size - offset); - memcpy(buf, _fileData+offset, realCount); - return realCount; -} - -size_t DataBlockFixture::size() const { - return _size; -} - -bool DataBlockFixture::fileContentEqual(const char *content, size_t count, off_t offset) { - return 0 == memcmp(content, _fileData + offset, count); -} - -DataBlockFixtureWriteable::DataBlockFixtureWriteable(size_t size, long long int IV) - :DataBlockFixture(size, IV), _originalSize(size) { - _originalFileData = new char[size]; - memcpy(_originalFileData, _fileData, size); -} - -DataBlockFixtureWriteable::~DataBlockFixtureWriteable() { - delete[] _originalFileData; -} - -void DataBlockFixtureWriteable::write(const void *buf, size_t count, off_t offset) { - extendFileSizeIfNecessary(count + offset); - - memcpy(_fileData+offset, buf, count); -} - -void DataBlockFixtureWriteable::extendFileSizeIfNecessary(size_t size) { - if (size > _size) { - extendFileSize(size); - } -} - -void DataBlockFixtureWriteable::extendFileSize(size_t size) { - char *newfile = new char[size]; - memcpy(newfile, _fileData, _size); - delete[] _fileData; - _fileData = newfile; - _size = size; -} - -bool DataBlockFixtureWriteable::sizeUnchanged() { - return _size == _originalSize; -} - -bool DataBlockFixtureWriteable::regionUnchanged(off_t offset, size_t count) { - return 0 == memcmp(_fileData+offset, _originalFileData+offset, count); -} diff --git a/test/testutils/DataBlockFixture.h b/test/testutils/DataBlockFixture.h deleted file mode 100644 index 73d763d9..00000000 --- a/test/testutils/DataBlockFixture.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -#ifndef TEST_TESTUTILS_DATABLOCKFIXTURE_H_ -#define TEST_TESTUTILS_DATABLOCKFIXTURE_H_ - -#include - -class DataBlockFixture { -public: - DataBlockFixture(size_t size, long long int IV = 1); - virtual ~DataBlockFixture(); - - int read(void *buf, size_t count, off_t offset); - - // Return true, iff the given data is equal to the data of the file at the given offset. - bool fileContentEqual(const char *content, size_t count, off_t offset); - - const char *data() const; - - size_t size() const; - -protected: - char *_fileData; - size_t _size; - -private: - void fillFileWithRandomData(long long int IV); -}; - -class DataBlockFixtureWriteable: public DataBlockFixture { -public: - DataBlockFixtureWriteable(size_t size, long long int IV = 1); - virtual ~DataBlockFixtureWriteable(); - - void write(const void *buf, size_t count, off_t offset); - - bool sizeUnchanged(); - bool regionUnchanged(off_t offset, size_t count); - -private: - void extendFileSizeIfNecessary(size_t size); - void extendFileSize(size_t size); - - char *_originalFileData; - size_t _originalSize; -}; - -#endif diff --git a/test/testutils/FuseTest.cpp b/test/testutils/FuseTest.cpp index d932e52f..85b09329 100644 --- a/test/testutils/FuseTest.cpp +++ b/test/testutils/FuseTest.cpp @@ -30,14 +30,18 @@ FuseTest::FuseTest(): fsimpl() { ON_CALL(fsimpl, fsync(_)).WillByDefault(defaultAction); ON_CALL(fsimpl, fdatasync(_)).WillByDefault(defaultAction); ON_CALL(fsimpl, access(_,_)).WillByDefault(defaultAction); - ON_CALL(fsimpl, createAndOpenFile(_,_)).WillByDefault(defaultAction); - ON_CALL(fsimpl, mkdir(_, _)).WillByDefault(defaultAction); + ON_CALL(fsimpl, createAndOpenFile(_,_,_,_)).WillByDefault(defaultAction); + ON_CALL(fsimpl, mkdir(_,_,_,_)).WillByDefault(defaultAction); ON_CALL(fsimpl, rmdir(_)).WillByDefault(defaultAction); ON_CALL(fsimpl, unlink(_)).WillByDefault(defaultAction); ON_CALL(fsimpl, rename(_,_)).WillByDefault(defaultAction); ON_CALL(fsimpl, readDir(_)).WillByDefault(defaultAction); - ON_CALL(fsimpl, utimens(_, _)).WillByDefault(defaultAction); - ON_CALL(fsimpl, statfs(_, _)).WillByDefault(defaultAction); + ON_CALL(fsimpl, utimens(_,_)).WillByDefault(defaultAction); + ON_CALL(fsimpl, statfs(_,_)).WillByDefault(defaultAction); + ON_CALL(fsimpl, chmod(_,_)).WillByDefault(defaultAction); + ON_CALL(fsimpl, chown(_,_,_)).WillByDefault(defaultAction); + ON_CALL(fsimpl, createSymlink(_,_,_,_)).WillByDefault(defaultAction); + ON_CALL(fsimpl, readSymlink(_,_,_)).WillByDefault(defaultAction); } unique_ptr FuseTest::TestFS() { diff --git a/test/testutils/FuseTest.h b/test/testutils/FuseTest.h index d89e2266..836328de 100644 --- a/test/testutils/FuseTest.h +++ b/test/testutils/FuseTest.h @@ -27,6 +27,12 @@ } \ MOCK_METHOD2(NAME, RETURNTYPE(const char*, PARAM1)); \ +#define MOCK_PATH_METHOD3(NAME, RETURNTYPE, PARAM1, PARAM2) \ + RETURNTYPE NAME(const boost::filesystem::path &path, PARAM1 p1, PARAM2 p2) override { \ + return NAME(path.c_str(), p1, p2); \ + } \ + MOCK_METHOD3(NAME, RETURNTYPE(const char*, PARAM1, PARAM2)); \ + #define MOCK_PATH_METHOD4(NAME, RETURNTYPE, PARAM1, PARAM2, PARAM3) \ RETURNTYPE NAME(const boost::filesystem::path &path, PARAM1 p1, PARAM2 p2, PARAM3 p3) override { \ return NAME(path.c_str(), p1, p2, p3); \ @@ -50,8 +56,8 @@ public: MOCK_METHOD1(fsync, void(int)); MOCK_METHOD1(fdatasync, void(int)); MOCK_PATH_METHOD2(access, void, int); - MOCK_PATH_METHOD2(createAndOpenFile, int, mode_t); - MOCK_PATH_METHOD2(mkdir, void, mode_t); + MOCK_PATH_METHOD4(createAndOpenFile, int, mode_t, uid_t, gid_t); + MOCK_PATH_METHOD4(mkdir, void, mode_t, uid_t, gid_t); MOCK_PATH_METHOD1(rmdir, void); MOCK_PATH_METHOD1(unlink, void); void rename(const boost::filesystem::path &from, const boost::filesystem::path &to) override { @@ -67,6 +73,13 @@ public: } MOCK_METHOD2(utimens, void(const char*,const timespec[2])); MOCK_PATH_METHOD2(statfs, void, struct statvfs*); + void createSymlink(const boost::filesystem::path &to, const boost::filesystem::path &from, uid_t uid, gid_t gid) override { + return createSymlink(to.c_str(), from.c_str(), uid, gid); + } + MOCK_PATH_METHOD2(chmod, void, mode_t); + MOCK_PATH_METHOD3(chown, void, uid_t, gid_t); + MOCK_METHOD4(createSymlink, void(const char*, const char*, uid_t, gid_t)); + MOCK_PATH_METHOD3(readSymlink, void, char*, size_t); }; class FuseTest: public ::testing::Test {