2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Jan Olszak <j.olszak@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
22 * @author Jan Olszak (j.olszak@samsung.com)
23 * @brief Tests of the IPC
26 // TODO: Test connection limit
27 // TODO: Refactor tests - function for setting up env
33 #include "ipc/service.hpp"
34 #include "ipc/client.hpp"
35 #include "ipc/types.hpp"
36 #include "ipc/result.hpp"
37 #include "ipc/epoll/thread-dispatcher.hpp"
38 #include "ipc/epoll/glib-dispatcher.hpp"
39 #include "utils/glib-loop.hpp"
40 #include "utils/latch.hpp"
41 #include "utils/value-latch.hpp"
42 #include "utils/scoped-dir.hpp"
44 #include "config/fields.hpp"
45 #include "logger/logger.hpp"
55 using namespace epoll;
56 using namespace utils;
57 using namespace std::placeholders;
59 // Timeout for sending one message
60 const int TIMEOUT = 1000 /*ms*/;
62 // Time that won't cause "TIMEOUT" methods to throw
63 const int SHORT_OPERATION_TIME = TIMEOUT / 100;
65 // Time that will cause "TIMEOUT" methods to throw
66 const int LONG_OPERATION_TIME = 1000 + TIMEOUT;
68 const std::string TEST_DIR = "/tmp/ut-ipc";
69 const std::string SOCKET_PATH = TEST_DIR + "/test.socket";
72 ScopedDir mTestPathGuard;
75 : mTestPathGuard(TEST_DIR)
80 struct ThreadedFixture : FixtureBase {
81 ThreadDispatcher dispatcher;
83 EventPoll& getPoll() { return dispatcher.getPoll(); }
86 struct GlibFixture : FixtureBase {
87 ScopedGlibLoop glibLoop;
88 GlibDispatcher dispatcher;
90 EventPoll& getPoll() { return dispatcher.getPoll(); }
95 SendData(int i): intVal(i) {}
105 RecvData(): intVal(-1) {}
113 struct LongSendData {
114 LongSendData(int i, int waitTime): mSendData(i), mWaitTime(waitTime), intVal(i) {}
116 template<typename Visitor>
117 void accept(Visitor visitor)
119 std::this_thread::sleep_for(std::chrono::milliseconds(mWaitTime));
120 mSendData.accept(visitor);
122 template<typename Visitor>
123 void accept(Visitor visitor) const
125 std::this_thread::sleep_for(std::chrono::milliseconds(mWaitTime));
126 mSendData.accept(visitor);
135 CONFIG_REGISTER_EMPTY
138 struct ThrowOnAcceptData {
139 template<typename Visitor>
142 throw std::runtime_error("intentional failure in accept");
144 template<typename Visitor>
145 void accept(Visitor) const
147 throw std::runtime_error("intentional failure in accept const");
151 void returnEmptyCallback(const PeerID,
152 std::shared_ptr<EmptyData>&,
153 MethodResult::Pointer methodResult)
155 methodResult->setVoid();
158 void returnDataCallback(const PeerID,
159 std::shared_ptr<RecvData>&,
160 MethodResult::Pointer methodResult)
162 auto returnData = std::make_shared<SendData>(1);
163 methodResult->set(returnData);
166 void echoCallback(const PeerID,
167 std::shared_ptr<RecvData>& data,
168 MethodResult::Pointer methodResult)
170 auto returnData = std::make_shared<SendData>(data->intVal);
171 methodResult->set(returnData);
174 void longEchoCallback(const PeerID,
175 std::shared_ptr<RecvData>& data,
176 MethodResult::Pointer methodResult)
178 std::this_thread::sleep_for(std::chrono::milliseconds(LONG_OPERATION_TIME));
179 auto returnData = std::make_shared<SendData>(data->intVal);
180 methodResult->set(returnData);
183 void shortEchoCallback(const PeerID,
184 std::shared_ptr<RecvData>& data,
185 MethodResult::Pointer methodResult)
187 std::this_thread::sleep_for(std::chrono::milliseconds(SHORT_OPERATION_TIME));
188 auto returnData = std::make_shared<SendData>(data->intVal);
189 methodResult->set(returnData);
192 PeerID connect(Service& s, Client& c)
194 // Connects the Client to the Service and returns Clients PeerID
195 ValueLatch<PeerID> peerIDLatch;
196 auto newPeerCallback = [&peerIDLatch](const PeerID newID, const FileDescriptor) {
197 peerIDLatch.set(newID);
200 s.setNewPeerCallback(newPeerCallback);
202 if (!s.isStarted()) {
208 PeerID peerID = peerIDLatch.get(TIMEOUT);
209 s.setNewPeerCallback(nullptr);
210 BOOST_REQUIRE_NE(peerID, 0);
214 void testEcho(Client& c, const MethodID methodID)
216 std::shared_ptr<SendData> sentData(new SendData(34));
217 std::shared_ptr<RecvData> recvData = c.callSync<SendData, RecvData>(methodID, sentData, TIMEOUT);
218 BOOST_REQUIRE(recvData);
219 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
222 void testEcho(Service& s, const MethodID methodID, const PeerID peerID)
224 std::shared_ptr<SendData> sentData(new SendData(56));
225 std::shared_ptr<RecvData> recvData = s.callSync<SendData, RecvData>(methodID, peerID, sentData, TIMEOUT);
226 BOOST_REQUIRE(recvData);
227 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
230 BOOST_AUTO_TEST_SUITE(IPCSuite)
232 MULTI_FIXTURE_TEST_CASE(ConstructorDestructor, F, ThreadedFixture, GlibFixture)
234 Service s(F::getPoll(), SOCKET_PATH);
235 Client c(F::getPoll(), SOCKET_PATH);
238 MULTI_FIXTURE_TEST_CASE(ServiceAddRemoveMethod, F, ThreadedFixture, GlibFixture)
240 Service s(F::getPoll(), SOCKET_PATH);
241 s.setMethodHandler<EmptyData, EmptyData>(1, returnEmptyCallback);
242 s.setMethodHandler<SendData, RecvData>(1, returnDataCallback);
246 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
247 s.setMethodHandler<SendData, RecvData>(2, returnDataCallback);
249 Client c(F::getPoll(), SOCKET_PATH);
256 BOOST_CHECK_THROW(testEcho(c, 2), IPCException);
259 MULTI_FIXTURE_TEST_CASE(ClientAddRemoveMethod, F, ThreadedFixture, GlibFixture)
261 Service s(F::getPoll(), SOCKET_PATH);
262 Client c(F::getPoll(), SOCKET_PATH);
263 c.setMethodHandler<EmptyData, EmptyData>(1, returnEmptyCallback);
264 c.setMethodHandler<SendData, RecvData>(1, returnDataCallback);
266 PeerID peerID = connect(s, c);
268 c.setMethodHandler<SendData, RecvData>(1, echoCallback);
269 c.setMethodHandler<SendData, RecvData>(2, returnDataCallback);
271 testEcho(s, 1, peerID);
276 BOOST_CHECK_THROW(testEcho(s, 1, peerID), IPCException);
279 MULTI_FIXTURE_TEST_CASE(ServiceStartStop, F, ThreadedFixture, GlibFixture)
281 Service s(F::getPoll(), SOCKET_PATH);
283 s.setMethodHandler<SendData, RecvData>(1, returnDataCallback);
294 MULTI_FIXTURE_TEST_CASE(ClientStartStop, F, ThreadedFixture, GlibFixture)
296 Service s(F::getPoll(), SOCKET_PATH);
297 Client c(F::getPoll(), SOCKET_PATH);
298 c.setMethodHandler<SendData, RecvData>(1, returnDataCallback);
312 MULTI_FIXTURE_TEST_CASE(SyncClientToServiceEcho, F, ThreadedFixture, GlibFixture)
314 Service s(F::getPoll(), SOCKET_PATH);
315 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
316 s.setMethodHandler<SendData, RecvData>(2, echoCallback);
318 Client c(F::getPoll(), SOCKET_PATH);
325 MULTI_FIXTURE_TEST_CASE(Restart, F, ThreadedFixture, GlibFixture)
327 Service s(F::getPoll(), SOCKET_PATH);
328 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
330 s.setMethodHandler<SendData, RecvData>(2, echoCallback);
332 Client c(F::getPoll(), SOCKET_PATH);
346 BOOST_CHECK_THROW(testEcho(c, 2), IPCException);
355 MULTI_FIXTURE_TEST_CASE(SyncServiceToClientEcho, F, ThreadedFixture, GlibFixture)
357 Service s(F::getPoll(), SOCKET_PATH);
358 Client c(F::getPoll(), SOCKET_PATH);
359 c.setMethodHandler<SendData, RecvData>(1, echoCallback);
360 PeerID peerID = connect(s, c);
362 std::shared_ptr<SendData> sentData(new SendData(56));
363 std::shared_ptr<RecvData> recvData = s.callSync<SendData, RecvData>(1, peerID, sentData);
364 BOOST_REQUIRE(recvData);
365 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
368 MULTI_FIXTURE_TEST_CASE(AsyncClientToServiceEcho, F, ThreadedFixture, GlibFixture)
370 std::shared_ptr<SendData> sentData(new SendData(34));
371 ValueLatch<std::shared_ptr<RecvData>> recvDataLatch;
373 // Setup Service and Client
374 Service s(F::getPoll(), SOCKET_PATH);
375 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
377 Client c(F::getPoll(), SOCKET_PATH);
381 auto dataBack = [&recvDataLatch](Result<RecvData> && r) {
382 recvDataLatch.set(r.get());
384 c.callAsync<SendData, RecvData>(1, sentData, dataBack);
386 // Wait for the response
387 std::shared_ptr<RecvData> recvData(recvDataLatch.get(TIMEOUT));
388 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
391 MULTI_FIXTURE_TEST_CASE(AsyncServiceToClientEcho, F, ThreadedFixture, GlibFixture)
393 std::shared_ptr<SendData> sentData(new SendData(56));
394 ValueLatch<std::shared_ptr<RecvData>> recvDataLatch;
396 Service s(F::getPoll(), SOCKET_PATH);
397 Client c(F::getPoll(), SOCKET_PATH);
398 c.setMethodHandler<SendData, RecvData>(1, echoCallback);
399 PeerID peerID = connect(s, c);
402 auto dataBack = [&recvDataLatch](Result<RecvData> && r) {
403 recvDataLatch.set(r.get());
406 s.callAsync<SendData, RecvData>(1, peerID, sentData, dataBack);
408 // Wait for the response
409 std::shared_ptr<RecvData> recvData(recvDataLatch.get(TIMEOUT));
410 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
414 MULTI_FIXTURE_TEST_CASE(SyncTimeout, F, ThreadedFixture, GlibFixture)
416 Service s(F::getPoll(), SOCKET_PATH);
417 s.setMethodHandler<SendData, RecvData>(1, longEchoCallback);
419 Client c(F::getPoll(), SOCKET_PATH);
422 std::shared_ptr<SendData> sentData(new SendData(78));
423 BOOST_REQUIRE_THROW((c.callSync<SendData, RecvData>(1, sentData, TIMEOUT)), IPCException);
426 MULTI_FIXTURE_TEST_CASE(SerializationError, F, ThreadedFixture, GlibFixture)
428 Service s(F::getPoll(), SOCKET_PATH);
429 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
431 Client c(F::getPoll(), SOCKET_PATH);
434 std::shared_ptr<ThrowOnAcceptData> throwingData(new ThrowOnAcceptData());
436 BOOST_CHECK_THROW((c.callSync<ThrowOnAcceptData, RecvData>(1, throwingData)), IPCSerializationException);
440 MULTI_FIXTURE_TEST_CASE(ParseError, F, ThreadedFixture, GlibFixture)
442 Service s(F::getPoll(), SOCKET_PATH);
443 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
446 Client c(F::getPoll(), SOCKET_PATH);
449 std::shared_ptr<SendData> sentData(new SendData(78));
450 BOOST_CHECK_THROW((c.callSync<SendData, ThrowOnAcceptData>(1, sentData, 10000)), IPCParsingException);
453 MULTI_FIXTURE_TEST_CASE(DisconnectedPeerError, F, ThreadedFixture, GlibFixture)
455 ValueLatch<Result<RecvData>> retStatusLatch;
457 Service s(F::getPoll(), SOCKET_PATH);
459 auto method = [](const PeerID, std::shared_ptr<ThrowOnAcceptData>&, MethodResult::Pointer methodResult) {
460 auto resultData = std::make_shared<SendData>(1);
461 methodResult->set<SendData>(resultData);
464 // Method will throw during serialization and disconnect automatically
465 s.setMethodHandler<SendData, ThrowOnAcceptData>(1, method);
468 Client c(F::getPoll(), SOCKET_PATH);
471 auto dataBack = [&retStatusLatch](Result<RecvData> && r) {
472 retStatusLatch.set(std::move(r));
475 std::shared_ptr<SendData> sentData(new SendData(78));
476 c.callAsync<SendData, RecvData>(1, sentData, dataBack);
478 // Wait for the response
479 Result<RecvData> result = retStatusLatch.get(TIMEOUT);
481 // The disconnection might have happened:
482 // - after sending the message (PEER_DISCONNECTED)
483 // - during external serialization (SERIALIZATION_ERROR)
484 BOOST_CHECK_THROW(result.get(), IPCException);
488 MULTI_FIXTURE_TEST_CASE(ReadTimeout, F, ThreadedFixture, GlibFixture)
490 Service s(F::getPoll(), SOCKET_PATH);
491 auto longEchoCallback = [](const PeerID, std::shared_ptr<RecvData>& data, MethodResult::Pointer methodResult) {
492 auto resultData = std::make_shared<LongSendData>(data->intVal, LONG_OPERATION_TIME);
493 methodResult->set<LongSendData>(resultData);
495 s.setMethodHandler<LongSendData, RecvData>(1, longEchoCallback);
497 Client c(F::getPoll(), SOCKET_PATH);
500 // Test timeout on read
501 std::shared_ptr<SendData> sentData(new SendData(334));
502 BOOST_CHECK_THROW((c.callSync<SendData, RecvData>(1, sentData, TIMEOUT)), IPCException);
506 MULTI_FIXTURE_TEST_CASE(WriteTimeout, F, ThreadedFixture, GlibFixture)
508 Service s(F::getPoll(), SOCKET_PATH);
509 s.setMethodHandler<SendData, RecvData>(1, shortEchoCallback);
512 Client c(F::getPoll(), SOCKET_PATH);
515 // Test echo with a minimal timeout
516 std::shared_ptr<LongSendData> sentDataA(new LongSendData(34, SHORT_OPERATION_TIME));
517 std::shared_ptr<RecvData> recvData = c.callSync<LongSendData, RecvData>(1, sentDataA, TIMEOUT);
518 BOOST_REQUIRE(recvData);
519 BOOST_CHECK_EQUAL(recvData->intVal, sentDataA->intVal);
521 // Test timeout on write
522 std::shared_ptr<LongSendData> sentDataB(new LongSendData(34, LONG_OPERATION_TIME));
523 BOOST_CHECK_THROW((c.callSync<LongSendData, RecvData>(1, sentDataB, TIMEOUT)), IPCTimeoutException);
527 MULTI_FIXTURE_TEST_CASE(AddSignalInRuntime, F, ThreadedFixture, GlibFixture)
529 ValueLatch<std::shared_ptr<RecvData>> recvDataLatchA;
530 ValueLatch<std::shared_ptr<RecvData>> recvDataLatchB;
532 Service s(F::getPoll(), SOCKET_PATH);
533 Client c(F::getPoll(), SOCKET_PATH);
536 auto handlerA = [&recvDataLatchA](const PeerID, std::shared_ptr<RecvData>& data) {
537 recvDataLatchA.set(data);
540 auto handlerB = [&recvDataLatchB](const PeerID, std::shared_ptr<RecvData>& data) {
541 recvDataLatchB.set(data);
544 c.setSignalHandler<RecvData>(1, handlerA);
545 c.setSignalHandler<RecvData>(2, handlerB);
547 // Wait for the signals to propagate to the Service
548 std::this_thread::sleep_for(std::chrono::milliseconds(2 * TIMEOUT));
550 auto sendDataA = std::make_shared<SendData>(1);
551 auto sendDataB = std::make_shared<SendData>(2);
552 s.signal<SendData>(2, sendDataB);
553 s.signal<SendData>(1, sendDataA);
555 // Wait for the signals to arrive
556 std::shared_ptr<RecvData> recvDataA(recvDataLatchA.get(TIMEOUT));
557 std::shared_ptr<RecvData> recvDataB(recvDataLatchB.get(TIMEOUT));
558 BOOST_CHECK_EQUAL(recvDataA->intVal, sendDataA->intVal);
559 BOOST_CHECK_EQUAL(recvDataB->intVal, sendDataB->intVal);
563 MULTI_FIXTURE_TEST_CASE(AddSignalOffline, F, ThreadedFixture, GlibFixture)
565 ValueLatch<std::shared_ptr<RecvData>> recvDataLatchA;
566 ValueLatch<std::shared_ptr<RecvData>> recvDataLatchB;
568 Service s(F::getPoll(), SOCKET_PATH);
569 Client c(F::getPoll(), SOCKET_PATH);
571 auto handlerA = [&recvDataLatchA](const PeerID, std::shared_ptr<RecvData>& data) {
572 recvDataLatchA.set(data);
575 auto handlerB = [&recvDataLatchB](const PeerID, std::shared_ptr<RecvData>& data) {
576 recvDataLatchB.set(data);
579 c.setSignalHandler<RecvData>(1, handlerA);
580 c.setSignalHandler<RecvData>(2, handlerB);
584 // Wait for the information about the signals to propagate
585 std::this_thread::sleep_for(std::chrono::milliseconds(TIMEOUT));
587 auto sendDataA = std::make_shared<SendData>(1);
588 auto sendDataB = std::make_shared<SendData>(2);
589 s.signal<SendData>(2, sendDataB);
590 s.signal<SendData>(1, sendDataA);
592 // Wait for the signals to arrive
593 std::shared_ptr<RecvData> recvDataA(recvDataLatchA.get(TIMEOUT));
594 std::shared_ptr<RecvData> recvDataB(recvDataLatchB.get(TIMEOUT));
595 BOOST_CHECK_EQUAL(recvDataA->intVal, sendDataA->intVal);
596 BOOST_CHECK_EQUAL(recvDataB->intVal, sendDataB->intVal);
599 MULTI_FIXTURE_TEST_CASE(UsersError, F, ThreadedFixture, GlibFixture)
601 const int TEST_ERROR_CODE = -234;
602 const std::string TEST_ERROR_MESSAGE = "Ay, caramba!";
604 Service s(F::getPoll(), SOCKET_PATH);
605 Client c(F::getPoll(), SOCKET_PATH);
606 auto clientID = connect(s, c);
608 auto throwingMethodHandler = [&](const PeerID, std::shared_ptr<RecvData>&, MethodResult::Pointer) {
609 throw IPCUserException(TEST_ERROR_CODE, TEST_ERROR_MESSAGE);
612 auto sendErrorMethodHandler = [&](const PeerID, std::shared_ptr<RecvData>&, MethodResult::Pointer methodResult) {
613 methodResult->setError(TEST_ERROR_CODE, TEST_ERROR_MESSAGE);
616 s.setMethodHandler<SendData, RecvData>(1, throwingMethodHandler);
617 s.setMethodHandler<SendData, RecvData>(2, sendErrorMethodHandler);
618 c.setMethodHandler<SendData, RecvData>(1, throwingMethodHandler);
619 c.setMethodHandler<SendData, RecvData>(2, sendErrorMethodHandler);
621 std::shared_ptr<SendData> sentData(new SendData(78));
623 auto hasProperData = [&](const IPCUserException & e) {
624 return e.getCode() == TEST_ERROR_CODE && e.what() == TEST_ERROR_MESSAGE;
627 BOOST_CHECK_EXCEPTION((c.callSync<SendData, RecvData>(1, sentData, TIMEOUT)), IPCUserException, hasProperData);
628 BOOST_CHECK_EXCEPTION((s.callSync<SendData, RecvData>(1, clientID, sentData, TIMEOUT)), IPCUserException, hasProperData);
629 BOOST_CHECK_EXCEPTION((c.callSync<SendData, RecvData>(2, sentData, TIMEOUT)), IPCUserException, hasProperData);
630 BOOST_CHECK_EXCEPTION((s.callSync<SendData, RecvData>(2, clientID, sentData, TIMEOUT)), IPCUserException, hasProperData);
633 MULTI_FIXTURE_TEST_CASE(AsyncResult, F, ThreadedFixture, GlibFixture)
635 const int TEST_ERROR_CODE = -567;
636 const std::string TEST_ERROR_MESSAGE = "Ooo jooo!";
638 Service s(F::getPoll(), SOCKET_PATH);
639 Client c(F::getPoll(), SOCKET_PATH);
640 auto clientID = connect(s, c);
642 auto errorMethodHandler = [&](const PeerID, std::shared_ptr<RecvData>&, MethodResult::Pointer methodResult) {
643 std::async(std::launch::async, [&, methodResult] {
644 std::this_thread::sleep_for(std::chrono::milliseconds(SHORT_OPERATION_TIME));
645 methodResult->setError(TEST_ERROR_CODE, TEST_ERROR_MESSAGE);
649 auto voidMethodHandler = [&](const PeerID, std::shared_ptr<RecvData>&, MethodResult::Pointer methodResult) {
650 std::async(std::launch::async, [methodResult] {
651 std::this_thread::sleep_for(std::chrono::milliseconds(SHORT_OPERATION_TIME));
652 methodResult->setVoid();
656 auto dataMethodHandler = [&](const PeerID, std::shared_ptr<RecvData>& data, MethodResult::Pointer methodResult) {
657 std::async(std::launch::async, [data, methodResult] {
658 std::this_thread::sleep_for(std::chrono::milliseconds(SHORT_OPERATION_TIME));
659 methodResult->set(data);
663 s.setMethodHandler<SendData, RecvData>(1, errorMethodHandler);
664 s.setMethodHandler<EmptyData, RecvData>(2, voidMethodHandler);
665 s.setMethodHandler<SendData, RecvData>(3, dataMethodHandler);
666 c.setMethodHandler<SendData, RecvData>(1, errorMethodHandler);
667 c.setMethodHandler<EmptyData, RecvData>(2, voidMethodHandler);
668 c.setMethodHandler<SendData, RecvData>(3, dataMethodHandler);
670 std::shared_ptr<SendData> sentData(new SendData(90));
672 auto hasProperData = [&](const IPCUserException & e) {
673 return e.getCode() == TEST_ERROR_CODE && e.what() == TEST_ERROR_MESSAGE;
676 BOOST_CHECK_EXCEPTION((s.callSync<SendData, RecvData>(1, clientID, sentData, TIMEOUT)), IPCUserException, hasProperData);
677 BOOST_CHECK_EXCEPTION((c.callSync<SendData, RecvData>(1, sentData, TIMEOUT)), IPCUserException, hasProperData);
679 BOOST_CHECK_NO_THROW((s.callSync<SendData, EmptyData>(2, clientID, sentData, TIMEOUT)));
680 BOOST_CHECK_NO_THROW((c.callSync<SendData, EmptyData>(2, sentData, TIMEOUT)));
682 std::shared_ptr<RecvData> recvData;
683 recvData = s.callSync<SendData, RecvData>(3, clientID, sentData, TIMEOUT);
684 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
685 recvData = c.callSync<SendData, RecvData>(3, sentData, TIMEOUT);
686 BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
689 MULTI_FIXTURE_TEST_CASE(MixOperations, F, ThreadedFixture, GlibFixture)
693 auto signalHandler = [&l](const PeerID, std::shared_ptr<RecvData>&) {
697 Service s(F::getPoll(), SOCKET_PATH);
698 s.setMethodHandler<SendData, RecvData>(1, echoCallback);
700 Client c(F::getPoll(), SOCKET_PATH);
701 s.setSignalHandler<RecvData>(2, signalHandler);
707 auto data = std::make_shared<SendData>(1);
708 c.signal<SendData>(2, data);
710 BOOST_CHECK(l.wait(TIMEOUT));
713 // MULTI_FIXTURE_TEST_CASE(ConnectionLimit, F, ThreadedFixture, GlibFixture)
715 // unsigned oldLimit = ipc::getMaxFDNumber();
716 // ipc::setMaxFDNumber(50);
718 // // Setup Service and many Clients
719 // Service s(F::getPoll(), SOCKET_PATH);
720 // s.setMethodHandler<SendData, RecvData>(1, echoCallback);
723 // std::list<Client> clients;
724 // for (int i = 0; i < 100; ++i) {
726 // clients.push_back(Client(F::getPoll(), SOCKET_PATH));
727 // clients.back().start();
731 // unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
732 // std::mt19937 generator(seed);
733 // for (auto it = clients.begin(); it != clients.end(); ++it) {
735 // std::shared_ptr<SendData> sentData(new SendData(generator()));
736 // std::shared_ptr<RecvData> recvData = it->callSync<SendData, RecvData>(1, sentData);
737 // BOOST_CHECK_EQUAL(recvData->intVal, sentData->intVal);
741 // ipc::setMaxFDNumber(oldLimit);
746 BOOST_AUTO_TEST_SUITE_END()