- add sources.
[platform/framework/web/crosswalk.git] / src / cc / resources / raster_worker_pool_unittest.cc
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
3 // found in the LICENSE file.
4
5 #include "cc/resources/raster_worker_pool.h"
6
7 #include <limits>
8 #include <vector>
9
10 #include "cc/resources/image_raster_worker_pool.h"
11 #include "cc/resources/picture_pile.h"
12 #include "cc/resources/picture_pile_impl.h"
13 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
14 #include "cc/resources/resource_provider.h"
15 #include "cc/resources/scoped_resource.h"
16 #include "cc/test/fake_output_surface.h"
17 #include "cc/test/fake_output_surface_client.h"
18 #include "cc/test/test_web_graphics_context_3d.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace cc {
22
23 class TestRasterWorkerPoolTaskImpl : public internal::RasterWorkerPoolTask {
24  public:
25   typedef base::Callback<void(const PicturePileImpl::Analysis& analysis,
26                               bool was_canceled,
27                               bool did_raster)> Reply;
28
29   TestRasterWorkerPoolTaskImpl(
30       const Resource* resource,
31       const Reply& reply,
32       TaskVector* dependencies)
33       : internal::RasterWorkerPoolTask(resource, dependencies),
34         reply_(reply),
35         did_raster_(false) {}
36
37   // Overridden from internal::WorkerPoolTask:
38   virtual bool RunOnWorkerThread(unsigned thread_index,
39                                  void* buffer,
40                                  gfx::Size size,
41                                  int stride) OVERRIDE {
42     did_raster_ = true;
43     return true;
44   }
45   virtual void CompleteOnOriginThread() OVERRIDE {
46     reply_.Run(PicturePileImpl::Analysis(), !HasFinishedRunning(), did_raster_);
47   }
48
49  protected:
50   virtual ~TestRasterWorkerPoolTaskImpl() {}
51
52  private:
53   const Reply reply_;
54   bool did_raster_;
55
56   DISALLOW_COPY_AND_ASSIGN(TestRasterWorkerPoolTaskImpl);
57 };
58
59 class RasterWorkerPoolTest : public testing::Test,
60                              public RasterWorkerPoolClient  {
61  public:
62   RasterWorkerPoolTest()
63       : context_provider_(TestContextProvider::Create()),
64         check_interval_milliseconds_(1),
65         timeout_seconds_(5),
66         timed_out_(false) {
67     output_surface_ = FakeOutputSurface::Create3d(context_provider_).Pass();
68     CHECK(output_surface_->BindToClient(&output_surface_client_));
69
70     resource_provider_ = ResourceProvider::Create(
71         output_surface_.get(), NULL, 0, false, 1).Pass();
72   }
73   virtual ~RasterWorkerPoolTest() {
74     resource_provider_.reset();
75   }
76
77   // Overridden from testing::Test:
78   virtual void TearDown() OVERRIDE {
79     if (!raster_worker_pool_)
80       return;
81     raster_worker_pool_->Shutdown();
82     raster_worker_pool_->CheckForCompletedTasks();
83   }
84
85   // Overriden from RasterWorkerPoolClient:
86   virtual bool ShouldForceTasksRequiredForActivationToComplete() const
87       OVERRIDE {
88     return false;
89   }
90   virtual void DidFinishRunningTasks() OVERRIDE {}
91   virtual void DidFinishRunningTasksRequiredForActivation() OVERRIDE {}
92
93   virtual void BeginTest() = 0;
94   virtual void AfterTest() = 0;
95
96   ResourceProvider* resource_provider() const {
97     return resource_provider_.get();
98   }
99
100   RasterWorkerPool* worker_pool() {
101     return raster_worker_pool_.get();
102   }
103
104   void RunTest(bool use_map_image) {
105     if (use_map_image) {
106       raster_worker_pool_ = ImageRasterWorkerPool::Create(
107           resource_provider(), 1);
108     } else {
109       raster_worker_pool_ =
110           PixelBufferRasterWorkerPool::Create(
111               resource_provider(),
112               1,
113               std::numeric_limits<size_t>::max());
114     }
115
116     raster_worker_pool_->SetClient(this);
117
118     BeginTest();
119
120     ScheduleCheckForCompletedTasks();
121
122     if (timeout_seconds_) {
123       timeout_.Reset(base::Bind(&RasterWorkerPoolTest::OnTimeout,
124                                 base::Unretained(this)));
125       base::MessageLoopProxy::current()->PostDelayedTask(
126           FROM_HERE,
127           timeout_.callback(),
128           base::TimeDelta::FromSeconds(timeout_seconds_));
129     }
130
131     base::MessageLoop::current()->Run();
132
133     check_.Cancel();
134     timeout_.Cancel();
135
136     if (timed_out_) {
137       FAIL() << "Test timed out";
138       return;
139     }
140     AfterTest();
141   }
142
143   void EndTest() {
144     base::MessageLoop::current()->Quit();
145   }
146
147   void ScheduleTasks() {
148     RasterWorkerPool::RasterTask::Queue tasks;
149
150     for (std::vector<RasterWorkerPool::RasterTask>::iterator it =
151              tasks_.begin();
152          it != tasks_.end(); ++it)
153       tasks.Append(*it, false);
154
155     worker_pool()->ScheduleTasks(&tasks);
156   }
157
158   void AppendTask(unsigned id) {
159     const gfx::Size size(1, 1);
160
161     scoped_ptr<ScopedResource> resource(
162         ScopedResource::create(resource_provider()));
163     resource->Allocate(size, ResourceProvider::TextureUsageAny, RGBA_8888);
164     const Resource* const_resource = resource.get();
165
166     RasterWorkerPool::Task::Set empty;
167     tasks_.push_back(
168         RasterWorkerPool::RasterTask(new TestRasterWorkerPoolTaskImpl(
169             const_resource,
170             base::Bind(&RasterWorkerPoolTest::OnTaskCompleted,
171                        base::Unretained(this),
172                        base::Passed(&resource),
173                        id),
174             &empty.tasks_)));
175   }
176
177   virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
178                                unsigned id,
179                                const PicturePileImpl::Analysis& analysis,
180                                bool was_canceled,
181                                bool did_raster) {}
182
183  private:
184   void ScheduleCheckForCompletedTasks() {
185     check_.Reset(base::Bind(&RasterWorkerPoolTest::OnCheckForCompletedTasks,
186                             base::Unretained(this)));
187     base::MessageLoopProxy::current()->PostDelayedTask(
188         FROM_HERE,
189         check_.callback(),
190         base::TimeDelta::FromMilliseconds(check_interval_milliseconds_));
191   }
192
193   void OnCheckForCompletedTasks() {
194     raster_worker_pool_->CheckForCompletedTasks();
195     ScheduleCheckForCompletedTasks();
196   }
197
198   void OnTimeout() {
199     timed_out_ = true;
200     base::MessageLoop::current()->Quit();
201   }
202
203  protected:
204   scoped_refptr<TestContextProvider> context_provider_;
205   FakeOutputSurfaceClient output_surface_client_;
206   scoped_ptr<FakeOutputSurface> output_surface_;
207   scoped_ptr<ResourceProvider> resource_provider_;
208   scoped_ptr<RasterWorkerPool> raster_worker_pool_;
209   base::CancelableClosure check_;
210   int check_interval_milliseconds_;
211   base::CancelableClosure timeout_;
212   int timeout_seconds_;
213   bool timed_out_;
214   std::vector<RasterWorkerPool::RasterTask> tasks_;
215 };
216
217 namespace {
218
219 #define PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME)                  \
220   TEST_F(TEST_FIXTURE_NAME, RunPixelBuffer) {                   \
221     RunTest(false);                                             \
222   }
223
224 #define IMAGE_TEST_F(TEST_FIXTURE_NAME)                         \
225   TEST_F(TEST_FIXTURE_NAME, RunImage) {                         \
226     RunTest(true);                                              \
227   }
228
229 #define PIXEL_BUFFER_AND_IMAGE_TEST_F(TEST_FIXTURE_NAME)        \
230   PIXEL_BUFFER_TEST_F(TEST_FIXTURE_NAME);                       \
231   IMAGE_TEST_F(TEST_FIXTURE_NAME)
232
233 class BasicRasterWorkerPoolTest : public RasterWorkerPoolTest {
234  public:
235   virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
236                                unsigned id,
237                                const PicturePileImpl::Analysis& analysis,
238                                bool was_canceled,
239                                bool did_raster) OVERRIDE {
240     EXPECT_TRUE(did_raster);
241     on_task_completed_ids_.push_back(id);
242     if (on_task_completed_ids_.size() == 2)
243       EndTest();
244   }
245
246   // Overridden from RasterWorkerPoolTest:
247   virtual void BeginTest() OVERRIDE {
248     AppendTask(0u);
249     AppendTask(1u);
250     ScheduleTasks();
251   }
252   virtual void AfterTest() OVERRIDE {
253     EXPECT_EQ(2u, on_task_completed_ids_.size());
254     tasks_.clear();
255   }
256
257   std::vector<unsigned> on_task_completed_ids_;
258 };
259
260 PIXEL_BUFFER_AND_IMAGE_TEST_F(BasicRasterWorkerPoolTest);
261
262 class RasterWorkerPoolTestFailedMapResource : public RasterWorkerPoolTest {
263  public:
264   virtual void OnTaskCompleted(scoped_ptr<ScopedResource> resource,
265                                unsigned id,
266                                const PicturePileImpl::Analysis& analysis,
267                                bool was_canceled,
268                                bool did_raster) OVERRIDE {
269     EXPECT_FALSE(did_raster);
270     EndTest();
271   }
272
273   // Overridden from RasterWorkerPoolTest:
274   virtual void BeginTest() OVERRIDE {
275     TestWebGraphicsContext3D* context3d = context_provider_->TestContext3d();
276     context3d->set_times_map_image_chromium_succeeds(0);
277     context3d->set_times_map_buffer_chromium_succeeds(0);
278     AppendTask(0u);
279     ScheduleTasks();
280   }
281
282   virtual void AfterTest() OVERRIDE {
283     ASSERT_EQ(1u, tasks_.size());
284     tasks_.clear();
285   }
286 };
287
288 PIXEL_BUFFER_AND_IMAGE_TEST_F(RasterWorkerPoolTestFailedMapResource);
289
290 }  // namespace
291
292 }  // namespace cc