blob: ce17f62d6b1f1b55aef232fd6b87784b915e5f31 [file] [log] [blame]
#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);
}