Tests for the NetworkSocketAPI

Dependents:   BSDInterfaceTests ESP8266InterfaceTests LWIPInterfaceTests SpwfInterface_NSAPI_Tests ... more

Revision:
7:444bc156318f
Parent:
6:d847da0dbf4f
Child:
8:5a5c498e1fa0
--- a/NSAPITests.cpp	Thu Mar 03 13:10:13 2016 -0600
+++ b/NSAPITests.cpp	Thu Mar 03 14:19:34 2016 -0600
@@ -4,6 +4,10 @@
 #include <stdio.h>
 #include "string.h"
 
+#define NSAPI_MAX_DATA_SIZE 1000
+
+char expected_data[NSAPI_MAX_DATA_SIZE];
+char received_data[NSAPI_MAX_DATA_SIZE];
 
 int nsapi_ni_isConnected_test(NetworkInterface *iface)
 {
@@ -98,26 +102,32 @@
   return 0;
 }
 
-int nsapi_socket_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
+void nsapi_socket_test_setup(char *buffer, int size)
 {
-  char expected_data[] = "{{data}}";
-  char data[100] = {0};
+  int i;
+  for (i = 0; i < size; i++) {
+    buffer[i] = '0' + (i % 10);
+  }
+}
 
-  int32_t ret = socket->send(expected_data, strlen(expected_data));
+int nsapi_socket_blocking_test_helper(Socket *socket, const char *test_address, uint16_t test_port, uint32_t data_size)
+{
+  nsapi_socket_test_setup(expected_data, data_size);
+
+  int32_t ret = socket->send(expected_data, data_size);
 
   if (ret) {
     printf("'send' failed during test with code %d\r\n", ret);
     return -4;
   }
 
-  int32_t bytes_received = socket->recv(data, sizeof(data));
+  int32_t bytes_received = socket->recv(received_data, sizeof(received_data));
 
-  if (bytes_received >= (int32_t)strlen(expected_data)) {
-    if (strstr(data, expected_data) != NULL) {
+  if (bytes_received >= (int32_t)data_size) {
+    if (strstr(received_data, expected_data) != NULL) {
       return 0;
     } else {
       printf("'recv' returned incorrect data with length %d\r\n", bytes_received);
-      printf("data: %c%c%c%c\r\n", data[0], data[1], data[2], data[3]);
       return -2;
     }
   } else if (bytes_received < 0) {
@@ -129,14 +139,49 @@
   }
 }
 
-int nsapi_socket_non_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
+int nsapi_socket_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  int32_t result, i;
+  int32_t packet_sizes[] = {10, 100, 1000};
+  int32_t num_packet_sizes = 3;
+
+  for (i = 0; i < num_packet_sizes; i++) {
+    result = nsapi_socket_blocking_test_helper(socket, test_address, test_port, packet_sizes[i]);
+
+    if (result) {
+      printf("nsapi_socket_blocking_test failed with data size %d\r\n", packet_sizes[i]);
+      break;
+    }
+  }
+
+  if (i >= num_packet_sizes) {
+    return 0;
+  } else {
+    return -num_packet_sizes;
+  }
+}
+
+int nsapi_socket_non_blocking_test_helper(Socket *socket, const char *test_address, uint16_t test_port, uint32_t data_size)
 {
   int32_t bytes_received;
   int result = -1;
-  char expected_data[] = "{{data}}";
-  char data[100] = {0};
+
+  nsapi_socket_test_setup(expected_data, data_size);
+
+  // First check to make sure `recv` will not block and return 0 for bytes
+  // received. If the tests do proceed after this test, be sure your `recv`
+  // respects the `blocking` flag
+  bytes_received = socket->recv(received_data, NSAPI_MAX_DATA_SIZE, false);
 
-  int32_t ret = socket->send(expected_data, strlen(expected_data));
+  if (bytes_received > 0) {
+    printf("'recv' returned data of length %d when no data was expected\r\n", bytes_received);
+    return -5;
+  } else if (bytes_received < 0) {
+    printf("'recv' failed when no data was expected with code %d\r\n", bytes_received);
+    return -5;
+  }
+
+  int32_t ret = socket->send(expected_data, data_size);
 
   if (ret) {
     printf("'send' failed during test with code %d\r\n", ret);
@@ -145,10 +190,10 @@
 
   // TODO: Create a better way to "wait" for data besides busy-looping
   for (int i = 0; i < 10000000; i++) {
-    bytes_received = socket->recv(data, sizeof(data), false);
+    bytes_received = socket->recv(received_data, data_size, false);
 
-    if (bytes_received >= (int32_t)strlen(expected_data)) {
-      if (strstr(data, expected_data) != NULL) {
+    if (bytes_received >= (int32_t)data_size) {
+      if (strstr(received_data, expected_data) != NULL) {
         result = 0;
         break;
       } else {
@@ -173,6 +218,28 @@
   return result;
 }
 
+int nsapi_socket_non_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  int32_t result, i;
+  int32_t packet_sizes[] = {10, 100, 1000};
+  int32_t num_packet_sizes = 3;
+
+  for (i = 0; i < num_packet_sizes; i++) {
+    result = nsapi_socket_non_blocking_test_helper(socket, test_address, test_port, packet_sizes[i]);
+
+    if (result) {
+      printf("nsapi_socket_non_blocking_test failed with data size of %d\r\n", packet_sizes[i]);
+      break;
+    }
+  }
+
+  if (i >= num_packet_sizes) {
+    return 0;
+  } else {
+    return -num_packet_sizes;
+  }
+}
+
 int nsapi_socket_close_test(Socket *socket, const char *test_address, uint16_t test_port)
 {
   int32_t ret = socket->close();
@@ -220,6 +287,7 @@
 {
   TCPSocket tcp_socket(iface);
   UDPSocket udp_socket(iface);
+
   int ret = 0;
 
   printf("--- Running NetworkInterface Tests ---\r\n\r\n");