Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Side by Side Diff: webrtc/base/timeutils_unittest.cc

Issue 1895933003: Adding the ability to use a simulated clock for unit tests. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing compile warning. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/timeutils.cc ('k') | webrtc/base/timing.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « webrtc/base/timeutils.cc ('k') | webrtc/base/timing.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698