test: timer-thread: Test starting a timer from another thread

Timers can't be started from another thread. Ensure that attempting to
do so fails.

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 08:02:40 +03:00
parent 62e3357681
commit ada18bf65a

View file

@ -8,6 +8,7 @@
#include <chrono> #include <chrono>
#include <iostream> #include <iostream>
#include <libcamera/event_dispatcher.h>
#include <libcamera/timer.h> #include <libcamera/timer.h>
#include "test.h" #include "test.h"
@ -26,6 +27,12 @@ public:
timer_.start(100); timer_.start(100);
} }
void restart()
{
timeout_ = false;
timer_.start(100);
}
bool timeout() const bool timeout() const
{ {
return timeout_; return timeout_;
@ -44,29 +51,56 @@ private:
class TimerThreadTest : public Test class TimerThreadTest : public Test
{ {
protected: protected:
int init()
{
thread_.start();
timeout_.moveToThread(&thread_);
return TestPass;
}
int run() int run()
{ {
Thread thread; /*
thread.start(); * Test that the timer expires and emits the timeout signal in
* the thread it belongs to.
*/
this_thread::sleep_for(chrono::milliseconds(200));
TimeoutHandler timeout; if (!timeout_.timeout()) {
timeout.moveToThread(&thread);
this_thread::sleep_for(chrono::milliseconds(100));
/* Must stop thread before destroying timeout. */
thread.exit(0);
thread.wait();
if (!timeout.timeout()) {
cout << "Timer expiration test failed" << endl; cout << "Timer expiration test failed" << endl;
return TestFail; return TestFail;
} }
/*
* Test that starting the timer from another thread fails. We
* need to interrupt the event dispatcher to make sure we don't
* succeed simply because the event dispatcher hasn't noticed
* the timer restart.
*/
timeout_.restart();
thread_.eventDispatcher()->interrupt();
this_thread::sleep_for(chrono::milliseconds(200));
if (timeout_.timeout()) {
cout << "Timer restart test failed" << endl;
return TestFail;
}
return TestPass; return TestPass;
} }
void cleanup()
{
/* Must stop thread before destroying timeout. */
thread_.exit(0);
thread_.wait();
}
private: private:
TimeoutHandler timeout_;
Thread thread_;
}; };
TEST_REGISTER(TimerThreadTest) TEST_REGISTER(TimerThreadTest)