LONGBOW_TEST_CASE(Global, parc_EventScheduler_Create_Destroy) { PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); parcEventScheduler_Destroy(&parcEventScheduler); assertNull(parcEventScheduler, "parcEventScheduler_Destroy failed to null reference"); }
/** * Ensure that the scheduler is using parc memory inside libevent */ LONGBOW_TEST_CASE(Global, parc_EventScheduler_Memory) { PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); size_t baseline = parcMemory_Outstanding(); struct event *testEvent = event_new(parcEventScheduler_GetEvBase(parcEventScheduler), -1, 0, _test_memory_event, NULL); assertTrue(parcMemory_Outstanding() > baseline, "event_new() did not increase parcMemory_Outstanding: baseline %zu now %u", baseline, parcMemory_Outstanding()); event_free(testEvent); assertTrue(parcMemory_Outstanding() == baseline, "event_free() did reduce to baseline: baseline %zu now %u", baseline, parcMemory_Outstanding()); parcEventScheduler_Destroy(&parcEventScheduler); assertTrue(parcSafeMemory_ReportAllocation(STDOUT_FILENO) == 0, "Memory imbalance on create/destroy: %u", parcMemory_Outstanding()); }
LONGBOW_TEST_CASE(Global, parc_EventScheduler_Dispatch) { _callback_event_called = 0; PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); PARCEventTimer *parcEvent = parcEventTimer_Create(parcEventScheduler, 0, _event_callback, (void *) &_callback_event_called); assertNotNull(parcEvent, "parcEventTimer_Create returned a null reference"); struct timeval fs = { 0, 1 }; parcEventTimer_Start(parcEvent, &fs); // This will block until the event is processed parcEventScheduler_DispatchBlocking(parcEventScheduler); assertTrue(_callback_event_called == 1, "Timer event never called back"); // Start the timer struct timeval longerfs = { 1, 0 }; // 1s parcEventTimer_Start(parcEvent, &longerfs); parcEventScheduler_DispatchNonBlocking(parcEventScheduler); assertTrue(_callback_event_called == 1, "Timer event called again prematurely"); usleep(2000000); // 2s parcEventScheduler_DispatchNonBlocking(parcEventScheduler); assertTrue(_callback_event_called == 2, "Timer event never called back"); parcEventTimer_Destroy(&parcEvent); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, parc_EventScheduler_GetLogger) { PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); assertNotNull(parcEventScheduler_GetLogger(parcEventScheduler), "Expected a non-null logger."); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, parc_EventSignal_Create_Destroy) { PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); PARCEventSignal *parcEventSignal = parcEventSignal_Create(parcEventScheduler, SIGUSR1, PARCEventType_Signal | PARCEventType_Persist, _empty_event, NULL); assertNotNull(parcEventSignal, "parcEventSignal_Create returned a null reference"); _parc_event_signal_callback(0, 0, (void *)parcEventSignal); assertTrue(_empty_event_called == 1, "Event handler never called."); parcEventSignal_Destroy(&parcEventSignal); parcEventScheduler_Destroy(&parcEventScheduler); }
MetisDispatcher * metisDispatcher_Create(MetisLogger *logger) { MetisDispatcher *dispatcher = parcMemory_AllocateAndClear(sizeof(MetisDispatcher)); assertNotNull(dispatcher, "parcMemory_AllocateAndClear(%zu) returned NULL", sizeof(MetisDispatcher)); dispatcher->Base = parcEventScheduler_Create(); dispatcher->logger = metisLogger_Acquire(logger); assertNotNull(dispatcher->Base, "Got NULL from parcEventScheduler_Create()"); return dispatcher; }
LONGBOW_TEST_CASE(Global, parc_EventScheduler_Abort) { PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); PARCEventTimer *parcEvent = parcEventTimer_Create(parcEventScheduler, PARCEventType_Persist, _abort_callback, parcEventScheduler); assertNotNull(parcEvent, "parcEventTimer_Create returned a null reference"); struct timeval fs = { 1, 0 }; parcEventTimer_Start(parcEvent, &fs); parcEventScheduler_Start(parcEventScheduler, PARCEventSchedulerDispatchType_Blocking); parcEventTimer_Destroy(&parcEvent); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, parc_EventSignal_Stop) { _test_event_called = 0; PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); PARCEventSignal *parcEventSignal = parcEventSignal_Create(parcEventScheduler, SIGUSR1, PARCEventType_Signal | PARCEventType_Persist, _test_stop_event, &parcEventSignal); assertNotNull(parcEventSignal, "parcEventSignal_Create returned a null reference"); parcEventSignal_Start(parcEventSignal); kill(getpid(), SIGUSR1); parcEventScheduler_Start(parcEventScheduler, PARCEventSchedulerDispatchType_Blocking); assertTrue(_test_event_called == 1, "Event never called."); parcEventSignal_Destroy(&parcEventSignal); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, parc_EventScheduler_Run) { _callback_event_called = 0; PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); PARCEventTimer *parcEvent = parcEventTimer_Create(parcEventScheduler, 0, _event_callback, (void *) &_callback_event_called); assertNotNull(parcEvent, "parcEventTimer_Create returned a null reference"); struct timeval fs = { 0, 1 }; parcEventTimer_Start(parcEvent, &fs); parcEventScheduler_Start(parcEventScheduler, PARCEventSchedulerDispatchType_Blocking); assertTrue(_callback_event_called == 1, "Timer event never called back"); parcEventTimer_Destroy(&parcEvent); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, parc_EventSignal_Start_Stop) { PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); PARCEventSignal *parcEventSignal = parcEventSignal_Create(parcEventScheduler, SIGUSR1, PARCEventType_Signal | PARCEventType_Persist, _signal_event, &parcEventSignal); assertNotNull(parcEventSignal, "parcEventSignal_Create returned a null reference"); parcEventSignal_Start(parcEventSignal); pthread_t thread; pthread_create(&thread, NULL, _run_scheduler, parcEventScheduler); kill(getpid(), SIGUSR1); pthread_join(thread, NULL); assertTrue(_test_event_called == 1, "Event never called."); parcEventSignal_Destroy(&parcEventSignal); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, parc_EventScheduler_Stop) { _callback_event_called = 0; // Create a new scheduler PARCEventScheduler *parcEventScheduler = parcEventScheduler_Create(); assertNotNull(parcEventScheduler, "parcEventScheduler_Create returned a null reference"); // Create a persistent event which will repeat until stopped PARCEventTimer *parcEvent = parcEventTimer_Create(parcEventScheduler, PARCEventType_Persist, _stop_callback, parcEventScheduler); assertNotNull(parcEvent, "parcEventTimer_Create returned a null reference"); struct timeval fs = { 1, 0 }; parcEventTimer_Start(parcEvent, &fs); parcEventScheduler_Start(parcEventScheduler, PARCEventSchedulerDispatchType_Blocking); assertTrue(_callback_event_called == 1, "Timer event never called back"); parcEventTimer_Destroy(&parcEvent); parcEventScheduler_Destroy(&parcEventScheduler); }
LONGBOW_TEST_CASE(Global, metisMessage_Write) { char message_str[] = "\x00Once upon a time ..."; PARCEventScheduler *scheduler = parcEventScheduler_Create(); PARCEventQueue *queue = parcEventQueue_Create(scheduler, -1, PARCEventQueueOption_CloseOnFree); PARCEventBuffer *buff = parcEventBuffer_Create(); parcEventBuffer_Append(buff, message_str, sizeof(message_str)); PARCLogReporter *reporter = parcLogReporterTextStdout_Create(); MetisLogger *logger = metisLogger_Create(reporter, parcClock_Wallclock()); parcLogReporter_Release(&reporter); MetisMessage *message = metisMessage_CreateFromBuffer(1, 2, buff, logger); int result = metisMessage_Write(queue, message); assertTrue(result == 0, "Got error from metisMessage_Write"); // buff is deallocated by metisMessage_Release metisLogger_Release(&logger); metisMessage_Release(&message); parcEventQueue_Destroy(&queue); parcEventScheduler_Destroy(&scheduler); }