OLD | NEW |
---|---|
(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 "testing/gtest/include/gtest/gtest.h" | |
6 #include "ui/gfx/ozone/impl/drm_skbitmap_ozone.h" | |
7 #include "ui/gfx/ozone/impl/drm_wrapper_ozone.h" | |
8 #include "ui/gfx/ozone/impl/hardware_display_controller_ozone.h" | |
9 #include "ui/gfx/ozone/impl/software_surface_ozone.h" | |
10 | |
11 namespace { | |
12 | |
13 // Create a basic mode for a 6x4 screen. | |
14 const drmModeModeInfo kDefaultMode = | |
15 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; | |
16 | |
17 // Mock file descriptor ID. | |
18 const int kFd = 3; | |
19 | |
20 // Mock connector ID. | |
21 const uint32_t kConnectorId = 1; | |
22 | |
23 // Mock CRTC ID. | |
24 const uint32_t kCrtcId = 1; | |
25 | |
26 // The real DrmWrapper makes actual DRM calls which we can't use in unit tests. | |
27 class MockDrmWrapperOzone : public gfx::DrmWrapperOzone { | |
28 public: | |
29 MockDrmWrapperOzone(int fd) : DrmWrapperOzone(""), | |
30 get_crtc_call_count(0), | |
31 free_crtc_call_count(0), | |
32 restore_crtc_call_count(0), | |
33 add_framebuffer_call_count(0), | |
34 remove_framebuffer_call_count(0), | |
35 set_crtc_expectation(true), | |
36 add_framebuffer_expectation(true), | |
37 page_flip_expectation(true) { | |
38 fd_ = fd; | |
39 } | |
40 | |
41 virtual ~MockDrmWrapperOzone() { fd_ = -1; } | |
42 | |
43 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE { | |
rjkroege
2013/10/11 21:14:54
newline separate the methods.
| |
44 get_crtc_call_count++; | |
45 return new drmModeCrtc; | |
46 } | |
47 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE { | |
48 free_crtc_call_count++; | |
49 delete crtc; | |
50 } | |
51 virtual bool SetCrtc(uint32_t crtc_id, | |
52 uint32_t framebuffer, | |
53 uint32_t* connectors, | |
54 drmModeModeInfo* mode) OVERRIDE { | |
55 return set_crtc_expectation; | |
56 } | |
57 virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) OVERRIDE { | |
58 restore_crtc_call_count++; | |
59 return true; | |
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 add_framebuffer_call_count++; | |
68 return add_framebuffer_expectation; | |
69 } | |
70 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { | |
71 remove_framebuffer_call_count++; | |
72 return true; | |
73 } | |
74 virtual bool PageFlip(uint32_t crtc_id, | |
75 uint32_t framebuffer, | |
76 void* data) OVERRIDE { | |
77 return page_flip_expectation; | |
78 } | |
79 | |
80 int get_get_crtc_call_count() const { | |
81 return get_crtc_call_count; | |
82 } | |
83 | |
84 int get_free_crtc_call_count() const { | |
85 return free_crtc_call_count; | |
86 } | |
87 | |
88 int get_restore_crtc_call_count() const { | |
89 return restore_crtc_call_count; | |
90 } | |
91 | |
92 int get_add_framebuffer_call_count() const { | |
93 return add_framebuffer_call_count; | |
94 } | |
95 | |
96 int get_remove_framebuffer_call_count() const { | |
97 return remove_framebuffer_call_count; | |
98 } | |
99 | |
100 void set_set_crtc_expectation(bool state) { | |
101 set_crtc_expectation = state; | |
102 } | |
103 | |
104 void set_add_framebuffer_expectation(bool state) { | |
105 add_framebuffer_expectation = state; | |
106 } | |
107 | |
108 void set_page_flip_expectation(bool state) { | |
109 page_flip_expectation = state; | |
110 } | |
111 | |
112 private: | |
113 int get_crtc_call_count; | |
114 int free_crtc_call_count; | |
115 int restore_crtc_call_count; | |
116 int add_framebuffer_call_count; | |
117 int remove_framebuffer_call_count; | |
118 | |
119 bool set_crtc_expectation; | |
120 bool add_framebuffer_expectation; | |
121 bool page_flip_expectation; | |
122 | |
123 DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone); | |
124 }; | |
125 | |
126 class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone { | |
127 public: | |
128 MockDrmSkBitmapOzone(int fd) : DrmSkBitmapOzone(fd) {} | |
129 virtual ~MockDrmSkBitmapOzone() {} | |
130 | |
131 virtual bool Initialize() OVERRIDE { | |
132 return allocPixels(); | |
133 } | |
134 private: | |
135 DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone); | |
136 }; | |
137 | |
138 class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone { | |
139 public: | |
140 MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller) | |
141 : SoftwareSurfaceOzone(controller) {} | |
142 virtual ~MockSoftwareSurfaceOzone() {} | |
143 | |
144 private: | |
145 virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE { | |
146 return new MockDrmSkBitmapOzone(kFd); | |
147 } | |
148 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone); | |
149 }; | |
150 | |
151 } // namespace | |
152 | |
153 class HardwareDisplayControllerOzoneTest : public testing::Test { | |
154 public: | |
155 HardwareDisplayControllerOzoneTest() {} | |
156 virtual ~HardwareDisplayControllerOzoneTest() {} | |
157 | |
158 virtual void SetUp() OVERRIDE; | |
159 virtual void TearDown() OVERRIDE; | |
160 protected: | |
161 scoped_ptr<gfx::HardwareDisplayControllerOzone> controller_; | |
162 scoped_ptr<MockDrmWrapperOzone> drm_; | |
163 | |
164 private: | |
165 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerOzoneTest); | |
166 }; | |
167 | |
168 void HardwareDisplayControllerOzoneTest::SetUp() { | |
169 controller_.reset(new gfx::HardwareDisplayControllerOzone()); | |
170 drm_.reset(new MockDrmWrapperOzone(kFd)); | |
171 } | |
172 | |
173 void HardwareDisplayControllerOzoneTest::TearDown() { | |
174 controller_.reset(); | |
175 drm_.reset(); | |
176 } | |
177 | |
178 TEST_F(HardwareDisplayControllerOzoneTest, CheckInitialState) { | |
179 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::UNASSOCIATED, | |
180 controller_->get_state()); | |
181 } | |
182 | |
183 TEST_F(HardwareDisplayControllerOzoneTest, | |
184 CheckStateAfterControllerIsInitialized) { | |
185 controller_->SetControllerInfo( | |
186 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
187 | |
188 EXPECT_EQ(1, drm_->get_get_crtc_call_count()); | |
189 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::UNINITIALIZED, | |
190 controller_->get_state()); | |
191 } | |
192 | |
193 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateAfterSurfaceIsBound) { | |
194 controller_->SetControllerInfo( | |
195 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
196 gfx::SoftwareSurfaceOzone* surface = | |
197 new MockSoftwareSurfaceOzone(controller_.get()); | |
198 | |
199 EXPECT_TRUE(surface->Initialize()); | |
200 EXPECT_TRUE(controller_->BindSurfaceToController(surface)); | |
201 | |
202 EXPECT_EQ(2, drm_->get_add_framebuffer_call_count()); | |
203 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::SURFACE_INITIALIZED, | |
204 controller_->get_state()); | |
205 } | |
206 | |
207 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfBindingFails) { | |
208 drm_->set_add_framebuffer_expectation(false); | |
209 | |
210 controller_->SetControllerInfo( | |
211 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
212 gfx::SoftwareSurfaceOzone* surface = | |
213 new MockSoftwareSurfaceOzone(controller_.get()); | |
214 | |
215 EXPECT_TRUE(surface->Initialize()); | |
216 EXPECT_FALSE(controller_->BindSurfaceToController(surface)); | |
217 | |
218 EXPECT_EQ(1, drm_->get_add_framebuffer_call_count()); | |
219 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED, | |
220 controller_->get_state()); | |
221 | |
222 // Normally the controller would take ownership, but we failed to bind, so we | |
223 // need to clean up. | |
224 delete surface; | |
225 } | |
226 | |
227 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateAfterPageFlip) { | |
228 controller_->SetControllerInfo( | |
229 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
230 gfx::SoftwareSurfaceOzone* surface = | |
231 new MockSoftwareSurfaceOzone(controller_.get()); | |
232 | |
233 EXPECT_TRUE(surface->Initialize()); | |
234 EXPECT_TRUE(controller_->BindSurfaceToController(surface)); | |
235 | |
236 controller_->SchedulePageFlip(); | |
237 | |
238 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::INITIALIZED, | |
239 controller_->get_state()); | |
240 } | |
241 | |
242 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfModesetFails) { | |
243 drm_->set_set_crtc_expectation(false); | |
244 | |
245 controller_->SetControllerInfo( | |
246 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
247 gfx::SoftwareSurfaceOzone* surface = | |
248 new MockSoftwareSurfaceOzone(controller_.get()); | |
249 | |
250 EXPECT_TRUE(surface->Initialize()); | |
251 EXPECT_TRUE(controller_->BindSurfaceToController(surface)); | |
252 | |
253 controller_->SchedulePageFlip(); | |
254 | |
255 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED, | |
256 controller_->get_state()); | |
257 } | |
258 | |
259 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfPageFlipFails) { | |
260 drm_->set_page_flip_expectation(false); | |
261 | |
262 controller_->SetControllerInfo( | |
263 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
264 gfx::SoftwareSurfaceOzone* surface = | |
265 new MockSoftwareSurfaceOzone(controller_.get()); | |
266 | |
267 EXPECT_TRUE(surface->Initialize()); | |
268 EXPECT_TRUE(controller_->BindSurfaceToController(surface)); | |
269 | |
270 controller_->SchedulePageFlip(); | |
271 | |
272 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED, | |
273 controller_->get_state()); | |
274 } | |
275 | |
276 TEST_F(HardwareDisplayControllerOzoneTest, CheckProperDestruction) { | |
277 controller_->SetControllerInfo( | |
278 drm_.get(), kConnectorId, kCrtcId, kDefaultMode); | |
279 gfx::SoftwareSurfaceOzone* surface = | |
280 new MockSoftwareSurfaceOzone(controller_.get()); | |
281 | |
282 EXPECT_TRUE(surface->Initialize()); | |
283 EXPECT_TRUE(controller_->BindSurfaceToController(surface)); | |
284 | |
285 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::SURFACE_INITIALIZED, | |
286 controller_->get_state()); | |
287 | |
288 controller_.reset(); | |
289 | |
290 EXPECT_EQ(2, drm_->get_remove_framebuffer_call_count()); | |
291 EXPECT_EQ(1, drm_->get_restore_crtc_call_count()); | |
292 EXPECT_EQ(1, drm_->get_free_crtc_call_count()); | |
293 } | |
OLD | NEW |