[libcamera-devel,v2,2/2] test: v4l2_device: Add test suite and initial test

Message ID 20190115160212.30100-3-kieran.bingham@ideasonboard.com
State Superseded
Headers show
Series
  • V4L2Device: Add basic V4L2 support class
Related show

Commit Message

Kieran Bingham Jan. 15, 2019, 4:02 p.m. UTC
Provide a base class to construct a v4l2_device object for further tests
and an initial test which validates the FD handle can not be leaked.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 test/meson.build                      |  1 +
 test/v4l2_device/double_open.cpp      | 38 +++++++++++++++++++++++
 test/v4l2_device/meson.build          | 12 ++++++++
 test/v4l2_device/v4l2_device_test.cpp | 43 +++++++++++++++++++++++++++
 test/v4l2_device/v4l2_device_test.h   | 27 +++++++++++++++++
 5 files changed, 121 insertions(+)
 create mode 100644 test/v4l2_device/double_open.cpp
 create mode 100644 test/v4l2_device/meson.build
 create mode 100644 test/v4l2_device/v4l2_device_test.cpp
 create mode 100644 test/v4l2_device/v4l2_device_test.h

Patch

diff --git a/test/meson.build b/test/meson.build
index 32152888a55e..fb6b115eb2ab 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -1,6 +1,7 @@ 
 subdir('libtest')
 
 subdir('media_device')
+subdir('v4l2_device')
 
 public_tests = [
     ['event',           'event.cpp'],
diff --git a/test/v4l2_device/double_open.cpp b/test/v4l2_device/double_open.cpp
new file mode 100644
index 000000000000..ca2b201454a4
--- /dev/null
+++ b/test/v4l2_device/double_open.cpp
@@ -0,0 +1,38 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * libcamera V4L2 API tests
+ */
+
+#include <iostream>
+
+#include "v4l2_device_test.h"
+
+namespace {
+
+class DoubleOpen : public V4L2DeviceTest
+{
+protected:
+	int run()
+	{
+		int ret;
+
+		/*
+		 * Expect failure: The device has already been opened by the
+		 * V4L2DeviceTest base class
+		 */
+		ret = dev_->open();
+		if (!ret) {
+			std::cout << "Double open erroneously succeeded" << std::endl;
+			dev_->close();
+			return TestFail;
+		}
+
+		return TestPass;
+	}
+};
+
+} /* namespace */
+
+TEST_REGISTER(DoubleOpen);
diff --git a/test/v4l2_device/meson.build b/test/v4l2_device/meson.build
new file mode 100644
index 000000000000..41675a303498
--- /dev/null
+++ b/test/v4l2_device/meson.build
@@ -0,0 +1,12 @@ 
+# Tests are listed in order of complexity.
+# They are not alphabetically sorted.
+v4l2_device_tests = [
+  [ 'double_open',        'double_open.cpp' ],
+]
+
+foreach t : v4l2_device_tests
+  exe = executable(t[0], [t[1], 'v4l2_device_test.cpp'],
+		   link_with : test_libraries,
+		   include_directories : test_includes_internal)
+  test(t[0], exe, suite: 'v4l2_device', is_parallel: false)
+endforeach
diff --git a/test/v4l2_device/v4l2_device_test.cpp b/test/v4l2_device/v4l2_device_test.cpp
new file mode 100644
index 000000000000..362553712caa
--- /dev/null
+++ b/test/v4l2_device/v4l2_device_test.cpp
@@ -0,0 +1,43 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * libcamera V4L2 API tests
+ */
+
+#include <iostream>
+#include <sys/stat.h>
+
+#include "v4l2_device_test.h"
+
+using namespace libcamera;
+
+bool exists(const std::string &path)
+{
+	struct stat sb;
+
+	if (stat(path.c_str(), &sb) == 0)
+		return true;
+
+	return false;
+}
+
+int V4L2DeviceTest::init()
+{
+	const std::string device("/dev/video0");
+
+	/* Validate the device node exists. */
+	if (!exists(device)) {
+		std::cout << "No video device available" << std::endl;
+		return TestSkip;
+	}
+
+	dev_ = new V4L2Device(device);
+
+	return dev_->open();
+}
+
+void V4L2DeviceTest::cleanup()
+{
+	delete dev_;
+};
diff --git a/test/v4l2_device/v4l2_device_test.h b/test/v4l2_device/v4l2_device_test.h
new file mode 100644
index 000000000000..405cb7d6f404
--- /dev/null
+++ b/test/v4l2_device/v4l2_device_test.h
@@ -0,0 +1,27 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2018, Google Inc.
+ *
+ * vl42device_test.h - libcamera v4l2device test base class
+ */
+#ifndef __LIBCAMERA_V4L2_DEVICE_TEST_H_
+#define __LIBCAMERA_V4L2_DEVICE_TEST_H_
+
+#include "test.h"
+#include "v4l2_device.h"
+
+using namespace libcamera;
+
+class V4L2DeviceTest : public Test
+{
+public:
+	V4L2DeviceTest() : dev_(nullptr) { };
+
+protected:
+	int init();
+	void cleanup();
+
+	V4L2Device *dev_;
+};
+
+#endif /* __LIBCAMERA_V4L2_DEVICE_TEST_H_ */