[libcamera-devel] [PATCH 09/11] test: Add signal/slot test
Niklas Söderlund
niklas.soderlund at ragnatech.se
Sun Jan 6 17:29:33 CET 2019
Hi Laurent,
Thanks for your patch.
On 2019-01-06 04:33:26 +0200, Laurent Pinchart wrote:
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Really nice test cases which really helps in reviewing the
implementation, nice work!
For this and the other test patches in this series
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
> test/meson.build | 1 +
> test/signal.cpp | 149 +++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 150 insertions(+)
> create mode 100644 test/signal.cpp
>
> diff --git a/test/meson.build b/test/meson.build
> index 638e8d51c131..4d334025f3d3 100644
> --- a/test/meson.build
> +++ b/test/meson.build
> @@ -4,6 +4,7 @@ subdir('media_device')
>
> public_tests = [
> ['list-cameras', 'list.cpp'],
> + ['signal', 'signal.cpp'],
> ]
>
> internal_tests = [
> diff --git a/test/signal.cpp b/test/signal.cpp
> new file mode 100644
> index 000000000000..5d96958c6d4c
> --- /dev/null
> +++ b/test/signal.cpp
> @@ -0,0 +1,149 @@
> +/* SPDX-License-Identifier: GPL-2.0-or-later */
> +/*
> + * Copyright (C) 2019, Google Inc.
> + *
> + * signal.cpp - Signal test
> + */
> +
> +#include <iostream>
> +#include <string.h>
> +
> +#include <libcamera/signal.h>
> +
> +#include "test.h"
> +
> +using namespace std;
> +using namespace libcamera;
> +
> +class SignalTest : public Test
> +{
> +protected:
> + void slotVoid()
> + {
> + called_ = true;
> + }
> +
> + void slotDisconnect()
> + {
> + called_ = true;
> + signalVoid_.disconnect(this, &SignalTest::slotDisconnect);
> + }
> +
> + void slotInteger1(int value)
> + {
> + values_[0] = value;
> + }
> +
> + void slotInteger2(int value)
> + {
> + values_[1] = value;
> + }
> +
> + void slotMultiArgs(int value, const std::string &name)
> + {
> + values_[2] = value;
> + name_ = name;
> + }
> +
> + int init()
> + {
> + return 0;
> + }
> +
> + int run()
> + {
> + /* Test signal emission and reception. */
> + called_ = false;
> + signalVoid_.connect(this, &SignalTest::slotVoid);
> + signalVoid_.emit();
> +
> + if (!called_) {
> + cout << "Signal emission test failed" << endl;
> + return TestFail;
> + }
> +
> + /* Test signal with parameters. */
> + values_[2] = 0;
> + name_.clear();
> + signalMultiArgs_.connect(this, &SignalTest::slotMultiArgs);
> + signalMultiArgs_.emit(42, "H2G2");
> +
> + if (values_[2] != 42 || name_ != "H2G2") {
> + cout << "Signal parameters test failed" << endl;
> + return TestFail;
> + }
> +
> + /* Test signal connected to multiple slots. */
> + memset(values_, 0, sizeof(values_));
> + signalInt_.connect(this, &SignalTest::slotInteger1);
> + signalInt_.connect(this, &SignalTest::slotInteger2);
> + signalInt_.emit(42);
> +
> + if (values_[0] != 42 || values_[1] != 42 || values_[2] != 0) {
> + cout << "Signal multi slot test failed" << endl;
> + return TestFail;
> + }
> +
> + /* Test disconnection of a single slot. */
> + memset(values_, 0, sizeof(values_));
> + signalInt_.disconnect(this, &SignalTest::slotInteger2);
> + signalInt_.emit(42);
> +
> + if (values_[0] != 42 || values_[1] != 0 || values_[2] != 0) {
> + cout << "Signal slot disconnection test failed" << endl;
> + return TestFail;
> + }
> +
> + /* Test disconnection of a whole object. */
> + memset(values_, 0, sizeof(values_));
> + signalInt_.disconnect(this);
> + signalInt_.emit(42);
> +
> + if (values_[0] != 0 || values_[1] != 0 || values_[2] != 0) {
> + cout << "Signal object disconnection test failed" << endl;
> + return TestFail;
> + }
> +
> + /* Test disconnection of a whole signal. */
> + memset(values_, 0, sizeof(values_));
> + signalInt_.connect(this, &SignalTest::slotInteger1);
> + signalInt_.connect(this, &SignalTest::slotInteger2);
> + signalInt_.disconnect();
> + signalInt_.emit(42);
> +
> + if (values_[0] != 0 || values_[1] != 0 || values_[2] != 0) {
> + cout << "Signal object disconnection test failed" << endl;
> + return TestFail;
> + }
> +
> + /* Test disconnection from slot. */
> + signalVoid_.disconnect();
> + signalVoid_.connect(this, &SignalTest::slotDisconnect);
> +
> + signalVoid_.emit();
> + called_ = false;
> + signalVoid_.emit();
> +
> + if (called_) {
> + cout << "Signal disconnection from slot test failed" << endl;
> + return TestFail;
> + }
> +
> + return TestPass;
> + }
> +
> + void cleanup()
> + {
> + }
> +
> +private:
> + Signal<> signalVoid_;
> + Signal<int> signalInt_;
> + Signal<int, const std::string &> signalMultiArgs_;
> +
> + bool called_;
> + int values_[3];
> + std::string name_;
> +};
> +
> +TEST_REGISTER(SignalTest)
> --
> 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