libcryfs/test/implementations/caching/PeriodicTaskTest.cpp
2015-04-26 12:36:19 +02:00

64 lines
1.3 KiB
C++

#include <google/gtest/gtest.h>
#include "../../../implementations/caching/PeriodicTask.h"
#include <mutex>
#include <condition_variable>
#include <atomic>
using ::testing::Test;
using std::mutex;
using std::unique_lock;
using std::condition_variable;
using namespace blockstore::caching;
class AtomicCounter {
public:
AtomicCounter(int count): _mutex(), _cv(), _counter(count) {}
void decrease() {
unique_lock<mutex> lock(_mutex);
--_counter;
_cv.notify_all();
}
void waitForZero() {
unique_lock<mutex> lock(_mutex);
_cv.wait(lock, [this] () {return _counter <= 0;});
}
private:
mutex _mutex;
condition_variable _cv;
int _counter;
};
class PeriodicTaskTest: public Test {
};
TEST_F(PeriodicTaskTest, DoesntDeadlockInDestructorWhenDestructedImmediately) {
PeriodicTask task([](){}, 1);
}
TEST_F(PeriodicTaskTest, CallsCallbackAtLeast10Times) {
AtomicCounter counter(10);
PeriodicTask task([&counter](){
counter.decrease();
}, 0.001);
counter.waitForZero();
}
TEST_F(PeriodicTaskTest, DoesntCallCallbackAfterDestruction) {
std::atomic<int> callCount(0);
{
PeriodicTask task([&callCount](){
callCount += 1;
}, 0.001);
}
int callCountDirectlyAfterDestruction = callCount;
boost::this_thread::sleep_for(boost::chrono::seconds(1));
EXPECT_EQ(callCountDirectlyAfterDestruction, callCount);
}