Committer:
borlanic
Date:
Tue Apr 24 11:45:18 2018 +0000
Revision:
0:02dd72d1d465
BaBoRo_test2 - backup 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
borlanic 0:02dd72d1d465 1 /*
borlanic 0:02dd72d1d465 2 * Copyright (c) 2013-2017, ARM Limited, All Rights Reserved
borlanic 0:02dd72d1d465 3 * SPDX-License-Identifier: Apache-2.0
borlanic 0:02dd72d1d465 4 *
borlanic 0:02dd72d1d465 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
borlanic 0:02dd72d1d465 6 * not use this file except in compliance with the License.
borlanic 0:02dd72d1d465 7 * You may obtain a copy of the License at
borlanic 0:02dd72d1d465 8 *
borlanic 0:02dd72d1d465 9 * http://www.apache.org/licenses/LICENSE-2.0
borlanic 0:02dd72d1d465 10 *
borlanic 0:02dd72d1d465 11 * Unless required by applicable law or agreed to in writing, software
borlanic 0:02dd72d1d465 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
borlanic 0:02dd72d1d465 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
borlanic 0:02dd72d1d465 14 * See the License for the specific language governing permissions and
borlanic 0:02dd72d1d465 15 * limitations under the License.
borlanic 0:02dd72d1d465 16 */
borlanic 0:02dd72d1d465 17
borlanic 0:02dd72d1d465 18 #ifndef MBED_CONF_APP_CONNECT_STATEMENT
borlanic 0:02dd72d1d465 19 #error [NOT_SUPPORTED] No network configuration found for this target.
borlanic 0:02dd72d1d465 20 #endif
borlanic 0:02dd72d1d465 21
borlanic 0:02dd72d1d465 22 #include "mbed.h"
borlanic 0:02dd72d1d465 23 #include MBED_CONF_APP_HEADER_FILE
borlanic 0:02dd72d1d465 24 #include "UDPSocket.h"
borlanic 0:02dd72d1d465 25 #include "greentea-client/test_env.h"
borlanic 0:02dd72d1d465 26 #include "unity/unity.h"
borlanic 0:02dd72d1d465 27 #include "utest.h"
borlanic 0:02dd72d1d465 28
borlanic 0:02dd72d1d465 29 using namespace utest::v1;
borlanic 0:02dd72d1d465 30
borlanic 0:02dd72d1d465 31
borlanic 0:02dd72d1d465 32 #ifndef MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE
borlanic 0:02dd72d1d465 33 #define MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE 64
borlanic 0:02dd72d1d465 34 #endif
borlanic 0:02dd72d1d465 35
borlanic 0:02dd72d1d465 36 #ifndef MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT
borlanic 0:02dd72d1d465 37 #define MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT 500
borlanic 0:02dd72d1d465 38 #endif
borlanic 0:02dd72d1d465 39
borlanic 0:02dd72d1d465 40 namespace {
borlanic 0:02dd72d1d465 41 char tx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
borlanic 0:02dd72d1d465 42 char rx_buffer[MBED_CFG_UDP_CLIENT_ECHO_BUFFER_SIZE] = {0};
borlanic 0:02dd72d1d465 43 const int ECHO_LOOPS = 16;
borlanic 0:02dd72d1d465 44 }
borlanic 0:02dd72d1d465 45
borlanic 0:02dd72d1d465 46 void prep_buffer(char *tx_buffer, size_t tx_size) {
borlanic 0:02dd72d1d465 47 size_t i = 0;
borlanic 0:02dd72d1d465 48
borlanic 0:02dd72d1d465 49 for (; i<tx_size; ++i) {
borlanic 0:02dd72d1d465 50 tx_buffer[i] = (rand() % 10) + '0';
borlanic 0:02dd72d1d465 51 }
borlanic 0:02dd72d1d465 52 }
borlanic 0:02dd72d1d465 53
borlanic 0:02dd72d1d465 54 void test_udp_echo() {
borlanic 0:02dd72d1d465 55
borlanic 0:02dd72d1d465 56 NetworkInterface* net = MBED_CONF_APP_OBJECT_CONSTRUCTION;
borlanic 0:02dd72d1d465 57 int err = MBED_CONF_APP_CONNECT_STATEMENT;
borlanic 0:02dd72d1d465 58
borlanic 0:02dd72d1d465 59 TEST_ASSERT_EQUAL(0, err);
borlanic 0:02dd72d1d465 60
borlanic 0:02dd72d1d465 61 if (err) {
borlanic 0:02dd72d1d465 62 printf("MBED: failed to connect with an error of %d\r\n", err);
borlanic 0:02dd72d1d465 63 TEST_ASSERT_EQUAL(0, err);
borlanic 0:02dd72d1d465 64 }
borlanic 0:02dd72d1d465 65
borlanic 0:02dd72d1d465 66 printf("UDP client IP Address is %s\n", net->get_ip_address());
borlanic 0:02dd72d1d465 67
borlanic 0:02dd72d1d465 68 UDPSocket sock;
borlanic 0:02dd72d1d465 69 sock.open(net);
borlanic 0:02dd72d1d465 70 sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
borlanic 0:02dd72d1d465 71
borlanic 0:02dd72d1d465 72 #if defined(MBED_CONF_APP_ECHO_SERVER_ADDR) && defined(MBED_CONF_APP_ECHO_SERVER_PORT)
borlanic 0:02dd72d1d465 73 SocketAddress udp_addr(MBED_CONF_APP_ECHO_SERVER_ADDR, MBED_CONF_APP_ECHO_SERVER_PORT);
borlanic 0:02dd72d1d465 74 #else /* MBED_CONF_APP_ECHO_SERVER_ADDR && MBED_CONF_APP_ECHO_SERVER_PORT */
borlanic 0:02dd72d1d465 75 char recv_key[] = "host_port";
borlanic 0:02dd72d1d465 76 char ipbuf[60] = {0};
borlanic 0:02dd72d1d465 77 char portbuf[16] = {0};
borlanic 0:02dd72d1d465 78 unsigned int port = 0;
borlanic 0:02dd72d1d465 79
borlanic 0:02dd72d1d465 80 greentea_send_kv("target_ip", net->get_ip_address());
borlanic 0:02dd72d1d465 81 greentea_send_kv("host_ip", " ");
borlanic 0:02dd72d1d465 82 greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf));
borlanic 0:02dd72d1d465 83
borlanic 0:02dd72d1d465 84 greentea_send_kv("host_port", " ");
borlanic 0:02dd72d1d465 85 greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf));
borlanic 0:02dd72d1d465 86 sscanf(portbuf, "%u", &port);
borlanic 0:02dd72d1d465 87
borlanic 0:02dd72d1d465 88 printf("MBED: UDP Server IP address received: %s:%d \n", ipbuf, port);
borlanic 0:02dd72d1d465 89 SocketAddress udp_addr(ipbuf, port);
borlanic 0:02dd72d1d465 90 #endif /* MBED_CONF_APP_ECHO_SERVER_ADDR && MBED_CONF_APP_ECHO_SERVER_PORT */
borlanic 0:02dd72d1d465 91
borlanic 0:02dd72d1d465 92 int success = 0;
borlanic 0:02dd72d1d465 93 for (int i = 0; success < ECHO_LOOPS; i++) {
borlanic 0:02dd72d1d465 94 prep_buffer(tx_buffer, sizeof(tx_buffer));
borlanic 0:02dd72d1d465 95 const int ret = sock.sendto(udp_addr, tx_buffer, sizeof(tx_buffer));
borlanic 0:02dd72d1d465 96 if (ret >= 0) {
borlanic 0:02dd72d1d465 97 printf("[%02d] sent %d bytes - %.*s \n", i, ret, ret, tx_buffer);
borlanic 0:02dd72d1d465 98 } else {
borlanic 0:02dd72d1d465 99 printf("[%02d] Network error %d\n", i, ret);
borlanic 0:02dd72d1d465 100 continue;
borlanic 0:02dd72d1d465 101 }
borlanic 0:02dd72d1d465 102
borlanic 0:02dd72d1d465 103 SocketAddress temp_addr;
borlanic 0:02dd72d1d465 104 const int n = sock.recvfrom(&temp_addr, rx_buffer, sizeof(rx_buffer));
borlanic 0:02dd72d1d465 105 if (n >= 0) {
borlanic 0:02dd72d1d465 106 printf("[%02d] recv %d bytes - %.*s \n", i, n, n, rx_buffer);
borlanic 0:02dd72d1d465 107 } else {
borlanic 0:02dd72d1d465 108 printf("[%02d] Network error %d\n", i, n);
borlanic 0:02dd72d1d465 109 continue;
borlanic 0:02dd72d1d465 110 }
borlanic 0:02dd72d1d465 111
borlanic 0:02dd72d1d465 112 if ((temp_addr == udp_addr &&
borlanic 0:02dd72d1d465 113 n == sizeof(tx_buffer) &&
borlanic 0:02dd72d1d465 114 memcmp(rx_buffer, tx_buffer, sizeof(rx_buffer)) == 0)) {
borlanic 0:02dd72d1d465 115 success += 1;
borlanic 0:02dd72d1d465 116
borlanic 0:02dd72d1d465 117 printf("[%02d] success #%d\n", i, success);
borlanic 0:02dd72d1d465 118 continue;
borlanic 0:02dd72d1d465 119 }
borlanic 0:02dd72d1d465 120
borlanic 0:02dd72d1d465 121 // failed, clean out any remaining bad packets
borlanic 0:02dd72d1d465 122 sock.set_timeout(0);
borlanic 0:02dd72d1d465 123 while (true) {
borlanic 0:02dd72d1d465 124 err = sock.recvfrom(NULL, NULL, 0);
borlanic 0:02dd72d1d465 125 if (err == NSAPI_ERROR_WOULD_BLOCK) {
borlanic 0:02dd72d1d465 126 break;
borlanic 0:02dd72d1d465 127 }
borlanic 0:02dd72d1d465 128 }
borlanic 0:02dd72d1d465 129 sock.set_timeout(MBED_CFG_UDP_CLIENT_ECHO_TIMEOUT);
borlanic 0:02dd72d1d465 130 }
borlanic 0:02dd72d1d465 131
borlanic 0:02dd72d1d465 132 sock.close();
borlanic 0:02dd72d1d465 133 net->disconnect();
borlanic 0:02dd72d1d465 134 TEST_ASSERT_EQUAL(ECHO_LOOPS, success);
borlanic 0:02dd72d1d465 135 }
borlanic 0:02dd72d1d465 136
borlanic 0:02dd72d1d465 137
borlanic 0:02dd72d1d465 138 // Test setup
borlanic 0:02dd72d1d465 139 utest::v1::status_t test_setup(const size_t number_of_cases) {
borlanic 0:02dd72d1d465 140 GREENTEA_SETUP(240, "udp_echo");
borlanic 0:02dd72d1d465 141 return verbose_test_setup_handler(number_of_cases);
borlanic 0:02dd72d1d465 142 }
borlanic 0:02dd72d1d465 143
borlanic 0:02dd72d1d465 144 Case cases[] = {
borlanic 0:02dd72d1d465 145 Case("UDP echo", test_udp_echo),
borlanic 0:02dd72d1d465 146 };
borlanic 0:02dd72d1d465 147
borlanic 0:02dd72d1d465 148 Specification specification(test_setup, cases);
borlanic 0:02dd72d1d465 149
borlanic 0:02dd72d1d465 150 int main() {
borlanic 0:02dd72d1d465 151 return !Harness::run(specification);
borlanic 0:02dd72d1d465 152 }