blob: 4083b782caf28d83ce59ec58a1d638b9eece7ca1 [file] [log] [blame]
[email protected]e7b3a612012-01-05 02:18:181// Copyright (c) 2012 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]c31af70db22011-08-18 23:13:015#include "base/bind.h"
[email protected]c6944272012-01-06 22:12:286#include "base/bind_helpers.h"
[email protected]3b63f8f42011-03-28 01:54:157#include "base/memory/scoped_ptr.h"
[email protected]95f861e2013-07-18 02:07:178#include "base/message_loop/message_loop.h"
[email protected]7ccb7072013-06-10 20:56:289#include "base/message_loop/message_loop_proxy.h"
[email protected]fb441962013-05-08 05:35:2410#include "base/sequenced_task_runner_helpers.h"
[email protected]c38831a12011-10-28 12:44:4911#include "content/browser/browser_thread_impl.h"
[email protected]e97882f2012-06-04 02:23:1712#include "content/public/test/test_browser_thread.h"
initial.commit09911bf2008-07-26 23:55:2913#include "testing/gtest/include/gtest/gtest.h"
[email protected]23887f04f2008-12-02 19:20:1514#include "testing/platform_test.h"
initial.commit09911bf2008-07-26 23:55:2915
[email protected]c38831a12011-10-28 12:44:4916namespace content {
17
[email protected]092b04e2010-10-12 23:23:4418class BrowserThreadTest : public testing::Test {
[email protected]f6710622009-11-02 06:10:3019 public:
[email protected]00ed48f2010-10-22 22:19:2420 void Release() const {
[email protected]092b04e2010-10-12 23:23:4421 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
[email protected]dd32b1272013-05-04 14:17:1122 loop_.PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
[email protected]f6710622009-11-02 06:10:3023 }
[email protected]64cd0d122008-10-17 21:16:1324
[email protected]f6710622009-11-02 06:10:3025 protected:
26 virtual void SetUp() {
[email protected]c38831a12011-10-28 12:44:4927 ui_thread_.reset(new BrowserThreadImpl(BrowserThread::UI));
28 file_thread_.reset(new BrowserThreadImpl(BrowserThread::FILE));
[email protected]2cbac9e2010-04-29 03:31:3429 ui_thread_->Start();
[email protected]f6710622009-11-02 06:10:3030 file_thread_->Start();
[email protected]f6710622009-11-02 06:10:3031 }
initial.commit09911bf2008-07-26 23:55:2932
[email protected]f6710622009-11-02 06:10:3033 virtual void TearDown() {
[email protected]2cbac9e2010-04-29 03:31:3434 ui_thread_->Stop();
[email protected]f6710622009-11-02 06:10:3035 file_thread_->Stop();
[email protected]f6710622009-11-02 06:10:3036 }
initial.commit09911bf2008-07-26 23:55:2937
[email protected]dd32b1272013-05-04 14:17:1138 static void BasicFunction(base::MessageLoop* message_loop) {
[email protected]092b04e2010-10-12 23:23:4439 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]dd32b1272013-05-04 14:17:1140 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
[email protected]f6710622009-11-02 06:10:3041 }
initial.commit09911bf2008-07-26 23:55:2942
[email protected]2cbac9e2010-04-29 03:31:3443 class DeletedOnFile
[email protected]f6710622009-11-02 06:10:3044 : public base::RefCountedThreadSafe<
[email protected]092b04e2010-10-12 23:23:4445 DeletedOnFile, BrowserThread::DeleteOnFileThread> {
[email protected]f6710622009-11-02 06:10:3046 public:
[email protected]dd32b1272013-05-04 14:17:1147 explicit DeletedOnFile(base::MessageLoop* message_loop)
48 : message_loop_(message_loop) {}
initial.commit09911bf2008-07-26 23:55:2949
[email protected]fb90c942012-04-27 23:40:5050 private:
51 friend struct BrowserThread::DeleteOnThread<BrowserThread::FILE>;
52 friend class base::DeleteHelper<DeletedOnFile>;
53
[email protected]2cbac9e2010-04-29 03:31:3454 ~DeletedOnFile() {
[email protected]092b04e2010-10-12 23:23:4455 CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
[email protected]dd32b1272013-05-04 14:17:1156 message_loop_->PostTask(FROM_HERE, base::MessageLoop::QuitClosure());
[email protected]f6710622009-11-02 06:10:3057 }
initial.commit09911bf2008-07-26 23:55:2958
[email protected]dd32b1272013-05-04 14:17:1159 base::MessageLoop* message_loop_;
[email protected]f6710622009-11-02 06:10:3060 };
initial.commit09911bf2008-07-26 23:55:2961
[email protected]f6710622009-11-02 06:10:3062 private:
[email protected]c38831a12011-10-28 12:44:4963 scoped_ptr<BrowserThreadImpl> ui_thread_;
64 scoped_ptr<BrowserThreadImpl> file_thread_;
[email protected]00ed48f2010-10-22 22:19:2465 // It's kind of ugly to make this mutable - solely so we can post the Quit
66 // Task from Release(). This should be fixed.
[email protected]dd32b1272013-05-04 14:17:1167 mutable base::MessageLoop loop_;
[email protected]f6710622009-11-02 06:10:3068};
initial.commit09911bf2008-07-26 23:55:2969
[email protected]092b04e2010-10-12 23:23:4470TEST_F(BrowserThreadTest, PostTask) {
71 BrowserThread::PostTask(
[email protected]dd32b1272013-05-04 14:17:1172 BrowserThread::FILE,
73 FROM_HERE,
74 base::Bind(&BasicFunction, base::MessageLoop::current()));
75 base::MessageLoop::current()->Run();
[email protected]f6710622009-11-02 06:10:3076}
initial.commit09911bf2008-07-26 23:55:2977
[email protected]092b04e2010-10-12 23:23:4478TEST_F(BrowserThreadTest, Release) {
79 BrowserThread::ReleaseSoon(BrowserThread::UI, FROM_HERE, this);
[email protected]dd32b1272013-05-04 14:17:1180 base::MessageLoop::current()->Run();
[email protected]f6710622009-11-02 06:10:3081}
initial.commit09911bf2008-07-26 23:55:2982
[email protected]092b04e2010-10-12 23:23:4483TEST_F(BrowserThreadTest, ReleasedOnCorrectThread) {
[email protected]f6710622009-11-02 06:10:3084 {
[email protected]2cbac9e2010-04-29 03:31:3485 scoped_refptr<DeletedOnFile> test(
[email protected]dd32b1272013-05-04 14:17:1186 new DeletedOnFile(base::MessageLoop::current()));
[email protected]f6710622009-11-02 06:10:3087 }
[email protected]dd32b1272013-05-04 14:17:1188 base::MessageLoop::current()->Run();
[email protected]f6710622009-11-02 06:10:3089}
90
[email protected]092b04e2010-10-12 23:23:4491TEST_F(BrowserThreadTest, PostTaskViaMessageLoopProxy) {
[email protected]656475d2010-05-06 18:34:2492 scoped_refptr<base::MessageLoopProxy> message_loop_proxy =
[email protected]092b04e2010-10-12 23:23:4493 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE);
[email protected]80751052011-11-12 17:10:5894 message_loop_proxy->PostTask(
[email protected]dd32b1272013-05-04 14:17:1195 FROM_HERE, base::Bind(&BasicFunction, base::MessageLoop::current()));
96 base::MessageLoop::current()->Run();
[email protected]2cbac9e2010-04-29 03:31:3497}
98
[email protected]092b04e2010-10-12 23:23:4499TEST_F(BrowserThreadTest, ReleaseViaMessageLoopProxy) {
[email protected]656475d2010-05-06 18:34:24100 scoped_refptr<base::MessageLoopProxy> message_loop_proxy =
[email protected]092b04e2010-10-12 23:23:44101 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI);
[email protected]2cbac9e2010-04-29 03:31:34102 message_loop_proxy->ReleaseSoon(FROM_HERE, this);
[email protected]dd32b1272013-05-04 14:17:11103 base::MessageLoop::current()->Run();
[email protected]2cbac9e2010-04-29 03:31:34104}
105
[email protected]c31af70db22011-08-18 23:13:01106TEST_F(BrowserThreadTest, PostTaskAndReply) {
107 // Most of the heavy testing for PostTaskAndReply() is done inside the
108 // MessageLoopProxy test. This just makes sure we get piped through at all.
109 ASSERT_TRUE(BrowserThread::PostTaskAndReply(
110 BrowserThread::FILE,
111 FROM_HERE,
[email protected]c6944272012-01-06 22:12:28112 base::Bind(&base::DoNothing),
[email protected]dd32b1272013-05-04 14:17:11113 base::Bind(&base::MessageLoop::Quit,
114 base::Unretained(base::MessageLoop::current()->current()))));
115 base::MessageLoop::current()->Run();
[email protected]c31af70db22011-08-18 23:13:01116}
117
[email protected]2b9eb3872013-03-30 18:58:30118} // namespace content