[libcamera-devel] [PATCH v3.1 4/3] test: Add Object::deleteLater() test
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Fri Jul 31 17:14:24 CEST 2020
From: Umang Jain <email at uajain.com>
Add a test case for the Object::deleteLater() API, to verify that
- the object is deleted from the correct thread
- multiple deleteLater() calls delete the object once only
Signed-off-by: Umang Jain <email at uajain.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
test/meson.build | 1 +
test/object-delete.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 98 insertions(+)
create mode 100644 test/object-delete.cpp
diff --git a/test/meson.build b/test/meson.build
index c0fb9bdfac17..775187159dec 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -33,6 +33,7 @@ internal_tests = [
['hotplug-cameras', 'hotplug-cameras.cpp'],
['message', 'message.cpp'],
['object', 'object.cpp'],
+ ['object-delete', 'object-delete.cpp'],
['object-invoke', 'object-invoke.cpp'],
['pixel-format', 'pixel-format.cpp'],
['signal-threads', 'signal-threads.cpp'],
diff --git a/test/object-delete.cpp b/test/object-delete.cpp
new file mode 100644
index 000000000000..a1a6f5ccefd5
--- /dev/null
+++ b/test/object-delete.cpp
@@ -0,0 +1,97 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2020, Google Inc.
+ *
+ * object.cpp - Object deletion tests
+ */
+
+#include <iostream>
+
+#include <libcamera/object.h>
+
+#include "libcamera/internal/thread.h"
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class TestObject : public Object
+{
+public:
+ TestObject(unsigned int *count)
+ : deleteCount_(count)
+ {
+ }
+
+ ~TestObject()
+ {
+ /* Count the deletions from the correct thread. */
+ if (thread() == Thread::current())
+ (*deleteCount_)++;
+ }
+
+ unsigned int *deleteCount_;
+};
+
+class NewThread : public Thread
+{
+public:
+ NewThread(Object *obj)
+ : object_(obj)
+ {
+ }
+
+protected:
+ void run()
+ {
+ object_->deleteLater();
+ }
+
+private:
+ Object *object_;
+};
+
+class ObjectDeleteTest : public Test
+{
+protected:
+ int run()
+ {
+ /*
+ * Test that deferred deletion is executed from the object's
+ * thread, not the caller's thread.
+ */
+ unsigned int count = 0;
+ TestObject *obj = new TestObject(&count);
+
+ NewThread thread(obj);
+ thread.start();
+ thread.wait();
+
+ Thread::current()->dispatchMessages(Message::Type::DeferredDelete);
+
+ if (count != 1) {
+ cout << "Failed to dispatch DeferredDelete (" << count << ")" << endl;
+ return TestFail;
+ }
+
+ /*
+ * Test that multiple calls to deleteLater() delete the object
+ * once only.
+ */
+ count = 0;
+ obj = new TestObject(&count);
+ obj->deleteLater();
+ obj->deleteLater();
+
+ Thread::current()->dispatchMessages(Message::Type::DeferredDelete);
+ if (count != 1) {
+ cout << "Multiple deleteLater() failed (" << count << ")" << endl;
+ return TestFail;
+ }
+
+ return TestPass;
+ }
+};
+
+TEST_REGISTER(ObjectDeleteTest)
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list