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