#include <gtest/gtest.h>

#include "times.h"

TEST(TIMES, TEST)
{
    uint64_t last_sec = 0;
    uint64_t last_msec = 0;
    uint64_t curr_sec = 0;
    uint64_t curr_msec = 0;

    stellar_update_time_cache();
    last_sec = stellar_get_monotonic_time_sec();
    last_msec = stellar_get_monotonic_time_msec();

    usleep(1000); // 1ms
    stellar_update_time_cache();
    curr_sec = stellar_get_monotonic_time_sec();
    curr_msec = stellar_get_monotonic_time_msec();
    printf("After usleep(1000)\n");
    printf("last_sec: %lu, last_msec: %lu\n", last_sec, last_msec);
    printf("curr_sec: %lu, curr_msec: %lu\n", curr_sec, curr_msec);
    EXPECT_TRUE(curr_sec == last_sec);
    EXPECT_TRUE(curr_msec - last_msec >= 1);

    usleep(1000 * 1000); // 1s
    stellar_update_time_cache();
    last_sec = curr_sec;
    last_msec = curr_msec;
    curr_sec = stellar_get_monotonic_time_sec();
    curr_msec = stellar_get_monotonic_time_msec();
    printf("After usleep(1000 * 1000)\n");
    printf("last_sec: %lu, last_msec: %lu\n", last_sec, last_msec);
    printf("curr_sec: %lu, curr_msec: %lu\n", curr_sec, curr_msec);
    EXPECT_TRUE(curr_sec - last_sec == 1);
    EXPECT_TRUE(curr_msec - last_msec >= 1000);
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}
