diff options
author | sanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-06 18:34:24 +0000 |
---|---|---|
committer | sanjeevr@chromium.org <sanjeevr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-06 18:34:24 +0000 |
commit | 656475d275524893e4e9b1f02469fe470721a14e (patch) | |
tree | 76198770e24f0bea147c10a50ae2a3bf9c7f7274 /base/message_loop_proxy_impl_unittest.cc | |
parent | 7e19edf7255b366b5e4b9b0bb77caf9842a37f1b (diff) | |
download | chromium_src-656475d275524893e4e9b1f02469fe470721a14e.zip chromium_src-656475d275524893e4e9b1f02469fe470721a14e.tar.gz chromium_src-656475d275524893e4e9b1f02469fe470721a14e.tar.bz2 |
Created a stock implementation of the MessageLoopProxy interface than can be used to create an implementation that targets the current thread's message loop.
BUG=None
TEST=Unit tests provided.
Review URL: http://codereview.chromium.org/1837003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@46591 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/message_loop_proxy_impl_unittest.cc')
-rw-r--r-- | base/message_loop_proxy_impl_unittest.cc | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/base/message_loop_proxy_impl_unittest.cc b/base/message_loop_proxy_impl_unittest.cc new file mode 100644 index 0000000..5fe341c --- /dev/null +++ b/base/message_loop_proxy_impl_unittest.cc @@ -0,0 +1,131 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/message_loop.h" +#include "base/message_loop_proxy_impl.h" +#include "base/thread.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" + + +class MessageLoopProxyImplTest : public testing::Test { + public: + void Release() { + AssertOnIOThread(); + Quit(); + } + + void Quit() { + loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask); + } + + void AssertOnIOThread() { + ASSERT_TRUE(io_thread_->message_loop_proxy()->BelongsToCurrentThread()); + } + + void AssertOnFileThread() { + ASSERT_TRUE(file_thread_->message_loop_proxy()->BelongsToCurrentThread()); + } + + protected: + virtual void SetUp() { + io_thread_.reset(new base::Thread("MessageLoopProxyImplTest_IO")); + file_thread_.reset(new base::Thread("MessageLoopProxyImplTest_File")); + io_thread_->Start(); + file_thread_->Start(); + } + + virtual void TearDown() { + io_thread_->Stop(); + file_thread_->Stop(); + } + + static void BasicFunction(MessageLoopProxyImplTest* test) { + test->AssertOnFileThread(); + test->Quit(); + } + + class DummyTask : public Task { + public: + explicit DummyTask(bool* deleted) : deleted_(deleted) { } + ~DummyTask() { + *deleted_ = true; + } + + void Run() { + FAIL(); + } + + private: + bool* deleted_; + }; + + class DeletedOnFile { + public: + explicit DeletedOnFile(MessageLoopProxyImplTest* test) : test_(test) {} + + ~DeletedOnFile() { + test_->AssertOnFileThread(); + test_->Quit(); + } + + private: + MessageLoopProxyImplTest* test_; + }; + + scoped_ptr<base::Thread> io_thread_; + scoped_ptr<base::Thread> file_thread_; + + private: + MessageLoop loop_; +}; + + +TEST_F(MessageLoopProxyImplTest, PostTask) { + EXPECT_TRUE(file_thread_->message_loop_proxy()->PostTask( + FROM_HERE, NewRunnableFunction(&BasicFunction, this))); + MessageLoop::current()->Run(); +} + +TEST_F(MessageLoopProxyImplTest, Release) { + EXPECT_TRUE(io_thread_->message_loop_proxy()->ReleaseSoon(FROM_HERE, this)); + MessageLoop::current()->Run(); +} + +TEST_F(MessageLoopProxyImplTest, Delete) { + DeletedOnFile* deleted_on_file = new DeletedOnFile(this); + EXPECT_TRUE(file_thread_->message_loop_proxy()->DeleteSoon( + FROM_HERE, deleted_on_file)); + MessageLoop::current()->Run(); +} + +TEST_F(MessageLoopProxyImplTest, PostTaskAfterThreadExits) { + scoped_ptr<base::Thread> test_thread( + new base::Thread("MessageLoopProxyImplTest_Dummy")); + test_thread->Start(); + scoped_refptr<base::MessageLoopProxy> message_loop_proxy = + test_thread->message_loop_proxy(); + test_thread->Stop(); + + bool deleted = false; + bool ret = message_loop_proxy->PostTask( + FROM_HERE, new DummyTask(&deleted)); + EXPECT_FALSE(ret); + EXPECT_TRUE(deleted); +} + +TEST_F(MessageLoopProxyImplTest, PostTaskAfterThreadIsDeleted) { + scoped_refptr<base::MessageLoopProxy> message_loop_proxy; + { + scoped_ptr<base::Thread> test_thread( + new base::Thread("MessageLoopProxyImplTest_Dummy")); + test_thread->Start(); + message_loop_proxy = test_thread->message_loop_proxy(); + } + bool deleted = false; + bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); + EXPECT_FALSE(ret); + EXPECT_TRUE(deleted); +} + |