[libcamera-devel,15/21] test: serialization: Add V4L2ControlInfoList serialization test

Message ID 20190924172503.30864-16-jacopo@jmondi.org
State Superseded
Headers show
Series
  • Implement control serialization
Related show

Commit Message

Jacopo Mondi Sept. 24, 2019, 5:24 p.m. UTC
Add test to serialize and de-serialize a V4L2ControlInfoList.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
---
 test/serialization/meson.build                |   1 +
 test/serialization/v4l2_control_info_list.cpp | 107 ++++++++++++++++++
 2 files changed, 108 insertions(+)
 create mode 100644 test/serialization/v4l2_control_info_list.cpp

Patch

diff --git a/test/serialization/meson.build b/test/serialization/meson.build
index 65ecdf2cf249..5cb25b39583b 100644
--- a/test/serialization/meson.build
+++ b/test/serialization/meson.build
@@ -2,6 +2,7 @@  serialization_tests = [
     [ 'control_list',              'control_list.cpp' ],
     [ 'control_info_list',         'control_info_list.cpp' ],
     [ 'v4l2_control_list',         'v4l2_control_list.cpp' ],
+    [ 'v4l2_control_info_list',    'v4l2_control_info_list.cpp' ],
 ]
 
 foreach t : serialization_tests
diff --git a/test/serialization/v4l2_control_info_list.cpp b/test/serialization/v4l2_control_info_list.cpp
new file mode 100644
index 000000000000..60ee9e43561b
--- /dev/null
+++ b/test/serialization/v4l2_control_info_list.cpp
@@ -0,0 +1,107 @@ 
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (C) 2019, Google Inc.
+ *
+ * v4l2_control_info_list.cpp - Serialize and de-serialize a list of v4l2
+ *				control info
+ */
+
+#include <iostream>
+
+#include <libcamera/camera.h>
+#include <libcamera/camera_manager.h>
+#include <libcamera/controls.h>
+
+#include "device_enumerator.h"
+#include "media_device.h"
+#include "serializer.h"
+#include "test.h"
+#include "v4l2_subdevice.h"
+
+#include "serialization_test.h"
+
+using namespace std;
+using namespace libcamera;
+
+class V4L2ControlInfoListSerializeTest : public SerializationTest
+{
+public:
+	V4L2ControlInfoListSerializeTest()
+		: SerializationTest()
+	{
+	}
+
+private:
+	void initValidationMatrix()
+	{
+		const V4L2ControlInfoMap &controls = sensor_->controls();
+
+		unsigned int i = 0;
+		for (const auto &ctrl : controls) {
+			unsigned int v4l2Id = ctrl.first;
+			const V4L2ControlInfo &info = ctrl.second;
+
+			infoValidationMatrix[i][INFO_CTRL_ID] = v4l2Id;
+			infoValidationMatrix[i][INFO_CTRL_MIN] = info.min().getInt();
+			infoValidationMatrix[i][INFO_CTRL_MAX] = info.max().getInt();
+			infoValidationMatrix[i][INFO_CTRL_FLAG] = 0;
+
+			numCtrls_++;
+			i++;
+		}
+	}
+
+	int init()
+	{
+		int ret = SerializationTest::init();
+		if (ret != TestPass)
+			return ret;
+
+		ret = initSubdevice();
+		if (ret < 0)
+			return ret;
+
+		initValidationMatrix();
+
+		return TestPass;
+	}
+
+	int run()
+	{
+		const V4L2ControlInfoMap &controls = sensor_->controls();
+
+		std::unique_ptr<DataBlob> blob = controls.serialize();
+		if (!blob) {
+			cerr << "Failed to serialize the control info" << endl;
+			return TestFail;
+		}
+
+		int ret = validateInfoBlobSize(blob.get());
+		if (ret != TestPass)
+			return ret;
+
+		/* Validate each serialized data info. */
+		uint8_t *b = blob->data();
+		for (unsigned int i = 0; i < numCtrls_; ++i) {
+			if (!validateInfoBlob(b))
+				return TestFail;
+
+			b += INFO_BLOB_SIZE;
+		}
+
+		/* De-serialize a control info list and re-validate it. */
+		V4L2ControlInfoMap newInfoMap;
+		newInfoMap.deserialize(blob->data(), blob->size());
+		for (auto it : newInfoMap) {
+			unsigned int id = it.first;
+			V4L2ControlInfo &info = it.second;
+
+			if (!validateInfoValue(id, info))
+				return TestFail;
+		}
+
+		return TestPass;
+	}
+};
+
+TEST_REGISTER(V4L2ControlInfoListSerializeTest)