[libcamera-devel] [RFC PATCH] tests: ipa_data_serializer_test: Test serializing fds

Paul Elder paul.elder at ideasonboard.com
Wed Aug 4 13:35:29 CEST 2021


Add tests to test IPADataSerializer serializing FileDescriptors.

Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
---
 include/libcamera/file_descriptor.h           |  1 +
 src/libcamera/file_descriptor.cpp             |  9 ++++
 .../ipa_data_serializer_test.cpp              | 43 +++++++++++++++++++
 3 files changed, 53 insertions(+)

diff --git a/include/libcamera/file_descriptor.h b/include/libcamera/file_descriptor.h
index d514aac7..8f1d6f21 100644
--- a/include/libcamera/file_descriptor.h
+++ b/include/libcamera/file_descriptor.h
@@ -22,6 +22,7 @@ public:
 
 	FileDescriptor &operator=(const FileDescriptor &other);
 	FileDescriptor &operator=(FileDescriptor &&other);
+	bool operator==(const FileDescriptor &other) const;
 
 	bool isValid() const { return fd_ != nullptr; }
 	int fd() const { return fd_ ? fd_->fd() : -1; }
diff --git a/src/libcamera/file_descriptor.cpp b/src/libcamera/file_descriptor.cpp
index 638b3bbe..f1394153 100644
--- a/src/libcamera/file_descriptor.cpp
+++ b/src/libcamera/file_descriptor.cpp
@@ -191,6 +191,15 @@ FileDescriptor &FileDescriptor::operator=(FileDescriptor &&other)
 	return *this;
 }
 
+/**
+ * \brief Compare FileDescriptor instances for equality
+ * \return True if the underlying file descriptor is equal, false otherwise
+ */
+bool FileDescriptor::operator==(const FileDescriptor &other) const
+{
+	return this->fd() == other.fd();
+}
+
 /**
  * \fn FileDescriptor::isValid()
  * \brief Check if the FileDescriptor instance is valid
diff --git a/test/serialization/ipa_data_serializer_test.cpp b/test/serialization/ipa_data_serializer_test.cpp
index 1e8f7e21..9c8ff69c 100644
--- a/test/serialization/ipa_data_serializer_test.cpp
+++ b/test/serialization/ipa_data_serializer_test.cpp
@@ -11,6 +11,7 @@
 #include <iostream>
 #include <limits>
 #include <stdlib.h>
+#include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <tuple>
@@ -144,6 +145,10 @@ protected:
 		if (ret != TestPass)
 			return ret;
 
+		ret = testFd();
+		if (ret != TestPass)
+			return ret;
+
 		return TestPass;
 	}
 
@@ -435,6 +440,44 @@ private:
 
 		return TestPass;
 	}
+
+	int testFd()
+	{
+		/* Test serdes of single fd */
+		int memfd = memfd_create("test", 0);
+		if (memfd < 0) {
+			cerr << "Failed to create memfd" << endl;
+			return TestFail;
+		}
+
+		FileDescriptor fd = FileDescriptor(std::move(memfd));
+		if (memfd != -1) {
+			cerr << "FileDescriptor move constructor failed" << endl;
+			return TestFail;
+		}
+
+		if (testPodSerdes(fd) != TestPass)
+			return TestFail;
+
+		/* Test serdes of vector of fds */
+		std::vector<FileDescriptor> vecFds;
+
+		for (unsigned int i = 0; i < 10; i++) {
+			std::string name = "test" + std::to_string(i);
+			int mfd = memfd_create(name.c_str(), 0);
+			if (mfd < 0)
+				return TestFail;
+
+			vecFds.push_back(FileDescriptor(std::move(mfd)));
+			if (mfd != -1)
+				return TestFail;
+		}
+
+		if (testVectorSerdes(vecFds) != TestPass)
+			return TestFail;
+
+		return TestPass;
+	}
 };
 
 TEST_REGISTER(IPADataSerializerTest)
-- 
2.27.0



More information about the libcamera-devel mailing list