summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-01-23 10:16:26 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-01-23 18:51:56 +0200
commit83c73c39c5c6b115fc80e6133433b70753499bab (patch)
treef1d86be30ad3b5fa966ce42e163e1a73ad69db9a
parentd32dc0c1c85325926d20044141d5b9850b9433fd (diff)
tests: Test event dispatcher interruption by signal
Add a test to verify that the event dispatcher correctly restarts event processing when interrupted by a signal. The test currently fails as this feature isn't implemented. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
-rw-r--r--test/event-dispatcher.cpp73
-rw-r--r--test/meson.build9
2 files changed, 78 insertions, 4 deletions
diff --git a/test/event-dispatcher.cpp b/test/event-dispatcher.cpp
new file mode 100644
index 00000000..06c2657f
--- /dev/null
+++ b/test/event-dispatcher.cpp
@@ -0,0 +1,73 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * event-dispatcher.cpp - Event dispatcher test
+ */
+
+#include <iostream>
+#include <signal.h>
+#include <sys/time.h>
+
+#include <libcamera/camera_manager.h>
+#include <libcamera/event_dispatcher.h>
+#include <libcamera/timer.h>
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class EventDispatcherTest : public Test
+{
+protected:
+ static void sigAlarmHandler(int)
+ {
+ cout << "SIGALARM received" << endl;
+ }
+
+ int init()
+ {
+ struct sigaction sa = {};
+ sa.sa_handler = &sigAlarmHandler;
+ sigaction(SIGALRM, &sa, nullptr);
+
+ return 0;
+ }
+
+ int run()
+ {
+ EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
+ Timer timer;
+
+ /* Event processing interruption by signal. */
+ struct timespec start;
+ clock_gettime(CLOCK_MONOTONIC, &start);
+
+ timer.start(1000);
+
+ struct itimerval itimer = {};
+ itimer.it_value.tv_usec = 500000;
+ setitimer(ITIMER_REAL, &itimer, nullptr);
+
+ dispatcher->processEvents();
+
+ struct timespec stop;
+ clock_gettime(CLOCK_MONOTONIC, &stop);
+ int duration = (stop.tv_sec - start.tv_sec) * 1000;
+ duration += (stop.tv_nsec - start.tv_nsec) / 1000000;
+
+ if (abs(duration - 1000) > 50) {
+ cout << "Event processing restart test failed" << endl;
+ return TestFail;
+ }
+
+ return TestPass;
+ }
+
+ void cleanup()
+ {
+ }
+};
+
+TEST_REGISTER(EventDispatcherTest)
diff --git a/test/meson.build b/test/meson.build
index 8cdcae2c..d515a716 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -5,10 +5,11 @@ subdir('pipeline')
subdir('v4l2_device')
public_tests = [
- ['event', 'event.cpp'],
- ['list-cameras', 'list-cameras.cpp'],
- ['signal', 'signal.cpp'],
- ['timer', 'timer.cpp'],
+ ['event', 'event.cpp'],
+ ['event-dispatcher', 'event-dispatcher.cpp'],
+ ['list-cameras', 'list-cameras.cpp'],
+ ['signal', 'signal.cpp'],
+ ['timer', 'timer.cpp'],
]
internal_tests = [