Test cases for new utimens interface
This commit is contained in:
parent
a583ff6970
commit
9fcc54d8b1
@ -15,9 +15,9 @@ INSTANTIATE_TEST_CASE_P(FuseUtimensErrorTest, FuseUtimensErrorTest, Values(EACCE
|
|||||||
|
|
||||||
TEST_P(FuseUtimensErrorTest, ReturnedErrorIsCorrect) {
|
TEST_P(FuseUtimensErrorTest, ReturnedErrorIsCorrect) {
|
||||||
ReturnIsFileOnLstat(FILENAME);
|
ReturnIsFileOnLstat(FILENAME);
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq(FILENAME), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq(FILENAME), _, _))
|
||||||
.Times(1).WillOnce(Throw(FuseErrnoException(GetParam())));
|
.Times(1).WillOnce(Throw(FuseErrnoException(GetParam())));
|
||||||
|
|
||||||
int error = UtimensReturnError(FILENAME, TIMEVALUES);
|
int error = UtimensReturnError(FILENAME, TIMEVALUE, TIMEVALUE);
|
||||||
EXPECT_EQ(GetParam(), error);
|
EXPECT_EQ(GetParam(), error);
|
||||||
}
|
}
|
||||||
|
@ -9,54 +9,54 @@ class FuseUtimensFilenameTest: public FuseUtimensTest {
|
|||||||
|
|
||||||
TEST_F(FuseUtimensFilenameTest, UtimensFile) {
|
TEST_F(FuseUtimensFilenameTest, UtimensFile) {
|
||||||
ReturnIsFileOnLstat("/myfile");
|
ReturnIsFileOnLstat("/myfile");
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq("/myfile"), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq("/myfile"), _, _))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens("/myfile", TIMEVALUES);
|
Utimens("/myfile", TIMEVALUE, TIMEVALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FuseUtimensFilenameTest, UtimensFileNested) {
|
TEST_F(FuseUtimensFilenameTest, UtimensFileNested) {
|
||||||
ReturnIsDirOnLstat("/mydir");
|
ReturnIsDirOnLstat("/mydir");
|
||||||
ReturnIsFileOnLstat("/mydir/myfile");
|
ReturnIsFileOnLstat("/mydir/myfile");
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/myfile"), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/myfile"), _, _))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens("/mydir/myfile", TIMEVALUES);
|
Utimens("/mydir/myfile", TIMEVALUE, TIMEVALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FuseUtimensFilenameTest, UtimensFileNested2) {
|
TEST_F(FuseUtimensFilenameTest, UtimensFileNested2) {
|
||||||
ReturnIsDirOnLstat("/mydir");
|
ReturnIsDirOnLstat("/mydir");
|
||||||
ReturnIsDirOnLstat("/mydir/mydir2");
|
ReturnIsDirOnLstat("/mydir/mydir2");
|
||||||
ReturnIsFileOnLstat("/mydir/mydir2/myfile");
|
ReturnIsFileOnLstat("/mydir/mydir2/myfile");
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/mydir2/myfile"), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/mydir2/myfile"), _, _))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens("/mydir/mydir2/myfile", TIMEVALUES);
|
Utimens("/mydir/mydir2/myfile", TIMEVALUE, TIMEVALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FuseUtimensFilenameTest, UtimensDir) {
|
TEST_F(FuseUtimensFilenameTest, UtimensDir) {
|
||||||
ReturnIsDirOnLstat("/mydir");
|
ReturnIsDirOnLstat("/mydir");
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir"), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir"), _, _))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens("/mydir", TIMEVALUES);
|
Utimens("/mydir", TIMEVALUE, TIMEVALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FuseUtimensFilenameTest, UtimensDirNested) {
|
TEST_F(FuseUtimensFilenameTest, UtimensDirNested) {
|
||||||
ReturnIsDirOnLstat("/mydir");
|
ReturnIsDirOnLstat("/mydir");
|
||||||
ReturnIsDirOnLstat("/mydir/mydir2");
|
ReturnIsDirOnLstat("/mydir/mydir2");
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/mydir2"), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/mydir2"), _, _))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens("/mydir/mydir2", TIMEVALUES);
|
Utimens("/mydir/mydir2", TIMEVALUE, TIMEVALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FuseUtimensFilenameTest, UtimensDirNested2) {
|
TEST_F(FuseUtimensFilenameTest, UtimensDirNested2) {
|
||||||
ReturnIsDirOnLstat("/mydir");
|
ReturnIsDirOnLstat("/mydir");
|
||||||
ReturnIsDirOnLstat("/mydir/mydir2");
|
ReturnIsDirOnLstat("/mydir/mydir2");
|
||||||
ReturnIsDirOnLstat("/mydir/mydir2/mydir3");
|
ReturnIsDirOnLstat("/mydir/mydir2/mydir3");
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/mydir2/mydir3"), _))
|
EXPECT_CALL(fsimpl, utimens(StrEq("/mydir/mydir2/mydir3"), _, _))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens("/mydir/mydir2/mydir3", TIMEVALUES);
|
Utimens("/mydir/mydir2/mydir3", TIMEVALUE, TIMEVALUE);
|
||||||
}
|
}
|
||||||
|
@ -24,8 +24,8 @@ INSTANTIATE_TEST_CASE_P(FuseUtimensTimeParameterTest, FuseUtimensTimeParameterTe
|
|||||||
|
|
||||||
TEST_P(FuseUtimensTimeParameterTest, Utimens) {
|
TEST_P(FuseUtimensTimeParameterTest, Utimens) {
|
||||||
ReturnIsFileOnLstat(FILENAME);
|
ReturnIsFileOnLstat(FILENAME);
|
||||||
EXPECT_CALL(fsimpl, utimens(StrEq(FILENAME), TimeSpecEq(GetParam())))
|
EXPECT_CALL(fsimpl, utimens(StrEq(FILENAME), TimeSpecEq(GetParam()[0]), TimeSpecEq(GetParam()[1])))
|
||||||
.Times(1).WillOnce(Return());
|
.Times(1).WillOnce(Return());
|
||||||
|
|
||||||
Utimens(FILENAME, GetParam());
|
Utimens(FILENAME, GetParam()[0], GetParam()[1]);
|
||||||
}
|
}
|
||||||
|
@ -3,19 +3,19 @@
|
|||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
void FuseUtimensTest::Utimens(const char *filename, const timespec times[2]) {
|
void FuseUtimensTest::Utimens(const char *filename, timespec lastAccessTime, timespec lastModificationTime) {
|
||||||
int error = UtimensReturnError(filename, times);
|
int error = UtimensReturnError(filename, lastAccessTime, lastModificationTime);
|
||||||
EXPECT_EQ(0, error);
|
EXPECT_EQ(0, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
int FuseUtimensTest::UtimensReturnError(const char *filename, const timespec times[2]) {
|
int FuseUtimensTest::UtimensReturnError(const char *filename, timespec lastAccessTime, timespec lastModificationTime) {
|
||||||
auto fs = TestFS();
|
auto fs = TestFS();
|
||||||
|
|
||||||
auto realpath = fs->mountDir() / filename;
|
auto realpath = fs->mountDir() / filename;
|
||||||
|
|
||||||
struct timeval casted_times[2];
|
struct timeval casted_times[2];
|
||||||
TIMESPEC_TO_TIMEVAL(&casted_times[0], ×[0]);
|
TIMESPEC_TO_TIMEVAL(&casted_times[0], &lastAccessTime);
|
||||||
TIMESPEC_TO_TIMEVAL(&casted_times[1], ×[1]);
|
TIMESPEC_TO_TIMEVAL(&casted_times[1], &lastModificationTime);
|
||||||
int retval = ::utimes(realpath.c_str(), casted_times);
|
int retval = ::utimes(realpath.c_str(), casted_times);
|
||||||
if (0 == retval) {
|
if (0 == retval) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -7,17 +7,16 @@
|
|||||||
class FuseUtimensTest: public FuseTest {
|
class FuseUtimensTest: public FuseTest {
|
||||||
public:
|
public:
|
||||||
const char *FILENAME = "/myfile";
|
const char *FILENAME = "/myfile";
|
||||||
struct timespec TIMEVALUES[2] = {makeTimespec(0,0), makeTimespec(0,0)};
|
timespec TIMEVALUE = makeTimespec(0,0);
|
||||||
|
|
||||||
void Utimens(const char *filename, const timespec times[2]);
|
void Utimens(const char *filename, timespec lastAccessTime, timespec lastModificationTime);
|
||||||
int UtimensReturnError(const char *filename, const timespec times[2]);
|
int UtimensReturnError(const char *filename, timespec lastAccessTime, timespec lastModificationTime);
|
||||||
|
|
||||||
static struct timespec makeTimespec(time_t tv_sec, long tv_nsec);
|
static struct timespec makeTimespec(time_t tv_sec, long tv_nsec);
|
||||||
};
|
};
|
||||||
|
|
||||||
MATCHER_P(TimeSpecEq, expected, "") {
|
MATCHER_P(TimeSpecEq, expected, "") {
|
||||||
return expected[0].tv_sec == arg[0].tv_sec && expected[0].tv_nsec == arg[0].tv_nsec &&
|
return expected.tv_sec == arg.tv_sec && expected.tv_nsec == arg.tv_nsec;
|
||||||
expected[1].tv_sec == arg[1].tv_sec && expected[1].tv_nsec == arg[1].tv_nsec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,7 +36,7 @@ FuseTest::FuseTest(): fsimpl() {
|
|||||||
ON_CALL(fsimpl, unlink(_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, unlink(_)).WillByDefault(defaultAction);
|
||||||
ON_CALL(fsimpl, rename(_,_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, rename(_,_)).WillByDefault(defaultAction);
|
||||||
ON_CALL(fsimpl, readDir(_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, readDir(_)).WillByDefault(defaultAction);
|
||||||
ON_CALL(fsimpl, utimens(_,_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, utimens(_,_,_)).WillByDefault(defaultAction);
|
||||||
ON_CALL(fsimpl, statfs(_,_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, statfs(_,_)).WillByDefault(defaultAction);
|
||||||
ON_CALL(fsimpl, chmod(_,_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, chmod(_,_)).WillByDefault(defaultAction);
|
||||||
ON_CALL(fsimpl, chown(_,_,_)).WillByDefault(defaultAction);
|
ON_CALL(fsimpl, chown(_,_,_)).WillByDefault(defaultAction);
|
||||||
|
@ -68,10 +68,10 @@ public:
|
|||||||
return cpputils::nullcheck(std::unique_ptr<std::vector<fspp::Dir::Entry>>(readDir(path.c_str()))).value();
|
return cpputils::nullcheck(std::unique_ptr<std::vector<fspp::Dir::Entry>>(readDir(path.c_str()))).value();
|
||||||
}
|
}
|
||||||
MOCK_METHOD1(readDir, std::vector<fspp::Dir::Entry>*(const char*));
|
MOCK_METHOD1(readDir, std::vector<fspp::Dir::Entry>*(const char*));
|
||||||
void utimens(const boost::filesystem::path &path, const timespec ts[2]) override {
|
void utimens(const boost::filesystem::path &path, timespec lastAccessTime, timespec lastModificationTime) override {
|
||||||
return utimens(path.c_str(), ts);
|
return utimens(path.c_str(), lastAccessTime, lastModificationTime);
|
||||||
}
|
}
|
||||||
MOCK_METHOD2(utimens, void(const char*,const timespec[2]));
|
MOCK_METHOD3(utimens, void(const char*, timespec, timespec));
|
||||||
MOCK_PATH_METHOD2(statfs, void, struct statvfs*);
|
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 {
|
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);
|
return createSymlink(to.c_str(), from.c_str(), uid, gid);
|
||||||
|
Loading…
Reference in New Issue
Block a user