| #include <utest/utest.h> |
| #include <parlib/alarm.h> |
| |
| TEST_SUITE("ALARMS"); |
| |
| /* <--- Begin definition of test cases ---> */ |
| |
| bool test_alarm(void) { |
| const int INTERVAL = 10000; |
| const int ITERATIONS = 100; |
| void alarm_handler(struct alarm_waiter *waiter) |
| { |
| __sync_fetch_and_add((int*)waiter->data, 1); |
| set_awaiter_inc(waiter, INTERVAL); |
| set_alarm(waiter); |
| } |
| |
| int count = 0; |
| uint64_t now, then; |
| struct alarm_waiter waiter; |
| init_awaiter(&waiter, alarm_handler); |
| waiter.data = &count; |
| set_awaiter_rel(&waiter, INTERVAL); |
| now = tsc2usec(read_tsc()); |
| set_alarm(&waiter); |
| while(count < ITERATIONS) |
| cpu_relax(); |
| then = tsc2usec(read_tsc()); |
| unset_alarm(&waiter); |
| UT_ASSERT_M("Alarms finished too soon", then >= (now + INTERVAL*count)); |
| UT_ASSERT_M("Alarms finished too late", then < (now + 2*INTERVAL*count)); |
| return true; |
| } |
| |
| /* <--- End definition of test cases ---> */ |
| |
| struct utest utests[] = { |
| UTEST_REG(alarm), |
| }; |
| int num_utests = sizeof(utests) / sizeof(struct utest); |
| |
| int main(int argc, char *argv[]) { |
| char **whitelist = &argv[1]; |
| int whitelist_len = argc - 1; |
| RUN_TEST_SUITE(utests, num_utests, whitelist, whitelist_len); |
| } |
| |
| |