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 "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 } |
OLD | NEW |