Add UDP ECHOTEST with connect/send/recv calls

UDPSocket can be used also similar to TCPSocket using connect(), send() and recv() methods.

This commit adds UDP ECHOTESTS which uses these methods instead of sendto() and recvfrom().
pull/12013/head
Kimmo Vaisanen 2019-12-03 13:39:50 +02:00
parent a8ee2d8c7d
commit 767c40d970
3 changed files with 65 additions and 9 deletions

View File

@ -192,9 +192,11 @@ Case cases[] = {
Case("UDPSOCKET_BIND_WRONG_TYPE", UDPSOCKET_BIND_WRONG_TYPE),
Case("UDPSOCKET_BIND_UNOPENED", UDPSOCKET_BIND_UNOPENED),
Case("UDPSOCKET_ECHOTEST_NONBLOCK", UDPSOCKET_ECHOTEST_NONBLOCK),
Case("UDPSOCKET_ECHOTEST_NONBLOCK_CONNECT_SEND_RECV", UDPSOCKET_ECHOTEST_NONBLOCK_CONNECT_SEND_RECV),
Case("UDPSOCKET_ECHOTEST_BURST_NONBLOCK", UDPSOCKET_ECHOTEST_BURST_NONBLOCK),
Case("UDPSOCKET_SENDTO_REPEAT", UDPSOCKET_SENDTO_REPEAT),
Case("UDPSOCKET_ECHOTEST", UDPSOCKET_ECHOTEST),
Case("UDPSOCKET_ECHOTEST_CONNECT_SEND_RECV", UDPSOCKET_ECHOTEST_CONNECT_SEND_RECV),
Case("UDPSOCKET_ECHOTEST_BURST", UDPSOCKET_ECHOTEST_BURST),
};

View File

@ -54,7 +54,9 @@ static const int MAX_SEND_SIZE_IPV6 = 1220;
* Test cases
*/
void UDPSOCKET_ECHOTEST();
void UDPSOCKET_ECHOTEST_CONNECT_SEND_RECV();
void UDPSOCKET_ECHOTEST_NONBLOCK();
void UDPSOCKET_ECHOTEST_NONBLOCK_CONNECT_SEND_RECV();
void UDPSOCKET_ECHOTEST_BURST();
void UDPSOCKET_ECHOTEST_BURST_NONBLOCK();
void UDPSOCKET_OPEN_CLOSE_REPEAT();

View File

@ -61,7 +61,7 @@ static void _sigio_handler()
signals.set(SIGNAL_SIGIO_RX | SIGNAL_SIGIO_TX);
}
void UDPSOCKET_ECHOTEST()
void UDPSOCKET_ECHOTEST_impl(bool use_sendto)
{
SocketAddress udp_addr;
SocketAddress recv_addr;
@ -71,6 +71,10 @@ void UDPSOCKET_ECHOTEST()
UDPSocket sock;
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.open(NetworkInterface::get_default_instance()));
if (!use_sendto) {
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.connect(udp_addr));
}
sock.set_timeout(SOCKET_TIMEOUT);
int recvd;
int sent;
@ -85,7 +89,11 @@ void UDPSOCKET_ECHOTEST()
for (int retry_cnt = 0; retry_cnt <= 2; retry_cnt++) {
memset(rx_buffer, 0, BUFF_SIZE);
if (use_sendto) {
sent = sock.sendto(udp_addr, tx_buffer, pkt_s);
} else {
sent = sock.send(tx_buffer, pkt_s);
}
if (check_oversized_packets(sent, pkt_s)) {
TEST_IGNORE_MESSAGE("This device does not handle oversized packets");
} else if (sent == pkt_s) {
@ -97,7 +105,11 @@ void UDPSOCKET_ECHOTEST()
do {
received_duplicate_packet = false;
if (use_sendto) {
recvd = sock.recvfrom(&recv_addr, rx_buffer, pkt_s);
} else {
recvd = sock.recv(rx_buffer, pkt_s);
}
//Check if received duplicated packet
for (unsigned int d_idx = 0; d_idx < PKTS; ++d_idx) {
if (pkt_received[d_idx] && d_idx != s_idx && recvd == pkt_sizes[d_idx]) {
@ -114,9 +126,12 @@ void UDPSOCKET_ECHOTEST()
tr_error("[Round#%02d - Receiver] error, returned %d", s_idx, recvd);
}
}
if (use_sendto) {
// Verify received address is correct
TEST_ASSERT(udp_addr == recv_addr);
TEST_ASSERT_EQUAL(udp_addr.get_port(), recv_addr.get_port());
}
if (memcmp(tx_buffer, rx_buffer, pkt_s) == 0) {
packets_recv++;
@ -135,7 +150,18 @@ void UDPSOCKET_ECHOTEST()
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.close());
}
void UDPSOCKET_ECHOTEST_NONBLOCK()
void UDPSOCKET_ECHOTEST()
{
UDPSOCKET_ECHOTEST_impl(true);
}
void UDPSOCKET_ECHOTEST_CONNECT_SEND_RECV()
{
UDPSOCKET_ECHOTEST_impl(false);
}
void UDPSOCKET_ECHOTEST_NONBLOCK_impl(bool use_sendto)
{
tc_exec_time.start();
time_allotted = split2half_rmng_udp_test_time(); // [s]
@ -149,6 +175,11 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
return;
}
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->open(NetworkInterface::get_default_instance()));
if (!use_sendto) {
TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock->connect(udp_addr));
}
sock->set_blocking(false);
sock->sigio(callback(_sigio_handler));
int sent;
@ -160,7 +191,12 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
for (int retry_cnt = 0; retry_cnt <= RETRIES; retry_cnt++) {
fill_tx_buffer_ascii(tx_buffer, pkt_s);
if (use_sendto) {
sent = sock->sendto(udp_addr, tx_buffer, pkt_s);
} else {
sent = sock->send(tx_buffer, pkt_s);
}
if (sent == pkt_s) {
packets_sent++;
} else if (sent == NSAPI_ERROR_WOULD_BLOCK) {
@ -176,7 +212,13 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
int recvd;
for (int retry_recv = 0; retry_recv <= RETRIES; retry_recv++) {
if (use_sendto) {
recvd = sock->recvfrom(NULL, rx_buffer, pkt_s);
} else {
recvd = sock->recv(rx_buffer, pkt_s);
}
if (recvd == NSAPI_ERROR_WOULD_BLOCK) {
if (tc_exec_time.read() >= time_allotted) {
break;
@ -230,3 +272,13 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
delete sock;
tc_exec_time.stop();
}
void UDPSOCKET_ECHOTEST_NONBLOCK()
{
UDPSOCKET_ECHOTEST_NONBLOCK_impl(true);
}
void UDPSOCKET_ECHOTEST_NONBLOCK_CONNECT_SEND_RECV()
{
UDPSOCKET_ECHOTEST_NONBLOCK_impl(false);
}