Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
- Child:
- 13:950327f445a3
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 |