From patchwork Mon Jan 7 23:11:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 172 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 2B17760B41 for ; Tue, 8 Jan 2019 00:10:51 +0100 (CET) Received: from avalon.bb.dnainternet.fi (dfj612ybrt5fhg77mgycy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:2e86:4862:ef6a:2804]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 755D7E51 for ; Tue, 8 Jan 2019 00:10:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1546902650; bh=IU6XMvY5UCWwLLrR458LSJmrgzXqYmdrBFGJZp+ZtZQ=; h=From:To:Subject:Date:In-Reply-To:References:From; b=H+MPVXaHzh/eIno7+hctn+RcZsgLhZem3jw4N3/OkhEFkAnZld6rfpey2vQFJsdBb wijjTJoT6tj76GsjFkSohty9E6n2yFF+L6hsr2ZDCU+/nzDw8VYnuqiI2LDaeMKvwP Bt8GkoYSDg96jq07Of/Wc+Jmewg9abodDYmq5Tkg= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Tue, 8 Jan 2019 01:11:49 +0200 Message-Id: <20190107231151.23291-10-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190107231151.23291-1-laurent.pinchart@ideasonboard.com> References: <20190107231151.23291-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 09/11] test: Add signal/slot test X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Jan 2019 23:10:51 -0000 Signed-off-by: Laurent Pinchart Reviewed-by: Niklas Söderlund --- test/meson.build | 1 + test/signal.cpp | 159 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 test/signal.cpp diff --git a/test/meson.build b/test/meson.build index 30350d2219a1..4000bd51808a 100644 --- a/test/meson.build +++ b/test/meson.build @@ -4,6 +4,7 @@ subdir('media_device') public_tests = [ ['list-cameras', 'list-cameras.cpp'], + ['signal', 'signal.cpp'], ] internal_tests = [ diff --git a/test/signal.cpp b/test/signal.cpp new file mode 100644 index 000000000000..ab69ca1b663d --- /dev/null +++ b/test/signal.cpp @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2019, Google Inc. + * + * signal.cpp - Signal test + */ + +#include +#include + +#include + +#include "test.h" + +using namespace std; +using namespace libcamera; + +static int valueStatic_ = 0; + +static void slotStatic(int value) +{ + valueStatic_ = value; +} + +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_)); + valueStatic_ = 0; + signalInt_.connect(this, &SignalTest::slotInteger1); + signalInt_.connect(this, &SignalTest::slotInteger2); + signalInt_.connect(&slotStatic); + signalInt_.emit(42); + + if (values_[0] != 42 || values_[1] != 42 || values_[2] != 0 || + valueStatic_ != 42) { + 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 signalInt_; + Signal signalMultiArgs_; + + bool called_; + int values_[3]; + std::string name_; +}; + +TEST_REGISTER(SignalTest)