Tests for the NetworkSocketAPI

Dependents:   BSDInterfaceTests ESP8266InterfaceTests LWIPInterfaceTests SpwfInterface_NSAPI_Tests ... more

Files at this revision

API Documentation at this revision

Comitter:
Brian Daniels
Date:
Wed Mar 02 16:16:25 2016 -0600
Parent:
2:41bf867fedd2
Child:
4:b52f17273177
Commit message:
Adding socket tests

Changed in this revision

NSAPITestServer.py Show annotated file Show diff for this revision Revisions of this file
NSAPITests.cpp Show annotated file Show diff for this revision Revisions of this file
NSAPITests.h Show annotated file Show diff for this revision Revisions of this file
--- a/NSAPITestServer.py	Wed Mar 02 13:24:46 2016 -0600
+++ b/NSAPITestServer.py	Wed Mar 02 16:16:25 2016 -0600
@@ -1,8 +1,92 @@
 #!/usr/bin/env python
+import socket
+import signal
+import sys
+
+runServer = True
+
+def signal_handler(signal, frame):
+    global runServer
+
+    print "Handling interrupt"
+    runServer = False
+
+def handle_recv(message) :
+    if message == "{{start}}":
+        return None
+    else:
+        return message
+
+
+def run_tcp_server(port):
+    global runServer
+
+    host = 'localhost'
+    backlog = 5
+    size = 1024
+    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    tcp_socket.settimeout(1.0)
+    tcp_socket.bind((host,port))
+    tcp_socket.listen(backlog)
+
+    while runServer:
+        try:
+            client, address = tcp_socket.accept()
+            data = client.recv(size)
+            if data:
+                print "TCP DATA from %s: %s" % (address, data)
+                message = handle_recv(data)
+                if message:
+                    client.send(message)
+                    client.close()
+        except socket.timeout:
+            pass
+        except IOError:
+            pass
 
-def main():
-    pass
+
+def run_udp_server(port):
+    global runServer
+
+    host = 'localhost'
+    backlog = 5
+    size = 1024
+    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    udp_socket.settimeout(1.0)
+    udp_socket.bind((host,port))
+
 
-if __name__ != "__main__":
-    import sys
-    main(*sys.argv[1:])
+    while runServer:
+        try:
+            data, address = udp_socket.recvfrom(size)
+            if data:
+                print "UDP DATA from %s: %s" % (addr, data)
+                message = handle_recv(data)
+                if message:
+                    udp_socket.sendto(message, address)
+        except socket.timeout:
+            pass
+        except IOError:
+            pass
+
+
+def main(arguments):
+    global thread_stop_event
+
+    signal.signal(signal.SIGINT, signal_handler)
+
+    socket_type = arguments[0]
+    port = int(arguments[1])
+
+    if socket_type == "TCP":
+        run_tcp_server(port)
+    elif socket_type == "UDP":
+        run_udp_server(port)
+    else:
+        print "Invalid socket type, must be 'TCP' or 'UDP'"
+        sys.exit(1)
+
+    sys.exit(0)
+
+if __name__ == "__main__":
+    main(sys.argv[1:])
\ No newline at end of file
--- a/NSAPITests.cpp	Wed Mar 02 13:24:46 2016 -0600
+++ b/NSAPITests.cpp	Wed Mar 02 16:16:25 2016 -0600
@@ -1,15 +1,16 @@
 #include "NetworkInterface.h"
 #include "TCPSocket.h"
+#include "UDPSocket.h"
 #include <stdio.h>
 #include "string.h"
 
 
-int nsapi_isConnected_test(NetworkInterface *iface)
+int nsapi_ni_isConnected_test(NetworkInterface *iface)
 {
   return !(iface->isConnected());
 }
 
