blob: c6ddd0ce80c96cf50a349c4d9ac6a920f67e1666 [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "aos/common/time.h"
2
3#include "gtest/gtest.h"
4
5#include "aos/common/macros.h"
Brian Silverman0534df62014-05-26 21:19:15 -07006#include "aos/common/util/death_test_log_implementation.h"
brians343bc112013-02-10 01:53:46 +00007
8namespace aos {
9namespace time {
10namespace testing {
11
12TEST(TimeTest, timespecConversions) {
13 timespec start{1234, 5678}; // NOLINT
14 Time time(start);
Brian Silvermanf7986142014-04-21 17:42:35 -070015 EXPECT_EQ(start.tv_sec, static_cast<time_t>(time.sec()));
brians343bc112013-02-10 01:53:46 +000016 EXPECT_EQ(start.tv_nsec, time.nsec());
17 timespec end = time.ToTimespec();
18 EXPECT_EQ(start.tv_sec, end.tv_sec);
19 EXPECT_EQ(start.tv_nsec, end.tv_nsec);
20}
21
brians57dd5822013-02-27 21:44:15 +000022TEST(TimeTest, timevalConversions) {
23 timeval start{1234, 5678}; // NOLINT
24 Time time(start);
brians652f7f72013-02-28 05:41:41 +000025 EXPECT_EQ(start.tv_sec, static_cast<long>(time.sec()));
brians57dd5822013-02-27 21:44:15 +000026 EXPECT_EQ(start.tv_usec, time.nsec() / Time::kNSecInUSec);
27 timeval end = time.ToTimeval();
28 EXPECT_EQ(start.tv_sec, end.tv_sec);
29 EXPECT_EQ(start.tv_usec, end.tv_usec);
30}
31
Brian Silverman0534df62014-05-26 21:19:15 -070032TEST(TimeDeathTest, ConstructorChecking) {
Brian Silverman5c201e22014-06-12 22:40:28 -070033 logging::Init();
Brian Silverman0534df62014-05-26 21:19:15 -070034 EXPECT_DEATH(
35 {
36 logging::AddImplementation(new util::DeathTestLogImplementation());
37 Time(0, -1);
38 },
39 ".*0 <= nsec\\(-1\\) < 10+ .*");
40 EXPECT_DEATH(
41 {
42 logging::AddImplementation(new util::DeathTestLogImplementation());
43 Time(0, Time::kNSecInSec);
44 },
45 ".*0 <= nsec\\(10+\\) < 10+ .*");
46}
47
brians343bc112013-02-10 01:53:46 +000048// It's kind of hard not to test Now and SleepFor at the same time.
49TEST(TimeTest, NowAndSleepFor) {
50 // without this, it tends to fail the first time (ends up sleeping for way
51 // longer than it should the second time, where it actually matters)
52 SleepFor(Time(0, Time::kNSecInSec / 10));
53 Time start = Time::Now();
Brian Silvermanaf784862014-05-13 08:14:55 -070054 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
55 SleepFor(kSleepTime);
56 Time difference = Time::Now() - start;
57 EXPECT_GE(difference, kSleepTime);
58 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000059}
60
61TEST(TimeTest, AbsoluteSleep) {
62 Time start = Time::Now();
63 SleepFor(Time(0, Time::kNSecInSec / 10));
Brian Silvermanaf784862014-05-13 08:14:55 -070064 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
65 SleepUntil(start + kSleepTime);
66 Time difference = Time::Now() - start;
67 EXPECT_GE(difference, kSleepTime);
68 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000069}
70
71TEST(TimeTest, Addition) {
72 Time t(54, 500);
73 EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
74 EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
75 EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
76 EXPECT_EQ(MACRO_DARG(Time(50, 300)),
77 t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
Brian Silverman6659bc32013-10-16 10:31:32 -070078 EXPECT_EQ(Time(-46, 500), t + Time(-100, 0));
79 EXPECT_EQ(Time(-47, Time::kNSecInSec - 500),
80 Time(-101, Time::kNSecInSec - 1000) + t);
brians343bc112013-02-10 01:53:46 +000081}
82TEST(TimeTest, Subtraction) {
83 Time t(54, 500);
84 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
85 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
86 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
87 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
88 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
89 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
90 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
Brian Silverman6659bc32013-10-16 10:31:32 -070091 EXPECT_EQ(Time(54, 5500), t - Time(-1, Time::kNSecInSec - 5000));
92 EXPECT_EQ(Time(-50, Time::kNSecInSec - 300),
93 Time(5, 200) - t);
brians343bc112013-02-10 01:53:46 +000094}
95
96TEST(TimeTest, Multiplication) {
97 Time t(54, Time::kNSecInSec / 3);
98 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
99 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
Brian Silverman6659bc32013-10-16 10:31:32 -0700100 EXPECT_EQ(Time(-109, Time::kNSecInSec / 3 + 1), t * -2);
101 EXPECT_EQ(Time(-55, Time::kNSecInSec / 3 * 2 + 1), t * -1);
102 EXPECT_EQ(Time(-218, Time::kNSecInSec / 3 * 2 + 2), (t * -1) * 4);
brians343bc112013-02-10 01:53:46 +0000103}
Brian Silverman6659bc32013-10-16 10:31:32 -0700104TEST(TimeTest, DivisionByInt) {
105 EXPECT_EQ(Time(5, Time::kNSecInSec / 10 * 4 + 50), Time(54, 500) / 10);
106 EXPECT_EQ(Time(2, Time::kNSecInSec / 4 * 3),
107 Time(5, Time::kNSecInSec / 2) / 2);
108 EXPECT_EQ(Time(-3, Time::kNSecInSec / 4 * 3),
109 Time(-5, Time::kNSecInSec / 2) / 2);
110}
111TEST(TimeTest, DivisionByTime) {
112 EXPECT_DOUBLE_EQ(2, Time(10, 0) / Time(5, 0));
113 EXPECT_DOUBLE_EQ(9, Time(27, 0) / Time(3, 0));
114 EXPECT_DOUBLE_EQ(9.25, Time(37, 0) / Time(4, 0));
115 EXPECT_DOUBLE_EQ(5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(7, 0));
116 EXPECT_DOUBLE_EQ(-5.25, Time(-37, Time::kNSecInSec / 4) / Time(7, 0));
117 EXPECT_DOUBLE_EQ(-5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(-7, 0));
brians343bc112013-02-10 01:53:46 +0000118}
119
Brian Silverman0079a9d2013-10-24 15:57:35 -0700120TEST(TimeTest, Negation) {
121 EXPECT_EQ(Time(-5, 1234), -Time(4, Time::kNSecInSec - 1234));
122 EXPECT_EQ(Time(5, Time::kNSecInSec * 2 / 3 + 1),
123 -Time(-6, Time::kNSecInSec / 3));
124}
125
brians343bc112013-02-10 01:53:46 +0000126TEST(TimeTest, Comparisons) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700127 EXPECT_TRUE(Time(971, 254) > Time(971, 253));
128 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
129 EXPECT_TRUE(Time(971, 254) < Time(971, 255));
130 EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
131 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
132 EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
133 EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
134 EXPECT_TRUE(Time(972, 254) > Time(971, 254));
135 EXPECT_TRUE(Time(971, 254) < Time(972, 254));
136
137 EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
138 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
139 EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
140 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
141 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
142 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
143 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
144 EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
145 EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
brians343bc112013-02-10 01:53:46 +0000146}
147
148TEST(TimeTest, Within) {
149 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
150 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
151 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
152 250)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700153 EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
154 EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
brians343bc112013-02-10 01:53:46 +0000155}
156
Brian Silverman6659bc32013-10-16 10:31:32 -0700157TEST(TimeTest, Modulus) {
brians343bc112013-02-10 01:53:46 +0000158 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
159 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700160 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
161 Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
162 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
163 Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
164 EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
165 Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
Brian Silverman0534df62014-05-26 21:19:15 -0700166 EXPECT_EQ(Time(1, Time::kNSecInSec / 10),
167 Time(60, Time::kNSecInSec / 10) % (Time::kNSecInSec / 10 * 12));
brians343bc112013-02-10 01:53:46 +0000168}
169
170TEST(TimeTest, InSeconds) {
171 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
172 Time::InSeconds(2.55));
Brian Silverman6659bc32013-10-16 10:31:32 -0700173 EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
174 Time::InSeconds(-2.55));
brians343bc112013-02-10 01:53:46 +0000175}
176
briansf0165ca2013-03-02 06:17:47 +0000177TEST(TimeTest, ToSeconds) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700178 EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
179 EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
180 1.0 / Time::kNSecInSec * 2);
briansf0165ca2013-03-02 06:17:47 +0000181}
182
brians343bc112013-02-10 01:53:46 +0000183TEST(TimeTest, InMS) {
184 Time t = Time::InMS(254971);
185 EXPECT_EQ(254, t.sec());
186 EXPECT_EQ(971000000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700187
188 Time t2 = Time::InMS(-254971);
189 EXPECT_EQ(-255, t2.sec());
190 EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
191}
192
193TEST(TimeTest, ToMSec) {
194 EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
195 EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
brians343bc112013-02-10 01:53:46 +0000196}
197
198TEST(TimeTest, InNS) {
199 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
200 EXPECT_EQ(973, t.sec());
201 EXPECT_EQ(254111971, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700202
203 Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
204 EXPECT_EQ(-974, t2.sec());
205 EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000206}
207
208TEST(TimeTest, InUS) {
209 Time t = Time::InUS(254111971);
210 EXPECT_EQ(254, t.sec());
211 EXPECT_EQ(111971000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700212
213 Time t2 = Time::InUS(-254111971);
214 EXPECT_EQ(-255, t2.sec());
215 EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000216}
217
Brian Silverman6659bc32013-10-16 10:31:32 -0700218TEST(TimeTest, ToUSec) {
219 EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
220 EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
brians343bc112013-02-10 01:53:46 +0000221}
222
Brian Silverman3204dd82013-03-12 18:42:01 -0700223TEST(TimeTest, Abs) {
224 EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
225 EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
226 MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
227 EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
228 MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
229}
230
brians343bc112013-02-10 01:53:46 +0000231} // namespace testing
232} // namespace time
233} // namespace aos