From 1fef1602a223768df02c24cf8cb3f26d9169eefb Mon Sep 17 00:00:00 2001 From: Veijo Pesonen Date: Fri, 11 May 2018 09:08:13 +0300 Subject: [PATCH] Adds UDP Greentea test cases udpsocket_echotest udpsocket_echotest_nonblock --- TESTS/netsocket/udp/main.cpp | 14 +- TESTS/netsocket/udp/udp_tests.h | 3 + TESTS/netsocket/udp/udpsocket_echotest.cpp | 153 ++++++++++++++++++ .../udp/udpsocket_echotest_burst.cpp | 12 -- 4 files changed, 169 insertions(+), 13 deletions(-) create mode 100644 TESTS/netsocket/udp/udpsocket_echotest.cpp diff --git a/TESTS/netsocket/udp/main.cpp b/TESTS/netsocket/udp/main.cpp index 222517b4cd..eb22dcce17 100644 --- a/TESTS/netsocket/udp/main.cpp +++ b/TESTS/netsocket/udp/main.cpp @@ -55,6 +55,17 @@ static void _ifdown() { printf("MBED: ifdown\n"); } +void drop_bad_packets(UDPSocket& sock) { + nsapi_error_t err; + sock.set_timeout(0); + while (true) { + err = sock.recvfrom(NULL, 0, 0); + if (err == NSAPI_ERROR_WOULD_BLOCK) { + break; + } + } +} + void fill_tx_buffer_ascii(char *buff, size_t len) { for (size_t i = 0; igethostbyname(MBED_CONF_APP_ECHO_SERVER_ADDR, &udp_addr); + udp_addr.set_port(MBED_CONF_APP_ECHO_SERVER_PORT); + + UDPSocket sock; + TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.open(get_interface())); + + int recvd; + int sent; + int s_idx = 0; + for (int pkt_s = pkt_sizes[s_idx]; s_idx < PKTS; pkt_s = ++s_idx) { + pkt_s = pkt_sizes[s_idx]; + + fill_tx_buffer_ascii(tx_buffer, BUFF_SIZE); + + for (int retry_cnt = 0; retry_cnt <= 2; retry_cnt++) { + sent = sock.sendto(udp_addr, tx_buffer, pkt_s); + if (sent != pkt_s) { + printf("[Round#%02d - Sender] error, returned %d\n", s_idx, sent); + continue; + } + recvd = sock.recvfrom(NULL, rx_buffer, pkt_s); + if (recvd == pkt_s) { + break; + } + } + TEST_ASSERT_EQUAL(0, memcmp(tx_buffer, rx_buffer, pkt_s)); + } + TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.close()); +} + +void udpsocket_echotest_nonblock_receiver(void *receive_bytes) +{ + int expt2recv = *(int*)receive_bytes; + int recvd; + for (int retry_cnt = 0; retry_cnt <= RETRIES; retry_cnt++) { + recvd = sock.recvfrom(NULL, rx_buffer, expt2recv); + if (recvd == NSAPI_ERROR_WOULD_BLOCK) { + wait_ms(WAIT2RECV_TIMEOUT); + continue; + } else if (recvd == expt2recv) { + break; + } + } + + TEST_ASSERT_EQUAL(0, memcmp(tx_buffer, rx_buffer, expt2recv)); + drop_bad_packets(sock); + sock.set_blocking(false); + + tx_sem.release(); +} + +void test_udpsocket_echotest_nonblock() +{ + SocketAddress udp_addr; + get_interface()->gethostbyname(MBED_CONF_APP_ECHO_SERVER_ADDR, &udp_addr); + udp_addr.set_port(MBED_CONF_APP_ECHO_SERVER_PORT); + + TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.open(get_interface())); + sock.set_blocking(false); + sock.sigio(callback(_sigio_handler, Thread::gettid())); + + int sent; + int s_idx = 0; + Thread *thread; + unsigned char *stack_mem = (unsigned char *)malloc(OS_STACK_SIZE); + TEST_ASSERT_NOT_NULL(stack_mem); + + for (int pkt_s = pkt_sizes[s_idx]; s_idx < PKTS; ++s_idx) { + pkt_s = pkt_sizes[s_idx]; + + thread = new Thread(osPriorityNormal, + OS_STACK_SIZE, + stack_mem, + "receiver"); + TEST_ASSERT_EQUAL(osOK, thread->start(callback(udpsocket_echotest_nonblock_receiver, &pkt_s))); + + for (int retry_cnt = 0; retry_cnt <= RETRIES; retry_cnt++) { + fill_tx_buffer_ascii(tx_buffer, pkt_s); + + sent = sock.sendto(udp_addr, tx_buffer, pkt_s); + if (sent == NSAPI_ERROR_WOULD_BLOCK) { + if (osSignalWait(SIGNAL_SIGIO, SIGIO_TIMEOUT).status == osEventTimeout) { + continue; + } + } else if (sent != pkt_s) { + printf("[Round#%02d - Sender] error, returned %d\n", s_idx, sent); + continue; + } + if (tx_sem.wait(WAIT2RECV_TIMEOUT*2) == 0) { // RX might wait up to WAIT2RECV_TIMEOUT before recvfrom + continue; + } + break; + } + thread->join(); + delete thread; + } + free(stack_mem); + TEST_ASSERT_EQUAL(NSAPI_ERROR_OK, sock.close()); +} diff --git a/TESTS/netsocket/udp/udpsocket_echotest_burst.cpp b/TESTS/netsocket/udp/udpsocket_echotest_burst.cpp index eacdc776f4..a4acf830db 100644 --- a/TESTS/netsocket/udp/udpsocket_echotest_burst.cpp +++ b/TESTS/netsocket/udp/udpsocket_echotest_burst.cpp @@ -56,18 +56,6 @@ void free_tx_buffers() { } } -void drop_bad_packets(UDPSocket& sock) { - nsapi_error_t err; - sock.set_timeout(0); - while (true) { - err = sock.recvfrom(NULL, NULL, 0); - if (err == NSAPI_ERROR_WOULD_BLOCK) { - break; - } - } - sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT); -} - void test_udpsocket_echotest_burst() { SocketAddress udp_addr;