trick/trick_source/sim_services/Clock/test/GetTimeOfDayClock_test.cpp
Alex Lin 14a75508a3 Cleaning up once include variables and copyright cleanup.
Changed all header file once include variables to follow the same naming
convention and not start with any underscores.  Also deleted old
incorrect copyright notices.  Also removed $Id: tags from all files.

Fixes #14.  Fixes #22.
2015-03-23 16:03:14 -05:00

165 lines
4.7 KiB
C++

/* Listed requirements are under requirement Trick-153 (3.7.1.1) */
/* Real-time control shall be able to use a system clock source */
#include <iostream>
#include <sys/types.h>
#include <signal.h>
#include <sys/time.h>
#include <map>
#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;
}
}