Tests for the NetworkSocketAPI

Dependents:   BSDInterfaceTests ESP8266InterfaceTests LWIPInterfaceTests SpwfInterface_NSAPI_Tests ... more

Committer:
mridup
Date:
Mon Jun 06 08:42:21 2016 +0000
Revision:
12:152ae238ddc1
Parent:
10:0d938ec9100c
-set socket options before ?socket.bind?; -listen for incoming SOCK_STREAM connections only before ?socket.accept?; ; resolves error in ubuntu linux ("address already in use"); ;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 10:0d938ec9100c 1 #include "NetworkStack.h"
Brian Daniels 2:41bf867fedd2 2 #include "TCPSocket.h"
Brian Daniels 3:8b595ee6219d 3 #include "UDPSocket.h"
Brian Daniels 2:41bf867fedd2 4 #include <stdio.h>
Brian Daniels 2:41bf867fedd2 5 #include "string.h"
Brian Daniels 2:41bf867fedd2 6
Christopher Haster 10:0d938ec9100c 7 #define NSAPI_MAX_DATA_SIZE 2048
Christopher Haster 10:0d938ec9100c 8 #define NSAPI_TEST_HOST "mbed.org"
Christopher Haster 10:0d938ec9100c 9 #define NSAPI_TEST_IP "8.8.4.4"
Brian Daniels 2:41bf867fedd2 10
Christopher Haster 10:0d938ec9100c 11 uint8_t test_buffer[NSAPI_MAX_DATA_SIZE];
Brian Daniels 2:41bf867fedd2 12
Christopher Haster 10:0d938ec9100c 13 int nsapi_networkstack_get_ip_address_test(NetworkStack *stack)
Christopher Haster 10:0d938ec9100c 14 {
Christopher Haster 10:0d938ec9100c 15 if (!stack->get_ip_address()[0]) {
Christopher Haster 10:0d938ec9100c 16 printf("error: 'get_ip_address()' did not return an IP address\r\n");
Christopher Haster 10:0d938ec9100c 17 return -1;
Christopher Haster 10:0d938ec9100c 18 }
Brian Daniels 2:41bf867fedd2 19
Christopher Haster 10:0d938ec9100c 20 return 0;
Brian Daniels 2:41bf867fedd2 21 }
Brian Daniels 2:41bf867fedd2 22
Christopher Haster 10:0d938ec9100c 23 int nsapi_networkstack_gethostbyname_test(NetworkStack *stack, SocketAddress *address, const char *test_host)
Brian Daniels 2:41bf867fedd2 24 {
Christopher Haster 10:0d938ec9100c 25 int ret = stack->gethostbyname(address, NSAPI_TEST_HOST);
Brian Daniels 2:41bf867fedd2 26
Christopher Haster 10:0d938ec9100c 27 if (ret) {
Christopher Haster 10:0d938ec9100c 28 printf("error: 'gethostbyname(\"%s\")' failed with code %d\r\n", NSAPI_TEST_HOST, ret);
Christopher Haster 10:0d938ec9100c 29 return -1;
Christopher Haster 10:0d938ec9100c 30 } else if (!address) {
Christopher Haster 10:0d938ec9100c 31 printf("error: 'gethostbyname(\"%s\")' returned null IP address\r\n", NSAPI_TEST_HOST);
Christopher Haster 10:0d938ec9100c 32 return -2;
Christopher Haster 10:0d938ec9100c 33 }
Christopher Haster 10:0d938ec9100c 34
Christopher Haster 10:0d938ec9100c 35 ret = stack->gethostbyname(address, NSAPI_TEST_IP);
Brian Daniels 2:41bf867fedd2 36
Christopher Haster 10:0d938ec9100c 37 if (ret) {
Christopher Haster 10:0d938ec9100c 38 printf("error: 'gethostbyname(\"%s\")' failed with code %d\r\n", NSAPI_TEST_IP, ret);
Christopher Haster 10:0d938ec9100c 39 return -1;
Christopher Haster 10:0d938ec9100c 40 } else if (!address) {
Christopher Haster 10:0d938ec9100c 41 printf("error: 'gethostbyname(\"%s\")' returned null IP address\r\n", NSAPI_TEST_IP);
Christopher Haster 10:0d938ec9100c 42 return -2;
Christopher Haster 10:0d938ec9100c 43 }
Christopher Haster 10:0d938ec9100c 44
Christopher Haster 10:0d938ec9100c 45 ret = stack->gethostbyname(address, test_host);
Christopher Haster 10:0d938ec9100c 46
Christopher Haster 10:0d938ec9100c 47 if (ret) {
Christopher Haster 10:0d938ec9100c 48 printf("error: 'gethostbyname(\"%s\")' failed with code %d\r\n", test_host, ret);
Christopher Haster 10:0d938ec9100c 49 return -1;
Christopher Haster 10:0d938ec9100c 50 } else if (!address) {
Christopher Haster 10:0d938ec9100c 51 printf("error: 'gethostbyname(\"%s\")' returned null IP address\r\n", test_host);
Christopher Haster 10:0d938ec9100c 52 return -2;
Christopher Haster 10:0d938ec9100c 53 }
Christopher Haster 10:0d938ec9100c 54
Brian Daniels 2:41bf867fedd2 55 return 0;
Christopher Haster 10:0d938ec9100c 56 }
Christopher Haster 10:0d938ec9100c 57
Christopher Haster 10:0d938ec9100c 58 static void nsapi_buffer_init(uint8_t *buffer, unsigned size)
Christopher Haster 10:0d938ec9100c 59 {
Christopher Haster 10:0d938ec9100c 60 for (unsigned i = 0; i < size; i++) {
Christopher Haster 10:0d938ec9100c 61 buffer[i] = '0' + (i % 10);
Christopher Haster 10:0d938ec9100c 62 }
Brian Daniels 2:41bf867fedd2 63 }
Brian Daniels 2:41bf867fedd2 64
Christopher Haster 10:0d938ec9100c 65 static bool nsapi_buffer_check(const uint8_t *buffer, unsigned size)
Brian Daniels 3:8b595ee6219d 66 {
Christopher Haster 10:0d938ec9100c 67 for (unsigned i = 0; i < size; i++) {
Christopher Haster 10:0d938ec9100c 68 if (buffer[i] != '0' + (i % 10)) {
Christopher Haster 10:0d938ec9100c 69 return false;
Christopher Haster 10:0d938ec9100c 70 }
Christopher Haster 10:0d938ec9100c 71 }
Brian Daniels 3:8b595ee6219d 72
Christopher Haster 10:0d938ec9100c 73 return true;
Christopher Haster 10:0d938ec9100c 74 }
Christopher Haster 10:0d938ec9100c 75
Christopher Haster 10:0d938ec9100c 76 static void nsapi_tcp_flush(TCPSocket *socket)
Christopher Haster 10:0d938ec9100c 77 {
Christopher Haster 10:0d938ec9100c 78 socket->set_timeout(1000);
Christopher Haster 10:0d938ec9100c 79 socket->recv(test_buffer, sizeof test_buffer);
Christopher Haster 10:0d938ec9100c 80 socket->set_timeout(-1);
Brian Daniels 3:8b595ee6219d 81 }
Brian Daniels 3:8b595ee6219d 82
Christopher Haster 10:0d938ec9100c 83 int nsapi_tcp_open_test(TCPSocket *udp, NetworkStack *stack)
Brian Daniels 3:8b595ee6219d 84 {
Christopher Haster 10:0d938ec9100c 85 int ret = udp->open(stack);
Christopher Haster 10:0d938ec9100c 86
Christopher Haster 10:0d938ec9100c 87 if (ret) {
Christopher Haster 10:0d938ec9100c 88 printf("error: 'open(%p)' failed with code %d\r\n", stack, ret);
Christopher Haster 10:0d938ec9100c 89 return -1;
Christopher Haster 10:0d938ec9100c 90 } else {
Christopher Haster 10:0d938ec9100c 91 return 0;
Christopher Haster 10:0d938ec9100c 92 }
Christopher Haster 10:0d938ec9100c 93 }
Christopher Haster 10:0d938ec9100c 94
Christopher Haster 10:0d938ec9100c 95 int nsapi_tcp_connect_test(TCPSocket *tcp, SocketAddress *addr)
Christopher Haster 10:0d938ec9100c 96 {
Christopher Haster 10:0d938ec9100c 97 int ret = tcp->connect(*addr);
Christopher Haster 10:0d938ec9100c 98
Christopher Haster 10:0d938ec9100c 99 if (ret) {
Christopher Haster 10:0d938ec9100c 100 printf("error: 'connect(SocketAddress(%s, %d))' failed with code %d\r\n",
Christopher Haster 10:0d938ec9100c 101 addr->get_ip_address(), addr->get_port(), ret);
Christopher Haster 10:0d938ec9100c 102 return -1;
Christopher Haster 10:0d938ec9100c 103 } else {
Christopher Haster 10:0d938ec9100c 104 return 0;
Christopher Haster 10:0d938ec9100c 105 }
Brian Daniels 3:8b595ee6219d 106 }
Brian Daniels 3:8b595ee6219d 107
Christopher Haster 10:0d938ec9100c 108 static int nsapi_tcp_blocking_test_helper(TCPSocket *tcp, unsigned size)
Christopher Haster 10:0d938ec9100c 109 {
Christopher Haster 10:0d938ec9100c 110 unsigned total;
Christopher Haster 10:0d938ec9100c 111 nsapi_tcp_flush(tcp);
Christopher Haster 10:0d938ec9100c 112 nsapi_buffer_init(test_buffer, size);
Brian Daniels 3:8b595ee6219d 113
Christopher Haster 10:0d938ec9100c 114 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 115 int ret = tcp->send(test_buffer, size);
Christopher Haster 10:0d938ec9100c 116
Christopher Haster 10:0d938ec9100c 117 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 118 printf("error: 'send(buffer, %d)' failed during test with code %d\r\n", size, ret);
Christopher Haster 10:0d938ec9100c 119 return -1;
Christopher Haster 10:0d938ec9100c 120 }
Christopher Haster 10:0d938ec9100c 121
Christopher Haster 10:0d938ec9100c 122 total += ret;
Christopher Haster 10:0d938ec9100c 123 }
Brian Daniels 2:41bf867fedd2 124
Christopher Haster 10:0d938ec9100c 125 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 126 int ret = tcp->recv(test_buffer, sizeof test_buffer);
Christopher Haster 10:0d938ec9100c 127
Christopher Haster 10:0d938ec9100c 128 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 129 printf("error: 'recv(buffer, %d)' failed during test with code %d\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 130 return -2;
Christopher Haster 10:0d938ec9100c 131 }
Brian Daniels 3:8b595ee6219d 132
Christopher Haster 10:0d938ec9100c 133 total += ret;
Christopher Haster 10:0d938ec9100c 134 }
Christopher Haster 10:0d938ec9100c 135
Christopher Haster 10:0d938ec9100c 136 if (total != size || !nsapi_buffer_check(test_buffer, size)) {
Christopher Haster 10:0d938ec9100c 137 printf("error: 'recv(buffer, %d)' recieved incorrect data with length %d\r\n", sizeof test_buffer, total);
Christopher Haster 10:0d938ec9100c 138 return -3;
Christopher Haster 10:0d938ec9100c 139 }
Christopher Haster 10:0d938ec9100c 140
Christopher Haster 10:0d938ec9100c 141 return 0;
Brian Daniels 3:8b595ee6219d 142 }
Brian Daniels 3:8b595ee6219d 143
Christopher Haster 10:0d938ec9100c 144 int nsapi_tcp_blocking_test(TCPSocket *tcp)
Brian Daniels 3:8b595ee6219d 145 {
Christopher Haster 10:0d938ec9100c 146 for (unsigned size = 64; size <= NSAPI_MAX_DATA_SIZE; size *= 2) {
Christopher Haster 10:0d938ec9100c 147 printf("%s: size %d\r\n", __func__, size);
Brian Daniels 3:8b595ee6219d 148
Christopher Haster 10:0d938ec9100c 149 int ret = nsapi_tcp_blocking_test_helper(tcp, size);
Christopher Haster 10:0d938ec9100c 150 if (ret) {
Christopher Haster 10:0d938ec9100c 151 return ret;
Christopher Haster 10:0d938ec9100c 152 }
Christopher Haster 10:0d938ec9100c 153 }
Brian Daniels 3:8b595ee6219d 154
Christopher Haster 10:0d938ec9100c 155 return 0;
Brian Daniels 7:444bc156318f 156 }
Brian Daniels 3:8b595ee6219d 157
Christopher Haster 10:0d938ec9100c 158 static int nsapi_tcp_non_blocking_test_helper(TCPSocket *tcp, unsigned size)
Brian Daniels 7:444bc156318f 159 {
Christopher Haster 10:0d938ec9100c 160 unsigned total;
Christopher Haster 10:0d938ec9100c 161 nsapi_tcp_flush(tcp);
Christopher Haster 10:0d938ec9100c 162 nsapi_buffer_init(test_buffer, size);
Brian Daniels 3:8b595ee6219d 163
Christopher Haster 10:0d938ec9100c 164 // First check to make sure `recv` will not block and return 0 for bytes received.
Christopher Haster 10:0d938ec9100c 165 tcp->set_blocking(false);
Christopher Haster 10:0d938ec9100c 166 int ret = tcp->recv(test_buffer, sizeof test_buffer);
Brian Daniels 2:41bf867fedd2 167
Christopher Haster 10:0d938ec9100c 168 if (ret != NSAPI_ERROR_WOULD_BLOCK) {
Christopher Haster 10:0d938ec9100c 169 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 170 printf("error: 'recv(buffer, %d)' failed during test with code %d\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 171 return -4;
Christopher Haster 10:0d938ec9100c 172 } else {
Christopher Haster 10:0d938ec9100c 173 printf("error: 'recv(buffer, %d)' returned %d when no data was expected\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 174 return -5;
Christopher Haster 10:0d938ec9100c 175 }
Brian Daniels 3:8b595ee6219d 176 }
Christopher Haster 10:0d938ec9100c 177
Christopher Haster 10:0d938ec9100c 178 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 179 int ret = tcp->send(test_buffer, size);
Brian Daniels 3:8b595ee6219d 180
Christopher Haster 10:0d938ec9100c 181 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 182 printf("error: 'send(buffer, %d)' failed during test with code %d\r\n", size, ret);
Christopher Haster 10:0d938ec9100c 183 return -1;
Christopher Haster 10:0d938ec9100c 184 }
Christopher Haster 10:0d938ec9100c 185
Christopher Haster 10:0d938ec9100c 186 total += ret;
Christopher Haster 10:0d938ec9100c 187 }
Christopher Haster 10:0d938ec9100c 188
Christopher Haster 10:0d938ec9100c 189
Christopher Haster 10:0d938ec9100c 190 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 191 ret = tcp->recv(test_buffer, sizeof test_buffer);
Brian Daniels 7:444bc156318f 192
Christopher Haster 10:0d938ec9100c 193 if (ret == NSAPI_ERROR_WOULD_BLOCK) {
Christopher Haster 10:0d938ec9100c 194 continue;
Christopher Haster 10:0d938ec9100c 195 } else if (ret < 0) {
Christopher Haster 10:0d938ec9100c 196 printf("error: 'recv(buffer, %d)' failed during test with code %d\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 197 return -2;
Christopher Haster 10:0d938ec9100c 198 } else {
Christopher Haster 10:0d938ec9100c 199 total += ret;
Christopher Haster 10:0d938ec9100c 200 }
Brian Daniels 7:444bc156318f 201 }
Brian Daniels 7:444bc156318f 202
Christopher Haster 10:0d938ec9100c 203 if (total != size || !nsapi_buffer_check(test_buffer, size)) {
Christopher Haster 10:0d938ec9100c 204 printf("error: 'recv(buffer, %d)' recieved incorrect data with length %d\r\n", sizeof test_buffer, total);
Christopher Haster 10:0d938ec9100c 205 return -3;
Christopher Haster 10:0d938ec9100c 206 }
Christopher Haster 10:0d938ec9100c 207
Brian Daniels 7:444bc156318f 208 return 0;
Brian Daniels 7:444bc156318f 209 }
Brian Daniels 7:444bc156318f 210
Christopher Haster 10:0d938ec9100c 211 int nsapi_tcp_non_blocking_test(TCPSocket *tcp)
Brian Daniels 3:8b595ee6219d 212 {
Christopher Haster 10:0d938ec9100c 213 for (unsigned size = 64; size <= NSAPI_MAX_DATA_SIZE; size *= 2) {
Christopher Haster 10:0d938ec9100c 214 printf("%s: size %d\r\n", __func__, size);
Brian Daniels 3:8b595ee6219d 215
Christopher Haster 10:0d938ec9100c 216 int ret = nsapi_tcp_non_blocking_test_helper(tcp, size);
Christopher Haster 10:0d938ec9100c 217 if (ret) {
Christopher Haster 10:0d938ec9100c 218 return ret;
Christopher Haster 10:0d938ec9100c 219 }
Christopher Haster 10:0d938ec9100c 220 }
Brian Daniels 7:444bc156318f 221
Christopher Haster 10:0d938ec9100c 222 return 0;
Christopher Haster 10:0d938ec9100c 223 }
Brian Daniels 3:8b595ee6219d 224
Christopher Haster 10:0d938ec9100c 225 int nsapi_tcp_close_test(TCPSocket *tcp)
Christopher Haster 10:0d938ec9100c 226 {
Christopher Haster 10:0d938ec9100c 227 int ret = tcp->close();
Brian Daniels 2:41bf867fedd2 228
Christopher Haster 10:0d938ec9100c 229 if (ret) {
Christopher Haster 10:0d938ec9100c 230 printf("error 'close()' failed with code %d\r\n", ret);
Christopher Haster 10:0d938ec9100c 231 return -1;
Christopher Haster 10:0d938ec9100c 232 } else {
Christopher Haster 10:0d938ec9100c 233 return 0;
Christopher Haster 10:0d938ec9100c 234 }
Christopher Haster 10:0d938ec9100c 235 }
Brian Daniels 5:03b0570b4c29 236
Christopher Haster 10:0d938ec9100c 237 static void nsapi_udp_flush(UDPSocket *udp)
Christopher Haster 10:0d938ec9100c 238 {
Christopher Haster 10:0d938ec9100c 239 udp->set_timeout(1000);
Christopher Haster 10:0d938ec9100c 240 udp->recvfrom(0, test_buffer, sizeof test_buffer);
Christopher Haster 10:0d938ec9100c 241 udp->set_timeout(-1);
Christopher Haster 10:0d938ec9100c 242 }
Christopher Haster 10:0d938ec9100c 243
Christopher Haster 10:0d938ec9100c 244 int nsapi_udp_open_test(UDPSocket *udp, NetworkStack *stack)
Christopher Haster 10:0d938ec9100c 245 {
Christopher Haster 10:0d938ec9100c 246 int ret = udp->open(stack);
Christopher Haster 10:0d938ec9100c 247
Christopher Haster 10:0d938ec9100c 248 if (ret) {
Christopher Haster 10:0d938ec9100c 249 printf("error: 'open(%p)' failed with code %d\r\n", stack, ret);
Christopher Haster 10:0d938ec9100c 250 return -1;
Christopher Haster 10:0d938ec9100c 251 } else {
Christopher Haster 10:0d938ec9100c 252 return 0;
Brian Daniels 3:8b595ee6219d 253 }
Brian Daniels 2:41bf867fedd2 254 }
Christopher Haster 1:796ba8b082b1 255
Christopher Haster 10:0d938ec9100c 256 static int nsapi_udp_blocking_test_helper(UDPSocket *udp, SocketAddress *addr, unsigned size)
Brian Daniels 7:444bc156318f 257 {
Christopher Haster 10:0d938ec9100c 258 unsigned total;
Christopher Haster 10:0d938ec9100c 259 nsapi_udp_flush(udp);
Christopher Haster 10:0d938ec9100c 260 nsapi_buffer_init(test_buffer, size);
Christopher Haster 10:0d938ec9100c 261
Christopher Haster 10:0d938ec9100c 262 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 263 int ret = udp->sendto(*addr, test_buffer, size);
Brian Daniels 7:444bc156318f 264
Christopher Haster 10:0d938ec9100c 265 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 266 printf("error: 'sendto(SocketAddress(%s, %d), buffer, %d)' failed during test with code %d\r\n",
Christopher Haster 10:0d938ec9100c 267 addr->get_ip_address(), addr->get_port(), size, ret);
Christopher Haster 10:0d938ec9100c 268 return -1;
Christopher Haster 10:0d938ec9100c 269 }
Christopher Haster 10:0d938ec9100c 270
Christopher Haster 10:0d938ec9100c 271 total += ret;
Christopher Haster 10:0d938ec9100c 272 }
Christopher Haster 10:0d938ec9100c 273
Christopher Haster 10:0d938ec9100c 274 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 275 int ret = udp->recvfrom(0, test_buffer, sizeof test_buffer);
Brian Daniels 7:444bc156318f 276
Christopher Haster 10:0d938ec9100c 277 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 278 printf("error: 'recvfrom(0, buffer, %d)' failed during test with code %d\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 279 return -2;
Christopher Haster 10:0d938ec9100c 280 }
Christopher Haster 10:0d938ec9100c 281
Christopher Haster 10:0d938ec9100c 282 total += ret;
Brian Daniels 7:444bc156318f 283 }
Christopher Haster 10:0d938ec9100c 284
Christopher Haster 10:0d938ec9100c 285 if (total != size || !nsapi_buffer_check(test_buffer, size)) {
Christopher Haster 10:0d938ec9100c 286 printf("error: 'recvfrom(0, buffer, %d)' recieved incorrect data with length %d\r\n", sizeof test_buffer, total);
Christopher Haster 10:0d938ec9100c 287 return -3;
Christopher Haster 10:0d938ec9100c 288 }
Brian Daniels 7:444bc156318f 289
Brian Daniels 7:444bc156318f 290 return 0;
Christopher Haster 10:0d938ec9100c 291 }
Christopher Haster 10:0d938ec9100c 292
Christopher Haster 10:0d938ec9100c 293 int nsapi_udp_blocking_test(UDPSocket *udp, SocketAddress *addr)
Christopher Haster 10:0d938ec9100c 294 {
Christopher Haster 10:0d938ec9100c 295 for (unsigned size = 64; size <= NSAPI_MAX_DATA_SIZE; size *= 2) {
Christopher Haster 10:0d938ec9100c 296 printf("%s: size %d\r\n", __func__, size);
Christopher Haster 10:0d938ec9100c 297
Christopher Haster 10:0d938ec9100c 298 int ret = nsapi_udp_blocking_test_helper(udp, addr, size);
Christopher Haster 10:0d938ec9100c 299 if (ret) {
Christopher Haster 10:0d938ec9100c 300 return ret;
Christopher Haster 10:0d938ec9100c 301 }
Christopher Haster 10:0d938ec9100c 302 }
Christopher Haster 10:0d938ec9100c 303
Christopher Haster 10:0d938ec9100c 304 return 0;
Brian Daniels 7:444bc156318f 305 }
Brian Daniels 7:444bc156318f 306
Christopher Haster 10:0d938ec9100c 307 int nsapi_udp_non_blocking_test_helper(UDPSocket *udp, SocketAddress *addr, unsigned size)
Christopher Haster 1:796ba8b082b1 308 {
Christopher Haster 10:0d938ec9100c 309 unsigned total;
Christopher Haster 10:0d938ec9100c 310 nsapi_udp_flush(udp);
Christopher Haster 10:0d938ec9100c 311 nsapi_buffer_init(test_buffer, size);
Christopher Haster 10:0d938ec9100c 312
Christopher Haster 10:0d938ec9100c 313 // First check to make sure `recv` will not block and return 0 for bytes received.
Christopher Haster 10:0d938ec9100c 314 udp->set_blocking(false);
Christopher Haster 10:0d938ec9100c 315 int ret = udp->recvfrom(0, test_buffer, sizeof test_buffer);
Brian Daniels 3:8b595ee6219d 316
Christopher Haster 10:0d938ec9100c 317 if (ret != NSAPI_ERROR_WOULD_BLOCK) {
Christopher Haster 10:0d938ec9100c 318 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 319 printf("error: 'recvfrom(0, buffer, %d)' failed during test with code %d\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 320 return -4;
Christopher Haster 10:0d938ec9100c 321 } else {
Christopher Haster 10:0d938ec9100c 322 printf("error: 'recvfrom(0, buffer, %d)' returned %d when no data was expected\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 323 return -5;
Christopher Haster 10:0d938ec9100c 324 }
Christopher Haster 10:0d938ec9100c 325 }
Brian Daniels 3:8b595ee6219d 326
Christopher Haster 10:0d938ec9100c 327 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 328 int ret = udp->sendto(*addr, test_buffer, size);
Brian Daniels 3:8b595ee6219d 329
Christopher Haster 10:0d938ec9100c 330 if (ret < 0) {
Christopher Haster 10:0d938ec9100c 331 printf("error: 'sendto(SocketAddress(%s, %d), buffer, %d)' failed during test with code %d\r\n",
Christopher Haster 10:0d938ec9100c 332 addr->get_ip_address(), addr->get_port(), size, ret);
Christopher Haster 10:0d938ec9100c 333 return -1;
Christopher Haster 10:0d938ec9100c 334 }
Christopher Haster 10:0d938ec9100c 335
Christopher Haster 10:0d938ec9100c 336 total += ret;
Christopher Haster 10:0d938ec9100c 337 }
Christopher Haster 10:0d938ec9100c 338
Christopher Haster 10:0d938ec9100c 339 for (total = 0; total < size;) {
Christopher Haster 10:0d938ec9100c 340 ret = udp->recvfrom(0, test_buffer, sizeof test_buffer);
Brian Daniels 3:8b595ee6219d 341
Christopher Haster 10:0d938ec9100c 342 if (ret == NSAPI_ERROR_WOULD_BLOCK) {
Christopher Haster 10:0d938ec9100c 343 continue;
Christopher Haster 10:0d938ec9100c 344 } else if (ret < 0) {
Christopher Haster 10:0d938ec9100c 345 printf("error: 'recv(buffer, %d)' failed during test with code %d\r\n", sizeof test_buffer, ret);
Christopher Haster 10:0d938ec9100c 346 return -2;
Christopher Haster 10:0d938ec9100c 347 } else {
Christopher Haster 10:0d938ec9100c 348 total += ret;
Christopher Haster 10:0d938ec9100c 349 }
Christopher Haster 10:0d938ec9100c 350 }
Brian Daniels 3:8b595ee6219d 351
Christopher Haster 10:0d938ec9100c 352 if (total != size || !nsapi_buffer_check(test_buffer, size)) {
Christopher Haster 10:0d938ec9100c 353 printf("error: 'recv(buffer, %d)' recieved incorrect data with length %d\r\n", sizeof test_buffer, total);
Christopher Haster 10:0d938ec9100c 354 return -3;
Christopher Haster 10:0d938ec9100c 355 }
Christopher Haster 10:0d938ec9100c 356
Christopher Haster 10:0d938ec9100c 357 return 0;
Brian Daniels 3:8b595ee6219d 358 }
Brian Daniels 3:8b595ee6219d 359
Christopher Haster 10:0d938ec9100c 360 int nsapi_udp_non_blocking_test(UDPSocket *udp, SocketAddress *addr)
Christopher Haster 10:0d938ec9100c 361 {
Christopher Haster 10:0d938ec9100c 362 for (unsigned size = 64; size <= NSAPI_MAX_DATA_SIZE; size *= 2) {
Christopher Haster 10:0d938ec9100c 363 printf("%s: size %d\r\n", __func__, size);
Christopher Haster 10:0d938ec9100c 364
Christopher Haster 10:0d938ec9100c 365 int ret = nsapi_udp_non_blocking_test_helper(udp, addr, size);
Christopher Haster 10:0d938ec9100c 366 if (ret) {
Christopher Haster 10:0d938ec9100c 367 return ret;
Christopher Haster 10:0d938ec9100c 368 }
Christopher Haster 10:0d938ec9100c 369 }
Christopher Haster 10:0d938ec9100c 370
Christopher Haster 10:0d938ec9100c 371 return 0;
Christopher Haster 10:0d938ec9100c 372 }
Christopher Haster 10:0d938ec9100c 373
Christopher Haster 10:0d938ec9100c 374 int nsapi_udp_close_test(UDPSocket *udp)
Christopher Haster 10:0d938ec9100c 375 {
Christopher Haster 10:0d938ec9100c 376 int ret = udp->close();
Christopher Haster 10:0d938ec9100c 377
Christopher Haster 10:0d938ec9100c 378 if (ret) {
Christopher Haster 10:0d938ec9100c 379 printf("error 'close()' failed with code %d\r\n", ret);
Christopher Haster 10:0d938ec9100c 380 return -1;
Christopher Haster 10:0d938ec9100c 381 } else {
Christopher Haster 10:0d938ec9100c 382 return 0;
Christopher Haster 10:0d938ec9100c 383 }
Brian Daniels 3:8b595ee6219d 384 }
Brian Daniels 3:8b595ee6219d 385
Christopher Haster 10:0d938ec9100c 386 int nsapi_tests(const char *name, NetworkStack *stack, const char *test_host, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 387 {
Christopher Haster 10:0d938ec9100c 388 SocketAddress address(0, test_port);
Christopher Haster 10:0d938ec9100c 389 TCPSocket tcp;
Christopher Haster 10:0d938ec9100c 390 UDPSocket udp;
Christopher Haster 10:0d938ec9100c 391
Christopher Haster 10:0d938ec9100c 392 int result = 0;
Christopher Haster 10:0d938ec9100c 393
Christopher Haster 10:0d938ec9100c 394 #define NSAPI_MARK_TESTS(tests) \
Christopher Haster 10:0d938ec9100c 395 printf("\r\n\r\nRunning %s Tests\r\n\r\n", tests)
Brian Daniels 7:444bc156318f 396
Christopher Haster 10:0d938ec9100c 397 #define NSAPI_RUN_TEST(test, ...) \
Christopher Haster 10:0d938ec9100c 398 do { \
Christopher Haster 10:0d938ec9100c 399 printf("---------------------\r\n"); \
Christopher Haster 10:0d938ec9100c 400 printf("%s: running...\r\n", #test); \
Christopher Haster 10:0d938ec9100c 401 int test##_result = test(__VA_ARGS__); \
Christopher Haster 10:0d938ec9100c 402 if (!test##_result) { \
Christopher Haster 10:0d938ec9100c 403 printf("%s: PASS\r\n", #test); \
Christopher Haster 10:0d938ec9100c 404 } else { \
Christopher Haster 10:0d938ec9100c 405 printf("%s: FAIL (%d)\r\n", #test, test##_result); \
Christopher Haster 10:0d938ec9100c 406 } \
Christopher Haster 10:0d938ec9100c 407 result |= test##_result; \
Christopher Haster 10:0d938ec9100c 408 } while (0)
Brian Daniels 3:8b595ee6219d 409
Christopher Haster 10:0d938ec9100c 410 NSAPI_MARK_TESTS("NetworkStack");
Christopher Haster 10:0d938ec9100c 411 NSAPI_RUN_TEST(nsapi_networkstack_get_ip_address_test, stack);
Christopher Haster 10:0d938ec9100c 412 NSAPI_RUN_TEST(nsapi_networkstack_gethostbyname_test, stack, &address, test_host);
Christopher Haster 1:796ba8b082b1 413
Christopher Haster 10:0d938ec9100c 414 NSAPI_MARK_TESTS("UDPSocket");
Christopher Haster 10:0d938ec9100c 415 NSAPI_RUN_TEST(nsapi_udp_open_test, &udp, stack);
Christopher Haster 10:0d938ec9100c 416 NSAPI_RUN_TEST(nsapi_udp_blocking_test, &udp, &address);
Christopher Haster 10:0d938ec9100c 417 NSAPI_RUN_TEST(nsapi_udp_non_blocking_test, &udp, &address);
Christopher Haster 10:0d938ec9100c 418 NSAPI_RUN_TEST(nsapi_udp_close_test, &udp);
Christopher Haster 1:796ba8b082b1 419
Christopher Haster 10:0d938ec9100c 420 NSAPI_MARK_TESTS("TCPSocket");
Christopher Haster 10:0d938ec9100c 421 NSAPI_RUN_TEST(nsapi_tcp_open_test, &tcp, stack);
Christopher Haster 10:0d938ec9100c 422 NSAPI_RUN_TEST(nsapi_tcp_connect_test, &tcp, &address);
Christopher Haster 10:0d938ec9100c 423 NSAPI_RUN_TEST(nsapi_tcp_blocking_test, &tcp);
Christopher Haster 10:0d938ec9100c 424 NSAPI_RUN_TEST(nsapi_tcp_non_blocking_test, &tcp);
Christopher Haster 10:0d938ec9100c 425 NSAPI_RUN_TEST(nsapi_tcp_close_test, &tcp);
Brian Daniels 3:8b595ee6219d 426
Christopher Haster 10:0d938ec9100c 427 if (result == 0) {
Christopher Haster 10:0d938ec9100c 428 printf("\r\n\r\n--- ALL TESTS PASSING ---\r\n");
Christopher Haster 10:0d938ec9100c 429 } else {
Christopher Haster 10:0d938ec9100c 430 printf("\r\n\r\n--- TEST FAILURES OCCURRED ---\r\n");
Christopher Haster 10:0d938ec9100c 431 }
Brian Daniels 5:03b0570b4c29 432
Christopher Haster 10:0d938ec9100c 433 return result;
Christopher Haster 1:796ba8b082b1 434 }
Christopher Haster 1:796ba8b082b1 435