[libcamera-devel] [PATCH 15/21] test: serialization: Add V4L2ControlInfoList serialization test
Jacopo Mondi
jacopo at jmondi.org
Tue Sep 24 19:24:57 CEST 2019
Add test to serialize and de-serialize a V4L2ControlInfoList.
Signed-off-by: Jacopo Mondi <jacopo at 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
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)
--
2.23.0
More information about the libcamera-devel
mailing list