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