-int nsapi_getIPAddress_test(NetworkInterface *iface)
+int nsapi_ni_getIPAddress_test(NetworkInterface *iface)
 {
 
   if (!iface->getIPAddress()[0]) {
@@ -20,7 +21,7 @@
   return 0;
 }
 
-int nsapi_getMACAddress_test(NetworkInterface *iface)
+int nsapi_ni_getMACAddress_test(NetworkInterface *iface)
 {
 
   if (!iface->getMACAddress()[0]) {
@@ -31,14 +32,14 @@
   return 0;
 }
 
-int nsapi_getHostByName_test(NetworkInterface *iface)
+int nsapi_ni_getHostByName_test(NetworkInterface *iface)
 {
   char ip_address[NS_IP_SIZE] = "\0";
 
-  int32_t ret = iface->getHostByName("google.com", ip_address);
+  int32_t ret = iface->getHostByName("developer.mbed.org", ip_address);
 
   if (ret) {
-    printf("'getHostByName' failed\r\n");
+    printf("'getHostByName' failed with code %d\r\n", ret);
     return -1;
   } else if (!ip_address[0]) {
     printf("Returned IP address was null\r\n");
@@ -48,35 +49,215 @@
   }
 }
 
-int nsapi_run_test(const char *name, NetworkInterface *iface, int (*test)(NetworkInterface*)) {
-  int ret;
+int nsapi_socket_open_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  int32_t ret = socket->open(test_address, test_port);
+
+  if (ret) {
+    printf("'open' failed with code %d\r\n", ret);
+    return -1;
+  } else {
+    return 0;
+  }
+}
+
+int nsapi_socket_isConnected_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  return !socket->isConnected();
+}
+
+
+int nsapi_socket_getIpAddress_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  const char *cur_ip_address = socket->getIPAddress();
 
-  printf("---------------------\r\n");
-  printf("%s: running...\r\n", name);
+  if (!cur_ip_address[0]) {
+    printf("'getIpAddress' did not return an IP address\r\n");
+    return -1;
+  } else if (strcmp(cur_ip_address, test_address)) {
+    printf("'getIpAddress' did not reutrurn the expected IP address\r\n");
+    printf("Expected: %s\r\n", test_address);
+    printf("Actual: %s\r\n", cur_ip_address);
+    return -2;
+  }
+
+  return 0;
+}
+
+int nsapi_socket_getPort_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  uint16_t cur_port = socket->getPort();
+
+  if (cur_port != test_port) {
+    printf("'getPort' did not return the expected port\r\n");
+    printf("Expected: %d\r\n", test_port);
+    printf("Actual: %d\r\n", cur_port);
+    return -1;
+  }
+
+  return 0;
+}
 
-  ret = test(iface);
+int nsapi_socket_send_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  char data[] = "{{start}}";
+  int32_t ret = socket->send(data, sizeof(data));
+
+  if (ret) {
+    printf("'send' failed with code %d\r\n", ret);
+    return -1;
+  } else {
+    return 0;
+  }
+}
 
-  printf("%s: ", name);
+int nsapi_socket_recv_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  char expected_data[] = "{{data}}";
+  char data[100] = {0};
+
+  int32_t ret = socket->send(data, sizeof(data));
+
+  if (ret) {
+    printf("'send' failed during 'recv' test with code %d\r\n", ret);
+    return -4;
+  }
+
+  int32_t bytes_received = socket->recv(data, sizeof(data));
 
-  if (!ret) {
-    printf("PASS\r\n");
+  if (bytes_received >= (int32_t)sizeof(expected_data)) {
+    if (strstr(data, expected_data) != NULL) {
+      return 0;
+    } else {
+      printf("'recv' returned incorrect data with length %d\r\n", bytes_received);
+      return -2;
+    }
+  } else if (bytes_received < 0) {
+    printf("'recv' failed with code %d\r\n", bytes_received);
+    return -3;
   } else {
-    printf("FAIL (Return code %d)\r\n", ret);
+    printf("'recv' returned no data during blocking test\r\n");
+    return -1;
+  }
+}
+
+int nsapi_socket_recv_non_blocking_test(Socket *socket, const char *test_address, uint16_t test_port)
+{
+  int32_t bytes_received;
+  int result = -1;
+  char expected_data[] = "{{data}}";
+  char data[100] = {0};
+
+  int32_t ret = socket->send(expected_data, sizeof(expected_data));
+
+  if (ret) {
+    printf("'send' failed during 'recv' test with code %d\r\n", ret);
+    return -4;
   }
 
-  return ret;
+  for (int i = 0; i < 100; i++) {
+    bytes_received = socket->recv(data, sizeof(data), false);
+    
+    if (bytes_received >= (int32_t)sizeof(expected_data)) {
+      if (strstr(data, expected_data) != NULL) {
+        result = 0;
+        break;
+      } else {
+        printf("'recv' returned incorrect data\r\n");
+        result =  -2;
+        break;
+      }
+    } else if (bytes_received < 0) {
+      result = -3;
+      break;
+    }
+  }
+
+  if (result == -1) {
+    printf("'recv' returned no data during blocking test\r\n");
+  } else if (result == -2) {
+    printf("'recv' returned incorrect data\r\n");
+  } else if (result == -3) {
+    printf("'recv' failed with code %d\r\n", bytes_received);
+  }
+
+  return result;
 }
 
