Chromium Code Reviews

Side by Side Diff: ui/gfx/ozone/impl/software_surface_factory_ozone_unittest.cc

Issue 27217009: [Ozone] Unit tests for SoftwareSurfaceFactoryOzone (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Added call to clear the pixels to make valgrind happy Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | | 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
(Empty)
1 // Copyright (c) 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 "base/memory/scoped_ptr.h"
6 #include "base/message_loop/message_loop.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "ui/gfx/ozone/impl/drm_skbitmap_ozone.h"
9 #include "ui/gfx/ozone/impl/drm_wrapper_ozone.h"
10 #include "ui/gfx/ozone/impl/hardware_display_controller_ozone.h"
11 #include "ui/gfx/ozone/impl/software_surface_factory_ozone.h"
12 #include "ui/gfx/ozone/impl/software_surface_ozone.h"
13 #include "ui/gfx/ozone/surface_factory_ozone.h"
14
15 namespace {
16
17 const drmModeModeInfo kDefaultMode =
18 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
19
20 // Mock file descriptor ID.
21 const int kFd = 3;
22
23 // Mock connector ID.
24 const uint32_t kConnectorId = 1;
25
26 // Mock CRTC ID.
27 const uint32_t kCrtcId = 1;
28
29 const gfx::AcceleratedWidget kDefaultWidgetHandle = 1;
30
31 // The real DrmWrapper makes actual DRM calls which we can't use in unit tests.
32 class MockDrmWrapperOzone : public gfx::DrmWrapperOzone {
33 public:
34 MockDrmWrapperOzone(int fd) : DrmWrapperOzone(""),
35 add_framebuffer_expectation_(true),
36 page_flip_expectation_(true) {
37 fd_ = fd;
38 }
39
40 virtual ~MockDrmWrapperOzone() { fd_ = -1; }
41
42 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE {
43 return new drmModeCrtc;
44 }
45
46 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE {
47 delete crtc;
48 }
49
50 virtual bool SetCrtc(uint32_t crtc_id,
51 uint32_t framebuffer,
52 uint32_t* connectors,
53 drmModeModeInfo* mode) OVERRIDE {
54 return true;
55 }
56
57 virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) OVERRIDE {
58 return true;
59 }
60
61 virtual bool AddFramebuffer(const drmModeModeInfo& mode,
62 uint8_t depth,
63 uint8_t bpp,
64 uint32_t stride,
65 uint32_t handle,
66 uint32_t* framebuffer) OVERRIDE {
67 return add_framebuffer_expectation_;
68 }
69
70 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { return true; }
71
72 virtual bool PageFlip(uint32_t crtc_id,
73 uint32_t framebuffer,
74 void* data) OVERRIDE {
75 static_cast<gfx::HardwareDisplayControllerOzone*>(data)->get_surface()
76 ->SwapBuffers();
77 return page_flip_expectation_;
78 }
79
80 void set_add_framebuffer_expectation(bool state) {
81 add_framebuffer_expectation_ = state;
82 }
83
84 void set_page_flip_expectation(bool state) {
85 page_flip_expectation_ = state;
86 }
87
88 private:
89 bool add_framebuffer_expectation_;
90 bool page_flip_expectation_;
91
92 DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone);
93 };
94
95 class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone {
96 public:
97 MockDrmSkBitmapOzone() : DrmSkBitmapOzone(kFd) {}
98 virtual ~MockDrmSkBitmapOzone() {}
99
100 virtual bool Initialize() OVERRIDE {
101 allocPixels();
102 eraseColor(SK_ColorBLACK);
103 return true;
104 }
105
106 private:
107 DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone);
108 };
109
110 class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone {
111 public:
112 MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller)
113 : SoftwareSurfaceOzone(controller) {}
114 virtual ~MockSoftwareSurfaceOzone() {}
115
116 private:
117 virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE {
118 return new MockDrmSkBitmapOzone();
119 }
120
121 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone);
122 };
123
124 // SSFO would normally allocate DRM resources. We can't rely on having a DRM
125 // backend to allocate and display our buffers. Thus, we replace these
126 // resources with stubs. For DRM calls, we simply use stubs that do nothing and
127 // for buffers we use the default SkBitmap allocator.
128 class MockSoftwareSurfaceFactoryOzone
129 : public gfx::SoftwareSurfaceFactoryOzone {
130 public:
131 MockSoftwareSurfaceFactoryOzone()
132 : SoftwareSurfaceFactoryOzone(),
133 mock_drm_(NULL),
134 drm_wrapper_expectation_(true),
135 initialize_controller_expectation_(true) {}
136 virtual ~MockSoftwareSurfaceFactoryOzone() {};
137
138 void set_drm_wrapper_expectation(bool state) {
139 drm_wrapper_expectation_ = state;
140 }
141
142 void set_initialize_controller_expectation(bool state) {
143 initialize_controller_expectation_ = state;
144 }
145
146 MockDrmWrapperOzone* get_drm() const {
147 return mock_drm_;
148 }
149
150 private:
151 virtual gfx::SoftwareSurfaceOzone* CreateSurface(
152 gfx::HardwareDisplayControllerOzone* controller) OVERRIDE {
153 return new MockSoftwareSurfaceOzone(controller);
154 }
155
156 virtual gfx::DrmWrapperOzone* CreateWrapper() OVERRIDE {
157 if (drm_wrapper_expectation_)
158 mock_drm_ = new MockDrmWrapperOzone(kFd);
159 else
160 mock_drm_ = new MockDrmWrapperOzone(-1);
161
162 return mock_drm_;
163 }
164
165 // Normally we'd use DRM to figure out the controller configuration. But we
166 // can't use DRM in unit tests, so we just create a fake configuration.
167 virtual bool InitializeControllerForPrimaryDisplay(
168 gfx::DrmWrapperOzone* drm,
169 gfx::HardwareDisplayControllerOzone* controller) OVERRIDE {
170 if (initialize_controller_expectation_) {
171 controller->SetControllerInfo(drm,
172 kConnectorId,
173 kCrtcId,
174 kDefaultMode);
175 return true;
176 } else {
177 return false;
178 }
179 }
180
181 virtual void WaitForPageFlipEvent(int fd) OVERRIDE {}
182
183 MockDrmWrapperOzone* mock_drm_;
184 bool drm_wrapper_expectation_;
185 bool initialize_controller_expectation_;
186
187 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceFactoryOzone);
188 };
189
190 } // namespace
191
192 class SoftwareSurfaceFactoryOzoneTest : public testing::Test {
193 public:
194 SoftwareSurfaceFactoryOzoneTest() {}
195
196 virtual void SetUp() OVERRIDE;
197 virtual void TearDown() OVERRIDE;
198 protected:
199 scoped_ptr<base::MessageLoop> message_loop_;
200 scoped_ptr<MockSoftwareSurfaceFactoryOzone> factory_;
201
202 private:
203 DISALLOW_COPY_AND_ASSIGN(SoftwareSurfaceFactoryOzoneTest);
204 };
205
206 void SoftwareSurfaceFactoryOzoneTest::SetUp() {
207 message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_UI));
208 factory_.reset(new MockSoftwareSurfaceFactoryOzone());
209 }
210
211 void SoftwareSurfaceFactoryOzoneTest::TearDown() {
212 factory_.reset();
213 message_loop_.reset();
214 }
215
216 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailInitialization) {
217 factory_->set_drm_wrapper_expectation(false);
218
219 EXPECT_EQ(gfx::SurfaceFactoryOzone::FAILED, factory_->InitializeHardware());
220 }
221
222 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulInitialization) {
223 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
224 factory_->InitializeHardware());
225 }
226
227 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailSurfaceInitialization) {
228 factory_->set_initialize_controller_expectation(false);
229
230 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
231 factory_->InitializeHardware());
232
233 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
234 EXPECT_EQ(kDefaultWidgetHandle, w);
235
236 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
237 }
238
239 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailBindingSurfaceToController) {
240 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
241 factory_->InitializeHardware());
242
243 factory_->get_drm()->set_add_framebuffer_expectation(false);
244
245 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
246 EXPECT_EQ(kDefaultWidgetHandle, w);
247
248 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
249 }
250
251 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulWidgetRealization) {
252 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
253 factory_->InitializeHardware());
254
255 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
256 EXPECT_EQ(kDefaultWidgetHandle, w);
257
258 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
259 }
260
261 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailSchedulePageFlip) {
262 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
263 factory_->InitializeHardware());
264
265 factory_->get_drm()->set_page_flip_expectation(false);
266
267 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
268 EXPECT_EQ(kDefaultWidgetHandle, w);
269
270 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
271
272 EXPECT_FALSE(factory_->SchedulePageFlip(w));
273 }
274
275 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulSchedulePageFlip) {
276 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
277 factory_->InitializeHardware());
278
279 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
280 EXPECT_EQ(kDefaultWidgetHandle, w);
281
282 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
283
284 EXPECT_TRUE(factory_->SchedulePageFlip(w));
285 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine