Esempio n. 1
0
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;

}