1 // This file is part of CAF, the C++ Actor Framework. See the file LICENSE in 2 // the main distribution directory for license terms and copyright or visit 3 // https://github.com/actor-framework/actor-framework/blob/master/LICENSE. 4 5 #define CAF_SUITE io.network.default_multiplexer 6 7 #include "caf/io/network/default_multiplexer.hpp" 8 9 #include "caf/test/io_dsl.hpp" 10 11 #include <algorithm> 12 #include <vector> 13 14 #include "caf/all.hpp" 15 #include "caf/io/all.hpp" 16 #include "caf/io/network/operation.hpp" 17 18 using namespace caf; 19 20 namespace { 21 22 struct sub_fixture : test_coordinator_fixture<> { 23 io::network::default_multiplexer mpx; 24 sub_fixture__anon3bbe42a20111::sub_fixture25 sub_fixture() : mpx(&sys) { 26 // nop 27 } 28 exec_all__anon3bbe42a20111::sub_fixture29 bool exec_all() { 30 size_t count = 0; 31 while (mpx.poll_once(false)) { 32 ++count; 33 } 34 return count != 0; 35 } 36 }; 37 38 struct fixture { 39 sub_fixture client; 40 41 sub_fixture server; 42 exec_all__anon3bbe42a20111::fixture43 void exec_all() { 44 while (client.exec_all() || server.exec_all()) { 45 // Rince and repeat. 46 } 47 } 48 }; 49 50 } // namespace 51 CAF_TEST_FIXTURE_SCOPE(default_multiplexer_tests,fixture)52CAF_TEST_FIXTURE_SCOPE(default_multiplexer_tests, fixture) 53 54 CAF_TEST(doorman io_failure) { 55 CAF_MESSAGE("add doorman to server"); 56 // The multiplexer adds a pipe reader on startup. 57 CAF_CHECK_EQUAL(server.mpx.num_socket_handlers(), 1u); 58 auto doorman = unbox(server.mpx.new_tcp_doorman(0, nullptr, false)); 59 doorman->add_to_loop(); 60 server.mpx.handle_internal_events(); 61 CAF_CHECK_EQUAL(server.mpx.num_socket_handlers(), 2u); 62 CAF_MESSAGE("trigger I/O failure in doorman"); 63 doorman->io_failure(&server.mpx, io::network::operation::propagate_error); 64 server.mpx.handle_internal_events(); 65 CAF_CHECK_EQUAL(server.mpx.num_socket_handlers(), 1u); 66 } 67 68 CAF_TEST_FIXTURE_SCOPE_END() 69