From patchwork Tue Sep 24 17:24:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 2013 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 8B54A62378 for ; Tue, 24 Sep 2019 19:23:37 +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 2C82760006 for ; Tue, 24 Sep 2019 17:23:36 +0000 (UTC) From: Jacopo Mondi To: libcamera-devel@lists.libcamera.org Date: Tue, 24 Sep 2019 19:24:56 +0200 Message-Id: <20190924172503.30864-15-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 14/21] test: serialization: Add V4L2ControlList 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:37 -0000 Add test to serialize and de-serialize a V4L2ControlList. Signed-off-by: Jacopo Mondi --- test/serialization/meson.build | 1 + test/serialization/v4l2_control_list.cpp | 114 +++++++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 test/serialization/v4l2_control_list.cpp diff --git a/test/serialization/meson.build b/test/serialization/meson.build index 510bd8c30d38..65ecdf2cf249 100644 --- a/test/serialization/meson.build +++ b/test/serialization/meson.build @@ -1,6 +1,7 @@ serialization_tests = [ [ 'control_list', 'control_list.cpp' ], [ 'control_info_list', 'control_info_list.cpp' ], + [ 'v4l2_control_list', 'v4l2_control_list.cpp' ], ] foreach t : serialization_tests diff --git a/test/serialization/v4l2_control_list.cpp b/test/serialization/v4l2_control_list.cpp new file mode 100644 index 000000000000..338ca4dadc78 --- /dev/null +++ b/test/serialization/v4l2_control_list.cpp @@ -0,0 +1,114 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * v4l2_control_list.cpp - Serialize and de-serialize a list of v4l2 controls + */ + +#include + +#include +#include +#include + +#include "test.h" +#include "serializer.h" +#include "serialization_test.h" +#include "v4l2_controls.h" + +using namespace std; +using namespace libcamera; + +class V4L2ControlListSerializeTest : public SerializationTest +{ +private: + void initializeValidationMatrix() + { + valueValidationMatrix[0][0] = V4L2_CID_SATURATION; + valueValidationMatrix[0][1] = DataTypeInteger; + valueValidationMatrix[0][2] = 8; + valueValidationMatrix[0][3] = 50; + valueValidationMatrix[0][4] = false; + valueValidationMatrix[1][0] = V4L2_CID_CONTRAST; + valueValidationMatrix[1][1] = DataTypeInteger; + valueValidationMatrix[1][2] = 8; + valueValidationMatrix[1][3] = 128; + valueValidationMatrix[1][4] = false; + valueValidationMatrix[2][0] = V4L2_CID_BRIGHTNESS; + valueValidationMatrix[2][1] = DataTypeInteger; + valueValidationMatrix[2][2] = 8; + valueValidationMatrix[2][3] = 255; + valueValidationMatrix[2][4] = false; + + numCtrls_ = 3; + } + + int init() + { + int ret = SerializationTest::init(); + if (ret != TestPass) + return ret; + + ret = initSubdevice(); + if (ret < 0) + return ret; + + return TestPass; + } + + int run() + { + V4L2ControlList controls; + + controls.add(V4L2_CID_BRIGHTNESS, 255); + controls.add(V4L2_CID_CONTRAST, 128); + controls.add(V4L2_CID_SATURATION, 50); + + int ret = sensor_->setControls(&controls); + if (ret) { + cerr << "Failed to set controls" << endl; + return ret; + } + + initializeValidationMatrix(); + + /* Serialize and verify the produced blob size. */ + std::unique_ptr blob = controls.serialize(); + if (!blob) { + cerr << "Failed to serialize the control list" << endl; + return TestFail; + } + + ret = validateValueBlobSize(blob.get()); + if (ret) + return ret; + + /* Validate each serialized data value. */ + uint8_t *b = blob->data(); + for (unsigned int i = 0; i < numCtrls_; ++i) { + if (!validateValueBlob(b)) + return TestFail; + + b += VALUE_BLOB_SIZE; + } + + /* De-serialize a control list and re-validate it. */ + V4L2ControlList newList; + newList.deserialize(blob->data(), blob->size()); + for (auto it : newList) { + if (!validateDataValue(it.id(), it)) + return TestFail; + } + + /* Does it still work when re-applied to a subdevice? */ + ret = sensor_->setControls(&newList); + if (ret) { + cerr << "Failed to set controls" << endl; + return ret; + } + + return TestPass; + } +}; + +TEST_REGISTER(V4L2ControlListSerializeTest)