fixed buffer management in case of packet fragmentation; improved test pattern with pseudo random to avoid pattern simulation

Fork of NSAPITests by Licio Mapelli

Committer:
Brian Daniels
Date:
Wed Mar 02 16:16:25 2016 -0600
Revision:
3:8b595ee6219d
Parent:
2:41bf867fedd2
Child:
4:b52f17273177
Adding socket tests

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 1:796ba8b082b1 1 #include "NetworkInterface.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
Brian Daniels 2:41bf867fedd2 7
Brian Daniels 3:8b595ee6219d 8 int nsapi_ni_isConnected_test(NetworkInterface *iface)
Brian Daniels 2:41bf867fedd2 9 {
Brian Daniels 2:41bf867fedd2 10 return !(iface->isConnected());
Brian Daniels 2:41bf867fedd2 11 }
Brian Daniels 2:41bf867fedd2 12
Brian Daniels 3:8b595ee6219d 13 int nsapi_ni_getIPAddress_test(NetworkInterface *iface)
Brian Daniels 2:41bf867fedd2 14 {
Brian Daniels 2:41bf867fedd2 15
Brian Daniels 2:41bf867fedd2 16 if (!iface->getIPAddress()[0]) {
Brian Daniels 2:41bf867fedd2 17 printf("'getIpAddress' did not return an IP address\r\n");
Brian Daniels 2:41bf867fedd2 18 return -1;
Brian Daniels 2:41bf867fedd2 19 }
Brian Daniels 2:41bf867fedd2 20
Brian Daniels 2:41bf867fedd2 21 return 0;
Brian Daniels 2:41bf867fedd2 22 }
Brian Daniels 2:41bf867fedd2 23
Brian Daniels 3:8b595ee6219d 24 int nsapi_ni_getMACAddress_test(NetworkInterface *iface)
Brian Daniels 2:41bf867fedd2 25 {
Brian Daniels 2:41bf867fedd2 26
Brian Daniels 2:41bf867fedd2 27 if (!iface->getMACAddress()[0]) {
Brian Daniels 2:41bf867fedd2 28 printf("'getMacAddress' did not return a MAC address\r\n");
Brian Daniels 2:41bf867fedd2 29 return -1;
Brian Daniels 2:41bf867fedd2 30 }
Brian Daniels 2:41bf867fedd2 31
Brian Daniels 2:41bf867fedd2 32 return 0;
Brian Daniels 2:41bf867fedd2 33 }
Brian Daniels 2:41bf867fedd2 34
Brian Daniels 3:8b595ee6219d 35 int nsapi_ni_getHostByName_test(NetworkInterface *iface)
Brian Daniels 2:41bf867fedd2 36 {
Brian Daniels 2:41bf867fedd2 37 char ip_address[NS_IP_SIZE] = "\0";
Brian Daniels 2:41bf867fedd2 38
Brian Daniels 3:8b595ee6219d 39 int32_t ret = iface->getHostByName("developer.mbed.org", ip_address);
Brian Daniels 2:41bf867fedd2 40
Brian Daniels 2:41bf867fedd2 41 if (ret) {
Brian Daniels 3:8b595ee6219d 42 printf("'getHostByName' failed with code %d\r\n", ret);
Brian Daniels 2:41bf867fedd2 43 return -1;
Brian Daniels 2:41bf867fedd2 44 } else if (!ip_address[0]) {
Brian Daniels 2:41bf867fedd2 45 printf("Returned IP address was null\r\n");
Brian Daniels 2:41bf867fedd2 46 return -2;
Brian Daniels 2:41bf867fedd2 47 } else {
Brian Daniels 2:41bf867fedd2 48 return 0;
Brian Daniels 2:41bf867fedd2 49 }
Brian Daniels 2:41bf867fedd2 50 }
Brian Daniels 2:41bf867fedd2 51
Brian Daniels 3:8b595ee6219d 52 int nsapi_socket_open_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 53 {
Brian Daniels 3:8b595ee6219d 54 int32_t ret = socket->open(test_address, test_port);
Brian Daniels 3:8b595ee6219d 55
Brian Daniels 3:8b595ee6219d 56 if (ret) {
Brian Daniels 3:8b595ee6219d 57 printf("'open' failed with code %d\r\n", ret);
Brian Daniels 3:8b595ee6219d 58 return -1;
Brian Daniels 3:8b595ee6219d 59 } else {
Brian Daniels 3:8b595ee6219d 60 return 0;
Brian Daniels 3:8b595ee6219d 61 }
Brian Daniels 3:8b595ee6219d 62 }
Brian Daniels 3:8b595ee6219d 63
Brian Daniels 3:8b595ee6219d 64 int nsapi_socket_isConnected_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 65 {
Brian Daniels 3:8b595ee6219d 66 return !socket->isConnected();
Brian Daniels 3:8b595ee6219d 67 }
Brian Daniels 3:8b595ee6219d 68
Brian Daniels 3:8b595ee6219d 69
Brian Daniels 3:8b595ee6219d 70 int nsapi_socket_getIpAddress_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 71 {
Brian Daniels 3:8b595ee6219d 72 const char *cur_ip_address = socket->getIPAddress();
Brian Daniels 2:41bf867fedd2 73
Brian Daniels 3:8b595ee6219d 74 if (!cur_ip_address[0]) {
Brian Daniels 3:8b595ee6219d 75 printf("'getIpAddress' did not return an IP address\r\n");
Brian Daniels 3:8b595ee6219d 76 return -1;
Brian Daniels 3:8b595ee6219d 77 } else if (strcmp(cur_ip_address, test_address)) {
Brian Daniels 3:8b595ee6219d 78 printf("'getIpAddress' did not reutrurn the expected IP address\r\n");
Brian Daniels 3:8b595ee6219d 79 printf("Expected: %s\r\n", test_address);
Brian Daniels 3:8b595ee6219d 80 printf("Actual: %s\r\n", cur_ip_address);
Brian Daniels 3:8b595ee6219d 81 return -2;
Brian Daniels 3:8b595ee6219d 82 }
Brian Daniels 3:8b595ee6219d 83
Brian Daniels 3:8b595ee6219d 84 return 0;
Brian Daniels 3:8b595ee6219d 85 }
Brian Daniels 3:8b595ee6219d 86
Brian Daniels 3:8b595ee6219d 87 int nsapi_socket_getPort_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 88 {
Brian Daniels 3:8b595ee6219d 89 uint16_t cur_port = socket->getPort();
Brian Daniels 3:8b595ee6219d 90
Brian Daniels 3:8b595ee6219d 91 if (cur_port != test_port) {
Brian Daniels 3:8b595ee6219d 92 printf("'getPort' did not return the expected port\r\n");
Brian Daniels 3:8b595ee6219d 93 printf("Expected: %d\r\n", test_port);
Brian Daniels 3:8b595ee6219d 94 printf("Actual: %d\r\n", cur_port);
Brian Daniels 3:8b595ee6219d 95 return -1;
Brian Daniels 3:8b595ee6219d 96 }
Brian Daniels 3:8b595ee6219d 97
Brian Daniels 3:8b595ee6219d 98 return 0;
Brian Daniels 3:8b595ee6219d 99 }
Brian Daniels 2:41bf867fedd2 100
Brian Daniels 3:8b595ee6219d 101 int nsapi_socket_send_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 102 {
Brian Daniels 3:8b595ee6219d 103 char data[] = "{{start}}";
Brian Daniels 3:8b595ee6219d 104 int32_t ret = socket->send(data, sizeof(data));
Brian Daniels 3:8b595ee6219d 105
Brian Daniels 3:8b595ee6219d 106 if (ret) {
Brian Daniels 3:8b595ee6219d 107 printf("'send' failed with code %d\r\n", ret);
Brian Daniels 3:8b595ee6219d 108 return -1;
Brian Daniels 3:8b595ee6219d 109 } else {
Brian Daniels 3:8b595ee6219d 110 return 0;
Brian Daniels 3:8b595ee6219d 111 }
Brian Daniels 3:8b595ee6219d 112 }
Brian Daniels 2:41bf867fedd2 113
Brian Daniels 3:8b595ee6219d 114 int nsapi_socket_recv_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 115 {
Brian Daniels 3:8b595ee6219d 116 char expected_data[] = "{{data}}";
Brian Daniels 3:8b595ee6219d 117 char data[100] = {0};
Brian Daniels 3:8b595ee6219d 118
Brian Daniels 3:8b595ee6219d 119 int32_t ret = socket->send(data, sizeof(data));
Brian Daniels 3:8b595ee6219d 120
Brian Daniels 3:8b595ee6219d 121 if (ret) {
Brian Daniels 3:8b595ee6219d 122 printf("'send' failed during 'recv' test with code %d\r\n", ret);
Brian Daniels 3:8b595ee6219d 123 return -4;
Brian Daniels 3:8b595ee6219d 124 }
Brian Daniels 3:8b595ee6219d 125
Brian Daniels 3:8b595ee6219d 126 int32_t bytes_received = socket->recv(data, sizeof(data));
Brian Daniels 2:41bf867fedd2 127
Brian Daniels 3:8b595ee6219d 128 if (bytes_received >= (int32_t)sizeof(expected_data)) {
Brian Daniels 3:8b595ee6219d 129 if (strstr(data, expected_data) != NULL) {
Brian Daniels 3:8b595ee6219d 130 return 0;
Brian Daniels 3:8b595ee6219d 131 } else {
Brian Daniels 3:8b595ee6219d 132 printf("'recv' returned incorrect data with length %d\r\n", bytes_received);
Brian Daniels 3:8b595ee6219d 133 return -2;
Brian Daniels 3:8b595ee6219d 134 }
Brian Daniels 3:8b595ee6219d 135 } else if (bytes_received < 0) {
Brian Daniels 3:8b595ee6219d 136 printf("'recv' failed with code %d\r\n", bytes_received);
Brian Daniels 3:8b595ee6219d 137 return -3;
Brian Daniels 2:41bf867fedd2 138 } else {
Brian Daniels 3:8b595ee6219d 139 printf("'recv' returned no data during blocking test\r\n");
Brian Daniels 3:8b595ee6219d 140 return -1;
Brian Daniels 3:8b595ee6219d 141 }
Brian Daniels 3:8b595ee6219d 142 }
Brian Daniels 3:8b595ee6219d 143
Brian Daniels 3:8b595ee6219d 144 int nsapi_socket_recv_non_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
Brian Daniels 3:8b595ee6219d 145 {
Brian Daniels 3:8b595ee6219d 146 int32_t bytes_received;
Brian Daniels 3:8b595ee6219d 147 int result = -1;
Brian Daniels 3:8b595ee6219d 148 char expected_data[] = "{{data}}";
Brian Daniels 3:8b595ee6219d 149 char data[100] = {0};
Brian Daniels 3:8b595ee6219d 150
Brian Daniels 3:8b595ee6219d 151 int32_t ret = socket->send(expected_data, sizeof(expected_data));
Brian Daniels 3:8b595ee6219d 152
Brian Daniels 3:8b595ee6219d 153 if (ret) {
Brian Daniels 3:8b595ee6219d 154 printf("'send' failed during 'recv' test with code %d\r\n", ret);
Brian Daniels 3:8b595ee6219d 155 return -4;
Brian Daniels 2:41bf867fedd2 156 }
Brian Daniels 2:41bf867fedd2 157
Brian Daniels 3:8b595ee6219d 158 for (int i = 0; i < 100; i++) {
Brian Daniels 3:8b595ee6219d 159 bytes_received = socket->recv(data, sizeof(data), false);
Brian Daniels 3:8b595ee6219d 160
Brian Daniels 3:8b595ee6219d 161 if (bytes_received >= (int32_t)sizeof(expected_data)) {
Brian Daniels 3:8b595ee6219d 162 if (strstr(data, expected_data) != NULL) {
Brian Daniels 3:8b595ee6219d 163 result = 0;
Brian Daniels 3:8b595ee6219d 164 break;
Brian Daniels 3:8b595ee6219d 165 } else {
Brian Daniels 3:8b595ee6219d 166 printf("'recv' returned incorrect data\r\n");
Brian Daniels 3:8b595ee6219d 167 result = -2;
Brian Daniels 3:8b595ee6219d 168 break;
Brian Daniels 3:8b595ee6219d 169 }
Brian Daniels 3:8b595ee6219d 170 } else if (bytes_received < 0) {
Brian Daniels 3:8b595ee6219d 171 result = -3;
Brian Daniels 3:8b595ee6219d 172 break;
Brian Daniels 3:8b595ee6219d 173 }
Brian Daniels 3:8b595ee6219d 174 }
Brian Daniels 3:8b595ee6219d 175
Brian Daniels 3:8b595ee6219d 176 if (result == -1) {
Brian Daniels 3:8b595ee6219d 177 printf("'recv' returned no data during blocking test\r\n");
Brian Daniels 3:8b595ee6219d 178 } else if (result == -2) {
Brian Daniels 3:8b595ee6219d 179 printf("'recv' returned incorrect data\r\n");
Brian Daniels 3:8b595ee6219d 180 } else if (result == -3) {
Brian Daniels 3:8b595ee6219d 181 printf("'recv' failed with code %d\r\n", bytes_received);
Brian Daniels 3:8b595ee6219d 182 }
Brian Daniels 3:8b595ee6219d 183
Brian Daniels 3:8b595ee6219d 184 return result;
Brian Daniels 2:41bf867fedd2 185 }
Christopher Haster 1:796ba8b082b1 186
Brian Daniels 3:8b595ee6219d 187 int nsapi_socket_close_test(Socket *socket, const char *test_address, uint16_t test_port)
Christopher Haster 1:796ba8b082b1 188 {
Brian Daniels 3:8b595ee6219d 189 int32_t ret = socket->close();
Brian Daniels 3:8b595ee6219d 190
Brian Daniels 3:8b595ee6219d 191 if (ret) {
Brian Daniels 3:8b595ee6219d 192 printf("'close' failed with code %d\r\n", ret);
Brian Daniels 3:8b595ee6219d 193 return -1;
Brian Daniels 3:8b595ee6219d 194 } else {
Brian Daniels 3:8b595ee6219d 195 return 0;
Brian Daniels 3:8b595ee6219d 196 }
Brian Daniels 3:8b595ee6219d 197 }
Brian Daniels 3:8b595ee6219d 198
Brian Daniels 3:8b595ee6219d 199 void nspai_print_test_header(const char *name) {
Brian Daniels 3:8b595ee6219d 200 printf("---------------------\r\n");
Brian Daniels 3:8b595ee6219d 201 printf("%s: running...\r\n", name);
Brian Daniels 3:8b595ee6219d 202 }
Brian Daniels 3:8b595ee6219d 203
Brian Daniels 3:8b595ee6219d 204 void nspai_print_test_result(const char *name, int result) {
Brian Daniels 3:8b595ee6219d 205 printf("%s: ", name);
Brian Daniels 3:8b595ee6219d 206
Brian Daniels 3:8b595ee6219d 207 if (!result) {
Brian Daniels 3:8b595ee6219d 208 printf("PASS\r\n");
Brian Daniels 3:8b595ee6219d 209 } else {
Brian Daniels 3:8b595ee6219d 210 printf("FAIL (Return code %d)\r\n", result);
Brian Daniels 3:8b595ee6219d 211 }
Brian Daniels 3:8b595ee6219d 212 }
Brian Daniels 3:8b595ee6219d 213
Brian Daniels 3:8b595ee6219d 214 int nsapi_ni_run_test(const char *name, NetworkInterface *iface, int (*test)(NetworkInterface*)) {
Brian Daniels 3:8b595ee6219d 215 int result;
Brian Daniels 3:8b595ee6219d 216 nspai_print_test_header(name);
Brian Daniels 3:8b595ee6219d 217 result = test(iface);
Brian Daniels 3:8b595ee6219d 218 nspai_print_test_result(name, result);
Brian Daniels 3:8b595ee6219d 219 return result;
Brian Daniels 3:8b595ee6219d 220 }
Brian Daniels 3:8b595ee6219d 221
Brian Daniels 3:8b595ee6219d 222 int nsapi_socket_run_test(const char *name, Socket *socket, const char *test_address, uint16_t test_port, int (*test)(Socket*, const char*, uint16_t)) {
Brian Daniels 3:8b595ee6219d 223 int result;
Brian Daniels 3:8b595ee6219d 224 nspai_print_test_header(name);
Brian Daniels 3:8b595ee6219d 225 result = test(socket, test_address, test_port);
Brian Daniels 3:8b595ee6219d 226 nspai_print_test_result(name, result);
Brian Daniels 3:8b595ee6219d 227 return result;
Brian Daniels 3:8b595ee6219d 228 }
Brian Daniels 3:8b595ee6219d 229
Brian Daniels 3:8b595ee6219d 230 int nsapi_tests(const char *name, NetworkInterface *iface, const char *test_address, uint16_t test_tcp_port, uint16_t test_udp_port)
Brian Daniels 3:8b595ee6219d 231 {
Brian Daniels 3:8b595ee6219d 232 TCPSocket tcp_socket(iface);
Brian Daniels 3:8b595ee6219d 233 UDPSocket udp_socket(iface);
Brian Daniels 2:41bf867fedd2 234 int ret = 0;
Brian Daniels 2:41bf867fedd2 235
Brian Daniels 3:8b595ee6219d 236 printf("--- Running NetworkInterface Tests ---\r\n\r\n");
Brian Daniels 3:8b595ee6219d 237 ret |= nsapi_ni_run_test("nsapi_ni_isConnected_test", iface, &nsapi_ni_isConnected_test);
Brian Daniels 3:8b595ee6219d 238 ret |= nsapi_ni_run_test("nsapi_ni_getIPAddress_test", iface, &nsapi_ni_getIPAddress_test);
Brian Daniels 3:8b595ee6219d 239 ret |= nsapi_ni_run_test("nsapi_ni_getMACAddress_test", iface, &nsapi_ni_getMACAddress_test);
Brian Daniels 3:8b595ee6219d 240 ret |= nsapi_ni_run_test("nsapi_ni_getHostByName_test", iface, &nsapi_ni_getHostByName_test);
Brian Daniels 3:8b595ee6219d 241
Brian Daniels 3:8b595ee6219d 242 printf("\r\n\r\n--- Running TCPSocket Tests ---\r\n\r\n");
Brian Daniels 3:8b595ee6219d 243 ret |= nsapi_socket_run_test("nsapi_socket_open_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_open_test);
Brian Daniels 3:8b595ee6219d 244 ret |= nsapi_socket_run_test("nsapi_socket_getIpAddress_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_getIpAddress_test);
Brian Daniels 3:8b595ee6219d 245 ret |= nsapi_socket_run_test("nsapi_socket_getPort_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_getPort_test);
Brian Daniels 3:8b595ee6219d 246 ret |= nsapi_socket_run_test("nsapi_socket_send_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_send_test);
Brian Daniels 3:8b595ee6219d 247 ret |= nsapi_socket_run_test("nsapi_socket_recv_blocking_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_recv_blocking_test);
Brian Daniels 3:8b595ee6219d 248 ret |= nsapi_socket_run_test("nsapi_socket_recv_non_blocking_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_recv_non_blocking_test);
Brian Daniels 3:8b595ee6219d 249 ret |= nsapi_socket_run_test("nsapi_socket_close_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_close_test);
Christopher Haster 1:796ba8b082b1 250
Christopher Haster 1:796ba8b082b1 251
Brian Daniels 3:8b595ee6219d 252 printf("\r\n\r\n--- Running UDPSocket Tests ---\r\n\r\n");
Brian Daniels 3:8b595ee6219d 253 ret |= nsapi_socket_run_test("nsapi_socket_open_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_open_test);
Brian Daniels 3:8b595ee6219d 254 ret |= nsapi_socket_run_test("nsapi_socket_getIpAddress_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_getIpAddress_test);
Brian Daniels 3:8b595ee6219d 255 ret |= nsapi_socket_run_test("nsapi_socket_getPort_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_getPort_test);
Brian Daniels 3:8b595ee6219d 256 ret |= nsapi_socket_run_test("nsapi_socket_send_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_send_test);
Brian Daniels 3:8b595ee6219d 257 ret |= nsapi_socket_run_test("nsapi_socket_recv_blocking_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_recv_blocking_test);
Brian Daniels 3:8b595ee6219d 258 ret |= nsapi_socket_run_test("nsapi_socket_recv_non_blocking_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_recv_non_blocking_test);
Brian Daniels 3:8b595ee6219d 259 ret |= nsapi_socket_run_test("nsapi_socket_close_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_close_test);
Brian Daniels 3:8b595ee6219d 260
Brian Daniels 3:8b595ee6219d 261 return ret != 0;
Christopher Haster 1:796ba8b082b1 262 }
Christopher Haster 1:796ba8b082b1 263