[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