LCOV - code coverage report
Current view: top level - src/test - socket_pair.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 73.5 % 34 25
Test Date: 2026-02-04 14:16:13 Functions: 100.0 % 3 3

            Line data    Source code
       1              : //
       2              : // Copyright (c) 2025 Vinnie Falco (vinnie dot falco at gmail dot com)
       3              : //
       4              : // Distributed under the Boost Software License, Version 1.0. (See accompanying
       5              : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
       6              : //
       7              : // Official repository: https://github.com/cppalliance/corosio
       8              : //
       9              : 
      10              : #include <boost/corosio/test/socket_pair.hpp>
      11              : #include <boost/corosio/tcp_acceptor.hpp>
      12              : #include <system_error>
      13              : #include <boost/corosio/basic_io_context.hpp>
      14              : #include <boost/corosio/detail/platform.hpp>
      15              : #include <boost/capy/ex/run_async.hpp>
      16              : #include <boost/capy/task.hpp>
      17              : 
      18              : #include <cstdio>
      19              : #include <stdexcept>
      20              : 
      21              : namespace boost::corosio::test {
      22              : 
      23              : std::pair<tcp_socket, tcp_socket>
      24            2 : make_socket_pair(basic_io_context& ctx)
      25              : {
      26            2 :     auto ex = ctx.get_executor();
      27              : 
      28            2 :     std::error_code accept_ec;
      29            2 :     std::error_code connect_ec;
      30            2 :     bool accept_done = false;
      31            2 :     bool connect_done = false;
      32              : 
      33              :     // Use ephemeral port (0) - OS assigns an available port
      34            2 :     tcp_acceptor acc(ctx);
      35            2 :     acc.listen(endpoint(ipv4_address::loopback(), 0));
      36            2 :     auto port = acc.local_endpoint().port();
      37              : 
      38            2 :     tcp_socket s1(ctx);
      39            2 :     tcp_socket s2(ctx);
      40            2 :     s2.open();
      41              : 
      42            4 :     capy::run_async(ex)(
      43            2 :         [](tcp_acceptor& a, tcp_socket& s,
      44              :            std::error_code& ec_out, bool& done_out) -> capy::task<>
      45              :         {
      46              :             auto [ec] = co_await a.accept(s);
      47              :             ec_out = ec;
      48              :             done_out = true;
      49            8 :         }(acc, s1, accept_ec, accept_done));
      50              : 
      51            4 :     capy::run_async(ex)(
      52            2 :         [](tcp_socket& s, endpoint ep,
      53              :            std::error_code& ec_out, bool& done_out) -> capy::task<>
      54              :         {
      55              :             auto [ec] = co_await s.connect(ep);
      56              :             ec_out = ec;
      57              :             done_out = true;
      58            8 :         }(s2, endpoint(ipv4_address::loopback(), port),
      59              :           connect_ec, connect_done));
      60              : 
      61            2 :     ctx.run();
      62            2 :     ctx.restart();
      63              : 
      64            2 :     if (!accept_done || accept_ec)
      65              :     {
      66            0 :         std::fprintf(stderr, "socket_pair: accept failed (done=%d, ec=%s)\n",
      67            0 :             accept_done, accept_ec.message().c_str());
      68            0 :         acc.close();
      69            0 :         throw std::runtime_error("socket_pair accept failed");
      70              :     }
      71              : 
      72            2 :     if (!connect_done || connect_ec)
      73              :     {
      74            0 :         std::fprintf(stderr, "socket_pair: connect failed (done=%d, ec=%s)\n",
      75            0 :             connect_done, connect_ec.message().c_str());
      76            0 :         acc.close();
      77            0 :         s1.close();
      78            0 :         throw std::runtime_error("socket_pair connect failed");
      79              :     }
      80              : 
      81            2 :     acc.close();
      82              : 
      83            4 :     return {std::move(s1), std::move(s2)};
      84            2 : }
      85              : 
      86              : } // namespace boost::corosio::test
        

Generated by: LCOV version 2.3