| // Copyright 2018 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <gtest/gtest.h> |
| #include <stdio.h> |
| |
| extern "C" { |
| #include "polled_interval_checker.h" |
| } |
| |
| static const int INTERVAL_DURATION = 5; |
| |
| static struct timespec time_now; |
| |
| static struct polled_interval* create_interval() { |
| struct polled_interval* interval = |
| pic_polled_interval_create(INTERVAL_DURATION); |
| EXPECT_NE(interval, static_cast<struct polled_interval*>(NULL)); |
| return interval; |
| } |
| |
| TEST(PolledIntervalCheckerTest, CreateDestroy) { |
| // Create an interval, checks it is non-null. |
| struct polled_interval* interval = create_interval(); |
| |
| pic_polled_interval_destroy(&interval); |
| |
| // Check it's been set to null. |
| EXPECT_EQ(interval, static_cast<struct polled_interval*>(NULL)); |
| } |
| |
| TEST(PolledIntervalCheckerTest, BasicFlow) { |
| // Set initial time. |
| time_now.tv_sec = 1000; |
| time_now.tv_nsec = 0; |
| pic_update_current_time(); |
| |
| // Create interval starting at initial time. |
| struct polled_interval* interval = create_interval(); |
| |
| // Check it hasn't elapsed. |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Increment time by less than the interval duration. |
| time_now.tv_sec += INTERVAL_DURATION / 2; |
| pic_update_current_time(); |
| |
| // Check the interval hasn't elapsed yet. |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Increment time past the duration of the interval. |
| time_now.tv_sec += INTERVAL_DURATION; |
| |
| // We haven't updated the current time, check the interval hasn't |
| // elapsed (that it isn't calling clock_gettime without us asking it to). |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Update time, check the interval has elapsed. |
| pic_update_current_time(); |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| pic_polled_interval_destroy(&interval); |
| } |
| |
| TEST(PolledIntervalCheckerTest, DoesNotResetAutomatically) { |
| // Set initial time. |
| time_now.tv_sec = 1000; |
| time_now.tv_nsec = 0; |
| pic_update_current_time(); |
| |
| struct polled_interval* interval = create_interval(); |
| |
| // Initial check. |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Increment time so the interval elapses. |
| time_now.tv_sec += INTERVAL_DURATION; |
| pic_update_current_time(); |
| |
| // Check the interval has elapsed. |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| |
| // Increment time further. |
| time_now.tv_sec += INTERVAL_DURATION * 2; |
| pic_update_current_time(); |
| |
| // Check the interval has still elapsed. |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| |
| // Check repeated calls return true. |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| pic_polled_interval_destroy(&interval); |
| } |
| |
| TEST(PolledIntervalCheckerTest, Reset) { |
| // Set initial time. |
| time_now.tv_sec = 1000; |
| time_now.tv_nsec = 0; |
| pic_update_current_time(); |
| |
| struct polled_interval* interval = create_interval(); |
| |
| // Initial check. |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Increment time so the interval elapses. |
| time_now.tv_sec += INTERVAL_DURATION; |
| pic_update_current_time(); |
| |
| // Check the interval has elapsed. |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| |
| // Increment time further. |
| time_now.tv_sec += INTERVAL_DURATION * 2; |
| pic_update_current_time(); |
| |
| // Check the interval has still elapsed. |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| |
| // Reset the interval. |
| pic_interval_reset(interval); |
| |
| // Check it's been reset. |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Increment time to just before it should elapse again. |
| time_now.tv_sec += INTERVAL_DURATION - 1; |
| pic_update_current_time(); |
| |
| // Check it still has not elapsed. |
| EXPECT_FALSE(pic_interval_elapsed(interval)); |
| |
| // Increment time to one duration after we reset it. |
| time_now.tv_sec += 1; |
| pic_update_current_time(); |
| |
| // Check the interval has elapsed now. |
| EXPECT_TRUE(pic_interval_elapsed(interval)); |
| pic_polled_interval_destroy(&interval); |
| } |
| |
| /* Stubs */ |
| extern "C" { |
| |
| int clock_gettime(clockid_t clk_id, struct timespec* tp) { |
| *tp = time_now; |
| return 0; |
| } |
| |
| } // extern "C" |
| |
| int main(int argc, char** argv) { |
| ::testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |