2 * Copyright (c) 2000-2020 Samsung Electronics Co., Ltd. All rights reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
17 * @file test_comm-manager.cpp
18 * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
22 #include <boost_macros_wrapper.h>
23 #include <boost/test/results_reporter.hpp>
24 #include <communication-manager.h>
31 explicit MessageA(int ai) : i(ai) {}
36 explicit MessageB(char ac) : c(ac) {}
41 explicit MessageC(const std::string &astr) : str(astr) {}
48 void Handle(const MessageA &msg)
53 void Handle(const MessageC &msg)
62 } // namespace anonymous
64 BOOST_AUTO_TEST_SUITE(MESSAGE_MANAGER_TEST)
66 POSITIVE_TEST_CASE(TMM_0010_NoListener)
68 CKM::CommunicationManager<MessageA> mgr;
69 BOOST_REQUIRE_MESSAGE(0 == mgr.SendMessage(MessageA(22)),
70 "There should be no listener.");
73 POSITIVE_TEST_CASE(TMM_0020_Basic)
75 CKM::CommunicationManager<MessageA> mgr;
77 mgr.Register<MessageA>([&](const MessageA & msg) {
80 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageA(4)), "No listener found");
81 BOOST_REQUIRE_MESSAGE(received != 0, "Message not received");
82 BOOST_REQUIRE_MESSAGE(received == 4, "Wrong message received i=" << received);
85 POSITIVE_TEST_CASE(TMM_0030_MultipleMessages)
87 CKM::CommunicationManager<MessageA, MessageB> mgr;
90 mgr.Register<MessageA>([&](const MessageA & msg) {
93 mgr.Register<MessageB>([&](const MessageB & msg) {
96 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageB('c')), "No listener found");
97 BOOST_REQUIRE_MESSAGE(reci == 0, "Unexpected message received");
98 BOOST_REQUIRE_MESSAGE(recc != 0, "Message not received");
99 BOOST_REQUIRE_MESSAGE(recc == 'c', "Wrong message received c=" << recc);
101 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageA(42)), "No listener found");
102 BOOST_REQUIRE_MESSAGE(reci != 0, "Message not received");
103 BOOST_REQUIRE_MESSAGE(reci == 42, "Wrong message received i=" << reci);
104 BOOST_REQUIRE_MESSAGE(recc == 'c', "Previous message overwritten c=" << recc);
107 POSITIVE_TEST_CASE(TMM_0040_Listener)
109 CKM::CommunicationManager<MessageA, MessageB, MessageC> mgr;
111 mgr.Register<MessageC>([&](const MessageC & msg) {
114 mgr.Register<MessageA>([&](const MessageA & msg) {
118 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageC("lorem ipsum")),
119 "No listener found");
120 BOOST_REQUIRE_MESSAGE(l.i == 0, "Unexpected message received");
121 BOOST_REQUIRE_MESSAGE(!l.str.empty(), "Message not received");
122 BOOST_REQUIRE_MESSAGE(l.str == "lorem ipsum",
123 "Wrong message received c=" << l.str);
125 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageA(3)), "No listener found");
126 BOOST_REQUIRE_MESSAGE(l.i != 0, "Message not received");
127 BOOST_REQUIRE_MESSAGE(l.i == 3, "Wrong message received i=" << l.i);
128 BOOST_REQUIRE_MESSAGE(l.str == "lorem ipsum",
129 "Previous message overwritten str=" << l.str);
132 POSITIVE_TEST_CASE(TMM_0050_2Listeners)
134 CKM::CommunicationManager<MessageA> mgr;
138 mgr.Register<MessageA>([&](const MessageA & msg) {
139 BOOST_REQUIRE_MESSAGE(msg.i == 5, "Unexpected message received i=" << msg.i);
142 mgr.Register<MessageA>([&](const MessageA & msg) {
143 BOOST_REQUIRE_MESSAGE(msg.i == 5, "Unexpected message received i=" << msg.i);
147 BOOST_REQUIRE_MESSAGE(2 == mgr.SendMessage(MessageA(5)), "No listener found");
148 BOOST_REQUIRE_MESSAGE(called[0], "First listener not called");
149 BOOST_REQUIRE_MESSAGE(called[1], "Second listener not called");
152 POSITIVE_TEST_CASE(TMM_0060_Stress)
154 CKM::CommunicationManager<MessageA, MessageB, MessageC> mgr;
156 std::default_random_engine generator(
157 std::chrono::system_clock::now().time_since_epoch().count());
158 std::uniform_int_distribution<size_t> message_dist(0, 2);
159 std::uniform_int_distribution<size_t> count_dist(1, 10);
164 mgr.Register<MessageA>([&](const MessageA & msg) {
165 BOOST_REQUIRE_MESSAGE(msg.i == 42, "Wrong message: " << msg.i);
168 mgr.Register<MessageB>([&](const MessageB & msg) {
169 BOOST_REQUIRE_MESSAGE(msg.c == 'c', "Wrong message: " << msg.c);
172 mgr.Register<MessageC>([&](const MessageC & msg) {
173 BOOST_REQUIRE_MESSAGE(msg.str == "lorem ipsum", "Wrong message: " << msg.str);
177 for (size_t i = 0; i < 1000; i++) {
178 size_t cnt = count_dist(generator);
180 for (size_t s = 0; s < cnt; s++) {
181 switch (message_dist(generator)) {
183 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageA(42)), "No listener found");
188 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageB('c')), "No listener found");
193 BOOST_REQUIRE_MESSAGE(1 == mgr.SendMessage(MessageC("lorem ipsum")),
194 "No listener found");
199 BOOST_FAIL("Unexpected message type");
204 BOOST_REQUIRE_MESSAGE(a == 0, "Unexpected number of MessageA: " << a);
205 BOOST_REQUIRE_MESSAGE(b == 0, "Unexpected number of MessageB: " << b);
206 BOOST_REQUIRE_MESSAGE(c == 0, "Unexpected number of MessageC: " << c);
209 BOOST_AUTO_TEST_SUITE_END()