[libcamera-devel,14/18] test: Add Timer thread move test

Message ID 20190812124642.24287-15-laurent.pinchart@ideasonboard.com
State Superseded
Headers show
Series
  • Object & Thread enhancements
Related show

Commit Message

Laurent Pinchart Aug. 12, 2019, 12:46 p.m. UTC
The test verifies correct behaviour of a running timer moved to a
different thread.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 src/libcamera/timer.cpp |  2 +-
 test/meson.build        |  1 +
 test/timer-thread.cpp   | 78 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 test/timer-thread.cpp

Patch

diff --git a/src/libcamera/timer.cpp b/src/libcamera/timer.cpp
index 21c0a444cdce..f45061d4c6f6 100644
--- a/src/libcamera/timer.cpp
+++ b/src/libcamera/timer.cpp
@@ -129,7 +129,7 @@  void Timer::message(Message *msg)
 	if (msg->type() == Message::ThreadMoveMessage) {
 		if (deadline_) {
 			unregisterTimer();
-			invokeMethod(this, &Timer::registerTimer);
+			invokeMethod(&Timer::registerTimer);
 		}
 	}
 
diff --git a/test/meson.build b/test/meson.build
index f695ffd7be44..05265b7d4976 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -29,6 +29,7 @@  internal_tests = [
     ['object-invoke',                   'object-invoke.cpp'],
     ['signal-threads',                  'signal-threads.cpp'],
     ['threads',                         'threads.cpp'],
+    ['timer-thread',                    'timer-thread.cpp'],
 ]
 
 foreach t : public_tests
diff --git a/test/timer-thread.cpp b/test/timer-thread.cpp
new file mode 100644
index 000000000000..b9373050068c
--- /dev/null
+++ b/test/timer-thread.cpp
@@ -0,0 +1,78 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * timer-thread.cpp - Threaded timer test
+ */
+
+#include <chrono>
+#include <iostream>
+
+#include <libcamera/timer.h>
+
+#include "test.h"
+#include "thread.h"
+
+using namespace std;
+using namespace libcamera;
+
+class TimeoutHandler : public Object
+{
+public:
+	TimeoutHandler()
+		: timeout_(false)
+	{
+		timer_.timeout.connect(this, &TimeoutHandler::timeoutHandler);
+		timer_.start(100);
+	}
+
+	bool timeout() const
+	{
+		return timeout_;
+	}
+
+	void moveToThread(Thread *thread)
+	{
+		Object::moveToThread(thread);
+		timer_.moveToThread(thread);
+	}
+
+private:
+	void timeoutHandler(Timer *timer)
+	{
+		timeout_ = true;
+	}
+
+	Timer timer_;
+	bool timeout_;
+};
+
+class TimerThreadTest : public Test
+{
+protected:
+	int run()
+	{
+		Thread thread;
+		thread.start();
+
+		TimeoutHandler 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;
+			return TestFail;
+		}
+
+		return TestPass;
+	}
+
+private:
+};
+
+TEST_REGISTER(TimerThreadTest)