147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2004 The WebRTC Project Authors. All rights reserved. 347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * 447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Use of this source code is governed by a BSD-style license 547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * that can be found in the LICENSE file in the root of the source 647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * tree. An additional intellectual property rights grant can be found 747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * in the file PATENTS. All contributing project authors may 847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * be found in the AUTHORS file in the root of the source tree. 947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */ 1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_GUNIT_H_ 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_GUNIT_H_ 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_ANDROID) || defined(GTEST_RELATIVE_PATH) 1749d62206ededc5905d6121d42fdcce8ed665b2c0kjellander@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else 1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "testing/base/public/gunit.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Wait until "ex" is true, or "timeout" expires. 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WAIT(ex, timeout) \ 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org for (uint32 start = rtc::Time(); \ 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org !(ex) && rtc::Time() < start + timeout;) \ 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::Thread::Current()->ProcessMessages(1); 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// This returns the result of the test in res, so that we don't re-evaluate 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// the expression in the XXXX_WAIT macros below, since that causes problems 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// when the expression is only true the first time you check it. 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WAIT_(ex, timeout, res) \ 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { \ 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org uint32 start = rtc::Time(); \ 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org res = (ex); \ 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org while (!res && rtc::Time() < start + timeout) { \ 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org rtc::Thread::Current()->ProcessMessages(1); \ 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org res = (ex); \ 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } \ 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (0); 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// The typical EXPECT_XXXX and ASSERT_XXXXs, but done until true or a timeout. 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EXPECT_TRUE_WAIT(ex, timeout) \ 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { \ 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool res; \ 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WAIT_(ex, timeout, res); \ 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!res) EXPECT_TRUE(ex); \ 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (0); 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EXPECT_EQ_WAIT(v1, v2, timeout) \ 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { \ 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool res; \ 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WAIT_(v1 == v2, timeout, res); \ 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!res) EXPECT_EQ(v1, v2); \ 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (0); 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ASSERT_TRUE_WAIT(ex, timeout) \ 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { \ 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool res; \ 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WAIT_(ex, timeout, res); \ 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!res) ASSERT_TRUE(ex); \ 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (0); 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define ASSERT_EQ_WAIT(v1, v2, timeout) \ 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { \ 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool res; \ 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WAIT_(v1 == v2, timeout, res); \ 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!res) ASSERT_EQ(v1, v2); \ 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (0); 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Version with a "soft" timeout and a margin. This logs if the timeout is 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// exceeded, but it only fails if the expression still isn't true after the 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// margin time passes. 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define EXPECT_TRUE_WAIT_MARGIN(ex, timeout, margin) \ 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org do { \ 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool res; \ 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WAIT_(ex, timeout, res); \ 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (res) { \ 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org break; \ 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } \ 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org LOG(LS_WARNING) << "Expression " << #ex << " still not true after " << \ 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org timeout << "ms; waiting an additional " << margin << "ms"; \ 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WAIT_(ex, margin, res); \ 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org if (!res) { \ 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE(ex); \ 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } \ 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } while (0); 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif // WEBRTC_BASE_GUNIT_H_ 89