LONGBOW_TEST_CASE(Global, tcpTunnel) { uint16_t metisA_port = 10001; uint16_t metisB_port = 10002; // these will get filled in with the most recent message NotifyReceiver receiver_a = { NULL }; NotifyReceiver receiver_b = { NULL }; MetisMessengerRecipient *recipient_a = metisMessengerRecipient_Create(&receiver_a, missiveNotify); MetisMessengerRecipient *recipient_b = metisMessengerRecipient_Create(&receiver_b, missiveNotify); // in between each step, run the dispatchers for 1 msec to let things settle. // =============================================== /* 1) run two instances of Metis */ MetisForwarder *metis_a = metisForwarder_Create(NULL); MetisForwarder *metis_b = metisForwarder_Create(NULL); MetisDispatcher *dispatcher_a = metisForwarder_GetDispatcher(metis_a); MetisDispatcher *dispatcher_b = metisForwarder_GetDispatcher(metis_b); // register to receive notifications metisMessenger_Register(metisForwarder_GetMessenger(metis_a), recipient_a); metisMessenger_Register(metisForwarder_GetMessenger(metis_b), recipient_b); // =============================================== /* 2) Create TCP listeners on 127.0.0.1:10001 and 10002 */ metisConfigurationListeners_SetupAll(metisForwarder_GetConfiguration(metis_a), metisA_port, NULL); metisConfigurationListeners_SetupAll(metisForwarder_GetConfiguration(metis_b), metisB_port, NULL); // ---- run metisDispatcher_RunDuration(dispatcher_a, &((struct timeval) { 0, 1000 }));
LONGBOW_TEST_CASE(Global, metisSystem_Interfaces) { MetisForwarder *metis = metisForwarder_Create(NULL); CPIInterfaceSet *set = metisSystem_Interfaces(metis); assertNotNull(set, "metisSystem_Interfaces return null set"); // XXX we need some sort of validation test. e.g. open a socket, then ioctl to // XXX get the interface name, then verify its in the list. 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); printf("Interface Index %u\n", cpiInterface_GetInterfaceIndex(iface)); const CPIAddressList *list = cpiInterface_GetAddresses(iface); PARCJSONArray *jsonArray = cpiAddressList_ToJson(list); char *str = parcJSONArray_ToString(jsonArray); printf("%s\n", str); parcMemory_Deallocate((void **) &str); parcJSONArray_Release(&jsonArray); } cpiInterfaceSet_Destroy(&set); metisForwarder_Destroy(&metis); }
LONGBOW_TEST_CASE(Global, metisSystem_InterfaceMTU) { MetisForwarder *metis = metisForwarder_Create(NULL); char *deviceName = _pickInterfaceName(metis); unsigned mtu = metisSystem_InterfaceMtu(metis, deviceName); assertTrue(mtu > 0, "Did not get mtu for interface %s", deviceName); free(deviceName); metisForwarder_Destroy(&metis); }
int main(int argc, const char *argv[]) { header(); uint16_t port = PORT_NUMBER; uint16_t configurationPort = 2001; bool daemon = false; int capacity = -1; const char *configFileName = NULL; char *logfile = NULL; if (argc == 2 && strcasecmp(argv[1], "-h") == 0) { _usage(EXIT_SUCCESS); } int logLevelArray[MetisLoggerFacility_END]; for (int i = 0; i < MetisLoggerFacility_END; i++) { logLevelArray[i] = -1; } for (int i = 0; i < argc; i++) { if (argv[i][0] == '-') { if (strcmp(argv[i], "--config") == 0) { configFileName = argv[i + 1]; i++; } else if (strcmp(argv[i], "--port") == 0) { port = atoi(argv[i + 1]); i++; } else if (strcmp(argv[i], "--daemon") == 0) { daemon = true; } else if (strcmp(argv[i], "--capacity") == 0 || strcmp(argv[i], "-c") == 0) { capacity = atoi(argv[i + 1]); i++; } else if (strcmp(argv[i], "--log") == 0) { _setLogLevel(logLevelArray, argv[i + 1]); i++; } else if (strcmp(argv[i], "--log-file") == 0) { if (logfile) { // error cannot repeat fprintf(stderr, "Cannot specify --log-file more than once\n"); _usage(EXIT_FAILURE); } logfile = parcMemory_StringDuplicate(argv[i + 1], strlen(argv[i + 1])); i++; } else { _usage(EXIT_FAILURE); } } } // set restrictive umask, in case we create any files umask(027); if (daemon && (logfile == NULL)) { fprintf(stderr, "Must specify a logfile when running in daemon mode\n"); _usage(EXIT_FAILURE); } if (daemon) { // inside this call, parent will EXIT_SUCCESS and child will continue _daemonize(); } MetisLogger *logger = NULL; if (logfile) { logger = _createLogfile(logfile); parcMemory_Deallocate((void **) &logfile); } else { PARCLogReporter *stdoutReporter = parcLogReporterTextStdout_Create(); logger = metisLogger_Create(stdoutReporter, parcClock_Wallclock()); parcLogReporter_Release(&stdoutReporter); } for (int i = 0; i < MetisLoggerFacility_END; i++) { if (logLevelArray[i] > -1) { metisLogger_SetLogLevel(logger, i, logLevelArray[i]); } } // this will update the clock to the tick clock MetisForwarder *metis = metisForwarder_Create(logger); MetisConfiguration *configuration = metisForwarder_GetConfiguration(metis); if (capacity > -1) { metisConfiguration_SetObjectStoreSize(configuration, capacity); } metisConfiguration_StartCLI(configuration, configurationPort); if (configFileName) { metisForwarder_SetupFromConfigFile(metis, configFileName); } else { // NULL to not setup AF_UNIX metisForwarder_SetupAllListeners(metis, port, NULL); } MetisDispatcher *dispatcher = metisForwarder_GetDispatcher(metis); metisLogger_Log(logger, MetisLoggerFacility_Core, PARCLogLevel_Alert, "daemon", "metis running port %d configuration-port %d", port, configurationPort); metisDispatcher_Run(dispatcher); metisLogger_Log(logger, MetisLoggerFacility_Core, PARCLogLevel_Alert, "daemon", "metis exiting port %d", port); metisForwarder_Destroy(&metis); sleep(2); metisLogger_Release(&logger); return 0; }