-set socket options before “socket.bind” -listen for incoming SOCK_STREAM connections only before “socket.accept” resolves ubuntu errors.
Fork of NSAPITests by
NSAPITests.cpp@10:0d938ec9100c, 2016-04-21 (annotated)
- Committer:
- Christopher Haster
- Date:
- Thu Apr 21 01:54:51 2016 -0500
- Revision:
- 10:0d938ec9100c
- Parent:
- 9:07b22947be75
Updated NSAPITests to match changes in the NSAPI
- separated tests to tcp/udp tests
- added appropriate open/close tests
- added flushing behaviour to take care of garbage
- increased test size to 2048 bytes
Who changed what in which revision?
User | Revision | Line number | New 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 |