diff --git a/rai/test/network.cpp b/rai/test/network.cpp index 67ebeeb9..eb3792b5 100644 --- a/rai/test/network.cpp +++ b/rai/test/network.cpp @@ -1084,4 +1084,47 @@ TEST (network, ipv6_from_ipv4) ASSERT_TRUE (endpoint1.address ().is_v4 ()); boost::asio::ip::udp::endpoint endpoint2 (boost::asio::ip::address_v6::v4_mapped (endpoint1.address ().to_v4 ()), 16000); ASSERT_TRUE (endpoint2.address ().is_v6 ()); +} + +TEST (network, ipv6_bind_send_ipv4) +{ + boost::asio::io_service service; + boost::asio::ip::udp::endpoint endpoint1 (boost::asio::ip::address_v6::any (), 24000); + boost::asio::ip::udp::endpoint endpoint2 (boost::asio::ip::address_v4::any (), 24001); + std::array bytes1; + auto finish1 (false); + boost::asio::ip::udp::endpoint endpoint3; + boost::asio::ip::udp::socket socket1 (service, endpoint1); + socket1.async_receive_from (boost::asio::buffer (bytes1.data (), bytes1.size ()), endpoint3, [&finish1] (boost::system::error_code const & error, size_t size_a) + { + ASSERT_FALSE (error); + ASSERT_EQ (16, size_a); + finish1 = true; + }); + boost::asio::ip::udp::socket socket2 (service, endpoint2); + boost::asio::ip::udp::endpoint endpoint5 (boost::asio::ip::address_v4::loopback (), 24000); + boost::asio::ip::udp::endpoint endpoint6 (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4::loopback ()), 24001); + socket2.async_send_to (boost::asio::buffer (std::array {}, 16), endpoint5, [] (boost::system::error_code const & error, size_t size_a) + { + ASSERT_FALSE (error); + ASSERT_EQ (16, size_a); + }); + while (!finish1) + { + service.poll_one (); + } + ASSERT_EQ (endpoint6, endpoint3); + std::array bytes2; + auto finish2 (false); + boost::asio::ip::udp::endpoint endpoint4; + socket2.async_receive_from (boost::asio::buffer (bytes2.data (), bytes2.size ()), endpoint4, [&finish2] (boost::system::error_code const & error, size_t size_a) + { + ASSERT_FALSE (!error); + ASSERT_EQ (16, size_a); + }); + socket1.async_send_to (boost::asio::buffer (std::array {}, 16), endpoint6, [] (boost::system::error_code const & error, size_t size_a) + { + ASSERT_FALSE (error); + ASSERT_EQ (16, size_a); + }); } \ No newline at end of file