| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/memory/scoped_ptr.h" | 6 #include "base/memory/scoped_ptr.h" |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/message_loop_proxy.h" | 8 #include "base/message_loop_proxy.h" |
| 9 #include "content/browser/browser_thread_impl.h" | 9 #include "content/browser/browser_thread_impl.h" |
| 10 #include "content/test/test_browser_thread.h" | 10 #include "content/test/test_browser_thread.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 34 } | 34 } |
| 35 | 35 |
| 36 static void BasicFunction(MessageLoop* message_loop) { | 36 static void BasicFunction(MessageLoop* message_loop) { |
| 37 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 37 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 38 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 38 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
| 39 } | 39 } |
| 40 | 40 |
| 41 static void DoNothing() { | 41 static void DoNothing() { |
| 42 } | 42 } |
| 43 | 43 |
| 44 class DummyTask : public Task { | |
| 45 public: | |
| 46 explicit DummyTask(bool* deleted) : deleted_(deleted) { } | |
| 47 ~DummyTask() { | |
| 48 *deleted_ = true; | |
| 49 } | |
| 50 | |
| 51 void Run() { | |
| 52 CHECK(false); | |
| 53 } | |
| 54 | |
| 55 private: | |
| 56 bool* deleted_; | |
| 57 }; | |
| 58 | |
| 59 class DeletedOnFile | 44 class DeletedOnFile |
| 60 : public base::RefCountedThreadSafe< | 45 : public base::RefCountedThreadSafe< |
| 61 DeletedOnFile, BrowserThread::DeleteOnFileThread> { | 46 DeletedOnFile, BrowserThread::DeleteOnFileThread> { |
| 62 public: | 47 public: |
| 63 explicit DeletedOnFile(MessageLoop* message_loop) | 48 explicit DeletedOnFile(MessageLoop* message_loop) |
| 64 : message_loop_(message_loop) { } | 49 : message_loop_(message_loop) { } |
| 65 | 50 |
| 66 ~DeletedOnFile() { | 51 ~DeletedOnFile() { |
| 67 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 52 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 68 message_loop_->PostTask(FROM_HERE, MessageLoop::QuitClosure()); | 53 message_loop_->PostTask(FROM_HERE, MessageLoop::QuitClosure()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 94 BrowserThread::FILE, FROM_HERE, | 79 BrowserThread::FILE, FROM_HERE, |
| 95 base::Bind(&BasicFunction, MessageLoop::current())); | 80 base::Bind(&BasicFunction, MessageLoop::current())); |
| 96 MessageLoop::current()->Run(); | 81 MessageLoop::current()->Run(); |
| 97 } | 82 } |
| 98 | 83 |
| 99 TEST_F(BrowserThreadTest, Release) { | 84 TEST_F(BrowserThreadTest, Release) { |
| 100 BrowserThread::ReleaseSoon(BrowserThread::UI, FROM_HERE, this); | 85 BrowserThread::ReleaseSoon(BrowserThread::UI, FROM_HERE, this); |
| 101 MessageLoop::current()->Run(); | 86 MessageLoop::current()->Run(); |
| 102 } | 87 } |
| 103 | 88 |
| 104 TEST_F(BrowserThreadTest, TaskToNonExistentThreadIsDeleted) { | |
| 105 bool deleted = false; | |
| 106 BrowserThread::PostTask( | |
| 107 BrowserThread::WEBKIT_DEPRECATED, FROM_HERE, | |
| 108 new DummyTask(&deleted)); | |
| 109 EXPECT_TRUE(deleted); | |
| 110 } | |
| 111 | |
| 112 TEST_F(BrowserThreadTest, ReleasedOnCorrectThread) { | 89 TEST_F(BrowserThreadTest, ReleasedOnCorrectThread) { |
| 113 { | 90 { |
| 114 scoped_refptr<DeletedOnFile> test( | 91 scoped_refptr<DeletedOnFile> test( |
| 115 new DeletedOnFile(MessageLoop::current())); | 92 new DeletedOnFile(MessageLoop::current())); |
| 116 } | 93 } |
| 117 MessageLoop::current()->Run(); | 94 MessageLoop::current()->Run(); |
| 118 } | 95 } |
| 119 | 96 |
| 120 TEST_F(BrowserThreadTest, NotReleasedIfTargetThreadNonExistent) { | 97 TEST_F(BrowserThreadTest, NotReleasedIfTargetThreadNonExistent) { |
| 121 scoped_refptr<NeverDeleted> test(new NeverDeleted()); | 98 scoped_refptr<NeverDeleted> test(new NeverDeleted()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 141 // MessageLoopProxy test. This just makes sure we get piped through at all. | 118 // MessageLoopProxy test. This just makes sure we get piped through at all. |
| 142 ASSERT_TRUE(BrowserThread::PostTaskAndReply( | 119 ASSERT_TRUE(BrowserThread::PostTaskAndReply( |
| 143 BrowserThread::FILE, | 120 BrowserThread::FILE, |
| 144 FROM_HERE, | 121 FROM_HERE, |
| 145 base::Bind(&BrowserThreadTest::DoNothing), | 122 base::Bind(&BrowserThreadTest::DoNothing), |
| 146 base::Bind(&MessageLoop::Quit, | 123 base::Bind(&MessageLoop::Quit, |
| 147 base::Unretained(MessageLoop::current()->current())))); | 124 base::Unretained(MessageLoop::current()->current())))); |
| 148 MessageLoop::current()->Run(); | 125 MessageLoop::current()->Run(); |
| 149 } | 126 } |
| 150 | 127 |
| 151 | |
| 152 TEST_F(BrowserThreadTest, TaskToNonExistentThreadIsDeletedViaMessageLoopProxy) { | |
| 153 bool deleted = false; | |
| 154 scoped_refptr<base::MessageLoopProxy> message_loop_proxy = | |
| 155 BrowserThread::GetMessageLoopProxyForThread( | |
| 156 BrowserThread::WEBKIT_DEPRECATED); | |
| 157 message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); | |
| 158 EXPECT_TRUE(deleted); | |
| 159 } | 128 } |
| 160 | |
| 161 TEST_F(BrowserThreadTest, PostTaskViaMessageLoopProxyAfterThreadExits) { | |
| 162 scoped_ptr<BrowserThreadImpl> io_thread( | |
| 163 new BrowserThreadImpl(BrowserThread::IO)); | |
| 164 io_thread->Start(); | |
| 165 io_thread->Stop(); | |
| 166 | |
| 167 bool deleted = false; | |
| 168 scoped_refptr<base::MessageLoopProxy> message_loop_proxy = | |
| 169 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); | |
| 170 bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); | |
| 171 EXPECT_FALSE(ret); | |
| 172 EXPECT_TRUE(deleted); | |
| 173 } | |
| 174 | |
| 175 TEST_F(BrowserThreadTest, PostTaskViaMessageLoopProxyAfterThreadIsDeleted) { | |
| 176 { | |
| 177 scoped_ptr<BrowserThreadImpl> io_thread( | |
| 178 new BrowserThreadImpl(BrowserThread::IO)); | |
| 179 io_thread->Start(); | |
| 180 } | |
| 181 bool deleted = false; | |
| 182 scoped_refptr<base::MessageLoopProxy> message_loop_proxy = | |
| 183 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); | |
| 184 bool ret = message_loop_proxy->PostTask(FROM_HERE, new DummyTask(&deleted)); | |
| 185 EXPECT_FALSE(ret); | |
| 186 EXPECT_TRUE(deleted); | |
| 187 } | |
| 188 | |
| 189 } | |
| OLD | NEW |