#include <atf-c.h>
#include <limits.h>
#include <time.h>
ATF_TC(timespec_getres);
ATF_TC_HEAD(timespec_getres, tc)
{
atf_tc_set_md_var(tc, "descr", "Resolution tests for timespec_getres");
}
ATF_TC_BODY(timespec_getres, tc)
{
struct timespec ts, ts2;
ATF_REQUIRE_EQ(timespec_getres(&ts, TIME_MONOTONIC), TIME_MONOTONIC);
ATF_REQUIRE_EQ(clock_getres(CLOCK_MONOTONIC, &ts2), 0);
ATF_REQUIRE_EQ(ts.tv_sec, ts2.tv_sec);
ATF_REQUIRE_EQ(ts.tv_nsec, ts2.tv_nsec);
ATF_REQUIRE_EQ(timespec_getres(&ts, TIME_UTC), TIME_UTC);
ATF_REQUIRE_EQ(clock_getres(CLOCK_REALTIME, &ts2), 0);
ATF_REQUIRE_EQ(ts.tv_sec, ts2.tv_sec);
ATF_REQUIRE_EQ(ts.tv_nsec, ts2.tv_nsec);
ATF_REQUIRE_EQ(timespec_getres(&ts, INT_MAX), 0);
}
ATF_TC(timespec_get);
ATF_TC_HEAD(timespec_get, tc)
{
atf_tc_set_md_var(tc, "descr", "Basic tests for timespec_get");
}
ATF_TC_BODY(timespec_get, tc)
{
struct timespec ts, ts2;
ATF_REQUIRE_EQ(timespec_get(&ts, TIME_UTC), TIME_UTC);
ATF_REQUIRE_EQ(clock_gettime(CLOCK_REALTIME, &ts2), 0);
if (ts2.tv_sec >= ts.tv_sec) {
ATF_REQUIRE((ts2.tv_sec - ts.tv_sec) < 86400);
} else {
ATF_REQUIRE((ts.tv_sec - ts2.tv_sec) < 86400);
}
ATF_REQUIRE_EQ(timespec_get(&ts, INT_MAX), 0);
}
ATF_TC(timespec_get_monotonic);
ATF_TC_HEAD(timespec_get_monotonic, tc)
{
atf_tc_set_md_var(tc, "descr", "Monotonic tests for timespec_getres");
}
ATF_TC_BODY(timespec_get_monotonic, tc)
{
struct timespec ts, ts2;
ATF_REQUIRE_EQ(timespec_get(&ts, TIME_MONOTONIC), TIME_MONOTONIC);
ATF_REQUIRE_EQ(clock_gettime(CLOCK_MONOTONIC, &ts2), 0);
ATF_REQUIRE(ts2.tv_sec >= ts.tv_sec);
ATF_REQUIRE((ts2.tv_sec - ts.tv_sec) < 86400);
ATF_REQUIRE_EQ(timespec_get(&ts2, TIME_MONOTONIC), TIME_MONOTONIC);
ATF_REQUIRE(ts2.tv_sec >= ts.tv_sec);
}
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, timespec_getres);
ATF_TP_ADD_TC(tp, timespec_get);
ATF_TP_ADD_TC(tp, timespec_get_monotonic);
return atf_no_error();
}