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.
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"
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'}};
17 // Mock file descriptor ID.
21 const uint32_t kConnectorId = 1;
24 const uint32_t kCrtcId = 1;
26 const uint32_t kDPMSPropertyId = 1;
28 // The real DrmWrapper makes actual DRM calls which we can't use in unit tests.
29 class MockDrmWrapperOzone : public gfx::DrmWrapperOzone {
31 MockDrmWrapperOzone(int fd) : DrmWrapperOzone(""),
32 get_crtc_call_count_(0),
33 free_crtc_call_count_(0),
34 restore_crtc_call_count_(0),
35 add_framebuffer_call_count_(0),
36 remove_framebuffer_call_count_(0),
37 set_crtc_expectation_(true),
38 add_framebuffer_expectation_(true),
39 page_flip_expectation_(true) {
43 virtual ~MockDrmWrapperOzone() { fd_ = -1; }
45 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE {
46 get_crtc_call_count_++;
47 return new drmModeCrtc;
50 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE {
51 free_crtc_call_count_++;
55 virtual bool SetCrtc(uint32_t crtc_id,
58 drmModeModeInfo* mode) OVERRIDE {
59 return set_crtc_expectation_;
62 virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) OVERRIDE {
63 restore_crtc_call_count_++;
67 virtual bool AddFramebuffer(const drmModeModeInfo& mode,
72 uint32_t* framebuffer) OVERRIDE {
73 add_framebuffer_call_count_++;
74 return add_framebuffer_expectation_;
77 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE {
78 remove_framebuffer_call_count_++;
82 virtual bool PageFlip(uint32_t crtc_id,
84 void* data) OVERRIDE {
85 return page_flip_expectation_;
88 virtual bool ConnectorSetProperty(uint32_t connector_id,
90 uint64_t value) OVERRIDE { return true; }
92 int get_get_crtc_call_count() const {
93 return get_crtc_call_count_;
96 int get_free_crtc_call_count() const {
97 return free_crtc_call_count_;
100 int get_restore_crtc_call_count() const {
101 return restore_crtc_call_count_;
104 int get_add_framebuffer_call_count() const {
105 return add_framebuffer_call_count_;
108 int get_remove_framebuffer_call_count() const {
109 return remove_framebuffer_call_count_;
112 void set_set_crtc_expectation(bool state) {
113 set_crtc_expectation_ = state;
116 void set_add_framebuffer_expectation(bool state) {
117 add_framebuffer_expectation_ = state;
120 void set_page_flip_expectation(bool state) {
121 page_flip_expectation_ = state;
125 int get_crtc_call_count_;
126 int free_crtc_call_count_;
127 int restore_crtc_call_count_;
128 int add_framebuffer_call_count_;
129 int remove_framebuffer_call_count_;
131 bool set_crtc_expectation_;
132 bool add_framebuffer_expectation_;
133 bool page_flip_expectation_;
135 DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone);
138 class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone {
140 MockDrmSkBitmapOzone(int fd) : DrmSkBitmapOzone(fd) {}
141 virtual ~MockDrmSkBitmapOzone() {}
143 virtual bool Initialize() OVERRIDE {
144 return allocPixels();
147 DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone);
150 class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone {
152 MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller)
153 : SoftwareSurfaceOzone(controller) {}
154 virtual ~MockSoftwareSurfaceOzone() {}
157 virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE {
158 return new MockDrmSkBitmapOzone(kFd);
160 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone);
165 class HardwareDisplayControllerOzoneTest : public testing::Test {
167 HardwareDisplayControllerOzoneTest() {}
168 virtual ~HardwareDisplayControllerOzoneTest() {}
170 virtual void SetUp() OVERRIDE;
171 virtual void TearDown() OVERRIDE;
173 scoped_ptr<gfx::HardwareDisplayControllerOzone> controller_;
174 scoped_ptr<MockDrmWrapperOzone> drm_;
177 DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerOzoneTest);
180 void HardwareDisplayControllerOzoneTest::SetUp() {
181 controller_.reset(new gfx::HardwareDisplayControllerOzone());
182 drm_.reset(new MockDrmWrapperOzone(kFd));
185 void HardwareDisplayControllerOzoneTest::TearDown() {
190 TEST_F(HardwareDisplayControllerOzoneTest, CheckInitialState) {
191 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::UNASSOCIATED,
192 controller_->get_state());
195 TEST_F(HardwareDisplayControllerOzoneTest,
196 CheckStateAfterControllerIsInitialized) {
197 controller_->SetControllerInfo(
198 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
200 EXPECT_EQ(1, drm_->get_get_crtc_call_count());
201 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::UNINITIALIZED,
202 controller_->get_state());
205 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateAfterSurfaceIsBound) {
206 controller_->SetControllerInfo(
207 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
208 scoped_ptr<gfx::SoftwareSurfaceOzone> surface(
209 new MockSoftwareSurfaceOzone(controller_.get()));
211 EXPECT_TRUE(surface->Initialize());
212 EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
214 EXPECT_EQ(2, drm_->get_add_framebuffer_call_count());
215 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::SURFACE_INITIALIZED,
216 controller_->get_state());
219 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfBindingFails) {
220 drm_->set_add_framebuffer_expectation(false);
222 controller_->SetControllerInfo(
223 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
224 scoped_ptr<gfx::SoftwareSurfaceOzone> surface(
225 new MockSoftwareSurfaceOzone(controller_.get()));
227 EXPECT_TRUE(surface->Initialize());
228 EXPECT_FALSE(controller_->BindSurfaceToController(surface.Pass()));
230 EXPECT_EQ(1, drm_->get_add_framebuffer_call_count());
231 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED,
232 controller_->get_state());
235 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateAfterPageFlip) {
236 controller_->SetControllerInfo(
237 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
238 scoped_ptr<gfx::SoftwareSurfaceOzone> surface(
239 new MockSoftwareSurfaceOzone(controller_.get()));
241 EXPECT_TRUE(surface->Initialize());
242 EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
244 controller_->SchedulePageFlip();
246 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::INITIALIZED,
247 controller_->get_state());
250 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfModesetFails) {
251 drm_->set_set_crtc_expectation(false);
253 controller_->SetControllerInfo(
254 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
255 scoped_ptr<gfx::SoftwareSurfaceOzone> surface(
256 new MockSoftwareSurfaceOzone(controller_.get()));
258 EXPECT_TRUE(surface->Initialize());
259 EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
261 controller_->SchedulePageFlip();
263 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED,
264 controller_->get_state());
267 TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfPageFlipFails) {
268 drm_->set_page_flip_expectation(false);
270 controller_->SetControllerInfo(
271 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
272 scoped_ptr<gfx::SoftwareSurfaceOzone> surface(
273 new MockSoftwareSurfaceOzone(controller_.get()));
275 EXPECT_TRUE(surface->Initialize());
276 EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
278 controller_->SchedulePageFlip();
280 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED,
281 controller_->get_state());
284 TEST_F(HardwareDisplayControllerOzoneTest, CheckProperDestruction) {
285 controller_->SetControllerInfo(
286 drm_.get(), kConnectorId, kCrtcId, kDPMSPropertyId, kDefaultMode);
287 scoped_ptr<gfx::SoftwareSurfaceOzone> surface(
288 new MockSoftwareSurfaceOzone(controller_.get()));
290 EXPECT_TRUE(surface->Initialize());
291 EXPECT_TRUE(controller_->BindSurfaceToController(surface.Pass()));
293 EXPECT_EQ(gfx::HardwareDisplayControllerOzone::SURFACE_INITIALIZED,
294 controller_->get_state());
298 EXPECT_EQ(2, drm_->get_remove_framebuffer_call_count());
299 EXPECT_EQ(1, drm_->get_restore_crtc_call_count());
300 EXPECT_EQ(1, drm_->get_free_crtc_call_count());