From patchwork Fri Nov 8 20:54:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 2311 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id CA96D6153D for ; Fri, 8 Nov 2019 21:54:27 +0100 (CET) Received: from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi [81.175.216.236]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 776C331D for ; Fri, 8 Nov 2019 21:54:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1573246467; bh=/o4v3ajYRaJ6lHjiWSB9hct6HF2EVFD4F9/qXSXbj9E=; h=From:To:Subject:Date:In-Reply-To:References:From; b=i6/pLUgwJTlrVd+hnKXbhNRLFhSMRvEapF9SHjiXd+Y8W1UoB1S5xcNFsTJRsJeQi Ca12lBScA1o+kI2x/Fy0QnOXqo4bUdOik5LUxfIJP2mLtAvrI5+emhF9ZoBcrMhv6s XO3cUw/f3JjYdX7Def6h0jJWP2YifluBhzfLtZvE= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Fri, 8 Nov 2019 22:54:00 +0200 Message-Id: <20191108205409.18845-16-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191108205409.18845-1-laurent.pinchart@ideasonboard.com> References: <20191108205409.18845-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 15/24] test: Add ByteStreamBuffer 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: Fri, 08 Nov 2019 20:54:29 -0000 The test exercises the API of the ByteStreamBuffer class in both read and write modes, including carve out buffers. Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- test/byte-stream-buffer.cpp | 172 ++++++++++++++++++++++++++++++++++++ test/meson.build | 1 + 2 files changed, 173 insertions(+) create mode 100644 test/byte-stream-buffer.cpp diff --git a/test/byte-stream-buffer.cpp b/test/byte-stream-buffer.cpp new file mode 100644 index 000000000000..bc1d462ebf6f --- /dev/null +++ b/test/byte-stream-buffer.cpp @@ -0,0 +1,172 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2018, Google Inc. + * + * byte_stream_buffer.cpp - ByteStreamBuffer tests + */ + +#include +#include + +#include "byte_stream_buffer.h" +#include "test.h" + +using namespace std; +using namespace libcamera; + +class ByteStreamBufferTest : public Test +{ +protected: + int run() + { + std::array data; + unsigned int i; + uint32_t value; + int ret; + + /* + * Write mode. + */ + ByteStreamBuffer wbuf(data.data(), data.size()); + + if (wbuf.base() != data.data() || wbuf.size() != data.size() || + wbuf.offset() != 0 || wbuf.overflow()) { + cerr << "Write buffer incorrectly constructed" << endl; + return TestFail; + } + + /* Test write. */ + value = 0x12345678; + ret = wbuf.write(&value); + if (ret || wbuf.offset() != 4 || wbuf.overflow() || + *reinterpret_cast(data.data()) != 0x12345678) { + cerr << "Write failed on write buffer" << endl; + return TestFail; + } + + /* Test write carve out. */ + ByteStreamBuffer wco = wbuf.carveOut(10); + if (wco.base() != wbuf.base() + 4 || wco.size() != 10 || + wco.offset() != 0 || wco.overflow() || wbuf.offset() != 14 || + wbuf.overflow()) { + cerr << "Carving out write buffer failed" << endl; + return TestFail; + } + + /* Test write on the carved out buffer. */ + value = 0x87654321; + ret = wco.write(&value); + if (ret || wco.offset() != 4 || wco.overflow() || + *reinterpret_cast(data.data() + 4) != 0x87654321) { + cerr << "Write failed on carve out buffer" << endl; + return TestFail; + } + + if (wbuf.offset() != 14 || wbuf.overflow()) { + cerr << "Write on carve out buffer modified write buffer" << endl; + return TestFail; + } + + /* Test read, this should fail. */ + ret = wbuf.read(&value); + if (!ret || wbuf.overflow()) { + cerr << "Read should fail on write buffer" << endl; + return TestFail; + } + + /* Test overflow on carved out buffer. */ + for (i = 0; i < 2; ++i) { + ret = wco.write(&value); + if (ret < 0) + break; + } + + if (i != 1 || !wco.overflow() || !wbuf.overflow()) { + cerr << "Write on carve out buffer failed to overflow" << endl; + return TestFail; + } + + /* Test reinitialization of the buffer. */ + wbuf = ByteStreamBuffer(data.data(), data.size()); + if (wbuf.overflow() || wbuf.base() != data.data() || + wbuf.offset() != 0) { + cerr << "Write buffer reinitialization failed" << endl; + return TestFail; + } + + /* + * Read mode. + */ + ByteStreamBuffer rbuf(const_cast(data.data()), + data.size()); + + if (rbuf.base() != data.data() || rbuf.size() != data.size() || + rbuf.offset() != 0 || rbuf.overflow()) { + cerr << "Read buffer incorrectly constructed" << endl; + return TestFail; + } + + /* Test read. */ + value = 0; + ret = rbuf.read(&value); + if (ret || rbuf.offset() != 4 || rbuf.overflow() || + value != 0x12345678) { + cerr << "Write failed on write buffer" << endl; + return TestFail; + } + + /* Test read carve out. */ + ByteStreamBuffer rco = rbuf.carveOut(10); + if (rco.base() != rbuf.base() + 4 || rco.size() != 10 || + rco.offset() != 0 || rco.overflow() || rbuf.offset() != 14 || + rbuf.overflow()) { + cerr << "Carving out read buffer failed" << endl; + return TestFail; + } + + /* Test read on the carved out buffer. */ + value = 0; + ret = rco.read(&value); + if (ret || rco.offset() != 4 || rco.overflow() || value != 0x87654321) { + cerr << "Read failed on carve out buffer" << endl; + return TestFail; + } + + if (rbuf.offset() != 14 || rbuf.overflow()) { + cerr << "Read on carve out buffer modified read buffer" << endl; + return TestFail; + } + + /* Test write, this should fail. */ + ret = rbuf.write(&value); + if (!ret || rbuf.overflow()) { + cerr << "Write should fail on read buffer" << endl; + return TestFail; + } + + /* Test overflow on carved out buffer. */ + for (i = 0; i < 2; ++i) { + ret = rco.read(&value); + if (ret < 0) + break; + } + + if (i != 1 || !rco.overflow() || !rbuf.overflow()) { + cerr << "Read on carve out buffer failed to overflow" << endl; + return TestFail; + } + + /* Test reinitialization of the buffer. */ + rbuf = ByteStreamBuffer(const_cast(data.data()), + data.size()); + if (rbuf.overflow() || rbuf.base() != data.data() || + rbuf.offset() != 0) { + cerr << "Read buffer reinitialization failed" << endl; + return TestFail; + } + + return TestPass; + } +}; + +TEST_REGISTER(ByteStreamBufferTest) diff --git a/test/meson.build b/test/meson.build index cf5eb84d20b2..adb5b29e69f3 100644 --- a/test/meson.build +++ b/test/meson.build @@ -19,6 +19,7 @@ public_tests = [ ] internal_tests = [ + ['byte-stream-buffer', 'byte-stream-buffer.cpp'], ['camera-sensor', 'camera-sensor.cpp'], ['event', 'event.cpp'], ['event-dispatcher', 'event-dispatcher.cpp'],