summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-06 08:02:40 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-07 06:02:24 +0300
commitada18bf65a1c343b6994bfd9f23b39aae8d9a9c5 (patch)
treefbb9af9bf4cb38687feebc88f1507b41b56eccba
parent62e33576819ab35b849d7262d0640c66b0d3a839 (diff)
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>
-rw-r--r--test/timer-thread.cpp54
1 files changed, 44 insertions, 10 deletions
diff --git a/test/timer-thread.cpp b/test/timer-thread.cpp
index 5c1b4ac4..32853b4e 100644
--- a/test/timer-thread.cpp
+++ b/test/timer-thread.cpp
@@ -8,6 +8,7 @@
#include <chrono>
#include <iostream>
+#include <libcamera/event_dispatcher.h>
#include <libcamera/timer.h>
#include "test.h"
@@ -26,6 +27,12 @@ public:
timer_.start(100);
}
+ void restart()
+ {
+ timeout_ = false;
+ timer_.start(100);
+ }
+
bool timeout() const
{
return timeout_;
@@ -44,29 +51,56 @@ private:
class TimerThreadTest : public Test
{
protected:
+ int init()
+ {
+ thread_.start();
+ timeout_.moveToThread(&thread_);
+
+ return TestPass;
+ }
+
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;
- timeout.moveToThread(&thread);
+ if (!timeout_.timeout()) {
+ cout << "Timer expiration test failed" << endl;
+ return TestFail;
+ }
- this_thread::sleep_for(chrono::milliseconds(100));
+ /*
+ * 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();
- /* Must stop thread before destroying timeout. */
- thread.exit(0);
- thread.wait();
+ this_thread::sleep_for(chrono::milliseconds(200));
- if (!timeout.timeout()) {
- cout << "Timer expiration test failed" << endl;
+ if (timeout_.timeout()) {
+ cout << "Timer restart test failed" << endl;
return TestFail;
}
return TestPass;
}
+ void cleanup()
+ {
+ /* Must stop thread before destroying timeout. */
+ thread_.exit(0);
+ thread_.wait();
+ }
+
private:
+ TimeoutHandler timeout_;
+ Thread thread_;
};
TEST_REGISTER(TimerThreadTest)