test: timer: Test that a timer can be restarted before it expires

The Timer API allows restarting a timer before it expires. Add a
corresponding test. The test fails as the Timer class doesn't comply
with its API documentation.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-10-06 07:23:58 +03:00
parent 9c6794164d
commit dfe1d89441

View file

@ -21,13 +21,14 @@ class ManagedTimer : public Timer
{ {
public: public:
ManagedTimer() ManagedTimer()
: Timer() : Timer(), count_(0)
{ {
timeout.connect(this, &ManagedTimer::timeoutHandler); timeout.connect(this, &ManagedTimer::timeoutHandler);
} }
void start(int msec) void start(int msec)
{ {
count_ = 0;
start_ = std::chrono::steady_clock::now(); start_ = std::chrono::steady_clock::now();
expiration_ = std::chrono::steady_clock::time_point(); expiration_ = std::chrono::steady_clock::time_point();
@ -40,12 +41,19 @@ public:
return abs(std::chrono::duration_cast<std::chrono::milliseconds>(duration).count()); return abs(std::chrono::duration_cast<std::chrono::milliseconds>(duration).count());
} }
bool hasFailed()
{
return isRunning() || count_ != 1 || jitter() > 50;
}
private: private:
void timeoutHandler(Timer *timer) void timeoutHandler(Timer *timer)
{ {
expiration_ = std::chrono::steady_clock::now(); expiration_ = std::chrono::steady_clock::now();
count_++;
} }
unsigned int count_;
std::chrono::steady_clock::time_point start_; std::chrono::steady_clock::time_point start_;
std::chrono::steady_clock::time_point expiration_; std::chrono::steady_clock::time_point expiration_;
}; };
@ -74,7 +82,7 @@ protected:
dispatcher->processEvents(); dispatcher->processEvents();
if (timer.isRunning() || timer.jitter() > 50) { if (timer.hasFailed()) {
cout << "Timer expiration test failed" << endl; cout << "Timer expiration test failed" << endl;
return TestFail; return TestFail;
} }
@ -87,7 +95,7 @@ protected:
timer.start(4295); timer.start(4295);
dispatcher->processEvents(); dispatcher->processEvents();
if (timer.isRunning() || timer.jitter() > 50) { if (timer.hasFailed()) {
cout << "Timer expiration test failed" << endl; cout << "Timer expiration test failed" << endl;
return TestFail; return TestFail;
} }
@ -102,11 +110,23 @@ protected:
dispatcher->processEvents(); dispatcher->processEvents();
if (timer.isRunning() || timer.jitter() > 50) { if (timer.hasFailed()) {
cout << "Timer restart test failed" << endl; cout << "Timer restart test failed" << endl;
return TestFail; return TestFail;
} }
/* Timer restart before expiration. */
timer.start(50);
timer.start(100);
timer.start(150);
dispatcher->processEvents();
if (timer.hasFailed()) {
cout << "Timer restart before expiration test failed" << endl;
return TestFail;
}
/* Two timers. */ /* Two timers. */
timer.start(1000); timer.start(1000);
timer2.start(300); timer2.start(300);