Index: chrome/browser/chrome_thread_unittest.cc |
=================================================================== |
--- chrome/browser/chrome_thread_unittest.cc (revision 45861) |
+++ chrome/browser/chrome_thread_unittest.cc (working copy) |
@@ -3,6 +3,7 @@ |
// found in the LICENSE file. |
#include "base/message_loop.h" |
+#include "base/message_loop_proxy.h" |
#include "chrome/browser/chrome_thread.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "testing/platform_test.h" |
@@ -10,25 +11,25 @@ |
class ChromeThreadTest : public testing::Test { |
public: |
void Release() { |
- CHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
+ CHECK(ChromeThread::CurrentlyOn(ChromeThread::UI)); |
loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask); |
} |
protected: |
virtual void SetUp() { |
+ ui_thread_.reset(new ChromeThread(ChromeThread::UI)); |
file_thread_.reset(new ChromeThread(ChromeThread::FILE)); |
- io_thread_.reset(new ChromeThread(ChromeThread::IO)); |
+ ui_thread_->Start(); |
file_thread_->Start(); |
- io_thread_->Start(); |
} |
virtual void TearDown() { |
+ ui_thread_->Stop(); |
file_thread_->Stop(); |
- io_thread_->Stop(); |
} |
static void BasicFunction(MessageLoop* message_loop) { |
- CHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
+ CHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
message_loop->PostTask(FROM_HERE, new MessageLoop::QuitTask); |
} |
@@ -47,15 +48,15 @@ |
bool* deleted_; |
}; |
- class DeletedOnIO |
+ class DeletedOnFile |
: public base::RefCountedThreadSafe< |
- DeletedOnIO, ChromeThread::DeleteOnIOThread> { |
+ DeletedOnFile, ChromeThread::DeleteOnFileThread> { |
public: |
- explicit DeletedOnIO(MessageLoop* message_loop) |
+ explicit DeletedOnFile(MessageLoop* message_loop) |
: message_loop_(message_loop) { } |
- ~DeletedOnIO() { |
- CHECK(ChromeThread::CurrentlyOn(ChromeThread::IO)); |
+ ~DeletedOnFile() { |
+ CHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
} |
@@ -73,20 +74,20 @@ |
}; |
private: |
+ scoped_ptr<ChromeThread> ui_thread_; |
scoped_ptr<ChromeThread> file_thread_; |
- scoped_ptr<ChromeThread> io_thread_; |
MessageLoop loop_; |
}; |
TEST_F(ChromeThreadTest, PostTask) { |
ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, |
+ ChromeThread::FILE, FROM_HERE, |
NewRunnableFunction(&BasicFunction, MessageLoop::current())); |
MessageLoop::current()->Run(); |
} |
TEST_F(ChromeThreadTest, Release) { |
- ChromeThread::ReleaseSoon(ChromeThread::FILE, FROM_HERE, this); |
+ ChromeThread::ReleaseSoon(ChromeThread::UI, FROM_HERE, this); |
MessageLoop::current()->Run(); |
} |
@@ -100,7 +101,8 @@ |
TEST_F(ChromeThreadTest, ReleasedOnCorrectThread) { |
{ |
- scoped_refptr<DeletedOnIO> test(new DeletedOnIO(MessageLoop::current())); |
+ scoped_refptr<DeletedOnFile> test( |
+ new DeletedOnFile(MessageLoop::current())); |
} |
MessageLoop::current()->Run(); |
} |
@@ -108,3 +110,54 @@ |
TEST_F(ChromeThreadTest, NotReleasedIfTargetThreadNonExistent) { |
scoped_refptr<NeverDeleted> test(new NeverDeleted()); |
} |
+ |
+TEST_F(ChromeThreadTest, PostTaskViaMessageLoopProxy) { |
+ scoped_refptr<MessageLoopProxy> message_loop_proxy = |
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::FILE); |
+ message_loop_proxy->PostTask(FROM_HERE, |
+ NewRunnableFunction(&BasicFunction, |
+ MessageLoop::current())); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(ChromeThreadTest, ReleaseViaMessageLoopProxy) { |
+ scoped_refptr<MessageLoopProxy> message_loop_proxy = |
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::UI); |
+ message_loop_proxy->ReleaseSoon(FROM_HERE, this); |
+ MessageLoop::current()->Run(); |
+} |
+ |
+TEST_F(ChromeThreadTest, TaskToNonExistentThreadIsDeletedViaMessageLoopProxy) { |
+ bool deleted = false; |
+ scoped_refptr<MessageLoopProxy> message_loop_proxy = |
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::WEBKIT); |
+ message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); |
+ EXPECT_TRUE(deleted); |
+} |
+ |
+TEST_F(ChromeThreadTest, PostTaskViaMessageLoopProxyAfterThreadExits) { |
+ scoped_ptr<ChromeThread> io_thread(new ChromeThread(ChromeThread::IO)); |
+ io_thread->Start(); |
+ io_thread->Stop(); |
+ |
+ bool deleted = false; |
+ scoped_refptr<MessageLoopProxy> message_loop_proxy = |
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::IO); |
+ bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); |
+ EXPECT_FALSE(ret); |
+ EXPECT_TRUE(deleted); |
+} |
+ |
+TEST_F(ChromeThreadTest, PostTaskViaMessageLoopProxyAfterThreadIsDeleted) { |
+ { |
+ scoped_ptr<ChromeThread> io_thread(new ChromeThread(ChromeThread::IO)); |
+ io_thread->Start(); |
+ } |
+ bool deleted = false; |
+ scoped_refptr<MessageLoopProxy> message_loop_proxy = |
+ ChromeThread::GetMessageLoopProxyForThread(ChromeThread::IO); |
+ bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); |
+ EXPECT_FALSE(ret); |
+ EXPECT_TRUE(deleted); |
+} |
+ |