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 "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"
17 const drmModeModeInfo kDefaultMode =
18 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
20 // Mock file descriptor ID.
24 const uint32_t kConnectorId = 1;
27 const uint32_t kCrtcId = 1;
29 const uint32_t kDPMSPropertyId = 1;
31 const gfx::AcceleratedWidget kDefaultWidgetHandle = 1;
33 // The real DrmWrapper makes actual DRM calls which we can't use in unit tests.
34 class MockDrmWrapperOzone : public gfx::DrmWrapperOzone {
36 MockDrmWrapperOzone(int fd) : DrmWrapperOzone(""),
37 add_framebuffer_expectation_(true),
38 page_flip_expectation_(true) {
42 virtual ~MockDrmWrapperOzone() { fd_ = -1; }
44 virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE {
45 return new drmModeCrtc;
48 virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE {
52 virtual bool SetCrtc(uint32_t crtc_id,
55 drmModeModeInfo* mode) OVERRIDE {
59 virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) OVERRIDE {
63 virtual bool AddFramebuffer(const drmModeModeInfo& mode,
68 uint32_t* framebuffer) OVERRIDE {
69 return add_framebuffer_expectation_;
72 virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { return true; }
74 virtual bool PageFlip(uint32_t crtc_id,
76 void* data) OVERRIDE {
77 static_cast<gfx::HardwareDisplayControllerOzone*>(data)->get_surface()
79 return page_flip_expectation_;
82 virtual bool ConnectorSetProperty(uint32_t connector_id,
84 uint64_t value) OVERRIDE { return true; }
86 void set_add_framebuffer_expectation(bool state) {
87 add_framebuffer_expectation_ = state;
90 void set_page_flip_expectation(bool state) {
91 page_flip_expectation_ = state;
95 bool add_framebuffer_expectation_;
96 bool page_flip_expectation_;
98 DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone);
101 class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone {
103 MockDrmSkBitmapOzone() : DrmSkBitmapOzone(kFd) {}
104 virtual ~MockDrmSkBitmapOzone() {}
106 virtual bool Initialize() OVERRIDE {
108 eraseColor(SK_ColorBLACK);
113 DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone);
116 class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone {
118 MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller)
119 : SoftwareSurfaceOzone(controller) {}
120 virtual ~MockSoftwareSurfaceOzone() {}
123 virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE {
124 return new MockDrmSkBitmapOzone();
127 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone);
130 // SSFO would normally allocate DRM resources. We can't rely on having a DRM
131 // backend to allocate and display our buffers. Thus, we replace these
132 // resources with stubs. For DRM calls, we simply use stubs that do nothing and
133 // for buffers we use the default SkBitmap allocator.
134 class MockSoftwareSurfaceFactoryOzone
135 : public gfx::SoftwareSurfaceFactoryOzone {
137 MockSoftwareSurfaceFactoryOzone()
138 : SoftwareSurfaceFactoryOzone(),
140 drm_wrapper_expectation_(true),
141 initialize_controller_expectation_(true) {}
142 virtual ~MockSoftwareSurfaceFactoryOzone() {};
144 void set_drm_wrapper_expectation(bool state) {
145 drm_wrapper_expectation_ = state;
148 void set_initialize_controller_expectation(bool state) {
149 initialize_controller_expectation_ = state;
152 MockDrmWrapperOzone* get_drm() const {
157 virtual gfx::SoftwareSurfaceOzone* CreateSurface(
158 gfx::HardwareDisplayControllerOzone* controller) OVERRIDE {
159 return new MockSoftwareSurfaceOzone(controller);
162 virtual gfx::DrmWrapperOzone* CreateWrapper() OVERRIDE {
163 if (drm_wrapper_expectation_)
164 mock_drm_ = new MockDrmWrapperOzone(kFd);
166 mock_drm_ = new MockDrmWrapperOzone(-1);
171 // Normally we'd use DRM to figure out the controller configuration. But we
172 // can't use DRM in unit tests, so we just create a fake configuration.
173 virtual bool InitializeControllerForPrimaryDisplay(
174 gfx::DrmWrapperOzone* drm,
175 gfx::HardwareDisplayControllerOzone* controller) OVERRIDE {
176 if (initialize_controller_expectation_) {
177 controller->SetControllerInfo(drm,
188 virtual void WaitForPageFlipEvent(int fd) OVERRIDE {}
190 MockDrmWrapperOzone* mock_drm_;
191 bool drm_wrapper_expectation_;
192 bool initialize_controller_expectation_;
194 DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceFactoryOzone);
199 class SoftwareSurfaceFactoryOzoneTest : public testing::Test {
201 SoftwareSurfaceFactoryOzoneTest() {}
203 virtual void SetUp() OVERRIDE;
204 virtual void TearDown() OVERRIDE;
206 scoped_ptr<base::MessageLoop> message_loop_;
207 scoped_ptr<MockSoftwareSurfaceFactoryOzone> factory_;
210 DISALLOW_COPY_AND_ASSIGN(SoftwareSurfaceFactoryOzoneTest);
213 void SoftwareSurfaceFactoryOzoneTest::SetUp() {
214 message_loop_.reset(new base::MessageLoop(base::MessageLoop::TYPE_UI));
215 factory_.reset(new MockSoftwareSurfaceFactoryOzone());
218 void SoftwareSurfaceFactoryOzoneTest::TearDown() {
220 message_loop_.reset();
223 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailInitialization) {
224 factory_->set_drm_wrapper_expectation(false);
226 EXPECT_EQ(gfx::SurfaceFactoryOzone::FAILED, factory_->InitializeHardware());
229 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulInitialization) {
230 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
231 factory_->InitializeHardware());
234 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailSurfaceInitialization) {
235 factory_->set_initialize_controller_expectation(false);
237 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
238 factory_->InitializeHardware());
240 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
241 EXPECT_EQ(kDefaultWidgetHandle, w);
243 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
246 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailBindingSurfaceToController) {
247 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
248 factory_->InitializeHardware());
250 factory_->get_drm()->set_add_framebuffer_expectation(false);
252 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
253 EXPECT_EQ(kDefaultWidgetHandle, w);
255 EXPECT_EQ(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
258 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulWidgetRealization) {
259 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
260 factory_->InitializeHardware());
262 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
263 EXPECT_EQ(kDefaultWidgetHandle, w);
265 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
268 TEST_F(SoftwareSurfaceFactoryOzoneTest, FailSchedulePageFlip) {
269 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
270 factory_->InitializeHardware());
272 factory_->get_drm()->set_page_flip_expectation(false);
274 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
275 EXPECT_EQ(kDefaultWidgetHandle, w);
277 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
279 EXPECT_FALSE(factory_->SchedulePageFlip(w));
282 TEST_F(SoftwareSurfaceFactoryOzoneTest, SuccessfulSchedulePageFlip) {
283 EXPECT_EQ(gfx::SurfaceFactoryOzone::INITIALIZED,
284 factory_->InitializeHardware());
286 gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
287 EXPECT_EQ(kDefaultWidgetHandle, w);
289 EXPECT_NE(gfx::kNullAcceleratedWidget, factory_->RealizeAcceleratedWidget(w));
291 EXPECT_TRUE(factory_->SchedulePageFlip(w));