OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" | 5 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" |
6 | 6 |
7 #include "base/location.h" | 7 #include "base/location.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/single_thread_task_runner.h" | 9 #include "base/single_thread_task_runner.h" |
10 #include "components/scheduler/child/scheduler_task_runner_delegate_impl.h" | 10 #include "components/scheduler/child/scheduler_task_runner_delegate_impl.h" |
11 #include "components/scheduler/renderer/renderer_scheduler_impl.h" | 11 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
12 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 #include "third_party/WebKit/public/platform/WebTaskRunner.h" |
14 #include "third_party/WebKit/public/platform/WebTraceLocation.h" | 15 #include "third_party/WebKit/public/platform/WebTraceLocation.h" |
15 | 16 |
16 namespace scheduler { | 17 namespace scheduler { |
17 namespace { | 18 namespace { |
18 | 19 |
19 const int kWorkBatchSize = 2; | 20 const int kWorkBatchSize = 2; |
20 | 21 |
21 class MockTask : public blink::WebThread::Task { | 22 class MockTask : public blink::WebTaskRunner::Task { |
22 public: | 23 public: |
23 MOCK_METHOD0(run, void()); | 24 MOCK_METHOD0(run, void()); |
24 }; | 25 }; |
25 | 26 |
26 class MockTaskObserver : public blink::WebThread::TaskObserver { | 27 class MockTaskObserver : public blink::WebThread::TaskObserver { |
27 public: | 28 public: |
28 MOCK_METHOD0(willProcessTask, void()); | 29 MOCK_METHOD0(willProcessTask, void()); |
29 MOCK_METHOD0(didProcessTask, void()); | 30 MOCK_METHOD0(didProcessTask, void()); |
30 }; | 31 }; |
31 } // namespace | 32 } // namespace |
(...skipping 28 matching lines...) Expand all Loading... |
60 thread_.addTaskObserver(&observer); | 61 thread_.addTaskObserver(&observer); |
61 scoped_ptr<MockTask> task(new MockTask()); | 62 scoped_ptr<MockTask> task(new MockTask()); |
62 | 63 |
63 { | 64 { |
64 testing::InSequence sequence; | 65 testing::InSequence sequence; |
65 EXPECT_CALL(observer, willProcessTask()); | 66 EXPECT_CALL(observer, willProcessTask()); |
66 EXPECT_CALL(*task, run()); | 67 EXPECT_CALL(*task, run()); |
67 EXPECT_CALL(observer, didProcessTask()); | 68 EXPECT_CALL(observer, didProcessTask()); |
68 } | 69 } |
69 | 70 |
70 thread_.postTask(blink::WebTraceLocation(), task.release()); | 71 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task.release()); |
71 message_loop_.RunUntilIdle(); | 72 message_loop_.RunUntilIdle(); |
72 thread_.removeTaskObserver(&observer); | 73 thread_.removeTaskObserver(&observer); |
73 } | 74 } |
74 | 75 |
75 TEST_F(WebThreadImplForRendererSchedulerTest, TestWorkBatchWithOneTask) { | 76 TEST_F(WebThreadImplForRendererSchedulerTest, TestWorkBatchWithOneTask) { |
76 MockTaskObserver observer; | 77 MockTaskObserver observer; |
77 thread_.addTaskObserver(&observer); | 78 thread_.addTaskObserver(&observer); |
78 scoped_ptr<MockTask> task(new MockTask()); | 79 scoped_ptr<MockTask> task(new MockTask()); |
79 | 80 |
80 SetWorkBatchSizeForTesting(kWorkBatchSize); | 81 SetWorkBatchSizeForTesting(kWorkBatchSize); |
81 { | 82 { |
82 testing::InSequence sequence; | 83 testing::InSequence sequence; |
83 EXPECT_CALL(observer, willProcessTask()); | 84 EXPECT_CALL(observer, willProcessTask()); |
84 EXPECT_CALL(*task, run()); | 85 EXPECT_CALL(*task, run()); |
85 EXPECT_CALL(observer, didProcessTask()); | 86 EXPECT_CALL(observer, didProcessTask()); |
86 } | 87 } |
87 | 88 |
88 thread_.postTask(blink::WebTraceLocation(), task.release()); | 89 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task.release()); |
89 message_loop_.RunUntilIdle(); | 90 message_loop_.RunUntilIdle(); |
90 thread_.removeTaskObserver(&observer); | 91 thread_.removeTaskObserver(&observer); |
91 } | 92 } |
92 | 93 |
93 TEST_F(WebThreadImplForRendererSchedulerTest, TestWorkBatchWithTwoTasks) { | 94 TEST_F(WebThreadImplForRendererSchedulerTest, TestWorkBatchWithTwoTasks) { |
94 MockTaskObserver observer; | 95 MockTaskObserver observer; |
95 thread_.addTaskObserver(&observer); | 96 thread_.addTaskObserver(&observer); |
96 scoped_ptr<MockTask> task1(new MockTask()); | 97 scoped_ptr<MockTask> task1(new MockTask()); |
97 scoped_ptr<MockTask> task2(new MockTask()); | 98 scoped_ptr<MockTask> task2(new MockTask()); |
98 | 99 |
99 SetWorkBatchSizeForTesting(kWorkBatchSize); | 100 SetWorkBatchSizeForTesting(kWorkBatchSize); |
100 { | 101 { |
101 testing::InSequence sequence; | 102 testing::InSequence sequence; |
102 EXPECT_CALL(observer, willProcessTask()); | 103 EXPECT_CALL(observer, willProcessTask()); |
103 EXPECT_CALL(*task1, run()); | 104 EXPECT_CALL(*task1, run()); |
104 EXPECT_CALL(observer, didProcessTask()); | 105 EXPECT_CALL(observer, didProcessTask()); |
105 | 106 |
106 EXPECT_CALL(observer, willProcessTask()); | 107 EXPECT_CALL(observer, willProcessTask()); |
107 EXPECT_CALL(*task2, run()); | 108 EXPECT_CALL(*task2, run()); |
108 EXPECT_CALL(observer, didProcessTask()); | 109 EXPECT_CALL(observer, didProcessTask()); |
109 } | 110 } |
110 | 111 |
111 thread_.postTask(blink::WebTraceLocation(), task1.release()); | 112 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task1.release()); |
112 thread_.postTask(blink::WebTraceLocation(), task2.release()); | 113 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task2.release()); |
113 message_loop_.RunUntilIdle(); | 114 message_loop_.RunUntilIdle(); |
114 thread_.removeTaskObserver(&observer); | 115 thread_.removeTaskObserver(&observer); |
115 } | 116 } |
116 | 117 |
117 TEST_F(WebThreadImplForRendererSchedulerTest, TestWorkBatchWithThreeTasks) { | 118 TEST_F(WebThreadImplForRendererSchedulerTest, TestWorkBatchWithThreeTasks) { |
118 MockTaskObserver observer; | 119 MockTaskObserver observer; |
119 thread_.addTaskObserver(&observer); | 120 thread_.addTaskObserver(&observer); |
120 scoped_ptr<MockTask> task1(new MockTask()); | 121 scoped_ptr<MockTask> task1(new MockTask()); |
121 scoped_ptr<MockTask> task2(new MockTask()); | 122 scoped_ptr<MockTask> task2(new MockTask()); |
122 scoped_ptr<MockTask> task3(new MockTask()); | 123 scoped_ptr<MockTask> task3(new MockTask()); |
123 | 124 |
124 SetWorkBatchSizeForTesting(kWorkBatchSize); | 125 SetWorkBatchSizeForTesting(kWorkBatchSize); |
125 { | 126 { |
126 testing::InSequence sequence; | 127 testing::InSequence sequence; |
127 EXPECT_CALL(observer, willProcessTask()); | 128 EXPECT_CALL(observer, willProcessTask()); |
128 EXPECT_CALL(*task1, run()); | 129 EXPECT_CALL(*task1, run()); |
129 EXPECT_CALL(observer, didProcessTask()); | 130 EXPECT_CALL(observer, didProcessTask()); |
130 | 131 |
131 EXPECT_CALL(observer, willProcessTask()); | 132 EXPECT_CALL(observer, willProcessTask()); |
132 EXPECT_CALL(*task2, run()); | 133 EXPECT_CALL(*task2, run()); |
133 EXPECT_CALL(observer, didProcessTask()); | 134 EXPECT_CALL(observer, didProcessTask()); |
134 | 135 |
135 EXPECT_CALL(observer, willProcessTask()); | 136 EXPECT_CALL(observer, willProcessTask()); |
136 EXPECT_CALL(*task3, run()); | 137 EXPECT_CALL(*task3, run()); |
137 EXPECT_CALL(observer, didProcessTask()); | 138 EXPECT_CALL(observer, didProcessTask()); |
138 } | 139 } |
139 | 140 |
140 thread_.postTask(blink::WebTraceLocation(), task1.release()); | 141 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task1.release()); |
141 thread_.postTask(blink::WebTraceLocation(), task2.release()); | 142 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task2.release()); |
142 thread_.postTask(blink::WebTraceLocation(), task3.release()); | 143 thread_.taskRunner()->postTask(blink::WebTraceLocation(), task3.release()); |
143 message_loop_.RunUntilIdle(); | 144 message_loop_.RunUntilIdle(); |
144 thread_.removeTaskObserver(&observer); | 145 thread_.removeTaskObserver(&observer); |
145 } | 146 } |
146 | 147 |
147 class ExitRunLoopTask : public blink::WebThread::Task { | 148 class ExitRunLoopTask : public blink::WebTaskRunner::Task { |
148 public: | 149 public: |
149 ExitRunLoopTask(base::RunLoop* run_loop) : run_loop_(run_loop) {} | 150 ExitRunLoopTask(base::RunLoop* run_loop) : run_loop_(run_loop) {} |
150 | 151 |
151 virtual void run() { run_loop_->Quit(); } | 152 virtual void run() { run_loop_->Quit(); } |
152 | 153 |
153 private: | 154 private: |
154 base::RunLoop* run_loop_; | 155 base::RunLoop* run_loop_; |
155 }; | 156 }; |
156 | 157 |
157 void EnterRunLoop(base::MessageLoop* message_loop, blink::WebThread* thread) { | 158 void EnterRunLoop(base::MessageLoop* message_loop, blink::WebThread* thread) { |
158 // Note: WebThreads do not support nested run loops, which is why we use a | 159 // Note: WebThreads do not support nested run loops, which is why we use a |
159 // run loop directly. | 160 // run loop directly. |
160 base::RunLoop run_loop; | 161 base::RunLoop run_loop; |
161 thread->postTask(blink::WebTraceLocation(), new ExitRunLoopTask(&run_loop)); | 162 thread->taskRunner()->postTask(blink::WebTraceLocation(), |
| 163 new ExitRunLoopTask(&run_loop)); |
162 message_loop->SetNestableTasksAllowed(true); | 164 message_loop->SetNestableTasksAllowed(true); |
163 run_loop.Run(); | 165 run_loop.Run(); |
164 } | 166 } |
165 | 167 |
166 TEST_F(WebThreadImplForRendererSchedulerTest, TestNestedRunLoop) { | 168 TEST_F(WebThreadImplForRendererSchedulerTest, TestNestedRunLoop) { |
167 MockTaskObserver observer; | 169 MockTaskObserver observer; |
168 thread_.addTaskObserver(&observer); | 170 thread_.addTaskObserver(&observer); |
169 | 171 |
170 { | 172 { |
171 testing::InSequence sequence; | 173 testing::InSequence sequence; |
(...skipping 10 matching lines...) Expand all Loading... |
182 } | 184 } |
183 | 185 |
184 message_loop_.task_runner()->PostTask( | 186 message_loop_.task_runner()->PostTask( |
185 FROM_HERE, base::Bind(&EnterRunLoop, base::Unretained(&message_loop_), | 187 FROM_HERE, base::Bind(&EnterRunLoop, base::Unretained(&message_loop_), |
186 base::Unretained(&thread_))); | 188 base::Unretained(&thread_))); |
187 message_loop_.RunUntilIdle(); | 189 message_loop_.RunUntilIdle(); |
188 thread_.removeTaskObserver(&observer); | 190 thread_.removeTaskObserver(&observer); |
189 } | 191 } |
190 | 192 |
191 } // namespace scheduler | 193 } // namespace scheduler |
OLD | NEW |