1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop_proxy_impl.h" 83f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/platform_test.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MessageLoopProxyImplTest : public testing::Test { 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void Release() const { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AssertOnIOThread(); 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Quit(); 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void Quit() const { 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch loop_.PostTask(FROM_HERE, new MessageLoop::QuitTask); 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void AssertOnIOThread() const { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(io_thread_->message_loop_proxy()->BelongsToCurrentThread()); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void AssertOnFileThread() const { 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(file_thread_->message_loop_proxy()->BelongsToCurrentThread()); 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void SetUp() { 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread_.reset(new base::Thread("MessageLoopProxyImplTest_IO")); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_thread_.reset(new base::Thread("MessageLoopProxyImplTest_File")); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread_->Start(); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_thread_->Start(); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void TearDown() { 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch io_thread_->Stop(); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_thread_->Stop(); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void BasicFunction(MessageLoopProxyImplTest* test) { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test->AssertOnFileThread(); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test->Quit(); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class DummyTask : public Task { 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit DummyTask(bool* deleted) : deleted_(deleted) { } 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~DummyTask() { 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *deleted_ = true; 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Run() { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FAIL(); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool* deleted_; 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch class DeletedOnFile { 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit DeletedOnFile(MessageLoopProxyImplTest* test) : test_(test) {} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ~DeletedOnFile() { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_->AssertOnFileThread(); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_->Quit(); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoopProxyImplTest* test_; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> io_thread_; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> file_thread_; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch mutable MessageLoop loop_; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(MessageLoopProxyImplTest, PostTask) { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_thread_->message_loop_proxy()->PostTask( 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, NewRunnableFunction(&BasicFunction, this))); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(MessageLoopProxyImplTest, Release) { 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(io_thread_->message_loop_proxy()->ReleaseSoon(FROM_HERE, this)); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(MessageLoopProxyImplTest, Delete) { 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeletedOnFile* deleted_on_file = new DeletedOnFile(this); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(file_thread_->message_loop_proxy()->DeleteSoon( 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, deleted_on_file)); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->Run(); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(MessageLoopProxyImplTest, PostTaskAfterThreadExits) { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> test_thread( 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new base::Thread("MessageLoopProxyImplTest_Dummy")); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_thread->Start(); 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<base::MessageLoopProxy> message_loop_proxy = 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_thread->message_loop_proxy(); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_thread->Stop(); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool deleted = false; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ret = message_loop_proxy->PostTask( 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, new DummyTask(&deleted)); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(ret); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deleted); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(MessageLoopProxyImplTest, PostTaskAfterThreadIsDeleted) { 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<base::MessageLoopProxy> message_loop_proxy; 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<base::Thread> test_thread( 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new base::Thread("MessageLoopProxyImplTest_Dummy")); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch test_thread->Start(); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch message_loop_proxy = test_thread->message_loop_proxy(); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool deleted = false; 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(ret); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deleted); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 133