Chromium Code Reviews| Index: base/threading/worker_pool_unittest.cc |
| diff --git a/base/threading/worker_pool_unittest.cc b/base/threading/worker_pool_unittest.cc |
| index 2d2b05574e2b17f8e14eb597c29ea434e9e8da14..4789dd3ae0218bbf6d5f5da13208e6a5dee27768 100644 |
| --- a/base/threading/worker_pool_unittest.cc |
| +++ b/base/threading/worker_pool_unittest.cc |
| @@ -4,8 +4,13 @@ |
| #include "base/threading/worker_pool.h" |
| +#include "base/bind.h" |
| #include "base/location.h" |
| +#include "base/message_loop.h" |
| #include "base/task.h" |
| +#include "base/test/test_timeouts.h" |
| +#include "base/time.h" |
| +#include "base/threading/thread_checker_impl.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "testing/platform_test.h" |
| @@ -29,6 +34,52 @@ class PostTaskTestTask : public Task { |
| WaitableEvent* event_; |
| }; |
| +class PostTaskAndReplyTester |
| + : public base::RefCountedThreadSafe<PostTaskAndReplyTester> { |
| + public: |
| + PostTaskAndReplyTester() : finished_(false), test_event_(false, false) { |
| + } |
| + |
| + void RunTest() { |
| + ASSERT_TRUE(thread_checker_.CalledOnValidThread()); |
| + WorkerPool::PostTaskAndReply( |
| + FROM_HERE, |
| + base::Bind(&PostTaskAndReplyTester::OnWorkerThread, this), |
| + base::Bind(&PostTaskAndReplyTester::OnOriginalThread, this), |
| + false); |
| + |
| + bool signaled = test_event_.Wait(); |
| + EXPECT_TRUE(signaled); |
| + |
| + const TimeDelta kMaxDuration = |
| + TimeDelta::FromMilliseconds(TestTimeouts::tiny_timeout_ms()); |
| + TimeTicks start = TimeTicks::Now(); |
| + while (!finished_ && TimeTicks::Now() - start < kMaxDuration) { |
| + MessageLoop::current()->RunAllPending(); |
|
awong
2011/10/05 17:27:01
Feels cleaner to me to have the waiting logic out
Jói
2011/10/06 14:20:31
Done.
|
| + } |
| + EXPECT_TRUE(finished_); |
| + } |
| + |
| + void OnWorkerThread() { |
| + // We're not on the original thread. |
| + EXPECT_FALSE(thread_checker_.CalledOnValidThread()); |
| + |
| + test_event_.Signal(); |
| + } |
| + |
| + void OnOriginalThread() { |
| + EXPECT_TRUE(thread_checker_.CalledOnValidThread()); |
| + finished_ = true; |
| + } |
| + |
| + private: |
| + bool finished_; |
| + WaitableEvent test_event_; |
| + |
| + // The Impl version performs its checks even in release builds. |
| + ThreadCheckerImpl thread_checker_; |
| +}; |
| + |
| } // namespace |
| TEST_F(WorkerPoolTest, PostTask) { |
| @@ -45,4 +96,10 @@ TEST_F(WorkerPoolTest, PostTask) { |
| EXPECT_TRUE(signaled); |
| } |
| +TEST_F(WorkerPoolTest, PostTaskAndReply) { |
| + MessageLoop message_loop; |
| + scoped_refptr<PostTaskAndReplyTester> tester(new PostTaskAndReplyTester()); |
| + tester->RunTest(); |
| +} |
| + |
| } // namespace base |