1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_BASE_GUNIT_H_ 12 #define WEBRTC_BASE_GUNIT_H_ 13 14 #include "webrtc/base/logging.h" 15 #include "webrtc/base/thread.h" 16 #if defined(WEBRTC_ANDROID) || defined(GTEST_RELATIVE_PATH) 17 #include "testing/gtest/include/gtest/gtest.h" 18 #else 19 #include "testing/base/public/gunit.h" 20 #endif 21 22 // Wait until "ex" is true, or "timeout" expires. 23 #define WAIT(ex, timeout) \ 24 for (uint32 start = rtc::Time(); \ 25 !(ex) && rtc::Time() < start + timeout;) \ 26 rtc::Thread::Current()->ProcessMessages(1); 27 28 // 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 30 // when the expression is only true the first time you check it. 31 #define WAIT_(ex, timeout, res) \ 32 do { \ 33 uint32 start = rtc::Time(); \ 34 res = (ex); \ 35 while (!res && rtc::Time() < start + timeout) { \ 36 rtc::Thread::Current()->ProcessMessages(1); \ 37 res = (ex); \ 38 } \ 39 } while (0); 40 41 // The typical EXPECT_XXXX and ASSERT_XXXXs, but done until true or a timeout. 42 #define EXPECT_TRUE_WAIT(ex, timeout) \ 43 do { \ 44 bool res; \ 45 WAIT_(ex, timeout, res); \ 46 if (!res) EXPECT_TRUE(ex); \ 47 } while (0); 48 49 #define EXPECT_EQ_WAIT(v1, v2, timeout) \ 50 do { \ 51 bool res; \ 52 WAIT_(v1 == v2, timeout, res); \ 53 if (!res) EXPECT_EQ(v1, v2); \ 54 } while (0); 55 56 #define ASSERT_TRUE_WAIT(ex, timeout) \ 57 do { \ 58 bool res; \ 59 WAIT_(ex, timeout, res); \ 60 if (!res) ASSERT_TRUE(ex); \ 61 } while (0); 62 63 #define ASSERT_EQ_WAIT(v1, v2, timeout) \ 64 do { \ 65 bool res; \ 66 WAIT_(v1 == v2, timeout, res); \ 67 if (!res) ASSERT_EQ(v1, v2); \ 68 } while (0); 69 70 // Version with a "soft" timeout and a margin. This logs if the timeout is 71 // exceeded, but it only fails if the expression still isn't true after the 72 // margin time passes. 73 #define EXPECT_TRUE_WAIT_MARGIN(ex, timeout, margin) \ 74 do { \ 75 bool res; \ 76 WAIT_(ex, timeout, res); \ 77 if (res) { \ 78 break; \ 79 } \ 80 LOG(LS_WARNING) << "Expression " << #ex << " still not true after " << \ 81 timeout << "ms; waiting an additional " << margin << "ms"; \ 82 WAIT_(ex, margin, res); \ 83 if (!res) { \ 84 EXPECT_TRUE(ex); \ 85 } \ 86 } while (0); 87 88 #endif // WEBRTC_BASE_GUNIT_H_ 89