summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c')
-rw-r--r--3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c b/3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c
new file mode 100644
index 0000000..2739215
--- /dev/null
+++ b/3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c
@@ -0,0 +1,203 @@
+/* vim:ts=8:sts=8:sw=4:noai:noexpandtab
+ *
+ * unit tests for portable implementations of inet_network and inet_network6.
+ *
+ * Copyright (c) 2009 Miru Limited.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+
+#include <errno.h>
+#include <sys/socket.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <glib.h>
+#include <check.h>
+
+
+/* mock state */
+
+/* mock functions for external references */
+
+size_t
+pgm_transport_pkt_offset2 (
+ const bool can_fragment,
+ const bool use_pgmcc
+ )
+{
+ return 0;
+}
+
+
+#define INET_NETWORK_DEBUG
+#include "inet_network.c"
+
+
+/* target:
+ * int
+ * pgm_inet_network (
+ * const char* s,
+ * struct in_addr* in -- in host byte order
+ * )
+ */
+
+struct test_case_t {
+ const char* network;
+ const char* answer;
+};
+
+static const struct test_case_t cases_001[] = {
+ { "127", "127.0.0.0" }, /* different to inet_addr/inet_network */
+ { "127/8", "127.0.0.0" },
+ { "127.1/8", "127.0.0.0" },
+ { "127.1", "127.1.0.0" }, /* different to inet_addr/inet_network */
+ { "127.x.x.x", "127.0.0.0" },
+ { "127.X.X.X", "127.0.0.0" },
+ { "127.0.0.0", "127.0.0.0" },
+ { "127.0.0.1/8", "127.0.0.0" },
+ { "127.0.0.1/32", "127.0.0.1" },
+ { "10.0.0.0/8", "10.0.0.0" }, /* RFC1918 class A */
+ { "10.255.255.255/8", "10.0.0.0" },
+ { "172.16.0.0/12", "172.16.0.0" }, /* RFC1918 class B */
+ { "172.31.255.255/12", "172.16.0.0" },
+ { "192.168.0.0/16", "192.168.0.0" }, /* RFC1918 class C */
+ { "192.168.255.255/16", "192.168.0.0" },
+ { "169.254.0.0/16", "169.254.0.0" }, /* RFC3927 link-local */
+ { "192.88.99.0/24", "192.88.99.0" }, /* RFC3068 6to4 relay anycast */
+ { "224.0.0.0/4", "224.0.0.0" }, /* RFC3171 multicast */
+ { "0.0.0.0", "0.0.0.0" },
+ { "255.255.255.255", "255.255.255.255" },
+};
+
+START_TEST (test_inet_network_pass_001)
+{
+ const char* network = cases_001[_i].network;
+ const char* answer = cases_001[_i].answer;
+
+ struct in_addr host_order, network_order;
+ fail_unless (0 == pgm_inet_network (network, &host_order));
+ network_order.s_addr = g_htonl (host_order.s_addr);
+
+ g_message ("Resolved \"%s\" to \"%s\"",
+ network, inet_ntoa (network_order));
+
+{
+struct in_addr t = { .s_addr = g_htonl (inet_network (network)) };
+g_message ("inet_network (%s) = %s", network, inet_ntoa (t));
+}
+
+ fail_unless (0 == strcmp (answer, inet_ntoa (network_order)));
+}
+END_TEST
+
+START_TEST (test_inet_network_fail_001)
+{
+ fail_unless (-1 == pgm_inet_network (NULL, NULL));
+}
+END_TEST
+
+START_TEST (test_inet_network_fail_002)
+{
+ const char* network = "192.168.0.1/0";
+
+ struct in_addr host_order;
+ fail_unless (-1 == pgm_inet_network (network, &host_order));
+}
+END_TEST
+
+/* target:
+ * int
+ * pgm_inet6_network (
+ * const char* s,
+ * struct in6_addr* in6
+ * )
+ */
+
+static const struct test_case_t cases6_001[] = {
+ { "::1/128", "::1" },
+ { "2002:dec8:d28e::36/64", "2002:dec8:d28e::" }, /* 6to4 */
+ { "fe80::203:baff:fe4e:6cc8/10", "fe80::" }, /* link-local */
+ { "ff02::1/8", "ff00::" }, /* multicast */
+ { "fc00:6::61/7", "fc00::" }, /* ULA */
+};
+
+START_TEST (test_inet6_network_pass_001)
+{
+ const char* network = cases6_001[_i].network;
+ const char* answer = cases6_001[_i].answer;
+
+ char snetwork[INET6_ADDRSTRLEN];
+ struct in6_addr addr;
+ fail_unless (0 == pgm_inet6_network (network, &addr));
+ g_message ("Resolved \"%s\" to \"%s\"",
+ network, pgm_inet_ntop (AF_INET6, &addr, snetwork, sizeof(snetwork)));
+
+ fail_unless (0 == strcmp (answer, snetwork));
+}
+END_TEST
+
+START_TEST (test_inet6_network_fail_001)
+{
+ fail_unless (-1 == pgm_inet6_network (NULL, NULL));
+}
+END_TEST
+
+
+static
+Suite*
+make_test_suite (void)
+{
+ Suite* s;
+
+ s = suite_create (__FILE__);
+
+ TCase* tc_inet_network = tcase_create ("inet-network");
+ suite_add_tcase (s, tc_inet_network);
+ tcase_add_loop_test (tc_inet_network, test_inet_network_pass_001, 0, G_N_ELEMENTS(cases_001));
+ tcase_add_test (tc_inet_network, test_inet_network_fail_001);
+
+ TCase* tc_inet6_network = tcase_create ("inet6-network");
+ suite_add_tcase (s, tc_inet6_network);
+ tcase_add_loop_test (tc_inet6_network, test_inet6_network_pass_001, 0, G_N_ELEMENTS(cases6_001));
+ tcase_add_test (tc_inet6_network, test_inet6_network_fail_001);
+ return s;
+}
+
+static
+Suite*
+make_master_suite (void)
+{
+ Suite* s = suite_create ("Master");
+ return s;
+}
+
+int
+main (void)
+{
+ SRunner* sr = srunner_create (make_master_suite ());
+ srunner_add_suite (sr, make_test_suite ());
+ srunner_run_all (sr, CK_ENV);
+ int number_failed = srunner_ntests_failed (sr);
+ srunner_free (sr);
+ return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
+
+/* eof */