blob: 3ae82ab622e708ed22293d73f20f3f34bd9ab295 [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "aos/common/time.h"
2
Austin Schuh793d6b92016-05-01 13:28:14 -07003#include <thread>
4
brians343bc112013-02-10 01:53:46 +00005#include "gtest/gtest.h"
6
7#include "aos/common/macros.h"
Brian Silverman0534df62014-05-26 21:19:15 -07008#include "aos/common/util/death_test_log_implementation.h"
brians343bc112013-02-10 01:53:46 +00009
10namespace aos {
11namespace time {
12namespace testing {
13
14TEST(TimeTest, timespecConversions) {
15 timespec start{1234, 5678}; // NOLINT
16 Time time(start);
Brian Silvermanf7986142014-04-21 17:42:35 -070017 EXPECT_EQ(start.tv_sec, static_cast<time_t>(time.sec()));
brians343bc112013-02-10 01:53:46 +000018 EXPECT_EQ(start.tv_nsec, time.nsec());
19 timespec end = time.ToTimespec();
20 EXPECT_EQ(start.tv_sec, end.tv_sec);
21 EXPECT_EQ(start.tv_nsec, end.tv_nsec);
22}
23
brians57dd5822013-02-27 21:44:15 +000024TEST(TimeTest, timevalConversions) {
25 timeval start{1234, 5678}; // NOLINT
26 Time time(start);
brians652f7f72013-02-28 05:41:41 +000027 EXPECT_EQ(start.tv_sec, static_cast<long>(time.sec()));
brians57dd5822013-02-27 21:44:15 +000028 EXPECT_EQ(start.tv_usec, time.nsec() / Time::kNSecInUSec);
29 timeval end = time.ToTimeval();
30 EXPECT_EQ(start.tv_sec, end.tv_sec);
31 EXPECT_EQ(start.tv_usec, end.tv_usec);
32}
33
Brian Silverman0534df62014-05-26 21:19:15 -070034TEST(TimeDeathTest, ConstructorChecking) {
Brian Silverman5c201e22014-06-12 22:40:28 -070035 logging::Init();
Brian Silverman0534df62014-05-26 21:19:15 -070036 EXPECT_DEATH(
37 {
38 logging::AddImplementation(new util::DeathTestLogImplementation());
39 Time(0, -1);
40 },
41 ".*0 <= nsec\\(-1\\) < 10+ .*");
42 EXPECT_DEATH(
43 {
44 logging::AddImplementation(new util::DeathTestLogImplementation());
45 Time(0, Time::kNSecInSec);
46 },
47 ".*0 <= nsec\\(10+\\) < 10+ .*");
48}
49
brians343bc112013-02-10 01:53:46 +000050// It's kind of hard not to test Now and SleepFor at the same time.
51TEST(TimeTest, NowAndSleepFor) {
52 // without this, it tends to fail the first time (ends up sleeping for way
53 // longer than it should the second time, where it actually matters)
54 SleepFor(Time(0, Time::kNSecInSec / 10));
55 Time start = Time::Now();
Brian Silvermanaf784862014-05-13 08:14:55 -070056 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
57 SleepFor(kSleepTime);
58 Time difference = Time::Now() - start;
59 EXPECT_GE(difference, kSleepTime);
60 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000061}
62
63TEST(TimeTest, AbsoluteSleep) {
64 Time start = Time::Now();
65 SleepFor(Time(0, Time::kNSecInSec / 10));
Brian Silvermanaf784862014-05-13 08:14:55 -070066 static constexpr Time kSleepTime = Time(0, Time::kNSecInSec * 2 / 10);
67 SleepUntil(start + kSleepTime);
68 Time difference = Time::Now() - start;
69 EXPECT_GE(difference, kSleepTime);
70 EXPECT_LT(difference, kSleepTime + Time(0, Time::kNSecInSec / 100));
brians343bc112013-02-10 01:53:46 +000071}
72
73TEST(TimeTest, Addition) {
74 Time t(54, 500);
75 EXPECT_EQ(MACRO_DARG(Time(54, 5500)), t + MACRO_DARG(Time(0, 5000)));
76 EXPECT_EQ(MACRO_DARG(Time(56, 500)), t + MACRO_DARG(Time(2, 0)));
77 EXPECT_EQ(MACRO_DARG(Time(57, 6500)), t + MACRO_DARG(Time(3, 6000)));
78 EXPECT_EQ(MACRO_DARG(Time(50, 300)),
79 t + MACRO_DARG(Time(-5, Time::kNSecInSec - 200)));
Brian Silverman6659bc32013-10-16 10:31:32 -070080 EXPECT_EQ(Time(-46, 500), t + Time(-100, 0));
81 EXPECT_EQ(Time(-47, Time::kNSecInSec - 500),
82 Time(-101, Time::kNSecInSec - 1000) + t);
brians343bc112013-02-10 01:53:46 +000083}
84TEST(TimeTest, Subtraction) {
85 Time t(54, 500);
86 EXPECT_EQ(MACRO_DARG(Time(54, 300)), t - MACRO_DARG(Time(0, 200)));
87 EXPECT_EQ(MACRO_DARG(Time(42, 500)), t - MACRO_DARG(Time(12, 0)));
88 EXPECT_EQ(MACRO_DARG(Time(50, 100)), t - MACRO_DARG(Time(4, 400)));
89 EXPECT_EQ(MACRO_DARG(Time(53, 600)),
90 t - MACRO_DARG(Time(0, Time::kNSecInSec - 100)));
91 EXPECT_EQ(MACRO_DARG(Time(55, 800)),
92 t - MACRO_DARG(Time(-2, Time::kNSecInSec - 300)));
Brian Silverman6659bc32013-10-16 10:31:32 -070093 EXPECT_EQ(Time(54, 5500), t - Time(-1, Time::kNSecInSec - 5000));
94 EXPECT_EQ(Time(-50, Time::kNSecInSec - 300),
95 Time(5, 200) - t);
brians343bc112013-02-10 01:53:46 +000096}
97
98TEST(TimeTest, Multiplication) {
99 Time t(54, Time::kNSecInSec / 3);
100 EXPECT_EQ(MACRO_DARG(Time(108, Time::kNSecInSec / 3 * 2)), t * 2);
101 EXPECT_EQ(MACRO_DARG(Time(271, Time::kNSecInSec / 3 * 2 - 1)), t * 5);
Brian Silverman6659bc32013-10-16 10:31:32 -0700102 EXPECT_EQ(Time(-109, Time::kNSecInSec / 3 + 1), t * -2);
103 EXPECT_EQ(Time(-55, Time::kNSecInSec / 3 * 2 + 1), t * -1);
104 EXPECT_EQ(Time(-218, Time::kNSecInSec / 3 * 2 + 2), (t * -1) * 4);
brians343bc112013-02-10 01:53:46 +0000105}
Brian Silverman6659bc32013-10-16 10:31:32 -0700106TEST(TimeTest, DivisionByInt) {
107 EXPECT_EQ(Time(5, Time::kNSecInSec / 10 * 4 + 50), Time(54, 500) / 10);
108 EXPECT_EQ(Time(2, Time::kNSecInSec / 4 * 3),
109 Time(5, Time::kNSecInSec / 2) / 2);
110 EXPECT_EQ(Time(-3, Time::kNSecInSec / 4 * 3),
111 Time(-5, Time::kNSecInSec / 2) / 2);
112}
113TEST(TimeTest, DivisionByTime) {
114 EXPECT_DOUBLE_EQ(2, Time(10, 0) / Time(5, 0));
115 EXPECT_DOUBLE_EQ(9, Time(27, 0) / Time(3, 0));
116 EXPECT_DOUBLE_EQ(9.25, Time(37, 0) / Time(4, 0));
117 EXPECT_DOUBLE_EQ(5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(7, 0));
118 EXPECT_DOUBLE_EQ(-5.25, Time(-37, Time::kNSecInSec / 4) / Time(7, 0));
119 EXPECT_DOUBLE_EQ(-5.25, Time(36, Time::kNSecInSec / 4 * 3) / Time(-7, 0));
brians343bc112013-02-10 01:53:46 +0000120}
121
Brian Silverman0079a9d2013-10-24 15:57:35 -0700122TEST(TimeTest, Negation) {
123 EXPECT_EQ(Time(-5, 1234), -Time(4, Time::kNSecInSec - 1234));
124 EXPECT_EQ(Time(5, Time::kNSecInSec * 2 / 3 + 1),
125 -Time(-6, Time::kNSecInSec / 3));
126}
127
brians343bc112013-02-10 01:53:46 +0000128TEST(TimeTest, Comparisons) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700129 EXPECT_TRUE(Time(971, 254) > Time(971, 253));
130 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
131 EXPECT_TRUE(Time(971, 254) < Time(971, 255));
132 EXPECT_TRUE(Time(971, 254) <= Time(971, 255));
133 EXPECT_TRUE(Time(971, 254) >= Time(971, 253));
134 EXPECT_TRUE(Time(971, 254) <= Time(971, 254));
135 EXPECT_TRUE(Time(971, 254) >= Time(971, 254));
136 EXPECT_TRUE(Time(972, 254) > Time(971, 254));
137 EXPECT_TRUE(Time(971, 254) < Time(972, 254));
138
139 EXPECT_TRUE(Time(-971, 254) > Time(-971, 253));
140 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
141 EXPECT_TRUE(Time(-971, 254) < Time(-971, 255));
142 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 255));
143 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 253));
144 EXPECT_TRUE(Time(-971, 254) <= Time(-971, 254));
145 EXPECT_TRUE(Time(-971, 254) >= Time(-971, 254));
146 EXPECT_TRUE(Time(-972, 254) < Time(-971, 254));
147 EXPECT_TRUE(Time(-971, 254) > Time(-972, 254));
brians343bc112013-02-10 01:53:46 +0000148}
149
150TEST(TimeTest, Within) {
151 EXPECT_TRUE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 100)));
152 EXPECT_FALSE(MACRO_DARG(Time(55, 5000).IsWithin(Time(55, 4900), 99)));
153 EXPECT_TRUE(MACRO_DARG(Time(5, 0).IsWithin(Time(4, Time::kNSecInSec - 200),
154 250)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700155 EXPECT_TRUE(Time(-5, Time::kNSecInSec - 200).IsWithin(Time(-4, 0), 250));
156 EXPECT_TRUE(Time(-5, 200).IsWithin(Time(-5, 0), 250));
brians343bc112013-02-10 01:53:46 +0000157}
158
Brian Silverman6659bc32013-10-16 10:31:32 -0700159TEST(TimeTest, Modulus) {
brians343bc112013-02-10 01:53:46 +0000160 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 10 * 2)),
161 MACRO_DARG(Time(50, 0) % (Time::kNSecInSec / 10 * 3)));
Brian Silverman6659bc32013-10-16 10:31:32 -0700162 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
163 Time(-50, 0) % (Time::kNSecInSec / 10 * 3));
164 EXPECT_EQ(Time(-1, Time::kNSecInSec / 10 * 8),
165 Time(-50, 0) % (-Time::kNSecInSec / 10 * 3));
166 EXPECT_EQ(Time(0, Time::kNSecInSec / 10 * 2),
167 Time(50, 0) % (-Time::kNSecInSec / 10 * 3));
Brian Silverman0534df62014-05-26 21:19:15 -0700168 EXPECT_EQ(Time(1, Time::kNSecInSec / 10),
169 Time(60, Time::kNSecInSec / 10) % (Time::kNSecInSec / 10 * 12));
brians343bc112013-02-10 01:53:46 +0000170}
171
172TEST(TimeTest, InSeconds) {
173 EXPECT_EQ(MACRO_DARG(Time(2, Time::kNSecInSec / 100 * 55 - 1)),
174 Time::InSeconds(2.55));
Brian Silverman6659bc32013-10-16 10:31:32 -0700175 EXPECT_EQ(MACRO_DARG(Time(-3, Time::kNSecInSec / 100 * 45)),
176 Time::InSeconds(-2.55));
brians343bc112013-02-10 01:53:46 +0000177}
178
briansf0165ca2013-03-02 06:17:47 +0000179TEST(TimeTest, ToSeconds) {
Brian Silverman6659bc32013-10-16 10:31:32 -0700180 EXPECT_DOUBLE_EQ(13.23, Time::InSeconds(13.23).ToSeconds());
181 EXPECT_NEAR(-13.23, Time::InSeconds(-13.23).ToSeconds(),
182 1.0 / Time::kNSecInSec * 2);
briansf0165ca2013-03-02 06:17:47 +0000183}
184
brians343bc112013-02-10 01:53:46 +0000185TEST(TimeTest, InMS) {
186 Time t = Time::InMS(254971);
187 EXPECT_EQ(254, t.sec());
188 EXPECT_EQ(971000000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700189
190 Time t2 = Time::InMS(-254971);
191 EXPECT_EQ(-255, t2.sec());
192 EXPECT_EQ(Time::kNSecInSec - 971000000, t2.nsec());
Brian Silvermandcaa3f72015-11-29 05:32:08 +0000193
194 Time t3 = Time::InMS(-1000);
195 EXPECT_EQ(-1, t3.sec());
196 EXPECT_EQ(0, t3.nsec());
197
198 Time t4 = Time::InMS(1000);
199 EXPECT_EQ(1, t4.sec());
200 EXPECT_EQ(0, t4.nsec());
201
202 Time t5 = Time::InMS(1001);
203 EXPECT_EQ(1, t5.sec());
204 EXPECT_EQ(Time::kNSecInMSec, t5.nsec());
205
206 Time t6 = Time::InMS(-1001);
207 EXPECT_EQ(-2, t6.sec());
208 EXPECT_EQ(Time::kNSecInSec - Time::kNSecInMSec, t6.nsec());
209
210 Time t7 = Time::InMS(-999);
211 EXPECT_EQ(-1, t7.sec());
212 EXPECT_EQ(Time::kNSecInMSec, t7.nsec());
213
214 Time t8 = Time::InMS(999);
215 EXPECT_EQ(0, t8.sec());
216 EXPECT_EQ(Time::kNSecInSec - Time::kNSecInMSec, t8.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700217}
218
219TEST(TimeTest, ToMSec) {
220 EXPECT_EQ(254971, Time(254, 971000000).ToMSec());
221 EXPECT_EQ(-254971, Time(-255, Time::kNSecInSec - 971000000).ToMSec());
brians343bc112013-02-10 01:53:46 +0000222}
223
224TEST(TimeTest, InNS) {
225 Time t = Time::InNS(static_cast<int64_t>(973254111971ll));
226 EXPECT_EQ(973, t.sec());
227 EXPECT_EQ(254111971, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700228
229 Time t2 = Time::InNS(static_cast<int64_t>(-973254111971ll));
230 EXPECT_EQ(-974, t2.sec());
231 EXPECT_EQ(Time::kNSecInSec - 254111971, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000232}
233
234TEST(TimeTest, InUS) {
235 Time t = Time::InUS(254111971);
236 EXPECT_EQ(254, t.sec());
237 EXPECT_EQ(111971000, t.nsec());
Brian Silverman6659bc32013-10-16 10:31:32 -0700238
239 Time t2 = Time::InUS(-254111971);
240 EXPECT_EQ(-255, t2.sec());
241 EXPECT_EQ(Time::kNSecInSec - 111971000, t2.nsec());
brians343bc112013-02-10 01:53:46 +0000242}
243
Brian Silverman6659bc32013-10-16 10:31:32 -0700244TEST(TimeTest, ToUSec) {
245 EXPECT_EQ(254000971, Time(254, 971000).ToUSec());
246 EXPECT_EQ(-254000971, Time(-255, Time::kNSecInSec - 971000).ToUSec());
brians343bc112013-02-10 01:53:46 +0000247}
248
Brian Silverman3204dd82013-03-12 18:42:01 -0700249TEST(TimeTest, Abs) {
250 EXPECT_EQ(MACRO_DARG(Time(971, 1114)), MACRO_DARG(Time(971, 1114).abs()));
251 EXPECT_EQ(MACRO_DARG(Time(253, Time::kNSecInSec * 0.3)),
252 MACRO_DARG(Time(-254, Time::kNSecInSec * 0.7).abs()));
253 EXPECT_EQ(MACRO_DARG(-Time(-971, 973).ToNSec()),
254 MACRO_DARG(Time(970, Time::kNSecInSec - 973).ToNSec()));
255}
256
Brian Silvermandcaa3f72015-11-29 05:32:08 +0000257TEST(TimeTest, FromRate) {
258 EXPECT_EQ(MACRO_DARG(Time(0, Time::kNSecInSec / 100)), Time::FromRate(100));
259}
260
Austin Schuh793d6b92016-05-01 13:28:14 -0700261// Test the monotonic_clock and sleep_until functions.
262TEST(TimeTest, MonotonicClockSleepAndNow) {
263 monotonic_clock::time_point start = monotonic_clock::now();
264 const auto kSleepTime = ::std::chrono::milliseconds(500);
265 ::std::this_thread::sleep_until(start + kSleepTime);
266 monotonic_clock::time_point end = monotonic_clock::now();
267 EXPECT_GE(end - start, kSleepTime);
268 EXPECT_LT(end - start, kSleepTime + ::std::chrono::milliseconds(200));
269}
270
brians343bc112013-02-10 01:53:46 +0000271} // namespace testing
272} // namespace time
273} // namespace aos