From e1116a20875b9212d3a1bc0dc351d2eeed3123b8 Mon Sep 17 00:00:00 2001 From: Andrej Babic Date: Fri, 17 Apr 2020 16:08:31 +0200 Subject: [PATCH] Add tests for multi msg recv --- core-buffer/test/test_UdpReceiver.cpp | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/core-buffer/test/test_UdpReceiver.cpp b/core-buffer/test/test_UdpReceiver.cpp index 4f215e5..d15be35 100644 --- a/core-buffer/test/test_UdpReceiver.cpp +++ b/core-buffer/test/test_UdpReceiver.cpp @@ -4,6 +4,10 @@ #include "UdpReceiver.hpp" #include "mock/udp.hpp" +#include +#include + +using namespace std; TEST(UdpReceiver, simple_recv) { @@ -94,6 +98,71 @@ TEST(UdpReceiver, false_recv) ASSERT_TRUE(udp_receiver.receive( &recv_udp_buffer, JUNGFRAU_BYTES_PER_PACKET-1)); + udp_receiver.close(); + ::close(send_socket_fd); +} + +TEST(UdpReceiver, receive_many) +{ + auto n_msg_buffer = JUNGFRAU_N_PACKETS_PER_FRAME; + jungfrau_packet recv_buffer[n_msg_buffer]; + iovec recv_buff_ptr[n_msg_buffer]; + struct mmsghdr msgs[n_msg_buffer]; + struct sockaddr_in sockFrom[n_msg_buffer]; + + for (int i = 0; i < n_msg_buffer; i++) { + recv_buff_ptr[i].iov_base = (void*) &(recv_buffer[i]); + recv_buff_ptr[i].iov_len = USHRT_MAX; + + msgs[i].msg_hdr.msg_iov = &recv_buff_ptr[i]; + msgs[i].msg_hdr.msg_iovlen = 1; + msgs[i].msg_hdr.msg_name = &sockFrom[i]; + msgs[i].msg_hdr.msg_namelen = sizeof(struct sockaddr_in ); + } + + uint16_t udp_port = MOCK_UDP_PORT; + + auto send_socket_fd = socket(AF_INET,SOCK_DGRAM,0); + ASSERT_TRUE(send_socket_fd >= 0); + + UdpReceiver udp_receiver; + udp_receiver.bind(udp_port); + + jungfrau_packet send_udp_buffer; + + auto server_address = get_server_address(udp_port); + + send_udp_buffer.bunchid = 0; + ::sendto( + send_socket_fd, + &send_udp_buffer, + JUNGFRAU_BYTES_PER_PACKET, + 0, + (sockaddr*) &server_address, + sizeof(server_address)); + + send_udp_buffer.bunchid = 1; + ::sendto( + send_socket_fd, + &send_udp_buffer, + JUNGFRAU_BYTES_PER_PACKET, + 0, + (sockaddr*) &server_address, + sizeof(server_address)); + + this_thread::sleep_for(chrono::milliseconds(10)); + + auto n_msgs = udp_receiver.receive_many(msgs, JUNGFRAU_N_PACKETS_PER_FRAME); + ASSERT_EQ(n_msgs, 2); + + for (size_t i=0;i