/* Listed requirements are under requirement Trick-153 (3.7.1.1) */ /* Real-time control shall be able to use a system clock source */ #include #include #include #include #include #include "gtest/gtest.h" #include "sim_services/Clock/include/GetTimeOfDayClock.hh" #include "sim_services/SimObject/include/JobData.hh" #include "trick_utils/reqs/include/RequirementScribe.hh" #define TIME_TOL 1e3 #define RATIO_TOL 1e-9 #define TICS_PER_SEC 1000000 namespace Trick { class GetTimeOfDayClockTest : public ::testing::Test { protected: Trick::GetTimeOfDayClock dClk; Trick::RequirementScribe req; GetTimeOfDayClockTest() {} ~GetTimeOfDayClockTest() {} virtual void SetUp() {} virtual void TearDown() {} } ; /* Ensure clock initializes correctly */ TEST_F(GetTimeOfDayClockTest, Initialize) { req.add_requirement("timeofday_clock"); //"The system clock shall initialize with time equal to computer system time, reference time of 0, and all ratios set to 1."); struct timeval res; Trick::GetTimeOfDayClock * timclk = new GetTimeOfDayClock; timclk->clock_init(); /* General expected clock initialization */ ASSERT_EQ(timclk->get_rt_clock_ratio() , 1.0); ASSERT_EQ(timclk->sim_tic_ratio, 1.0); ASSERT_EQ(timclk->ref_time_tics, 0); /* Time of Day clock initialization tests */ EXPECT_STREQ(timclk->get_name() , "GetTimeOfDay"); gettimeofday(&res, NULL); EXPECT_NEAR(timclk->wall_clock_time(), (res.tv_sec * 1000000LL + res.tv_usec), TIME_TOL); } TEST_F(GetTimeOfDayClockTest, ClockSimRatio) { req.add_requirement("timeofday_clock"); //"The system clock shall provide the ability to change the sim time-to-real time ratio."); long long tim_curr; double tic_ratio, tic_val; Trick::GetTimeOfDayClock * timclk = new GetTimeOfDayClock; tic_val = 100000; timclk->calc_sim_time_ratio(tic_val); usleep(100000); tim_curr = timclk->wall_clock_time(); tic_ratio = (double) timclk->clock_time() / (double) tim_curr; EXPECT_NEAR(tic_ratio, (double) tic_val / (double) TICS_PER_SEC, RATIO_TOL); delete timclk; } TEST_F(GetTimeOfDayClockTest, ClockRTRatio) { req.add_requirement("timeofday_clock"); //"The system clock shall provide the ability to adjust the reference time ratio."); long long tim_curr, tim_diff; double tic_ratio; int rt_ratio; Trick::GetTimeOfDayClock * timclk = new GetTimeOfDayClock; rt_ratio = 6.0; ASSERT_EQ(timclk->sim_tic_ratio, 1); timclk->calc_sim_time_ratio(TICS_PER_SEC); timclk->set_rt_clock_ratio(rt_ratio); tim_diff = timclk->wall_clock_time() - timclk->ref_time_tics; EXPECT_NEAR(tim_diff, (long long) (timclk->wall_clock_time() / rt_ratio), TIME_TOL); timclk->set_reference(0); usleep(100000); tim_curr = timclk->wall_clock_time(); tic_ratio = (double) timclk->clock_time() / (double) tim_curr; EXPECT_NEAR(tic_ratio, rt_ratio, RATIO_TOL); delete timclk; } TEST_F(GetTimeOfDayClockTest, ClockSpin) { req.add_requirement("timeofday_clock"); //"The system clock shall provide the ability to spin (wait) until a specified time is reached."); long long tim_curr, spin_time; Trick:: GetTimeOfDayClock * timclk = new GetTimeOfDayClock; spin_time = 100000; tim_curr = timclk->wall_clock_time(); dClk.clock_spin(tim_curr + spin_time); EXPECT_EQ((timclk->wall_clock_time() - tim_curr), spin_time); delete timclk; } /* Change and test reference times */ TEST_F(GetTimeOfDayClockTest, ReferenceTime) { req.add_requirement("timeofday_clock"); //"The system clock shall provide the ability to set a reference time."); long long tic_adjust; Trick:: GetTimeOfDayClock * timclk = new GetTimeOfDayClock; timclk->clock_init(); tic_adjust = 50000; timclk->set_reference(tic_adjust); EXPECT_NEAR(timclk->clock_time(), timclk->wall_clock_time() - tic_adjust, TIME_TOL); timclk->adjust_ref_time(2*tic_adjust); EXPECT_EQ(timclk->ref_time_tics, tic_adjust + 2*tic_adjust); delete timclk; } TEST_F(GetTimeOfDayClockTest, ClockSync) { req.add_requirement("timeofday_clock"); //"The system clock shall provide the ability to sync reference time to wall clock time"); double align_tics_mult; int clock_unit; Trick::GetTimeOfDayClock * timclk = new GetTimeOfDayClock; align_tics_mult = 1.5; clock_unit = int((TICS_PER_SEC * align_tics_mult) / (timclk->rt_clock_ratio * timclk->sim_tic_ratio)); timclk->sync_to_wall_clock(align_tics_mult, TICS_PER_SEC); EXPECT_EQ((timclk->ref_time_tics%clock_unit), 0); delete timclk; } }