mirror of https://github.com/ARMmbed/mbed-os.git
Making udp_echo_parallel test more robust against network issues.
Making the test more forgiven for minor networking issues. Also adding more debug prints to make it easier to see which packets are coming from where.pull/4369/head
parent
acaf435d64
commit
dc87aaad1c
|
@ -29,8 +29,20 @@ EthernetInterface net;
|
|||
SocketAddress udp_addr;
|
||||
Mutex iomutex;
|
||||
|
||||
void prep_buffer(char *tx_buffer, size_t tx_size) {
|
||||
for (size_t i=0; i<tx_size; ++i) {
|
||||
// NOTE: assuming that "id" stays in the single digits
|
||||
void prep_buffer(int id, char *uuid_buffer, size_t uuid_len, char *tx_buffer, size_t tx_size) {
|
||||
size_t i = 2;
|
||||
|
||||
tx_buffer[0] = '0' + id;
|
||||
tx_buffer[1] = ' ';
|
||||
|
||||
for (; i<uuid_len + 2; ++i) {
|
||||
tx_buffer[i] = uuid_buffer[i - 2];
|
||||
}
|
||||
|
||||
tx_buffer[i++] = ' ';
|
||||
|
||||
for (; i<tx_size; ++i) {
|
||||
tx_buffer[i] = (rand() % 10) + '0';
|
||||
}
|
||||
}
|
||||
|
@ -44,15 +56,21 @@ private:
|
|||
|
||||
UDPSocket sock;
|
||||
Thread thread;
|
||||
bool result;
|
||||
int id;
|
||||
char *uuid_buffer;
|
||||
size_t uuid_len;
|
||||
|
||||
public:
|
||||
// Limiting stack size to 1k
|
||||
Echo(): thread(osPriorityNormal, 1024) {
|
||||
Echo(): thread(osPriorityNormal, 1024), result(false) {
|
||||
}
|
||||
|
||||
void start() {
|
||||
void start(int id, char *uuid_buffer, size_t uuid_len) {
|
||||
this->id = id;
|
||||
this->uuid_buffer = uuid_buffer;
|
||||
this->uuid_len = uuid_len;
|
||||
osStatus status = thread.start(callback(this, &Echo::echo));
|
||||
TEST_ASSERT_EQUAL(osOK, status);
|
||||
}
|
||||
|
||||
void join() {
|
||||
|
@ -68,40 +86,61 @@ public:
|
|||
|
||||
sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
|
||||
|
||||
for (int i = 0; i < ECHO_LOOPS; i++) {
|
||||
prep_buffer(tx_buffer, sizeof(tx_buffer));
|
||||
int i = 0;
|
||||
while(success < ECHO_LOOPS) {
|
||||
prep_buffer(id, uuid_buffer, uuid_len, tx_buffer, sizeof(tx_buffer));
|
||||
const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
|
||||
iomutex.lock();
|
||||
printf("[%02d] sent...%d Bytes \n", i, ret);
|
||||
printf("[ID:%01d][%02d] sent %d Bytes - %.*s\n", id, i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, tx_buffer);
|
||||
iomutex.unlock();
|
||||
|
||||
SocketAddress temp_addr;
|
||||
const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
|
||||
iomutex.lock();
|
||||
printf("[%02d] recv...%d Bytes \n", i, n);
|
||||
printf("[ID:%01d][%02d] recv %d Bytes - %.*s\n", id, i, ret, MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE, rx_buffer);
|
||||
iomutex.unlock();
|
||||
|
||||
if ((temp_addr == udp_addr &&
|
||||
n == sizeof(tx_buffer) &&
|
||||
memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
|
||||
success += 1;
|
||||
iomutex.lock();
|
||||
printf("[ID:%01d][%02d] success #%d\n", id, i, success);
|
||||
iomutex.unlock();
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
result = success == ECHO_LOOPS;
|
||||
|
||||
err = sock.close();
|
||||
TEST_ASSERT_EQUAL(0, err);
|
||||
if (err) {
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
|
||||
TEST_ASSERT(success > 3*ECHO_LOOPS/4);
|
||||
bool get_result() {
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
GREENTEA_SETUP(60, "udp_echo");
|
||||
char uuid[48] = {0};
|
||||
GREENTEA_SETUP_UUID(60, "udp_echo", uuid, 48);
|
||||
printf("Got a uuid of %s\r\n", uuid);
|
||||
size_t uuid_len = strlen(uuid);
|
||||
|
||||
Echo echoers[MBED_CFG_UDP_CLIENT_ECHO_THREADS];
|
||||
|
||||
int err = net.connect();
|
||||
TEST_ASSERT_EQUAL(0, err);
|
||||
|
||||
if (err) {
|
||||
printf("MBED: failed to connect with an error of %d\r\n", err);
|
||||
GREENTEA_TESTSUITE_RESULT(false);
|
||||
} else {
|
||||
printf("UDP client IP Address is %s\n", net.get_ip_address());
|
||||
|
||||
greentea_send_kv("target_ip", net.get_ip_address());
|
||||
|
@ -124,13 +163,17 @@ int main() {
|
|||
|
||||
// Startup echo threads in parallel
|
||||
for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) {
|
||||
echoers[i].start();
|
||||
echoers[i].start(i, uuid, uuid_len);
|
||||
}
|
||||
|
||||
bool result = true;
|
||||
|
||||
for (int i = 0; i < MBED_CFG_UDP_CLIENT_ECHO_THREADS; i++) {
|
||||
echoers[i].join();
|
||||
result = result && echoers[i].get_result();
|
||||
}
|
||||
|
||||
net.disconnect();
|
||||
GREENTEA_TESTSUITE_RESULT(true);
|
||||
GREENTEA_TESTSUITE_RESULT(result);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue