Make TimestampTestUtils generic

This commit is contained in:
Sebastian Messmer 2016-06-07 13:07:22 -07:00
parent 354f72443e
commit be31d78349
3 changed files with 16 additions and 15 deletions

View File

@ -5,7 +5,7 @@
#include "testutils/TimestampTestUtils.h" #include "testutils/TimestampTestUtils.h"
template<class ConcreteFileSystemTestFixture> template<class ConcreteFileSystemTestFixture>
class FsppDeviceTest_Timestamps: public FsppNodeTest<ConcreteFileSystemTestFixture>, public TimestampTestUtils { class FsppDeviceTest_Timestamps: public FsppNodeTest<ConcreteFileSystemTestFixture>, public TimestampTestUtils<fspp::Node> {
public: public:
void Test_Load_While_Loaded() { void Test_Load_While_Loaded() {
auto node = this->CreateNode("/mynode"); auto node = this->CreateNode("/mynode");

View File

@ -11,7 +11,7 @@ using namespace cpputils::time;
using std::function; using std::function;
template<class ConcreteFileSystemTestFixture> template<class ConcreteFileSystemTestFixture>
class FsppNodeTest_Timestamps: public FsppNodeTest<ConcreteFileSystemTestFixture>, public TimestampTestUtils { class FsppNodeTest_Timestamps: public FsppNodeTest<ConcreteFileSystemTestFixture>, public TimestampTestUtils<fspp::Node> {
public: public:
void Test_Create() { void Test_Create() {

View File

@ -5,24 +5,25 @@
#include <cpp-utils/system/time.h> #include <cpp-utils/system/time.h>
#include <cpp-utils/system/stat.h> #include <cpp-utils/system/stat.h>
template<typename NodeType>
class TimestampTestUtils { class TimestampTestUtils {
public: public:
void EXPECT_ACCESS_TIMESTAMP_BETWEEN(timespec lowerBound, timespec upperBound, const fspp::Node &node) { void EXPECT_ACCESS_TIMESTAMP_BETWEEN(timespec lowerBound, timespec upperBound, const NodeType &node) {
EXPECT_LE(lowerBound, stat(node).st_atim); EXPECT_LE(lowerBound, stat(node).st_atim);
EXPECT_GE(upperBound, stat(node).st_atim); EXPECT_GE(upperBound, stat(node).st_atim);
} }
void EXPECT_MODIFICATION_TIMESTAMP_BETWEEN(timespec lowerBound, timespec upperBound, const fspp::Node &node) { void EXPECT_MODIFICATION_TIMESTAMP_BETWEEN(timespec lowerBound, timespec upperBound, const NodeType &node) {
EXPECT_LE(lowerBound, stat(node).st_mtim); EXPECT_LE(lowerBound, stat(node).st_mtim);
EXPECT_GE(upperBound, stat(node).st_mtim); EXPECT_GE(upperBound, stat(node).st_mtim);
} }
void EXPECT_METADATACHANGE_TIMESTAMP_BETWEEN(timespec lowerBound, timespec upperBound, const fspp::Node &node) { void EXPECT_METADATACHANGE_TIMESTAMP_BETWEEN(timespec lowerBound, timespec upperBound, const NodeType &node) {
EXPECT_LE(lowerBound, stat(node).st_ctim); EXPECT_LE(lowerBound, stat(node).st_ctim);
EXPECT_GE(upperBound, stat(node).st_ctim); EXPECT_GE(upperBound, stat(node).st_ctim);
} }
void EXPECT_OPERATION_DOESNT_UPDATE_ACCESS_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_DOESNT_UPDATE_ACCESS_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
ensureNodeTimestampsAreOld(node); ensureNodeTimestampsAreOld(node);
timespec oldTime = stat(node).st_atim; timespec oldTime = stat(node).st_atim;
operation(); operation();
@ -30,7 +31,7 @@ public:
EXPECT_EQ(oldTime, newTime); EXPECT_EQ(oldTime, newTime);
} }
void EXPECT_OPERATION_DOESNT_UPDATE_MODIFICATION_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_DOESNT_UPDATE_MODIFICATION_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
ensureNodeTimestampsAreOld(node); ensureNodeTimestampsAreOld(node);
timespec oldTime = stat(node).st_mtim; timespec oldTime = stat(node).st_mtim;
operation(); operation();
@ -38,7 +39,7 @@ public:
EXPECT_EQ(oldTime, newTime); EXPECT_EQ(oldTime, newTime);
} }
void EXPECT_OPERATION_DOESNT_UPDATE_METADATACHANGE_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_DOESNT_UPDATE_METADATACHANGE_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
ensureNodeTimestampsAreOld(node); ensureNodeTimestampsAreOld(node);
timespec oldTime = stat(node).st_ctim; timespec oldTime = stat(node).st_ctim;
operation(); operation();
@ -46,7 +47,7 @@ public:
EXPECT_EQ(oldTime, newTime); EXPECT_EQ(oldTime, newTime);
} }
void EXPECT_OPERATION_UPDATES_ACCESS_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_UPDATES_ACCESS_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
ensureNodeTimestampsAreOld(node); ensureNodeTimestampsAreOld(node);
timespec lowerBound = cpputils::time::now(); timespec lowerBound = cpputils::time::now();
operation(); operation();
@ -54,7 +55,7 @@ public:
EXPECT_ACCESS_TIMESTAMP_BETWEEN(lowerBound, upperBound, node); EXPECT_ACCESS_TIMESTAMP_BETWEEN(lowerBound, upperBound, node);
} }
void EXPECT_OPERATION_UPDATES_MODIFICATION_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_UPDATES_MODIFICATION_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
ensureNodeTimestampsAreOld(node); ensureNodeTimestampsAreOld(node);
timespec lowerBound = cpputils::time::now(); timespec lowerBound = cpputils::time::now();
operation(); operation();
@ -62,7 +63,7 @@ public:
EXPECT_MODIFICATION_TIMESTAMP_BETWEEN(lowerBound, upperBound, node); EXPECT_MODIFICATION_TIMESTAMP_BETWEEN(lowerBound, upperBound, node);
} }
void EXPECT_OPERATION_UPDATES_METADATACHANGE_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_UPDATES_METADATACHANGE_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
ensureNodeTimestampsAreOld(node); ensureNodeTimestampsAreOld(node);
timespec lowerBound = cpputils::time::now(); timespec lowerBound = cpputils::time::now();
operation(); operation();
@ -70,7 +71,7 @@ public:
EXPECT_METADATACHANGE_TIMESTAMP_BETWEEN(lowerBound, upperBound, node); EXPECT_METADATACHANGE_TIMESTAMP_BETWEEN(lowerBound, upperBound, node);
} }
void EXPECT_OPERATION_DOESNT_UPDATE_TIMESTAMPS(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_DOESNT_UPDATE_TIMESTAMPS(const NodeType &node, std::function<void()> operation) {
// equivalent to the following, but implemented separately because operation() should only be called once. // equivalent to the following, but implemented separately because operation() should only be called once.
// EXPECT_OPERATION_DOESNT_UPDATE_ACCESS_TIMESTAMP(node, operation); // EXPECT_OPERATION_DOESNT_UPDATE_ACCESS_TIMESTAMP(node, operation);
// EXPECT_OPERATION_DOESNT_UPDATE_MODIFICATION_TIMESTAMP(node, operation); // EXPECT_OPERATION_DOESNT_UPDATE_MODIFICATION_TIMESTAMP(node, operation);
@ -84,7 +85,7 @@ public:
EXPECT_EQ(oldStat.st_ctim, newStat.st_ctim); EXPECT_EQ(oldStat.st_ctim, newStat.st_ctim);
} }
void EXPECT_OPERATION_ONLY_UPDATES_METADATACHANGE_TIMESTAMP(const fspp::Node &node, std::function<void()> operation) { void EXPECT_OPERATION_ONLY_UPDATES_METADATACHANGE_TIMESTAMP(const NodeType &node, std::function<void()> operation) {
// equivalent to the following, but implemented separately because operation() should only be called once. // equivalent to the following, but implemented separately because operation() should only be called once.
// EXPECT_OPERATION_DOESNT_UPDATE_ACCESS_TIMESTAMP(node, operation); // EXPECT_OPERATION_DOESNT_UPDATE_ACCESS_TIMESTAMP(node, operation);
// EXPECT_OPERATION_DOESNT_UPDATE_MODIFICATION_TIMESTAMP(node, operation); // EXPECT_OPERATION_DOESNT_UPDATE_MODIFICATION_TIMESTAMP(node, operation);
@ -101,7 +102,7 @@ public:
EXPECT_GE(upperBound, newStat.st_ctim); EXPECT_GE(upperBound, newStat.st_ctim);
} }
struct stat stat(const fspp::Node &node) { struct stat stat(const NodeType &node) {
struct stat st; struct stat st;
node.stat(&st); node.stat(&st);
return st; return st;
@ -113,7 +114,7 @@ public:
return result; return result;
} }
void ensureNodeTimestampsAreOld(const fspp::Node &node) { void ensureNodeTimestampsAreOld(const NodeType &node) {
waitUntilClockProgresses(); waitUntilClockProgresses();
EXPECT_LT(stat(node).st_atim, cpputils::time::now()); EXPECT_LT(stat(node).st_atim, cpputils::time::now());
EXPECT_LT(stat(node).st_mtim, cpputils::time::now()); EXPECT_LT(stat(node).st_mtim, cpputils::time::now());