Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Side by Side Diff: cc/resources/raster_worker_pool_unittest.cc

Issue 143693007: cc: Refactor and cleanup RasterWorkerPool unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "cc/resources/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include <limits> 7 #include <limits>
8 #include <vector> 8 #include <vector>
9 9
10 #include "cc/resources/image_raster_worker_pool.h" 10 #include "cc/resources/image_raster_worker_pool.h"
11 #include "cc/resources/picture_pile.h" 11 #include "cc/resources/picture_pile.h"
12 #include "cc/resources/picture_pile_impl.h" 12 #include "cc/resources/picture_pile_impl.h"
13 #include "cc/resources/pixel_buffer_raster_worker_pool.h" 13 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
14 #include "cc/resources/resource_provider.h" 14 #include "cc/resources/resource_provider.h"
15 #include "cc/resources/scoped_resource.h" 15 #include "cc/resources/scoped_resource.h"
16 #include "cc/test/fake_output_surface.h" 16 #include "cc/test/fake_output_surface.h"
17 #include "cc/test/fake_output_surface_client.h" 17 #include "cc/test/fake_output_surface_client.h"
18 #include "cc/test/test_web_graphics_context_3d.h" 18 #include "cc/test/test_web_graphics_context_3d.h"
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 20
21 namespace cc { 21 namespace cc {
22 22
23 enum RasterThread { NONE, ORIGIN, WORKER };
alokp 2014/01/27 08:09:19 I prefer RASTER_THREAD prefix?
reveman 2014/01/27 16:03:20 Done.
24
23 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask { 25 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
24 public: 26 public:
25 enum RasterThread {
26 RASTER_THREAD_NONE,
27 RASTER_THREAD_ORIGIN,
28 RASTER_THREAD_WORKER
29 };
30 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis, 27 typedef base::Callback<void(const PicturePileImpl::Analysis& analysis,
31 bool was_canceled, 28 bool was_canceled,
32 RasterThread raster_thread)> Reply; 29 RasterThread raster_thread)> Reply;
33 30
34 TestRasterWorkerPoolTaskImpl(const Resource* resource, 31 TestRasterWorkerPoolTaskImpl(const Resource* resource,
35 const Reply& reply, 32 const Reply& reply,
36 internal::Task::Vector* dependencies, 33 internal::Task::Vector* dependencies,
37 bool use_gpu_rasterization) 34 bool use_gpu_rasterization)
38 : internal::RasterWorkerPoolTask(resource, 35 : internal::RasterWorkerPoolTask(resource,
39 dependencies, 36 dependencies,
40 use_gpu_rasterization), 37 use_gpu_rasterization),
41 reply_(reply), 38 reply_(reply),
42 raster_thread_(RASTER_THREAD_NONE) {} 39 raster_thread_(NONE) {}
43 40
44 // Overridden from internal::Task: 41 // Overridden from internal::Task:
45 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { 42 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
46 raster_thread_ = RASTER_THREAD_WORKER; 43 raster_thread_ = WORKER;
47 } 44 }
48 45
49 // Overridden from internal::WorkerPoolTask: 46 // Overridden from internal::WorkerPoolTask:
50 virtual void ScheduleOnOriginThread(internal::WorkerPool* worker_pool) 47 virtual void ScheduleOnOriginThread(internal::WorkerPool* worker_pool)
51 OVERRIDE { 48 OVERRIDE {
52 int stride; 49 int stride;
53 worker_pool->AcquireBufferForRaster(this, &stride); 50 worker_pool->AcquireBufferForRaster(this, &stride);
54 } 51 }
55 virtual void CompleteOnOriginThread(internal::WorkerPool* worker_pool) 52 virtual void CompleteOnOriginThread(internal::WorkerPool* worker_pool)
56 OVERRIDE { 53 OVERRIDE {
57 worker_pool->OnRasterCompleted(this, PicturePileImpl::Analysis()); 54 worker_pool->OnRasterCompleted(this, PicturePileImpl::Analysis());
58 } 55 }
59 virtual void RunReplyOnOriginThread() OVERRIDE { 56 virtual void RunReplyOnOriginThread() OVERRIDE {
60 reply_.Run( 57 reply_.Run(
61 PicturePileImpl::Analysis(), !HasFinishedRunning(), raster_thread_); 58 PicturePileImpl::Analysis(), !HasFinishedRunning(), raster_thread_);
62 } 59 }
63 60
64 // Overridden from internal::RasterWorkerPoolTask: 61 // Overridden from internal::RasterWorkerPoolTask:
65 virtual void RunOnOriginThread(ResourceProvider* resource_provider, 62 virtual void RunOnOriginThread(ResourceProvider* resource_provider,
66 ContextProvider* context_provider) OVERRIDE { 63 ContextProvider* context_provider) OVERRIDE {
67 raster_thread_ = RASTER_THREAD_ORIGIN; 64 raster_thread_ = ORIGIN;
68 } 65 }
69 66
70 protected: 67 protected:
71 virtual ~TestRasterWorkerPoolTaskImpl() {} 68 virtual ~TestRasterWorkerPoolTaskImpl() {}
72 69
73 private: 70 private:
74 const Reply reply_; 71 const Reply reply_;
75 RasterThread raster_thread_; 72 RasterThread raster_thread_;
76 73
77 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl); 74 DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl);
(...skipping 23 matching lines...) Expand all
101 98
102 protected: 99 protected:
103 virtual ~BlockingRasterWorkerPoolTaskImpl() {} 100 virtual ~BlockingRasterWorkerPoolTaskImpl() {}
104 101
105 private: 102 private:
106 base::Lock* lock_; 103 base::Lock* lock_;
107 104
108 DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl); 105 DISALLOW_COPY_AND_ASSIGN(BlockingRasterWorkerPoolTaskImpl);
109 }; 106 };
110 107
111 class RasterWorkerPoolTest : public testing::Test, 108 enum RasterWorkerPoolType { PIXEL_BUFFER, IMAGE };
112 public RasterWorkerPoolClient { 109
110 class RasterWorkerPoolTest
111 : public testing::TestWithParam<RasterWorkerPoolType>,
112 public RasterWorkerPoolClient {
113 public: 113 public:
114 RasterWorkerPoolTest() 114 RasterWorkerPoolTest()
115 : context_provider_(TestContextProvider::Create()), 115 : context_provider_(TestContextProvider::Create()),
116 check_interval_milliseconds_(1),
117 timeout_seconds_(5), 116 timeout_seconds_(5),
118 timed_out_(false) { 117 timed_out_(false) {
119 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass(); 118 output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
120 CHECK(output_surface_->BindToClient(&output_surface_client_)); 119 CHECK(output_surface_->BindToClient(&output_surface_client_));
121 120
122 resource_provider_ = ResourceProvider::Create( 121 resource_provider_ = ResourceProvider::Create(
123 output_surface_.get(), NULL, 0, false, 1).Pass(); 122 output_surface_.get(), NULL, 0, false, 1).Pass();
123
124 switch (GetParam()) {
125 case IMAGE:
126 raster_worker_pool_ = ImageRasterWorkerPool::Create(
127 resource_provider_.get(), context_provider_.get(), GL_TEXTURE_2D);
128 break;
129 case PIXEL_BUFFER:
130 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
131 resource_provider_.get(),
132 context_provider_.get(),
133 std::numeric_limits<size_t>::max());
134 break;
135 }
136
137 DCHECK(raster_worker_pool_);
138 raster_worker_pool_->SetClient(this);
124 } 139 }
125 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); } 140 virtual ~RasterWorkerPoolTest() { resource_provider_.reset(); }
126 141
127 // Overridden from testing::Test: 142 // Overridden from testing::Test:
128 virtual void TearDown() OVERRIDE { 143 virtual void TearDown() OVERRIDE {
129 if (!raster_worker_pool_)
130 return;
131 raster_worker_pool_->Shutdown(); 144 raster_worker_pool_->Shutdown();
132 raster_worker_pool_->CheckForCompletedTasks(); 145 raster_worker_pool_->CheckForCompletedTasks();
133 } 146 }
134 147
135 // Overriden from RasterWorkerPoolClient: 148 // Overriden from RasterWorkerPoolClient:
136 virtual bool ShouldForceTasksRequiredForActivationToComplete() 149 virtual bool ShouldForceTasksRequiredForActivationToComplete()
137 const OVERRIDE { 150 const OVERRIDE {
138 return false; 151 return false;
139 } 152 }
140 virtual void DidFinishRunningTasks() OVERRIDE {} 153 virtual void DidFinishRunningTasks() OVERRIDE {
154 raster_worker_pool_->CheckForCompletedTasks();
155 base::MessageLoop::current()->Quit();
156 }
141 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {} 157 virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
142 158
143 virtual void BeginTest() = 0; 159 void RunMessageLoopUntilAllTasksHaveCompleted() {
144 virtual void AfterTest() = 0;
145
146 ResourceProvider* resource_provider() const {
147 return resource_provider_.get();
148 }
149
150 RasterWorkerPool* worker_pool() { return raster_worker_pool_.get(); }
151
152 void RunTest(bool use_map_image) {
153 if (use_map_image) {
154 raster_worker_pool_ = ImageRasterWorkerPool::Create(
155 resource_provider(), context_provider_.get(), GL_TEXTURE_2D);
156 } else {
157 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
158 resource_provider(),
159 context_provider_.get(),
160 std::numeric_limits<size_t>::max());
161 }
162
163 raster_worker_pool_->SetClient(this);
164
165 BeginTest();
166
167 ScheduleCheckForCompletedTasks();
168
169 if (timeout_seconds_) { 160 if (timeout_seconds_) {
170 timeout_.Reset( 161 timeout_.Reset(
171 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this))); 162 base::Bind(&RasterWorkerPoolTest::OnTimeout, base::Unretained(this)));
172 base::MessageLoopProxy::current()->PostDelayedTask( 163 base::MessageLoopProxy::current()->PostDelayedTask(
173 FROM_HERE, 164 FROM_HERE,
174 timeout_.callback(), 165 timeout_.callback(),
175 base::TimeDelta::FromSeconds(timeout_seconds_)); 166 base::TimeDelta::FromSeconds(timeout_seconds_));
176 } 167 }
177 168
178 base::MessageLoop::current()->Run(); 169 base::MessageLoop::current()->Run();
179 170
180 check_.Cancel();
181 timeout_.Cancel(); 171 timeout_.Cancel();
182 172
183 if (timed_out_) { 173 ASSERT_FALSE(timed_out_) << "Test timed out";
184 FAIL() << "Test timed out";
185 return;
186 }
187 AfterTest();
188 } 174 }
189 175
190 void EndTest() { base::MessageLoop::current()->Quit(); }
191
192 void ScheduleTasks() { 176 void ScheduleTasks() {
193 RasterWorkerPool::RasterTask::Queue tasks; 177 RasterWorkerPool::RasterTask::Queue tasks;
194 178
195 for (std::vector<RasterWorkerPool::RasterTask>::iterator it = 179 for (std::vector<RasterWorkerPool::RasterTask>::iterator it =
196 tasks_.begin(); 180 tasks_.begin();
197 it != tasks_.end(); 181 it != tasks_.end();
198 ++it) 182 ++it)
199 tasks.Append(*it, false); 183 tasks.Append(*it, false);
200 184
201 worker_pool()->ScheduleTasks(&tasks); 185 raster_worker_pool_->ScheduleTasks(&tasks);
202 } 186 }
203 187
204 void AppendTask(unsigned id, bool use_gpu_rasterization) { 188 void AppendTask(unsigned id, bool use_gpu_rasterization) {
205 const gfx::Size size(1, 1); 189 const gfx::Size size(1, 1);
206 190
207 scoped_ptr<ScopedResource> resource( 191 scoped_ptr<ScopedResource> resource(
208 ScopedResource::Create(resource_provider())); 192 ScopedResource::Create(resource_provider_.get()));
209 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); 193 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
210 const Resource* const_resource = resource.get(); 194 const Resource* const_resource = resource.get();
211 195
212 RasterWorkerPool::Task::Set empty; 196 RasterWorkerPool::Task::Set empty;
213 tasks_.push_back( 197 tasks_.push_back(
214 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl( 198 RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl(
215 const_resource, 199 const_resource,
216 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, 200 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
217 base::Unretained(this), 201 base::Unretained(this),
218 base::Passed(&resource), 202 base::Passed(&resource),
219 id), 203 id),
220 &empty.tasks_, 204 &empty.tasks_,
221 use_gpu_rasterization))); 205 use_gpu_rasterization)));
222 } 206 }
223 207
224 void AppendBlockingTask(unsigned id, base::Lock* lock) { 208 void AppendBlockingTask(unsigned id, base::Lock* lock) {
225 const gfx::Size size(1, 1); 209 const gfx::Size size(1, 1);
226 210
227 scoped_ptr<ScopedResource> resource( 211 scoped_ptr<ScopedResource> resource(
228 ScopedResource::Create(resource_provider())); 212 ScopedResource::Create(resource_provider_.get()));
229 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888); 213 resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
230 const Resource* const_resource = resource.get(); 214 const Resource* const_resource = resource.get();
231 215
232 RasterWorkerPool::Task::Set empty; 216 RasterWorkerPool::Task::Set empty;
233 tasks_.push_back( 217 tasks_.push_back(
234 RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl( 218 RasterWorkerPool::RasterTask(new BlockingRasterWorkerPoolTaskImpl(
235 const_resource, 219 const_resource,
236 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted, 220 base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
237 base::Unretained(this), 221 base::Unretained(this),
238 base::Passed(&resource), 222 base::Passed(&resource),
239 id), 223 id),
240 lock, 224 lock,
241 &empty.tasks_, 225 &empty.tasks_,
242 false))); 226 false)));
243 } 227 }
244 228
245 virtual void OnTaskCompleted( 229 const std::vector<unsigned>& completed_task_ids() const {
246 scoped_ptr<ScopedResource> resource, 230 return completed_task_ids_;
247 unsigned id, 231 }
248 const PicturePileImpl::Analysis& analysis, 232
249 bool was_canceled, 233 const std::vector<bool>& completed_task_cancellation_values() const {
250 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) {} 234 return completed_task_cancellation_values_;
235 }
236
237 const std::vector<RasterThread>& completed_task_raster_threads() const {
238 return completed_task_raster_threads_;
239 }
251 240
252 private: 241 private:
253 void ScheduleCheckForCompletedTasks() { 242 void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
254 check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks, 243 unsigned id,
255 base::Unretained(this))); 244 const PicturePileImpl::Analysis& analysis,
256 base::MessageLoopProxy::current()->PostDelayedTask( 245 bool was_canceled,
257 FROM_HERE, 246 RasterThread raster_thread) {
258 check_.callback(), 247 completed_task_ids_.push_back(id);
259 base::TimeDelta::FromMilliseconds(check_interval_milliseconds_)); 248 completed_task_cancellation_values_.push_back(was_canceled);
260 } 249 completed_task_raster_threads_.push_back(raster_thread);
261
262 void OnCheckForCompletedTasks() {
263 raster_worker_pool_->CheckForCompletedTasks();
264 ScheduleCheckForCompletedTasks();
265 } 250 }
266 251
267 void OnTimeout() { 252 void OnTimeout() {
268 timed_out_ = true; 253 timed_out_ = true;
269 base::MessageLoop::current()->Quit(); 254 base::MessageLoop::current()->Quit();
270 } 255 }
271 256
272 protected: 257 protected:
273 scoped_refptr<TestContextProvider> context_provider_; 258 scoped_refptr<TestContextProvider> context_provider_;
274 FakeOutputSurfaceClient output_surface_client_; 259 FakeOutputSurfaceClient output_surface_client_;
275 scoped_ptr<FakeOutputSurface> output_surface_; 260 scoped_ptr<FakeOutputSurface> output_surface_;
276 scoped_ptr<ResourceProvider> resource_provider_; 261 scoped_ptr<ResourceProvider> resource_provider_;
277 scoped_ptr<RasterWorkerPool> raster_worker_pool_; 262 scoped_ptr<RasterWorkerPool> raster_worker_pool_;
278 base::CancelableClosure check_;
279 int check_interval_milliseconds_;
280 base::CancelableClosure timeout_; 263 base::CancelableClosure timeout_;
281 int timeout_seconds_; 264 int timeout_seconds_;
282 bool timed_out_; 265 bool timed_out_;
283 std::vector<RasterWorkerPool::RasterTask> tasks_; 266 std::vector<RasterWorkerPool::RasterTask> tasks_;
267 std::vector<unsigned> completed_task_ids_;
alokp 2014/01/27 08:09:19 It may be better to store a single vector of struc
reveman 2014/01/27 16:03:20 Done.
268 std::vector<bool> completed_task_cancellation_values_;
269 std::vector<RasterThread> completed_task_raster_threads_;
284 }; 270 };
285 271
286 namespace { 272 namespace {
287 273
288 #define PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME) \ 274 TEST_P(RasterWorkerPoolTest, Basic) {
289 TEST_F(TEST_FIXTURE_NAME, RunPixelBuffer) { RunTest(false); } 275 AppendTask(0u, false);
276 AppendTask(1u, false);
277 ScheduleTasks();
290 278
291 #define IMAGE_TEST_F(TEST_FIXTURE_NAME) \ 279 RunMessageLoopUntilAllTasksHaveCompleted();
292 TEST_F(TEST_FIXTURE_NAME, RunImage) { RunTest(true); }
293 280
294 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME) \ 281 ASSERT_EQ(2u, completed_task_ids().size());
295 PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME); \ 282 EXPECT_FALSE(completed_task_cancellation_values()[0]);
296 IMAGE_TEST_F(TEST_FIXTURE_NAME) 283 EXPECT_FALSE(completed_task_cancellation_values()[1]);
284 EXPECT_EQ(WORKER, completed_task_raster_threads()[0]);
285 EXPECT_EQ(WORKER, completed_task_raster_threads()[1]);
286 }
297 287
298 class RasterWorkerPoolTestSofwareRaster : public RasterWorkerPoolTest { 288 TEST_P(RasterWorkerPoolTest, GpuRaster) {
299 public: 289 AppendTask(0u, true); // GPU raster.
300 virtual void OnTaskCompleted( 290 ScheduleTasks();
301 scoped_ptr<ScopedResource> resource,
302 unsigned id,
303 const PicturePileImpl::Analysis& analysis,
304 bool was_canceled,
305 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
306 EXPECT_FALSE(was_canceled);
307 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER,
308 raster_thread);
309 on_task_completed_ids_.push_back(id);
310 if (on_task_completed_ids_.size() == 2)
311 EndTest();
312 }
313 291
314 // Overridden from RasterWorkerPoolTest: 292 RunMessageLoopUntilAllTasksHaveCompleted();
315 virtual void BeginTest() OVERRIDE {
316 AppendTask(0u, false);
317 AppendTask(1u, false);
318 ScheduleTasks();
319 }
320 virtual void AfterTest() OVERRIDE {
321 EXPECT_EQ(2u, on_task_completed_ids_.size());
322 tasks_.clear();
323 }
324 293
325 std::vector<unsigned> on_task_completed_ids_; 294 ASSERT_EQ(1u, completed_task_ids().size());
326 }; 295 EXPECT_EQ(0u, completed_task_ids()[0]);
296 EXPECT_FALSE(completed_task_cancellation_values()[0]);
297 EXPECT_EQ(ORIGIN, completed_task_raster_threads()[0]);
298 }
327 299
328 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestSofwareRaster); 300 TEST_P(RasterWorkerPoolTest, HybridRaster) {
301 AppendTask(0u, false); // Software raster.
302 AppendTask(1u, true); // GPU raster.
303 ScheduleTasks();
329 304
330 class RasterWorkerPoolTestGpuRaster : public RasterWorkerPoolTest { 305 RunMessageLoopUntilAllTasksHaveCompleted();
331 public:
332 virtual void OnTaskCompleted(
333 scoped_ptr<ScopedResource> resource,
334 unsigned id,
335 const PicturePileImpl::Analysis& analysis,
336 bool was_canceled,
337 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
338 EXPECT_EQ(0u, id);
339 EXPECT_FALSE(was_canceled);
340 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN,
341 raster_thread);
342 EndTest();
343 }
344 306
345 // Overridden from RasterWorkerPoolTest: 307 ASSERT_EQ(2u, completed_task_ids().size());
346 virtual void BeginTest() OVERRIDE { 308 for (int i = 0; i < 2; ++i) {
347 AppendTask(0u, true); // GPU raster. 309 EXPECT_FALSE(completed_task_cancellation_values()[i]);
348 ScheduleTasks(); 310 switch (completed_task_ids()[i]) {
349 }
350
351 virtual void AfterTest() OVERRIDE { EXPECT_EQ(1u, tasks_.size()); }
352 };
353 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestGpuRaster);
354
355 class RasterWorkerPoolTestHybridRaster : public RasterWorkerPoolTest {
356 public:
357 virtual void OnTaskCompleted(
358 scoped_ptr<ScopedResource> resource,
359 unsigned id,
360 const PicturePileImpl::Analysis& analysis,
361 bool was_canceled,
362 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
363 EXPECT_FALSE(was_canceled);
364 switch (id) {
365 case 0u: 311 case 0u:
366 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER, 312 EXPECT_EQ(WORKER, completed_task_raster_threads()[i]);
367 raster_thread);
368 break; 313 break;
369 case 1u: 314 case 1u:
370 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_ORIGIN, 315 EXPECT_EQ(ORIGIN, completed_task_raster_threads()[i]);
371 raster_thread);
372 break; 316 break;
373 default: 317 default:
374 NOTREACHED(); 318 NOTREACHED();
375 } 319 }
376 completed_task_ids_.push_back(id);
377 if (completed_task_ids_.size() == 2)
378 EndTest();
379 } 320 }
321 }
380 322
381 // Overridden from RasterWorkerPoolTest: 323 TEST_P(RasterWorkerPoolTest, FailedMapResource) {
382 virtual void BeginTest() OVERRIDE { 324 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
383 AppendTask(0u, false); // Software raster. 325 context3d->set_times_map_image_chromium_succeeds(0);
384 AppendTask(1u, true); // GPU raster. 326 context3d->set_times_map_buffer_chromium_succeeds(0);
385 ScheduleTasks(); 327 AppendTask(0u, false);
386 } 328 ScheduleTasks();
387 329
388 virtual void AfterTest() OVERRIDE { 330 RunMessageLoopUntilAllTasksHaveCompleted();
389 EXPECT_EQ(2u, tasks_.size());
390 EXPECT_EQ(2u, completed_task_ids_.size());
391 }
392 331
393 std::vector<unsigned> completed_task_ids_; 332 ASSERT_EQ(1u, completed_task_ids().size());
394 }; 333 EXPECT_FALSE(completed_task_cancellation_values()[0]);
395 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestHybridRaster); 334 EXPECT_EQ(WORKER, completed_task_raster_threads()[0]);
335 }
396 336
397 class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest { 337 // This test checks that replacing a pending raster task with another does
398 public: 338 // not prevent the DidFinishRunningTasks notification from being sent.
399 virtual void OnTaskCompleted( 339 TEST_P(RasterWorkerPoolTest, FalseThrottling) {
400 scoped_ptr<ScopedResource> resource, 340 base::Lock lock;
401 unsigned id,
402 const PicturePileImpl::Analysis& analysis,
403 bool was_canceled,
404 TestRasterWorkerPoolTaskImpl::RasterThread raster_thread) OVERRIDE {
405 EXPECT_FALSE(was_canceled);
406 EXPECT_EQ(TestRasterWorkerPoolTaskImpl::RASTER_THREAD_WORKER,
407 raster_thread);
408 EndTest();
409 }
410 341
411 // Overridden from RasterWorkerPoolTest: 342 // Schedule a task that is prevented from completing with a lock.
412 virtual void BeginTest() OVERRIDE { 343 lock.Acquire();
413 TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d(); 344 AppendBlockingTask(0u, &lock);
414 context3d->set_times_map_image_chromium_succeeds(0); 345 ScheduleTasks();
415 context3d->set_times_map_buffer_chromium_succeeds(0);
416 AppendTask(0u, false);
417 ScheduleTasks();
418 }
419 346
420 virtual void AfterTest() OVERRIDE { 347 // Schedule another task to replace the still-pending task. Because the old
421 ASSERT_EQ(1u, tasks_.size()); 348 // task is not a throttled task in the new task set, it should not prevent
422 tasks_.clear(); 349 // DidFinishRunningTasks from getting signaled.
423 } 350 tasks_.clear();
424 }; 351 AppendTask(1u, false);
352 ScheduleTasks();
425 353
426 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource); 354 // Unblock the first task to allow the second task to complete.
355 lock.Release();
427 356
428 class RasterWorkerPoolTestFalseThrottling : public RasterWorkerPoolTest { 357 RunMessageLoopUntilAllTasksHaveCompleted();
429 public: 358 }
430 // Overridden from RasterWorkerPoolTest:
431 virtual void BeginTest() OVERRIDE {
432 // This test checks that replacing a pending raster task with another does
433 // not prevent the DidFinishRunningTasks notification from being sent.
434 359
435 // Schedule a task that is prevented from completing with a lock. 360 INSTANTIATE_TEST_CASE_P(RasterWorkerPoolTests,
436 lock_.Acquire(); 361 RasterWorkerPoolTest,
437 AppendBlockingTask(0u, &lock_); 362 ::testing::Values(PIXEL_BUFFER, IMAGE));
438 ScheduleTasks();
439
440 // Schedule another task to replace the still-pending task. Because the old
441 // task is not a throttled task in the new task set, it should not prevent
442 // DidFinishRunningTasks from getting signaled.
443 tasks_.clear();
444 AppendTask(1u, false);
445 ScheduleTasks();
446
447 // Unblock the first task to allow the second task to complete.
448 lock_.Release();
449 }
450
451 virtual void AfterTest() OVERRIDE {}
452
453 virtual void DidFinishRunningTasks() OVERRIDE { EndTest(); }
454
455 base::Lock lock_;
456 };
457
458 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFalseThrottling);
459 363
460 } // namespace 364 } // namespace
461 } // namespace cc 365 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698