[libcamera-devel] [PATCH v2 15/24] test: Add ByteStreamBuffer test
Niklas Söderlund
niklas.soderlund at ragnatech.se
Mon Nov 18 19:18:33 CET 2019
Hi Laurent,
Thanks for your work.
On 2019-11-08 22:54:00 +0200, Laurent Pinchart wrote:
> The test exercises the API of the ByteStreamBuffer class in both read
> and write modes, including carve out buffers.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> 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 <array>
> +#include <iostream>
> +
> +#include "byte_stream_buffer.h"
> +#include "test.h"
> +
> +using namespace std;
> +using namespace libcamera;
> +
> +class ByteStreamBufferTest : public Test
> +{
> +protected:
> + int run()
> + {
> + std::array<uint8_t, 100> 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<uint32_t *>(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<uint32_t *>(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<const uint8_t *>(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<const uint8_t *>(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'],
> --
> Regards,
>
> Laurent Pinchart
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list