From patchwork Tue Sep 24 17:24:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2014 Return-Path: Received: from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net [217.70.183.195]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 170A16237C for ; Tue, 24 Sep 2019 19:23:38 +0200 (CEST) X-Originating-IP: 213.45.248.89 Received: from uno.homenet.telecomitalia.it (host89-248-dynamic.45-213-r.retail.telecomitalia.it [213.45.248.89]) (Authenticated sender: jacopo@jmondi.org) by relay3-d.mail.gandi.net (Postfix) with ESMTPSA id B148A60006 for ; Tue, 24 Sep 2019 17:23:37 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Tue, 24 Sep 2019 19:24:57 +0200 Message-Id: <20190924172503.30864-16-jacopo@jmondi.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190924172503.30864-1-jacopo@jmondi.org> References: <20190924172503.30864-1-jacopo@jmondi.org> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 15/21] test: serialization: Add V4L2ControlInfoList serialization test X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 24 Sep 2019 17:23:38 -0000 Add test to serialize and de-serialize a V4L2ControlInfoList. Signed-off-by: Jacopo Mondi --- 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 + +#include +#include +#include + +#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 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)