1#include <base/system.h>
2
3#include <gtest/gtest.h>
4
5#include <chrono>
6
7using namespace std::chrono_literals;
8
9TEST(Net, Ipv4AndIpv6Work)
10{
11 NETADDR Bindaddr = {};
12 NETSOCKET Socket1;
13 NETSOCKET Socket2;
14
15 Bindaddr.type = NETTYPE_IPV4 | NETTYPE_IPV6;
16 Socket2 = net_udp_create(bindaddr: Bindaddr);
17 do
18 {
19 Bindaddr.port = secure_rand() % 64511 + 1024;
20 } while(!(Socket1 = net_udp_create(bindaddr: Bindaddr)));
21
22 NETADDR LocalhostV4;
23 NETADDR LocalhostV6;
24 NETADDR TargetV4;
25 NETADDR TargetV6;
26 ASSERT_FALSE(net_addr_from_str(&LocalhostV4, "127.0.0.1"));
27 ASSERT_FALSE(net_addr_from_str(&LocalhostV6, "[::1]"));
28 TargetV4 = LocalhostV4;
29 TargetV6 = LocalhostV6;
30 TargetV4.port = Bindaddr.port;
31 TargetV6.port = Bindaddr.port;
32
33 NETADDR Addr;
34 unsigned char *pData;
35
36 EXPECT_EQ(net_udp_send(Socket2, &TargetV4, "abc", 3), 3);
37
38 EXPECT_EQ(net_socket_read_wait(Socket1, 10s), 1);
39 ASSERT_EQ(net_udp_recv(Socket1, &Addr, &pData), 3);
40 Addr.port = 0;
41 EXPECT_EQ(Addr, LocalhostV4);
42 EXPECT_EQ(mem_comp(pData, "abc", 3), 0);
43
44 EXPECT_EQ(net_udp_send(Socket2, &TargetV6, "def", 3), 3);
45
46 EXPECT_EQ(net_socket_read_wait(Socket1, 10s), 1);
47 ASSERT_EQ(net_udp_recv(Socket1, &Addr, &pData), 3);
48 Addr.port = 0;
49 EXPECT_EQ(Addr, LocalhostV6);
50 EXPECT_EQ(mem_comp(pData, "def", 3), 0);
51
52 net_udp_close(sock: Socket1);
53 net_udp_close(sock: Socket2);
54}
55