[libcamera-devel,v3,3/3] test: v4l2_device: Add test suite and initial test

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

Commit Message

Kieran Bingham Jan. 15, 2019, 11:19 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

Comments

Niklas Söderlund Jan. 16, 2019, 3:03 p.m. UTC | #1
Hi Kieran,

Thanks for your work.

On 2019-01-15 23:19:09 +0000, Kieran Bingham wrote:
> 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>

Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>

> ---
>  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
> 
> 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_ */
> -- 
> 2.17.1
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel@lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

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_ */