[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