aboutsummaryrefslogtreecommitdiffstats
path: root/metis/ccnx/forwarder/metis/config/test/test_metis_ConfigurationListeners.c
diff options
context:
space:
mode:
Diffstat (limited to 'metis/ccnx/forwarder/metis/config/test/test_metis_ConfigurationListeners.c')
-rw-r--r--metis/ccnx/forwarder/metis/config/test/test_metis_ConfigurationListeners.c644
1 files changed, 644 insertions, 0 deletions
diff --git a/metis/ccnx/forwarder/metis/config/test/test_metis_ConfigurationListeners.c b/metis/ccnx/forwarder/metis/config/test/test_metis_ConfigurationListeners.c
new file mode 100644
index 00000000..8ac2c82d
--- /dev/null
+++ b/metis/ccnx/forwarder/metis/config/test/test_metis_ConfigurationListeners.c
@@ -0,0 +1,644 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Some of these tests might not execute on certain systems, as they
+ * depend on having INET and INET6 addresses available. If you system
+ * does not have one or both of those, the corresponding tests will not
+ * execute.
+ */
+
+// We need to specifically include the Ethernet mockup and set the proper define so
+// we do not need an actual Ethernet listener
+
+#define METIS_MOCK_ETHERNET 1
+#include "../../io/test/testrig_GenericEther.c"
+
+// Include the file(s) containing the functions to be tested.
+// This permits internal static functions to be visible to this Test Framework.
+#include "../metis_ConfigurationListeners.c"
+#include <LongBow/unit-test.h>
+#include <parc/algol/parc_SafeMemory.h>
+
+#include <signal.h>
+#include <net/ethernet.h>
+
+#define TEST_PORT 9697
+static const CPIAddress *
+getFirstAddressOfType(CPIInterfaceSet *set, CPIAddressType type)
+{
+ for (int i = 0; i < cpiInterfaceSet_Length(set); i++) {
+ CPIInterface *iface = cpiInterfaceSet_GetByOrdinalIndex(set, i);
+ const CPIAddressList *list = cpiInterface_GetAddresses(iface);
+ for (int j = 0; j < cpiAddressList_Length(list); j++) {
+ const CPIAddress *address = cpiAddressList_GetItem(list, j);
+ if (cpiAddress_GetType(address) == type) {
+ return address;
+ }
+ }
+ }
+ return NULL;
+}
+
+struct sigaction save_sigchld;
+struct sigaction save_sigpipe;
+
+static void
+blockSigChild()
+{
+ struct sigaction ignore_action;
+ ignore_action.sa_handler = SIG_IGN;
+ sigemptyset(&ignore_action.sa_mask);
+ ignore_action.sa_flags = 0;
+
+ sigaction(SIGCHLD, NULL, &save_sigchld);
+ sigaction(SIGPIPE, NULL, &save_sigpipe);
+
+ sigaction(SIGCHLD, &ignore_action, NULL);
+ sigaction(SIGPIPE, &ignore_action, NULL);
+}
+
+static void
+unblockSigChild()
+{
+ sigaction(SIGCHLD, &save_sigchld, NULL);
+ sigaction(SIGPIPE, &save_sigpipe, NULL);
+}
+
+static bool
+verifyInNetstat(const char *addressString, int port)
+{
+ // now verify that we are listening
+ // tcp4 0 0 127.0.0.1.49009 *.* LISTEN
+
+ FILE *fp = popen("netstat -an", "r");
+ assertNotNull(fp, "Got null opening netstat for reading");
+
+ char buffer[4][1024];
+
+ sprintf(buffer[0], "%s.%d", addressString, port);
+ sprintf(buffer[1], "%s:%d", addressString, port);
+ sprintf(buffer[2], "%s%%lo0.%d", addressString, port);
+ sprintf(buffer[3], "%s%%lo0:%d", addressString, port);
+
+ char str[1035];
+ bool found = false;
+ while (!found && (fgets(str, sizeof(str) - 1, fp) != NULL)) {
+ for (int i = 0; i < 4; i++) {
+ if (strstr(str, buffer[i]) != NULL) {
+ found = true;
+ }
+ }
+ }
+
+ blockSigChild();
+ pclose(fp);
+ unblockSigChild();
+
+ return found;
+}
+
+// returns a strdup() of the interface name, use free(3)
+static char *
+_pickInterfaceName(MetisForwarder *metis)
+{
+ char *ifname = NULL;
+
+ CPIInterfaceSet *set = metisSystem_Interfaces(metis);
+ size_t length = cpiInterfaceSet_Length(set);
+ assertTrue(length > 0, "metisSystem_Interfaces returned no interfaces");
+
+ for (size_t i = 0; i < length; i++) {
+ CPIInterface *iface = cpiInterfaceSet_GetByOrdinalIndex(set, i);
+ const CPIAddressList *addressList = cpiInterface_GetAddresses(iface);
+
+ size_t length = cpiAddressList_Length(addressList);
+ for (size_t i = 0; i < length && !ifname; i++) {
+ const CPIAddress *a = cpiAddressList_GetItem(addressList, i);
+ if (cpiAddress_GetType(a) == cpiAddressType_LINK) {
+ ifname = strdup(cpiInterface_GetName(iface));
+ }
+ }
+ }
+
+ cpiInterfaceSet_Destroy(&set);
+ return ifname;
+}
+
+// =========================================================================
+
+LONGBOW_TEST_RUNNER(metis_Configuration)
+{
+ LONGBOW_RUN_TEST_FIXTURE(Global);
+ LONGBOW_RUN_TEST_FIXTURE(Local);
+}
+
+// The Test Runner calls this function once before any Test Fixtures are run.
+LONGBOW_TEST_RUNNER_SETUP(metis_Configuration)
+{
+ parcMemory_SetInterface(&PARCSafeMemoryAsPARCMemory);
+ return LONGBOW_STATUS_SUCCEEDED;
+}
+
+// The Test Runner calls this function once after all the Test Fixtures are run.
+LONGBOW_TEST_RUNNER_TEARDOWN(metis_Configuration)
+{
+ return LONGBOW_STATUS_SUCCEEDED;
+}
+
+// ==============================================================================
+
+LONGBOW_TEST_FIXTURE(Global)
+{
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_SetupAll);
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_Add_Ether);
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_Add_IP_UDP4);
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_Add_IP_UDP6);
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_Add_IP_TCP4);
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_Add_IP_TCP6);
+ LONGBOW_RUN_TEST_CASE(Global, metisConfigurationListeners_Remove);
+}
+
+LONGBOW_TEST_FIXTURE_SETUP(Global)
+{
+ return LONGBOW_STATUS_SUCCEEDED;
+}
+
+LONGBOW_TEST_FIXTURE_TEARDOWN(Global)
+{
+ uint32_t outstandingAllocations = parcSafeMemory_ReportAllocation(STDERR_FILENO);
+ if (outstandingAllocations != 0) {
+ printf("%s leaks memory by %d allocations\n", longBowTestCase_GetName(testCase), outstandingAllocations);
+ return LONGBOW_STATUS_MEMORYLEAK;
+ }
+ return LONGBOW_STATUS_SUCCEEDED;
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_SetupAll)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_IO, PARCLogLevel_Debug);
+
+ metisConfigurationListeners_SetupAll(metisForwarder_GetConfiguration(metis), TEST_PORT, NULL);
+
+ MetisListenerSet *set = metisForwarder_GetListenerSet(metis);
+ size_t len = metisListenerSet_Length(set);
+ assertTrue(len > 0, "Bad listener set size, expected positive, got %zu", len);
+
+ metisForwarder_Destroy(&metis);
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_Add_Ether)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_IO, PARCLogLevel_Debug);
+
+ // Create a mock up of an interface so we can see the response
+ unsigned mockup_id = 77;
+
+ // create the listener
+ char *ifname = _pickInterfaceName(metis);
+ CPIListener *cpiListener = cpiListener_CreateEther(ifname, 0x0801, "fake0");
+ CCNxControl *control = cpiListener_CreateAddMessage(cpiListener);
+ bool listenerOk = metisConfigurationListeners_Add(metisForwarder_GetConfiguration(metis), control, mockup_id);
+ assertTrue(listenerOk, "Failed to setup ether listener.");
+ free(ifname);
+
+ ccnxControl_Release(&control);
+ cpiListener_Release(&cpiListener);
+
+ MetisListenerSet *set = metisForwarder_GetListenerSet(metis);
+ size_t len = metisListenerSet_Length(set);
+ assertTrue(len == 1, "Bad listener set size, expected 1, got %zu", len);
+
+ metisForwarder_Destroy(&metis);
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_Add_IP_UDP4)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_IO, PARCLogLevel_Debug);
+
+ // Create a mock up of an interface so we can see the response
+ unsigned mockup_id = 77;
+
+ // create the listener
+ struct sockaddr_in sin;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(TEST_PORT);
+ int result = inet_aton("127.0.0.1", &sin.sin_addr);
+ assertTrue(result == 1, "failed inet_aton: (%d) %s", errno, strerror(errno));
+
+ CPIAddress *address = cpiAddress_CreateFromInet(&sin);
+ CPIListener *listener = cpiListener_CreateIP(IPTUN_UDP, address, "conn1");
+ cpiAddress_Destroy(&address);
+
+
+ CCNxControl *control = cpiListener_CreateAddMessage(listener);
+ bool listenerOk = metisConfigurationListeners_Add(metisForwarder_GetConfiguration(metis), control, mockup_id);
+ assertTrue(listenerOk, "Failed to setup ether listener.") {
+ int res;
+ res = system("netstat -an -p udp");
+ assertTrue(res != -1, "Error on system call");
+ res = system("ps -el");
+ assertTrue(res != -1, "Error on system call");
+ }
+
+ ccnxControl_Release(&control);
+ cpiListener_Release(&listener);
+
+ MetisListenerSet *set = metisForwarder_GetListenerSet(metis);
+ size_t len = metisListenerSet_Length(set);
+ assertTrue(len == 1, "Bad listener set size, expected 1, got %zu", len);
+
+ metisForwarder_Destroy(&metis);
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_Add_IP_UDP6)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_IO, PARCLogLevel_Debug);
+
+ // Create a mock up of an interface so we can see the response
+ unsigned mockup_id = 77;
+
+ // create the listener
+ struct sockaddr_in6 sin6;
+ memset(&sin6, 0, sizeof(sin6));
+ sin6.sin6_family = AF_INET6;
+ sin6.sin6_port = htons(TEST_PORT);
+ int result = inet_pton(AF_INET6, "::1", &(sin6.sin6_addr));
+ if (result == 1) {
+ CPIAddress *address = cpiAddress_CreateFromInet6(&sin6);
+ CPIListener *listener = cpiListener_CreateIP(IPTUN_UDP, address, "conn1");
+ cpiAddress_Destroy(&address);
+
+
+ CCNxControl *control = cpiListener_CreateAddMessage(listener);
+ bool listenerOk = metisConfigurationListeners_Add(metisForwarder_GetConfiguration(metis), control, mockup_id);
+ assertTrue(listenerOk, "Failed to setup ether listener.") {
+ int res;
+ res = system("netstat -an -p udp");
+ assertTrue(res != -1, "Error on system call");
+ res = system("ps -el");
+ assertTrue(res != -1, "Error on system call");
+ }
+
+ ccnxControl_Release(&control);
+ cpiListener_Release(&listener);
+
+ MetisListenerSet *set = metisForwarder_GetListenerSet(metis);
+ size_t len = metisListenerSet_Length(set);
+ assertTrue(len == 1, "Bad listener set size, expected 1, got %zu", len);
+ metisForwarder_Destroy(&metis);
+ } else {
+ metisForwarder_Destroy(&metis);
+ testSkip("IPv6 not supported");
+ }
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_Add_IP_TCP4)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_IO, PARCLogLevel_Debug);
+
+ // Create a mock up of an interface so we can see the response
+ unsigned mockup_id = 77;
+
+ // create the listener
+ struct sockaddr_in sin;
+ memset(&sin, 0, sizeof(sin));
+ sin.sin_family = AF_INET;
+ sin.sin_port = htons(TEST_PORT);
+ int result = inet_aton("127.0.0.1", &sin.sin_addr);
+ assertTrue(result == 1, "failed inet_aton: (%d) %s", errno, strerror(errno));
+
+ CPIAddress *address = cpiAddress_CreateFromInet(&sin);
+ CPIListener *listener = cpiListener_CreateIP(IPTUN_TCP, address, "conn1");
+ cpiAddress_Destroy(&address);
+
+
+ CCNxControl *control = cpiListener_CreateAddMessage(listener);
+ bool listenerOk = metisConfigurationListeners_Add(metisForwarder_GetConfiguration(metis), control, mockup_id);
+ assertTrue(listenerOk, "Failed to setup ether listener.") {
+ int res;
+ res = system("netstat -an -p tcp");
+ assertTrue(res != -1, "Error on system call");
+ res = system("ps -el");
+ assertTrue(res != -1, "Error on system call");
+ }
+
+ ccnxControl_Release(&control);
+ cpiListener_Release(&listener);
+
+ MetisListenerSet *set = metisForwarder_GetListenerSet(metis);
+ size_t len = metisListenerSet_Length(set);
+ assertTrue(len == 1, "Bad listener set size, expected 1, got %zu", len);
+
+ metisForwarder_Destroy(&metis);
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_Add_IP_TCP6)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_IO, PARCLogLevel_Debug);
+
+ // Create a mock up of an interface so we can see the response
+ unsigned mockup_id = 77;
+
+ // create the listener
+ struct sockaddr_in6 sin6;
+ memset(&sin6, 0, sizeof(sin6));
+ sin6.sin6_family = AF_INET6;
+ sin6.sin6_port = htons(TEST_PORT);
+ int result = inet_pton(AF_INET6, "::1", &(sin6.sin6_addr));
+ if (result == 1) {
+ CPIAddress *address = cpiAddress_CreateFromInet6(&sin6);
+ CPIListener *listener = cpiListener_CreateIP(IPTUN_TCP, address, "conn1");
+ cpiAddress_Destroy(&address);
+
+
+ CCNxControl *control = cpiListener_CreateAddMessage(listener);
+ bool listenerOk = metisConfigurationListeners_Add(metisForwarder_GetConfiguration(metis), control, mockup_id);
+ assertTrue(listenerOk, "Failed to setup ether listener.") {
+ int res;
+ res = system("netstat -an -p tcp");
+ assertTrue(res != -1, "Error on system call");
+ res = system("ps -el");
+ assertTrue(res != -1, "Error on system call");
+ }
+
+ ccnxControl_Release(&control);
+ cpiListener_Release(&listener);
+
+ MetisListenerSet *set = metisForwarder_GetListenerSet(metis);
+ size_t len = metisListenerSet_Length(set);
+ assertTrue(len == 1, "Bad listener set size, expected 1, got %zu", len);
+ metisForwarder_Destroy(&metis);
+ } else {
+ metisForwarder_Destroy(&metis);
+ testSkip("IPv6 not supported");
+ }
+}
+
+LONGBOW_TEST_CASE(Global, metisConfigurationListeners_Remove)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+// ==============================================================================
+
+LONGBOW_TEST_FIXTURE(Local)
+{
+ LONGBOW_RUN_TEST_CASE(Local, setupEthernetListenerOnLink);
+ LONGBOW_RUN_TEST_CASE(Local, setupEthernetListenerOnLink_SecondEthertype);
+ LONGBOW_RUN_TEST_CASE(Local, setupIPMulticastListenerOnInet);
+ LONGBOW_RUN_TEST_CASE(Local, setupListenersOnAddress);
+ LONGBOW_RUN_TEST_CASE(Local, setupListenersOnInet);
+ LONGBOW_RUN_TEST_CASE(Local, setupListenersOnInet6);
+ LONGBOW_RUN_TEST_CASE(Local, setupListenersOnLink);
+ LONGBOW_RUN_TEST_CASE(Local, setupLocalListener);
+ LONGBOW_RUN_TEST_CASE(Local, setupTcpListenerOnInet);
+ LONGBOW_RUN_TEST_CASE(Local, setupTcpListenerOnInet6);
+ LONGBOW_RUN_TEST_CASE(Local, setupUdpListenerOnInet);
+ LONGBOW_RUN_TEST_CASE(Local, setupUdpListenerOnInet6);
+}
+
+LONGBOW_TEST_FIXTURE_SETUP(Local)
+{
+ return LONGBOW_STATUS_SUCCEEDED;
+}
+
+LONGBOW_TEST_FIXTURE_TEARDOWN(Local)
+{
+ uint32_t outstandingAllocations = parcSafeMemory_ReportAllocation(STDERR_FILENO);
+ if (outstandingAllocations != 0) {
+ printf("%s leaks memory by %d allocations\n", longBowTestCase_GetName(testCase), outstandingAllocations);
+ return LONGBOW_STATUS_MEMORYLEAK;
+ }
+ return LONGBOW_STATUS_SUCCEEDED;
+}
+
+LONGBOW_TEST_CASE(Local, setupEthernetListenerOnLink)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+
+ uint8_t addr[ETHER_ADDR_LEN] = { 1, 2, 3, 4, 5, 6 };
+ CPIAddress *localAddress = cpiAddress_CreateFromLink(addr, ETHER_ADDR_LEN);
+
+ char *ifname = _pickInterfaceName(metis);
+ MetisListenerOps *listenerops = _setupEthernetListenerOnLink(metis, localAddress, ifname, 0x0801);
+ assertNotNull(listenerops, "Got null result from _setupEthernetListenerOnLink");
+
+ free(ifname);
+ cpiAddress_Destroy(&localAddress);
+ metisForwarder_Destroy(&metis);
+}
+
+/*
+ * The current system does not allow multiple ether listeners on a single interface.
+ * even if they are different ethertypes
+ */
+LONGBOW_TEST_CASE(Local, setupEthernetListenerOnLink_SecondEthertype)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+
+ uint8_t addr[ETHER_ADDR_LEN] = { 1, 2, 3, 4, 5, 6 };
+ CPIAddress *localAddress = cpiAddress_CreateFromLink(addr, ETHER_ADDR_LEN);
+
+ char *ifname = _pickInterfaceName(metis);
+ MetisListenerOps *listenerops = _setupEthernetListenerOnLink(metis, localAddress, ifname, 0x0801);
+ assertNotNull(listenerops, "Got null result from _setupEthernetListenerOnLink");
+
+ // now try to add again with different ethertype
+ MetisListenerOps *second = _setupEthernetListenerOnLink(metis, localAddress, ifname, 0x0802);
+ assertNull(second, "Should have gotten null for second listener");
+
+ free(ifname);
+ cpiAddress_Destroy(&localAddress);
+ metisForwarder_Destroy(&metis);
+}
+
+
+LONGBOW_TEST_CASE(Local, setupIPMulticastListenerOnInet)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+LONGBOW_TEST_CASE(Local, setupListenersOnAddress)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+LONGBOW_TEST_CASE(Local, setupListenersOnInet)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+LONGBOW_TEST_CASE(Local, setupListenersOnInet6)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+LONGBOW_TEST_CASE(Local, setupListenersOnLink)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+LONGBOW_TEST_CASE(Local, setupLocalListener)
+{
+ testUnimplemented("This test is unimplemented");
+}
+
+LONGBOW_TEST_CASE(Local, setupTcpListenerOnInet)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+
+ CPIInterfaceSet *set = metisSystem_Interfaces(metis);
+ const CPIAddress *address = getFirstAddressOfType(set, cpiAddressType_INET);
+ if (address != NULL) {
+ char valueToFind[1024];
+ struct sockaddr_in sin;
+ cpiAddress_GetInet(address, &sin);
+ _setupTcpListenerOnInet(metis, address, PORT_NUMBER);
+ bool found = verifyInNetstat(inet_ntoa(sin.sin_addr), PORT_NUMBER);
+ if (!found) {
+ // extra diagnostics
+ int ret = system("netstat -an -p tcp");
+ assertTrue(ret > -1, "Error on system call");
+ }
+ assertTrue(found, "Did not find value %s in netstat", valueToFind);
+ }
+
+ cpiInterfaceSet_Destroy(&set);
+ metisForwarder_Destroy(&metis);
+
+ if (address == NULL) {
+ testSkip("No network interfaces of type INET found");
+ }
+}
+
+LONGBOW_TEST_CASE(Local, setupTcpListenerOnInet6)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+
+ CPIInterfaceSet *set = metisSystem_Interfaces(metis);
+ const CPIAddress *address = getFirstAddressOfType(set, cpiAddressType_INET6);
+ if (address != NULL) {
+ char valueToFind[1024];
+ char inet6str[INET6_ADDRSTRLEN];
+ struct sockaddr_in6 sin6;
+ cpiAddress_GetInet6(address, &sin6);
+ inet_ntop(AF_INET6, &sin6.sin6_addr, inet6str, INET6_ADDRSTRLEN);
+ _setupTcpListenerOnInet6(metis, address, PORT_NUMBER);
+ bool found = verifyInNetstat(inet6str, PORT_NUMBER);
+ if (!found) {
+ // extra diagnostics
+ int ret = system("netstat -an -p tcp");
+ assertTrue(ret > -1, "Error on system call");
+ }
+ assertTrue(found, "Did not find value %s in netstat", valueToFind);
+ }
+
+ cpiInterfaceSet_Destroy(&set);
+ metisForwarder_Destroy(&metis);
+
+ if (address == NULL) {
+ testSkip("No network interfaces of type INET found");
+ }
+}
+
+LONGBOW_TEST_CASE(Local, setupUdpListenerOnInet)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+
+ CPIInterfaceSet *set = metisSystem_Interfaces(metis);
+ const CPIAddress *address = getFirstAddressOfType(set, cpiAddressType_INET);
+ if (address != NULL) {
+ char valueToFind[1024];
+ struct sockaddr_in sin;
+ cpiAddress_GetInet(address, &sin);
+ _setupUdpListenerOnInet(metis, address, PORT_NUMBER);
+ bool found = verifyInNetstat(inet_ntoa(sin.sin_addr), PORT_NUMBER);
+ if (!found) {
+ // extra diagnostics
+ int ret = system("netstat -an -p udp");
+ assertTrue(ret > -1, "Error on system call");
+ }
+ assertTrue(found, "Did not find value %s in netstat", valueToFind);
+ }
+
+ cpiInterfaceSet_Destroy(&set);
+ metisForwarder_Destroy(&metis);
+
+ if (address == NULL) {
+ testSkip("No network interfaces of type INET found");
+ }
+}
+
+LONGBOW_TEST_CASE(Local, setupUdpListenerOnInet6)
+{
+ MetisForwarder *metis = metisForwarder_Create(NULL);
+ metisLogger_SetLogLevel(metisForwarder_GetLogger(metis), MetisLoggerFacility_Config, PARCLogLevel_Debug);
+
+ CPIInterfaceSet *set = metisSystem_Interfaces(metis);
+ const CPIAddress *address = getFirstAddressOfType(set, cpiAddressType_INET6);
+ if (address != NULL) {
+ char valueToFind[1024];
+ char inet6str[INET6_ADDRSTRLEN];
+ struct sockaddr_in6 sin6;
+ cpiAddress_GetInet6(address, &sin6);
+ inet_ntop(AF_INET6, &sin6.sin6_addr, inet6str, INET6_ADDRSTRLEN);
+ _setupUdpListenerOnInet6(metis, address, PORT_NUMBER);
+ bool found = verifyInNetstat(inet6str, PORT_NUMBER);
+ if (!found) {
+ // extra diagnostics
+ int ret = system("netstat -an -p udp");
+ assertTrue(ret > -1, "Error on system call");
+ }
+ assertTrue(found, "Did not find value %s in netstat", valueToFind);
+ }
+
+ cpiInterfaceSet_Destroy(&set);
+ metisForwarder_Destroy(&metis);
+
+ if (address == NULL) {
+ testSkip("No network interfaces of type INET found");
+ }
+}
+
+
+// ======================================================
+
+int
+main(int argc, char *argv[])
+{
+ LongBowRunner *testRunner = LONGBOW_TEST_RUNNER_CREATE(metis_Configuration);
+ int exitStatus = longBowMain(argc, argv, testRunner, NULL);
+ longBowTestRunner_Destroy(&testRunner);
+ exit(exitStatus);
+}