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

Side by Side Diff: webrtc/base/gunit.h

Issue 2024813004: Improving the fake clock and using it to fix a flaky STUN timeout test. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: 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/fakeclock.cc ('k') | webrtc/base/messagequeue.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 #ifndef WEBRTC_BASE_GUNIT_H_ 11 #ifndef WEBRTC_BASE_GUNIT_H_
12 #define WEBRTC_BASE_GUNIT_H_ 12 #define WEBRTC_BASE_GUNIT_H_
13 13
14 #include "webrtc/base/fakeclock.h"
14 #include "webrtc/base/logging.h" 15 #include "webrtc/base/logging.h"
15 #include "webrtc/base/thread.h" 16 #include "webrtc/base/thread.h"
16 #if defined(GTEST_RELATIVE_PATH) 17 #if defined(GTEST_RELATIVE_PATH)
17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "testing/gtest/include/gtest/gtest.h"
18 #else 19 #else
19 #include "testing/base/public/gunit.h" 20 #include "testing/base/public/gunit.h"
20 #endif 21 #endif
21 22
22 // Wait until "ex" is true, or "timeout" expires. 23 // Wait until "ex" is true, or "timeout" expires.
23 #define WAIT(ex, timeout) \ 24 #define WAIT(ex, timeout) \
24 for (int64_t start = rtc::TimeMillis(); \ 25 for (int64_t start = rtc::TimeMillis(); \
25 !(ex) && rtc::TimeMillis() < start + timeout;) \ 26 !(ex) && rtc::TimeMillis() < start + timeout;) \
26 rtc::Thread::Current()->ProcessMessages(1); 27 rtc::Thread::Current()->ProcessMessages(0); \
28 rtc::Thread::Current()->SleepMs(1);
Taylor Brandstetter 2016/06/01 15:54:58 I had to do this because if you do a "WAIT" while
27 29
28 // This returns the result of the test in res, so that we don't re-evaluate 30 // This returns the result of the test in res, so that we don't re-evaluate
29 // the expression in the XXXX_WAIT macros below, since that causes problems 31 // the expression in the XXXX_WAIT macros below, since that causes problems
30 // when the expression is only true the first time you check it. 32 // when the expression is only true the first time you check it.
31 #define WAIT_(ex, timeout, res) \ 33 #define WAIT_(ex, timeout, res) \
32 do { \ 34 do { \
33 int64_t start = rtc::TimeMillis(); \ 35 int64_t start = rtc::TimeMillis(); \
34 res = (ex); \ 36 res = (ex); \
35 while (!res && rtc::TimeMillis() < start + timeout) { \ 37 while (!res && rtc::TimeMillis() < start + timeout) { \
36 rtc::Thread::Current()->ProcessMessages(1); \ 38 rtc::Thread::Current()->ProcessMessages(0); \
39 rtc::Thread::Current()->SleepMs(1); \
37 res = (ex); \ 40 res = (ex); \
38 } \ 41 } \
39 } while (0) 42 } while (0)
40 43
41 // The typical EXPECT_XXXX and ASSERT_XXXXs, but done until true or a timeout. 44 // The typical EXPECT_XXXX and ASSERT_XXXXs, but done until true or a timeout.
42 #define EXPECT_TRUE_WAIT(ex, timeout) \ 45 #define EXPECT_TRUE_WAIT(ex, timeout) \
43 do { \ 46 do { \
44 bool res; \ 47 bool res; \
45 WAIT_(ex, timeout, res); \ 48 WAIT_(ex, timeout, res); \
46 if (!res) EXPECT_TRUE(ex); \ 49 if (!res) EXPECT_TRUE(ex); \
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 break; \ 81 break; \
79 } \ 82 } \
80 LOG(LS_WARNING) << "Expression " << #ex << " still not true after " << \ 83 LOG(LS_WARNING) << "Expression " << #ex << " still not true after " << \
81 timeout << "ms; waiting an additional " << margin << "ms"; \ 84 timeout << "ms; waiting an additional " << margin << "ms"; \
82 WAIT_(ex, margin, res); \ 85 WAIT_(ex, margin, res); \
83 if (!res) { \ 86 if (!res) { \
84 EXPECT_TRUE(ex); \ 87 EXPECT_TRUE(ex); \
85 } \ 88 } \
86 } while (0) 89 } while (0)
87 90
91 // Wait until "ex" is true, or "timeout" expires, using fake clock where
92 // messages are processed every millisecond.
93 #define SIMULATED_WAIT(ex, clock, timeout) \
94 for (int64_t start = rtc::TimeMillis(); \
95 !(ex) && rtc::TimeMillis() < start + timeout;) \
96 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
97
98 // This returns the result of the test in res, so that we don't re-evaluate
99 // the expression in the XXXX_WAIT macros below, since that causes problems
100 // when the expression is only true the first time you check it.
101 #define SIMULATED_WAIT_(ex, clock, timeout, res) \
102 do { \
103 int64_t start = rtc::TimeMillis(); \
104 res = (ex); \
105 while (!res && rtc::TimeMillis() < start + timeout) { \
106 clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); \
107 res = (ex); \
108 } \
109 } while (0)
110
111 // The typical EXPECT_XXXX and ASSERT_XXXXs, but done until true or a timeout.
112 #define EXPECT_TRUE_SIMULATED_WAIT(ex, clock, timeout) \
113 do { \
114 bool res; \
115 SIMULATED_WAIT_(ex, clock, timeout, res); \
116 if (!res) \
117 EXPECT_TRUE(ex); \
118 } while (0)
119
120 #define EXPECT_EQ_SIMULATED_WAIT(v1, v2, clock, timeout) \
121 do { \
122 bool res; \
123 SIMULATED_WAIT_(v1 == v2, clock, timeout, res); \
124 if (!res) \
125 EXPECT_EQ(v1, v2); \
126 } while (0)
127
88 #endif // WEBRTC_BASE_GUNIT_H_ 128 #endif // WEBRTC_BASE_GUNIT_H_
OLDNEW
« no previous file with comments | « webrtc/base/fakeclock.cc ('k') | webrtc/base/messagequeue.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698