147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/* 247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * Copyright 2011 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#include "webrtc/base/common.h" 1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h" 1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/messagehandler.h" 1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/messagequeue.h" 1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/scoped_ptr.h" 1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/sharedexclusivelock.h" 1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h" 1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/timeutils.h" 19a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.org#include "webrtc/test/testsupport/gtest_disable.h" 2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc { 2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const uint32 kMsgRead = 0; 2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const uint32 kMsgWrite = 0; 2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const int kNoWaitThresholdInMs = 10; 2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const int kWaitThresholdInMs = 80; 2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const int kProcessTimeInMs = 100; 2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgstatic const int kProcessTimeoutInMs = 5000; 2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass SharedExclusiveTask : public MessageHandler { 3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SharedExclusiveTask(SharedExclusiveLock* shared_exclusive_lock, 3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int* value, 3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool* done) 3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : shared_exclusive_lock_(shared_exclusive_lock), 3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org waiting_time_in_ms_(0), 3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value_(value), 3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done_(done) { 3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org worker_thread_.reset(new Thread()); 4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org worker_thread_->Start(); 4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int waiting_time_in_ms() const { return waiting_time_in_ms_; } 4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<Thread> worker_thread_; 4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SharedExclusiveLock* shared_exclusive_lock_; 4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int waiting_time_in_ms_; 4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int* value_; 5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool* done_; 5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass ReadTask : public SharedExclusiveTask { 5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ReadTask(SharedExclusiveLock* shared_exclusive_lock, int* value, bool* done) 5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : SharedExclusiveTask(shared_exclusive_lock, value, done) { 5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void PostRead(int* value) { 6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org worker_thread_->Post(this, kMsgRead, new TypedMessageData<int*>(value)); 6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnMessage(Message* message) { 6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_.get()); 6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(message != NULL); 6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(message->message_id == kMsgRead); 6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TypedMessageData<int*>* message_data = 7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static_cast<TypedMessageData<int*>*>(message->pdata); 7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org uint32 start_time = Time(); 7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { 7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SharedScope ss(shared_exclusive_lock_); 7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org waiting_time_in_ms_ = TimeDiff(Time(), start_time); 7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::SleepMs(kProcessTimeInMs); 7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *message_data->data() = *value_; 7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *done_ = true; 8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete message->pdata; 8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org message->pdata = NULL; 8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass WriteTask : public SharedExclusiveTask { 8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WriteTask(SharedExclusiveLock* shared_exclusive_lock, int* value, bool* done) 8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : SharedExclusiveTask(shared_exclusive_lock, value, done) { 9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org void PostWrite(int value) { 9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org worker_thread_->Post(this, kMsgWrite, new TypedMessageData<int>(value)); 9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private: 9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void OnMessage(Message* message) { 9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(rtc::Thread::Current() == worker_thread_.get()); 9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(message != NULL); 10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ASSERT(message->message_id == kMsgWrite); 10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org TypedMessageData<int>* message_data = 10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org static_cast<TypedMessageData<int>*>(message->pdata); 10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org uint32 start_time = Time(); 10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { 10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ExclusiveScope es(shared_exclusive_lock_); 10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org waiting_time_in_ms_ = TimeDiff(Time(), start_time); 10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::SleepMs(kProcessTimeInMs); 11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *value_ = message_data->data(); 11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *done_ = true; 11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org delete message->pdata; 11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org message->pdata = NULL; 11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Unit test for SharedExclusiveLock. 12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass SharedExclusiveLockTest 12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org : public testing::Test { 12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public: 12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SharedExclusiveLockTest() : value_(0) { 12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org virtual void SetUp() { 12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org shared_exclusive_lock_.reset(new SharedExclusiveLock()); 12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected: 13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org scoped_ptr<SharedExclusiveLock> shared_exclusive_lock_; 13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int value_; 13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}; 13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 1352b549191daa67ffd099b7caae9a659a5d2256abehenrike@webrtc.org// Flaky: https://code.google.com/p/webrtc/issues/detail?id=3318 1362b549191daa67ffd099b7caae9a659a5d2256abehenrike@webrtc.orgTEST_F(SharedExclusiveLockTest, DISABLED_TestSharedShared) { 13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int value0, value1; 13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool done0, done1; 13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ReadTask reader0(shared_exclusive_lock_.get(), &value_, &done0); 14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ReadTask reader1(shared_exclusive_lock_.get(), &value_, &done1); 14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Test shared locks can be shared without waiting. 14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { 14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SharedScope ss(shared_exclusive_lock_.get()); 14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value_ = 1; 14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done0 = false; 14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done1 = false; 14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org reader0.PostRead(&value0); 14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org reader1.PostRead(&value1); 15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::SleepMs(kProcessTimeInMs); 15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE_WAIT(done0, kProcessTimeoutInMs); 15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(1, value0); 15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LE(reader0.waiting_time_in_ms(), kNoWaitThresholdInMs); 15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE_WAIT(done1, kProcessTimeoutInMs); 15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(1, value1); 15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_LE(reader1.waiting_time_in_ms(), kNoWaitThresholdInMs); 15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 161a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, DISABLED_ON_MAC(TestSharedExclusive)) { 16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool done; 16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WriteTask writer(shared_exclusive_lock_.get(), &value_, &done); 16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Test exclusive lock needs to wait for shared lock. 16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { 16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org SharedScope ss(shared_exclusive_lock_.get()); 16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value_ = 1; 16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done = false; 17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org writer.PostWrite(2); 17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::SleepMs(kProcessTimeInMs); 17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(1, value_); 17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE_WAIT(done, kProcessTimeoutInMs); 17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(2, value_); 17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GE(writer.waiting_time_in_ms(), kWaitThresholdInMs); 17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 180a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, DISABLED_ON_MAC(TestExclusiveShared)) { 18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org int value; 18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool done; 18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ReadTask reader(shared_exclusive_lock_.get(), &value_, &done); 18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Test shared lock needs to wait for exclusive lock. 18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { 18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ExclusiveScope es(shared_exclusive_lock_.get()); 18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value_ = 1; 18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done = false; 19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org reader.PostRead(&value); 19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::SleepMs(kProcessTimeInMs); 19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value_ = 2; 19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE_WAIT(done, kProcessTimeoutInMs); 19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(2, value); 19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GE(reader.waiting_time_in_ms(), kWaitThresholdInMs); 19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 200a127c9555d5bc8d9404562840ebfd5281c670600henrike@webrtc.orgTEST_F(SharedExclusiveLockTest, DISABLED_ON_MAC(TestExclusiveExclusive)) { 20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org bool done; 20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org WriteTask writer(shared_exclusive_lock_.get(), &value_, &done); 20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org // Test exclusive lock needs to wait for exclusive lock. 20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org { 20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org ExclusiveScope es(shared_exclusive_lock_.get()); 20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org value_ = 1; 20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org done = false; 20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org writer.PostWrite(2); 21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org Thread::SleepMs(kProcessTimeInMs); 21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(1, value_); 21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org } 21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_TRUE_WAIT(done, kProcessTimeoutInMs); 21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_EQ(2, value_); 21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org EXPECT_GE(writer.waiting_time_in_ms(), kWaitThresholdInMs); 21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} 21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org 21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org} // namespace rtc 220