-int nsapi_tests(const char *name, NetworkInterface *iface)
+int nsapi_socket_close_test(Socket *socket, const char *test_address, uint16_t test_port)
 {
+  int32_t ret = socket->close();
+
+  if (ret) {
+    printf("'close' failed with code %d\r\n", ret);
+    return -1;
+  } else {
+    return 0;
+  }
+}
+
+void nspai_print_test_header(const char *name) {
+  printf("---------------------\r\n");
+  printf("%s: running...\r\n", name);
+}
+
+void nspai_print_test_result(const char *name, int result) {
+  printf("%s: ", name);
+
+  if (!result) {
+    printf("PASS\r\n");
+  } else {
+    printf("FAIL (Return code %d)\r\n", result);
+  }
+}
+
+int nsapi_ni_run_test(const char *name, NetworkInterface *iface, int (*test)(NetworkInterface*)) {
+  int result;
+  nspai_print_test_header(name);
+  result = test(iface);
+  nspai_print_test_result(name, result);
+  return result;
+}
+
+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)) {
+  int result;
+  nspai_print_test_header(name);
+  result = test(socket, test_address, test_port);
+  nspai_print_test_result(name, result);
+  return result;
+}
+
+int nsapi_tests(const char *name, NetworkInterface *iface, const char *test_address, uint16_t test_tcp_port, uint16_t test_udp_port)
+{
+  TCPSocket tcp_socket(iface);
+  UDPSocket udp_socket(iface);
   int ret = 0;
 
-  ret |= nsapi_run_test("nsapi_isConnected_test", iface, &nsapi_isConnected_test);
-  ret |= nsapi_run_test("nsapi_getIPAddress_test", iface, &nsapi_getIPAddress_test);
-  ret |= nsapi_run_test("nsapi_getMACAddress_test", iface, &nsapi_getMACAddress_test);
-  ret |= nsapi_run_test("nsapi_getHostByName_test", iface, &nsapi_getHostByName_test);
+  printf("--- Running NetworkInterface Tests ---\r\n\r\n");
+  ret |= nsapi_ni_run_test("nsapi_ni_isConnected_test", iface, &nsapi_ni_isConnected_test);
+  ret |= nsapi_ni_run_test("nsapi_ni_getIPAddress_test", iface, &nsapi_ni_getIPAddress_test);
+  ret |= nsapi_ni_run_test("nsapi_ni_getMACAddress_test", iface, &nsapi_ni_getMACAddress_test);
+  ret |= nsapi_ni_run_test("nsapi_ni_getHostByName_test", iface, &nsapi_ni_getHostByName_test);
+
+  printf("\r\n\r\n--- Running TCPSocket Tests ---\r\n\r\n");
+  ret |= nsapi_socket_run_test("nsapi_socket_open_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_open_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_getIpAddress_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_getIpAddress_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_getPort_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_getPort_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_send_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_send_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_recv_blocking_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_recv_blocking_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_recv_non_blocking_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_recv_non_blocking_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_close_test", &tcp_socket, test_address, test_tcp_port, &nsapi_socket_close_test);
 
 
-  return ret;
+  printf("\r\n\r\n--- Running UDPSocket Tests ---\r\n\r\n");
+  ret |= nsapi_socket_run_test("nsapi_socket_open_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_open_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_getIpAddress_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_getIpAddress_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_getPort_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_getPort_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_send_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_send_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_recv_blocking_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_recv_blocking_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_recv_non_blocking_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_recv_non_blocking_test);
+  ret |= nsapi_socket_run_test("nsapi_socket_close_test", &udp_socket, test_address, test_udp_port, &nsapi_socket_close_test);
+
+  return ret != 0;
 }
 
--- a/NSAPITests.h	Wed Mar 02 13:24:46 2016 -0600
+++ b/NSAPITests.h	Wed Mar 02 16:16:25 2016 -0600
@@ -19,7 +19,6 @@
 
 #include "NetworkInterface.h"
 
-int nsapi_tests(const char *name, NetworkInterface *iface);
-int nsapi_run_test(const char *name, NetworkInterface *iface, int (*test)(NetworkInterface*));
+int nsapi_tests(const char *name, NetworkInterface *iface, const char *test_address, uint16_t test_tcp_port, uint16_t test_udp_port);
 
 #endif