summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-08-11 18:51:48 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-08-17 18:32:37 +0300
commit980d1ee0c0e15fc3c8332138f9e39f3b2df1ea9c (patch)
tree8749d45224f8c520eff72865c34cc1736248c924 /test
parenta991d5aac0a61805f9333f6687fe2cb07521f1ff (diff)
test: Add Object class thread affinity test
The test verifies thread affinity and thread move notifications. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'test')
-rw-r--r--test/meson.build1
-rw-r--r--test/object.cpp88
2 files changed, 89 insertions, 0 deletions
diff --git a/test/meson.build b/test/meson.build
index 7c9abc63..c6601813 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -24,6 +24,7 @@ public_tests = [
internal_tests = [
['camera-sensor', 'camera-sensor.cpp'],
['message', 'message.cpp'],
+ ['object', 'object.cpp'],
['object-invoke', 'object-invoke.cpp'],
['signal-threads', 'signal-threads.cpp'],
['threads', 'threads.cpp'],
diff --git a/test/object.cpp b/test/object.cpp
new file mode 100644
index 00000000..3f1f700d
--- /dev/null
+++ b/test/object.cpp
@@ -0,0 +1,88 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * object.cpp - Object tests
+ */
+
+#include <iostream>
+
+#include <libcamera/object.h>
+
+#include "message.h"
+#include "thread.h"
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class InstrumentedObject : public Object
+{
+public:
+ enum Status {
+ NoMessage,
+ MessageReceived,
+ };
+
+ InstrumentedObject()
+ : status_(NoMessage)
+ {
+ }
+
+ Status status() const { return status_; }
+ void reset() { status_ = NoMessage; }
+
+protected:
+ void message(Message *msg) override
+ {
+ if (msg->type() == Message::ThreadMoveMessage)
+ status_ = MessageReceived;
+
+ Object::message(msg);
+ }
+
+private:
+ Status status_;
+};
+
+class ObjectTest : public Test
+{
+protected:
+ int init()
+ {
+ a_ = new InstrumentedObject();
+ return TestPass;
+ }
+
+ int run()
+ {
+ /* Verify that moving an object to a different thread succeeds. */
+ a_->moveToThread(&thread_);
+
+ if (a_->thread() != &thread_ || a_->thread() == Thread::current()) {
+ cout << "Failed to move object to thread" << endl;
+ return TestFail;
+ }
+
+ /* Verify that objects receive a ThreadMoveMessage when moved. */
+ if (a_->status() != InstrumentedObject::MessageReceived) {
+ cout << "Moving object didn't deliver ThreadMoveMessage" << endl;
+ return TestFail;
+ }
+
+ return TestPass;
+ }
+
+ void cleanup()
+ {
+ delete a_;
+ }
+
+private:
+ InstrumentedObject *a_;
+
+ Thread thread_;
+};
+
+TEST_REGISTER(ObjectTest)