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