summaryrefslogtreecommitdiffstats
path: root/testsuites/libtests/networking01
diff options
context:
space:
mode:
authorChristian Mauderer <Christian.Mauderer@embedded-brains.de>2016-05-02 14:49:33 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-06-28 13:01:47 +0200
commit195d412d397a50383a0a2703022613d97cca2736 (patch)
treeab0fbf0f22842cffc9a4954b4f8e77319d5188bf /testsuites/libtests/networking01
parentlibnetworking: Import current <netdb.h> (diff)
downloadrtems-195d412d397a50383a0a2703022613d97cca2736.tar.bz2
libnetworking: Add minimal getnameinfo()
This implementation just falls back to giving a string representation of the IP. It supports IPv4 only. Add test for getnameinfo().
Diffstat (limited to 'testsuites/libtests/networking01')
-rw-r--r--testsuites/libtests/networking01/Makefile.am22
-rw-r--r--testsuites/libtests/networking01/init.c161
-rw-r--r--testsuites/libtests/networking01/networking01.doc26
-rw-r--r--testsuites/libtests/networking01/networking01.scn9
4 files changed, 218 insertions, 0 deletions
diff --git a/testsuites/libtests/networking01/Makefile.am b/testsuites/libtests/networking01/Makefile.am
new file mode 100644
index 0000000000..0f1fb70bd3
--- /dev/null
+++ b/testsuites/libtests/networking01/Makefile.am
@@ -0,0 +1,22 @@
+
+rtems_tests_PROGRAMS = networking01
+networking01_SOURCES = init.c
+
+dist_rtems_tests_DATA = networking01.scn
+dist_rtems_tests_DATA += networking01.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+AM_CPPFLAGS += -I$(top_srcdir)/termios04
+
+LINK_OBJS = $(networking01_OBJECTS)
+LINK_LIBS = $(networking01_LDLIBS)
+
+networking01$(EXEEXT): $(networking01_OBJECTS) $(networking01_DEPENDENCIES)
+ @rm -f networking01$(EXEEXT)
+ $(make-exe)
+
+include $(top_srcdir)/../automake/local.am
diff --git a/testsuites/libtests/networking01/init.c b/testsuites/libtests/networking01/init.c
new file mode 100644
index 0000000000..800d785776
--- /dev/null
+++ b/testsuites/libtests/networking01/init.c
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/socket.h>
+#include <netdb.h>
+#include <string.h>
+#include <netinet/in.h>
+
+#include <rtems.h>
+#include <tmacros.h>
+
+const char rtems_test_name[] = "NETWORKING 1";
+
+/* forward declarations to avoid warnings */
+static rtems_task Init(rtems_task_argument argument);
+
+static void fill_sa(struct sockaddr *sa, sa_family_t family)
+{
+ memset(sa, 0, sizeof(struct sockaddr));
+ sa->sa_len = sizeof(struct sockaddr);
+ sa->sa_family = family;
+}
+
+static void fill_sa_in(struct sockaddr_in *sa_in,
+ in_addr_t addr, in_port_t port)
+{
+ fill_sa((struct sockaddr *)sa_in, AF_INET);
+ sa_in->sin_port = port;
+ sa_in->sin_addr.s_addr = addr;
+}
+
+static void test_getnameinfo(
+ const struct sockaddr *sa,
+ int flags,
+ bool ask_node,
+ bool ask_service,
+ int expected_returnvalue,
+ const char *expected_node,
+ const char *expected_service
+)
+{
+ char node[] = "255.255.255.255";
+ char service[] = "65535";
+ socklen_t salen = sa->sa_len;
+ int rv;
+
+ char *node_p = node;
+ char *service_p = service;
+ size_t node_l = sizeof(node);
+ size_t service_l = sizeof(service);
+
+ if(ask_node == false) {
+ node_p = NULL;
+ node_l = 0;
+ }
+
+ if(ask_service == false) {
+ service_p = NULL;
+ service_l = 0;
+ }
+
+ rv = getnameinfo(sa, salen, node_p, node_l, service_p, service_l, flags);
+ rtems_test_assert(rv == expected_returnvalue);
+
+ if(expected_node != NULL) {
+ rtems_test_assert(strcmp(expected_node, node) == 0);
+ }
+
+ if(expected_service != NULL) {
+ rtems_test_assert(strcmp(expected_service, service) == 0);
+ }
+}
+
+static void test(void)
+{
+ struct sockaddr sa;
+ struct sockaddr_in sa_in;
+ struct sockaddr *sa_in_p = (struct sockaddr *) &sa_in;
+
+ const in_addr_t ip1_num = 0x7F000001u;
+ const char ip1_string[] = "127.0.0.1";
+
+ const in_addr_t ip2_num = 0xC0A86464u;
+ const char ip2_string[] = "192.168.100.100";
+
+ const in_port_t port1_num = 7u;
+ const char port1_string[] = "7";
+
+ const in_port_t port2_num = 65534u;
+ const char port2_string[] = "65534";
+
+
+ printk("Try AF_INET6\n");
+ fill_sa(&sa, AF_INET6);
+ test_getnameinfo(&sa, 0, true, true, EAI_FAMILY, NULL, NULL);
+
+ printk("force node name\n");
+ fill_sa_in(&sa_in, ip1_num, port1_num);
+ test_getnameinfo(sa_in_p, NI_NAMEREQD, true, true, EAI_NONAME, NULL, NULL);
+
+ printk("force service name\n");
+ fill_sa_in(&sa_in, ip1_num, port1_num);
+ test_getnameinfo(sa_in_p, NI_NAMEREQD, true, true, EAI_NONAME, NULL, NULL);
+
+ printk("get node only\n");
+ fill_sa_in(&sa_in, ip1_num, port1_num);
+ test_getnameinfo(sa_in_p, 0, true, false, 0, ip1_string, NULL);
+
+ printk("get service only\n");
+ fill_sa_in(&sa_in, ip1_num, port1_num);
+ test_getnameinfo(sa_in_p, 0, false, true, 0, NULL, port1_string);
+
+ printk("get node and service\n");
+ fill_sa_in(&sa_in, ip1_num, port1_num);
+ test_getnameinfo(sa_in_p, 0, true, true, 0, ip1_string, port1_string);
+
+ printk("get node and service with maximum number of characters for IP\n");
+ fill_sa_in(&sa_in, ip2_num, port2_num);
+ test_getnameinfo(sa_in_p, 0, true, true, 0, ip2_string, port2_string);
+}
+
+static rtems_task Init(rtems_task_argument argument)
+{
+ TEST_BEGIN();
+ test();
+ TEST_END();
+
+ rtems_test_exit(0);
+}
+
+#define CONFIGURE_INIT
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 10000
+
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+
+#define CONFIGURE_MAXIMUM_DRIVERS 2
+
+#define CONFIGURE_MAXIMUM_TASKS (1)
+
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#include <rtems/confdefs.h>
diff --git a/testsuites/libtests/networking01/networking01.doc b/testsuites/libtests/networking01/networking01.doc
new file mode 100644
index 0000000000..949a32cbcb
--- /dev/null
+++ b/testsuites/libtests/networking01/networking01.doc
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2016 embedded brains GmbH. All rights reserved.
+#
+# embedded brains GmbH
+# Dornierstr. 4
+# 82178 Puchheim
+# Germany
+# <rtems@embedded-brains.de>
+#
+# The license and distribution terms for this file may be
+# found in the file LICENSE in this distribution or at
+# http://www.rtems.org/license/LICENSE.
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: networking
+
+directives:
+
++ getnameinfo()
+
+concepts:
+
++ Try to get some valid and invalid name infos.
+
+NOTE: This test works without a network connection.
diff --git a/testsuites/libtests/networking01/networking01.scn b/testsuites/libtests/networking01/networking01.scn
new file mode 100644
index 0000000000..75e8457a0f
--- /dev/null
+++ b/testsuites/libtests/networking01/networking01.scn
@@ -0,0 +1,9 @@
+*** BEGIN OF TEST LIBNETWORKING 1 ***
+Try AF_INET6
+force node name
+force service name
+get node only
+get service only
+get node and service
+get node and service with maximum number of characters for IP
+*** END OF TEST LIBNETWORKING 1 ***