OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/base/common.h" | 11 #include "webrtc/base/common.h" |
| 12 #include "webrtc/base/event.h" |
| 13 #include "webrtc/base/fakeclock.h" |
12 #include "webrtc/base/gunit.h" | 14 #include "webrtc/base/gunit.h" |
13 #include "webrtc/base/helpers.h" | 15 #include "webrtc/base/helpers.h" |
14 #include "webrtc/base/thread.h" | 16 #include "webrtc/base/thread.h" |
15 #include "webrtc/base/timeutils.h" | 17 #include "webrtc/base/timeutils.h" |
16 | 18 |
17 namespace rtc { | 19 namespace rtc { |
18 | 20 |
19 TEST(TimeTest, TimeInMs) { | 21 TEST(TimeTest, TimeInMs) { |
20 int64_t ts_earlier = TimeMillis(); | 22 int64_t ts_earlier = TimeMillis(); |
21 Thread::SleepMs(100); | 23 Thread::SleepMs(100); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 EXPECT_TRUE(rtc::TmToSeconds(tm) == t); | 200 EXPECT_TRUE(rtc::TmToSeconds(tm) == t); |
199 #endif | 201 #endif |
200 } | 202 } |
201 } | 203 } |
202 }; | 204 }; |
203 | 205 |
204 TEST_F(TmToSeconds, TestTmToSeconds) { | 206 TEST_F(TmToSeconds, TestTmToSeconds) { |
205 TestTmToSeconds(100000); | 207 TestTmToSeconds(100000); |
206 } | 208 } |
207 | 209 |
| 210 TEST(TimeDelta, FromAndTo) { |
| 211 EXPECT_TRUE(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000)); |
| 212 EXPECT_TRUE(TimeDelta::FromMilliseconds(3) == |
| 213 TimeDelta::FromMicroseconds(3000)); |
| 214 EXPECT_TRUE(TimeDelta::FromMicroseconds(4) == |
| 215 TimeDelta::FromNanoseconds(4000)); |
| 216 EXPECT_EQ(13, TimeDelta::FromSeconds(13).ToSeconds()); |
| 217 EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).ToMilliseconds()); |
| 218 EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).ToMicroseconds()); |
| 219 EXPECT_EQ(13, TimeDelta::FromNanoseconds(13).ToNanoseconds()); |
| 220 } |
| 221 |
| 222 TEST(TimeDelta, ComparisonOperators) { |
| 223 EXPECT_LT(TimeDelta::FromSeconds(1), TimeDelta::FromSeconds(2)); |
| 224 EXPECT_EQ(TimeDelta::FromSeconds(3), TimeDelta::FromSeconds(3)); |
| 225 EXPECT_GT(TimeDelta::FromSeconds(5), TimeDelta::FromSeconds(4)); |
| 226 } |
| 227 |
| 228 TEST(TimeDelta, NumericOperators) { |
| 229 double d = 0.5; |
| 230 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 231 TimeDelta::FromMilliseconds(1000) * d); |
| 232 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 233 TimeDelta::FromMilliseconds(1000) / d); |
| 234 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 235 TimeDelta::FromMilliseconds(1000) *= d); |
| 236 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 237 TimeDelta::FromMilliseconds(1000) /= d); |
| 238 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 239 d * TimeDelta::FromMilliseconds(1000)); |
| 240 |
| 241 float f = 0.5; |
| 242 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 243 TimeDelta::FromMilliseconds(1000) * f); |
| 244 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 245 TimeDelta::FromMilliseconds(1000) / f); |
| 246 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 247 TimeDelta::FromMilliseconds(1000) *= f); |
| 248 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 249 TimeDelta::FromMilliseconds(1000) /= f); |
| 250 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 251 f * TimeDelta::FromMilliseconds(1000)); |
| 252 |
| 253 int i = 2; |
| 254 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 255 TimeDelta::FromMilliseconds(1000) * i); |
| 256 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 257 TimeDelta::FromMilliseconds(1000) / i); |
| 258 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 259 TimeDelta::FromMilliseconds(1000) *= i); |
| 260 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 261 TimeDelta::FromMilliseconds(1000) /= i); |
| 262 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 263 i * TimeDelta::FromMilliseconds(1000)); |
| 264 |
| 265 int64_t i64 = 2; |
| 266 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 267 TimeDelta::FromMilliseconds(1000) * i64); |
| 268 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 269 TimeDelta::FromMilliseconds(1000) / i64); |
| 270 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 271 TimeDelta::FromMilliseconds(1000) *= i64); |
| 272 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 273 TimeDelta::FromMilliseconds(1000) /= i64); |
| 274 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 275 i64 * TimeDelta::FromMilliseconds(1000)); |
| 276 |
| 277 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 278 TimeDelta::FromMilliseconds(1000) * 0.5); |
| 279 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 280 TimeDelta::FromMilliseconds(1000) / 0.5); |
| 281 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 282 TimeDelta::FromMilliseconds(1000) *= 0.5); |
| 283 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 284 TimeDelta::FromMilliseconds(1000) /= 0.5); |
| 285 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 286 0.5 * TimeDelta::FromMilliseconds(1000)); |
| 287 |
| 288 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 289 TimeDelta::FromMilliseconds(1000) * 2); |
| 290 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 291 TimeDelta::FromMilliseconds(1000) / 2); |
| 292 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 293 TimeDelta::FromMilliseconds(1000) *= 2); |
| 294 EXPECT_EQ(TimeDelta::FromMilliseconds(500), |
| 295 TimeDelta::FromMilliseconds(1000) /= 2); |
| 296 EXPECT_EQ(TimeDelta::FromMilliseconds(2000), |
| 297 2 * TimeDelta::FromMilliseconds(1000)); |
| 298 } |
| 299 |
| 300 // Test that all the time functions exposed by TimeUtils get time from the |
| 301 // fake clock when it's set. |
| 302 TEST(FakeClock, TimeFunctionsUseFakeClock) { |
| 303 FakeClock clock; |
| 304 SetClock(&clock); |
| 305 |
| 306 clock.SetTimeNanos(987654321u); |
| 307 EXPECT_EQ(987u, Time32()); |
| 308 EXPECT_EQ(987, TimeMillis()); |
| 309 EXPECT_EQ(987654u, TimeMicros()); |
| 310 EXPECT_EQ(987654321u, TimeNanos()); |
| 311 EXPECT_EQ(1000u, TimeAfter(13)); |
| 312 |
| 313 SetClock(nullptr); |
| 314 // After it's unset, we should get a normal time. |
| 315 EXPECT_NE(987, TimeMillis()); |
| 316 } |
| 317 |
| 318 TEST(FakeClock, InitialTime) { |
| 319 FakeClock clock; |
| 320 EXPECT_EQ(0u, clock.TimeNanos()); |
| 321 } |
| 322 |
| 323 TEST(FakeClock, SetTimeNanos) { |
| 324 FakeClock clock; |
| 325 clock.SetTimeNanos(123u); |
| 326 EXPECT_EQ(123u, clock.TimeNanos()); |
| 327 clock.SetTimeNanos(456u); |
| 328 EXPECT_EQ(456u, clock.TimeNanos()); |
| 329 } |
| 330 |
| 331 TEST(FakeClock, AdvanceTime) { |
| 332 FakeClock clock; |
| 333 clock.AdvanceTime(TimeDelta::FromNanoseconds(1111u)); |
| 334 EXPECT_EQ(1111u, clock.TimeNanos()); |
| 335 clock.AdvanceTime(TimeDelta::FromMicroseconds(2222u)); |
| 336 EXPECT_EQ(2223111u, clock.TimeNanos()); |
| 337 clock.AdvanceTime(TimeDelta::FromMilliseconds(3333u)); |
| 338 EXPECT_EQ(3335223111u, clock.TimeNanos()); |
| 339 clock.AdvanceTime(TimeDelta::FromSeconds(4444u)); |
| 340 EXPECT_EQ(4447335223111u, clock.TimeNanos()); |
| 341 } |
| 342 |
| 343 // When the clock is advanced, threads that are waiting in a socket select |
| 344 // should wake up and look at the new time. This allows tests using the |
| 345 // fake clock to run much faster, if the test is bound by time constraints |
| 346 // (such as a test for a STUN ping timeout). |
| 347 TEST(FakeClock, SettingTimeWakesThreads) { |
| 348 int64_t real_start_time_ms = TimeMillis(); |
| 349 |
| 350 FakeClock clock; |
| 351 SetClock(&clock); |
| 352 |
| 353 Thread worker; |
| 354 worker.Start(); |
| 355 |
| 356 // Post an event that won't be executed for 10 seconds. |
| 357 Event message_handler_dispatched(false, false); |
| 358 auto functor = [&message_handler_dispatched] { |
| 359 message_handler_dispatched.Set(); |
| 360 }; |
| 361 FunctorMessageHandler<void, decltype(functor)> handler(functor); |
| 362 worker.PostDelayed(10000, &handler); |
| 363 |
| 364 // Wait for a bit for the worker thread to be started and enter its socket |
| 365 // select(). |
| 366 Thread::Current()->SleepMs(1000); |
| 367 |
| 368 // Advance the fake clock, expecting the worker thread to wake up |
| 369 // and dispatch the message quickly. |
| 370 clock.AdvanceTime(TimeDelta::FromSeconds(10u)); |
| 371 message_handler_dispatched.Wait(Event::kForever); |
| 372 worker.Stop(); |
| 373 |
| 374 SetClock(nullptr); |
| 375 |
| 376 // The message should have been dispatched long before the 10 seconds fully |
| 377 // elapsed. |
| 378 int64_t real_end_time_ms = TimeMillis(); |
| 379 EXPECT_LT(real_end_time_ms - real_start_time_ms, 2000); |
| 380 } |
| 381 |
208 } // namespace rtc | 382 } // namespace rtc |
OLD | NEW |