[libcamera-devel] [PATCH 3/3] test: file_descriptor: Add test

Niklas Söderlund niklas.soderlund at ragnatech.se
Mon Dec 16 13:10:29 CET 2019


Add a test which exercises the whole FileDescriptor interface.

Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
 test/file_descriptor.cpp | 152 +++++++++++++++++++++++++++++++++++++++
 test/meson.build         |   1 +
 2 files changed, 153 insertions(+)
 create mode 100644 test/file_descriptor.cpp

diff --git a/test/file_descriptor.cpp b/test/file_descriptor.cpp
new file mode 100644
index 0000000000000000..b1d0d0e0b2807b20
--- /dev/null
+++ b/test/file_descriptor.cpp
@@ -0,0 +1,152 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * file_descriptor.cpp - FileDescriptor test
+ */
+
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <libcamera/file_descriptor.h>
+
+#include "test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class FileDescriptorTest : public Test
+{
+protected:
+	int init()
+	{
+		fd_ = open("/tmp", O_TMPFILE | O_RDWR, S_IRUSR | S_IWUSR);
+		if (fd_ < 0)
+			return TestFail;
+
+		return 0;
+	}
+
+	int run()
+	{
+		FileDescriptor *desc1, *desc2;
+
+		/* Test creating FileDescriptor from numerical file descriptor. */
+		desc1 = new FileDescriptor(fd_);
+		if (desc1->fd() == fd_)
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc1->fd()))
+			return TestFail;
+
+		delete desc1;
+
+		if (!validFD(fd_))
+			return TestFail;
+
+		/* Test creating FileDescriptor from other FileDescriptor. */
+		desc1 = new FileDescriptor(fd_);
+		desc2 = new FileDescriptor(*desc1);
+
+		if (desc1->fd() == fd_ || desc2->fd() == fd_ || desc1->fd() == desc2->fd())
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc1->fd()) || !validFD(desc2->fd()))
+			return TestFail;
+
+		delete desc1;
+
+		if (!validFD(fd_) || !validFD(desc2->fd()))
+			return TestFail;
+
+		delete desc2;
+
+		if (!validFD(fd_))
+			return TestFail;
+
+		/* Test creating FileDescriptor by taking over other FileDescriptor. */
+		desc1 = new FileDescriptor(fd_);
+		desc2 = new FileDescriptor(std::move(*desc1));
+
+		if (desc1->fd() != -1 || desc2->fd() == fd_ || desc1->fd() == desc2->fd())
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc2->fd()))
+			return TestFail;
+
+		delete desc1;
+		delete desc2;
+
+		if (!validFD(fd_))
+			return TestFail;
+
+		/* Test creating FileDescriptor by copy assigment */
+		desc1 = new FileDescriptor();
+		desc2 = new FileDescriptor(fd_);
+
+		if (desc1->fd() != -1 || desc2->fd() == fd_ || desc1->fd() == desc2->fd())
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc2->fd()))
+			return TestFail;
+
+		*desc1 = *desc2;
+
+		if (desc1->fd() == fd_ || desc2->fd() == fd_ || desc1->fd() == desc2->fd())
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc1->fd()) || !validFD(desc2->fd()))
+			return TestFail;
+
+		delete desc1;
+		delete desc2;
+
+		if (!validFD(fd_))
+			return TestFail;
+
+		/* Test creating FileDescriptor by move assigment */
+		desc1 = new FileDescriptor();
+		desc2 = new FileDescriptor(fd_);
+
+		if (desc1->fd() != -1 || desc2->fd() == fd_ || desc1->fd() == desc2->fd())
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc2->fd()))
+			return TestFail;
+
+		*desc1 = std::move(*desc2);
+
+		if (desc1->fd() == fd_ || desc2->fd() != -1 || desc1->fd() == desc2->fd())
+			return TestFail;
+
+		if (!validFD(fd_) || !validFD(desc1->fd()))
+			return TestFail;
+
+		delete desc1;
+		delete desc2;
+
+		if (!validFD(fd_))
+			return TestFail;
+
+		return TestPass;
+	}
+
+	void cleanup()
+	{
+		if (fd_ > 0)
+			close(fd_);
+	}
+
+private:
+	bool validFD(int fd)
+	{
+		struct stat s;
+		return fstat(fd, &s) == 0;
+	}
+
+	int fd_;
+};
+
+TEST_REGISTER(FileDescriptorTest)
diff --git a/test/meson.build b/test/meson.build
index 1bb2161dc05a7b1d..9dc392df30efd956 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -25,6 +25,7 @@ internal_tests = [
     ['event',                           'event.cpp'],
     ['event-dispatcher',                'event-dispatcher.cpp'],
     ['event-thread',                    'event-thread.cpp'],
+    ['file_descriptor',                 'file_descriptor.cpp'],
     ['message',                         'message.cpp'],
     ['object',                          'object.cpp'],
     ['object-invoke',                   'object-invoke.cpp'],
-- 
2.24.0



More information about the libcamera-devel mailing list