summaryrefslogtreecommitdiff
path: root/test/message.cpp
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-07-10 19:59:13 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-07-11 11:57:37 +0300
commit851eaeb9cd5dcdc282f859fd0047867a3f1d57ec (patch)
tree2344d0030409411ddd1f4900d218be564759bf25 /test/message.cpp
parenta7fb1db1fa263ddcc200bad5b1e223e8e7449f2f (diff)
test: Add Message test case
The Message class test creates a receiver inheriting from Object, moves it to a different thread, sends a message to the receiver and verifies that the message is delivered in the correct thread. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'test/message.cpp')
-rw-r--r--test/message.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/test/message.cpp b/test/message.cpp
new file mode 100644
index 00000000..de98da3e
--- /dev/null
+++ b/test/message.cpp
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * message.cpp - Messages test
+ */
+
+#include <chrono>
+#include <iostream>
+#include <thread>
+
+#include "message.h"
+#include "thread.h"
+#include "test.h"
+#include "utils.h"
+
+using namespace std;
+using namespace libcamera;
+
+class MessageReceiver : public Object
+{
+public:
+ enum Status {
+ NoMessage,
+ InvalidThread,
+ MessageReceived,
+ };
+
+ MessageReceiver()
+ : status_(NoMessage)
+ {
+ }
+
+ Status status() const { return status_; }
+ void reset() { status_ = NoMessage; }
+
+protected:
+ void message(Message *msg)
+ {
+ if (thread() != Thread::current())
+ status_ = InvalidThread;
+ else
+ status_ = MessageReceived;
+ }
+
+private:
+ Status status_;
+};
+
+class MessageTest : public Test
+{
+protected:
+ int run()
+ {
+ MessageReceiver receiver;
+ receiver.moveToThread(&thread_);
+
+ thread_.start();
+
+ receiver.postMessage(utils::make_unique<Message>(Message::None));
+
+ this_thread::sleep_for(chrono::milliseconds(100));
+
+ switch (receiver.status()) {
+ case MessageReceiver::NoMessage:
+ cout << "No message received" << endl;
+ return TestFail;
+ case MessageReceiver::InvalidThread:
+ cout << "Message received in incorrect thread" << endl;
+ return TestFail;
+ default:
+ break;
+ }
+
+ return TestPass;
+ }
+
+ void cleanup()
+ {
+ thread_.exit(0);
+ thread_.wait();
+ }
+
+private:
+ Thread thread_;
+};
+
+TEST_REGISTER(MessageTest)