TEST(A1MarkingEventQueueTests, TimerTests) { // Test timers function as expected on event queue (e.g., that they // are serviced on a regular basis) const long SLEEP_TIME = 1000000/1000; EventQueue* eventQueue = new EventQueue(); TimerListenerCounter repeatingListener; TimerListenerCounter oneShotListener; EXPECT_EQ(0, MemoryTrackingTimer::num_allocated); MemoryTrackingTimer* repeatingTimer = new MemoryTrackingTimer(eventQueue, 0, true, &repeatingListener); MemoryTrackingTimer* oneShotTimer = new MemoryTrackingTimer(eventQueue, 0, false, &oneShotListener); EXPECT_EQ(2, MemoryTrackingTimer::num_allocated); EXPECT_EQ(0, eventQueue->GetNumTimers()); EXPECT_EQ(0, repeatingListener.num_times_called); EXPECT_EQ(0, oneShotListener.num_times_called); EXPECT_FALSE(repeatingTimer->IsRunning()); EXPECT_FALSE(oneShotTimer->IsRunning()); EXPECT_FALSE(repeatingTimer->IsRunning()); EXPECT_FALSE(oneShotTimer->IsRunning()); repeatingTimer->Start(); EXPECT_EQ(1, eventQueue->GetNumTimers()); oneShotTimer->Start(); EXPECT_EQ(2, eventQueue->GetNumTimers()); EXPECT_TRUE(repeatingTimer->IsRunning()); EXPECT_TRUE(oneShotTimer->IsRunning()); EXPECT_EQ(0, repeatingListener.num_times_called); EXPECT_EQ(0, oneShotListener.num_times_called); usleep(SLEEP_TIME); EXPECT_EQ(0, eventQueue->GetNumEventsInQueue()); eventQueue->ProcessNextEvent(); EXPECT_EQ(1, eventQueue->GetNumEventsInQueue()); EXPECT_EQ(1, repeatingListener.num_times_called); EXPECT_EQ(0, oneShotListener.num_times_called); EXPECT_EQ(1, eventQueue->GetNumTimers()); EXPECT_EQ(2, MemoryTrackingTimer::num_allocated); EXPECT_TRUE(repeatingTimer->IsRunning()); EXPECT_FALSE(oneShotTimer->IsRunning()); eventQueue->ProcessNextEvent(); EXPECT_EQ(1, oneShotListener.num_times_called); EXPECT_EQ(1, eventQueue->GetNumTimers()); EXPECT_EQ(2, MemoryTrackingTimer::num_allocated); EXPECT_TRUE(repeatingTimer->IsRunning()); EXPECT_FALSE(oneShotTimer->IsRunning()); usleep(SLEEP_TIME); eventQueue->ProcessNextEvent(); EXPECT_EQ(2, repeatingListener.num_times_called); EXPECT_EQ(1, oneShotListener.num_times_called); delete repeatingTimer; EXPECT_EQ(1, MemoryTrackingTimer::num_allocated); EXPECT_EQ(0, eventQueue->GetNumTimers()); delete oneShotTimer; EXPECT_EQ(0, MemoryTrackingTimer::num_allocated); EXPECT_EQ(0, eventQueue->GetNumTimers()); delete eventQueue; }