[libcamera-devel] [PATCH 4/4] tests: event-dispatcher: Add processEvents() interruption test

Laurent Pinchart laurent.pinchart at ideasonboard.com
Wed Jan 23 09:59:23 CET 2019


Test that the EventDispatcher::interrupt() function correctly interrupts
the processEvents() function, both when called before processEvents()
and when called while it is running.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 test/event-dispatcher.cpp | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/test/event-dispatcher.cpp b/test/event-dispatcher.cpp
index 06c2657f09d6..e8818dcab4ad 100644
--- a/test/event-dispatcher.cpp
+++ b/test/event-dispatcher.cpp
@@ -18,16 +18,23 @@
 using namespace std;
 using namespace libcamera;
 
+static EventDispatcher *dispatcher;
+static bool interrupt;
+
 class EventDispatcherTest : public Test
 {
 protected:
 	static void sigAlarmHandler(int)
 	{
 		cout << "SIGALARM received" << endl;
+		if (interrupt)
+			dispatcher->interrupt();
 	}
 
 	int init()
 	{
+		dispatcher = CameraManager::instance()->eventDispatcher();
+
 		struct sigaction sa = {};
 		sa.sa_handler = &sigAlarmHandler;
 		sigaction(SIGALRM, &sa, nullptr);
@@ -37,7 +44,6 @@ protected:
 
 	int run()
 	{
-		EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
 		Timer timer;
 
 		/* Event processing interruption by signal. */
@@ -48,6 +54,7 @@ protected:
 
 		struct itimerval itimer = {};
 		itimer.it_value.tv_usec = 500000;
+		interrupt = false;
 		setitimer(ITIMER_REAL, &itimer, nullptr);
 
 		dispatcher->processEvents();
@@ -62,6 +69,29 @@ protected:
 			return TestFail;
 		}
 
+		/* Event processing interruption. */
+		timer.start(1000);
+		dispatcher->interrupt();
+
+		dispatcher->processEvents();
+
+		if (!timer.isRunning()) {
+			cout << "Event processing immediate interruption failed" << endl;
+			return TestFail;
+		}
+
+		timer.start(1000);
+		itimer.it_value.tv_usec = 500000;
+		interrupt = true;
+		setitimer(ITIMER_REAL, &itimer, nullptr);
+
+		dispatcher->processEvents();
+
+		if (!timer.isRunning()) {
+			cout << "Event processing delayed interruption failed" << endl;
+			return TestFail;
+		}
+
 		return TestPass;
 	}
 
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list