diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/event-dispatcher.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/test/event-dispatcher.cpp b/test/event-dispatcher.cpp index 06c2657f..e8818dca 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; } |