| 105 | }; |
| 106 | |
| 107 | TEST(TimerThreadTest, RunTasks) { |
| 108 | bthread::TimerThread timer_thread; |
| 109 | ASSERT_EQ(0, timer_thread.start(NULL)); |
| 110 | |
| 111 | timespec _2s_later = butil::seconds_from_now(2); |
| 112 | TimeKeeper keeper1(_2s_later, "keeper1"); |
| 113 | keeper1.schedule(&timer_thread); |
| 114 | |
| 115 | TimeKeeper keeper2(_2s_later, "keeper2"); // same time with keeper1 |
| 116 | keeper2.schedule(&timer_thread); |
| 117 | |
| 118 | timespec _1s_later = butil::seconds_from_now(1); |
| 119 | TimeKeeper keeper3(_1s_later, "keeper3"); |
| 120 | keeper3.schedule(&timer_thread); |
| 121 | |
| 122 | timespec _10s_later = butil::seconds_from_now(10); |
| 123 | TimeKeeper keeper4(_10s_later, "keeper4"); |
| 124 | keeper4.schedule(&timer_thread); |
| 125 | |
| 126 | TimeKeeper keeper5(_10s_later, "keeper5"); |
| 127 | keeper5.schedule(&timer_thread); |
| 128 | |
| 129 | // sleep 1 second, and unschedule task2 |
| 130 | LOG(INFO) << "Sleep 1s"; |
| 131 | sleep(1); |
| 132 | timer_thread.unschedule(keeper2._task_id); |
| 133 | timer_thread.unschedule(keeper4._task_id); |
| 134 | |
| 135 | timespec old_time = { 0, 0 }; |
| 136 | TimeKeeper keeper6(old_time, "keeper6"); |
| 137 | keeper6.schedule(&timer_thread); |
| 138 | const timespec keeper6_addtime = butil::seconds_from_now(0); |
| 139 | |
| 140 | // sleep 10 seconds and stop. |
| 141 | LOG(INFO) << "Sleep 2s"; |
| 142 | sleep(2); |
| 143 | LOG(INFO) << "Stop timer_thread"; |
| 144 | butil::Timer tm; |
| 145 | tm.start(); |
| 146 | timer_thread.stop_and_join(); |
| 147 | tm.stop(); |
| 148 | ASSERT_LE(tm.m_elapsed(), 15); |
| 149 | |
| 150 | // verify all runs in expected time range. |
| 151 | keeper1.expect_first_run(); |
| 152 | keeper2.expect_not_run(); |
| 153 | keeper3.expect_first_run(); |
| 154 | keeper4.expect_not_run(); |
| 155 | keeper5.expect_not_run(); |
| 156 | keeper6.expect_first_run(keeper6_addtime); |
| 157 | } |
| 158 | |
| 159 | // If the scheduled time is before start time, then should run it |
| 160 | // immediately. |
nothing calls this directly
no test coverage detected