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)52 CAF_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