Index: ui/gfx/ozone/impl/hardware_display_controller_ozone_unittest.cc |
diff --git a/ui/gfx/ozone/impl/hardware_display_controller_ozone_unittest.cc b/ui/gfx/ozone/impl/hardware_display_controller_ozone_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b5507c202f2b61fcdb528eac23bf4531e6b7a97a |
--- /dev/null |
+++ b/ui/gfx/ozone/impl/hardware_display_controller_ozone_unittest.cc |
@@ -0,0 +1,299 @@ |
+// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/gfx/ozone/impl/drm_skbitmap_ozone.h" |
+#include "ui/gfx/ozone/impl/drm_wrapper_ozone.h" |
+#include "ui/gfx/ozone/impl/hardware_display_controller_ozone.h" |
+#include "ui/gfx/ozone/impl/software_surface_ozone.h" |
+ |
+namespace { |
+ |
+// Create a basic mode for a 6x4 screen. |
+const drmModeModeInfo kDefaultMode = |
+ {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}}; |
+ |
+// Mock file descriptor ID. |
+const int kFd = 3; |
+ |
+// Mock connector ID. |
+const uint32_t kConnectorId = 1; |
+ |
+// Mock CRTC ID. |
+const uint32_t kCrtcId = 1; |
+ |
+// The real DrmWrapper makes actual DRM calls which we can't use in unit tests. |
+class MockDrmWrapperOzone : public gfx::DrmWrapperOzone { |
+ public: |
+ MockDrmWrapperOzone(int fd) : DrmWrapperOzone(""), |
+ get_crtc_call_count(0), |
+ free_crtc_call_count(0), |
+ restore_crtc_call_count(0), |
+ add_framebuffer_call_count(0), |
+ remove_framebuffer_call_count(0), |
+ set_crtc_expectation(true), |
+ add_framebuffer_expectation(true), |
+ page_flip_expectation(true) { |
+ fd_ = fd; |
+ } |
+ |
+ virtual ~MockDrmWrapperOzone() { fd_ = -1; } |
+ |
+ virtual drmModeCrtc* GetCrtc(uint32_t crtc_id) OVERRIDE { |
+ get_crtc_call_count++; |
+ return new drmModeCrtc; |
+ } |
+ |
+ virtual void FreeCrtc(drmModeCrtc* crtc) OVERRIDE { |
+ free_crtc_call_count++; |
+ delete crtc; |
+ } |
+ |
+ virtual bool SetCrtc(uint32_t crtc_id, |
+ uint32_t framebuffer, |
+ uint32_t* connectors, |
+ drmModeModeInfo* mode) OVERRIDE { |
+ return set_crtc_expectation; |
+ } |
+ |
+ virtual bool SetCrtc(drmModeCrtc* crtc, uint32_t* connectors) OVERRIDE { |
+ restore_crtc_call_count++; |
+ return true; |
+ } |
+ |
+ virtual bool AddFramebuffer(const drmModeModeInfo& mode, |
+ uint8_t depth, |
+ uint8_t bpp, |
+ uint32_t stride, |
+ uint32_t handle, |
+ uint32_t* framebuffer) OVERRIDE { |
+ add_framebuffer_call_count++; |
+ return add_framebuffer_expectation; |
+ } |
+ |
+ virtual bool RemoveFramebuffer(uint32_t framebuffer) OVERRIDE { |
+ remove_framebuffer_call_count++; |
+ return true; |
+ } |
+ |
+ virtual bool PageFlip(uint32_t crtc_id, |
+ uint32_t framebuffer, |
+ void* data) OVERRIDE { |
+ return page_flip_expectation; |
+ } |
+ |
+ int get_get_crtc_call_count() const { |
+ return get_crtc_call_count; |
+ } |
+ |
+ int get_free_crtc_call_count() const { |
+ return free_crtc_call_count; |
+ } |
+ |
+ int get_restore_crtc_call_count() const { |
+ return restore_crtc_call_count; |
+ } |
+ |
+ int get_add_framebuffer_call_count() const { |
+ return add_framebuffer_call_count; |
+ } |
+ |
+ int get_remove_framebuffer_call_count() const { |
+ return remove_framebuffer_call_count; |
+ } |
+ |
+ void set_set_crtc_expectation(bool state) { |
+ set_crtc_expectation = state; |
+ } |
+ |
+ void set_add_framebuffer_expectation(bool state) { |
+ add_framebuffer_expectation = state; |
+ } |
+ |
+ void set_page_flip_expectation(bool state) { |
+ page_flip_expectation = state; |
+ } |
+ |
+ private: |
+ int get_crtc_call_count; |
+ int free_crtc_call_count; |
+ int restore_crtc_call_count; |
+ int add_framebuffer_call_count; |
+ int remove_framebuffer_call_count; |
+ |
+ bool set_crtc_expectation; |
+ bool add_framebuffer_expectation; |
+ bool page_flip_expectation; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(MockDrmWrapperOzone); |
+}; |
+ |
+class MockDrmSkBitmapOzone : public gfx::DrmSkBitmapOzone { |
+ public: |
+ MockDrmSkBitmapOzone(int fd) : DrmSkBitmapOzone(fd) {} |
+ virtual ~MockDrmSkBitmapOzone() {} |
+ |
+ virtual bool Initialize() OVERRIDE { |
+ return allocPixels(); |
+ } |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(MockDrmSkBitmapOzone); |
+}; |
+ |
+class MockSoftwareSurfaceOzone : public gfx::SoftwareSurfaceOzone { |
+ public: |
+ MockSoftwareSurfaceOzone(gfx::HardwareDisplayControllerOzone* controller) |
+ : SoftwareSurfaceOzone(controller) {} |
+ virtual ~MockSoftwareSurfaceOzone() {} |
+ |
+ private: |
+ virtual gfx::DrmSkBitmapOzone* CreateBuffer() OVERRIDE { |
+ return new MockDrmSkBitmapOzone(kFd); |
+ } |
+ DISALLOW_COPY_AND_ASSIGN(MockSoftwareSurfaceOzone); |
+}; |
+ |
+} // namespace |
+ |
+class HardwareDisplayControllerOzoneTest : public testing::Test { |
+ public: |
+ HardwareDisplayControllerOzoneTest() {} |
+ virtual ~HardwareDisplayControllerOzoneTest() {} |
+ |
+ virtual void SetUp() OVERRIDE; |
+ virtual void TearDown() OVERRIDE; |
+ protected: |
+ scoped_ptr<gfx::HardwareDisplayControllerOzone> controller_; |
+ scoped_ptr<MockDrmWrapperOzone> drm_; |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(HardwareDisplayControllerOzoneTest); |
+}; |
+ |
+void HardwareDisplayControllerOzoneTest::SetUp() { |
+ controller_.reset(new gfx::HardwareDisplayControllerOzone()); |
+ drm_.reset(new MockDrmWrapperOzone(kFd)); |
+} |
+ |
+void HardwareDisplayControllerOzoneTest::TearDown() { |
+ controller_.reset(); |
+ drm_.reset(); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckInitialState) { |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::UNASSOCIATED, |
+ controller_->get_state()); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, |
+ CheckStateAfterControllerIsInitialized) { |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ |
+ EXPECT_EQ(1, drm_->get_get_crtc_call_count()); |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::UNINITIALIZED, |
+ controller_->get_state()); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckStateAfterSurfaceIsBound) { |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ gfx::SoftwareSurfaceOzone* surface = |
+ new MockSoftwareSurfaceOzone(controller_.get()); |
+ |
+ EXPECT_TRUE(surface->Initialize()); |
+ EXPECT_TRUE(controller_->BindSurfaceToController(surface)); |
+ |
+ EXPECT_EQ(2, drm_->get_add_framebuffer_call_count()); |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::SURFACE_INITIALIZED, |
+ controller_->get_state()); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfBindingFails) { |
+ drm_->set_add_framebuffer_expectation(false); |
+ |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ gfx::SoftwareSurfaceOzone* surface = |
+ new MockSoftwareSurfaceOzone(controller_.get()); |
+ |
+ EXPECT_TRUE(surface->Initialize()); |
+ EXPECT_FALSE(controller_->BindSurfaceToController(surface)); |
+ |
+ EXPECT_EQ(1, drm_->get_add_framebuffer_call_count()); |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED, |
+ controller_->get_state()); |
+ |
+ // Normally the controller would take ownership, but we failed to bind, so we |
+ // need to clean up. |
+ delete surface; |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckStateAfterPageFlip) { |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ gfx::SoftwareSurfaceOzone* surface = |
+ new MockSoftwareSurfaceOzone(controller_.get()); |
+ |
+ EXPECT_TRUE(surface->Initialize()); |
+ EXPECT_TRUE(controller_->BindSurfaceToController(surface)); |
+ |
+ controller_->SchedulePageFlip(); |
+ |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::INITIALIZED, |
+ controller_->get_state()); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfModesetFails) { |
+ drm_->set_set_crtc_expectation(false); |
+ |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ gfx::SoftwareSurfaceOzone* surface = |
+ new MockSoftwareSurfaceOzone(controller_.get()); |
+ |
+ EXPECT_TRUE(surface->Initialize()); |
+ EXPECT_TRUE(controller_->BindSurfaceToController(surface)); |
+ |
+ controller_->SchedulePageFlip(); |
+ |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED, |
+ controller_->get_state()); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckStateIfPageFlipFails) { |
+ drm_->set_page_flip_expectation(false); |
+ |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ gfx::SoftwareSurfaceOzone* surface = |
+ new MockSoftwareSurfaceOzone(controller_.get()); |
+ |
+ EXPECT_TRUE(surface->Initialize()); |
+ EXPECT_TRUE(controller_->BindSurfaceToController(surface)); |
+ |
+ controller_->SchedulePageFlip(); |
+ |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::FAILED, |
+ controller_->get_state()); |
+} |
+ |
+TEST_F(HardwareDisplayControllerOzoneTest, CheckProperDestruction) { |
+ controller_->SetControllerInfo( |
+ drm_.get(), kConnectorId, kCrtcId, kDefaultMode); |
+ gfx::SoftwareSurfaceOzone* surface = |
+ new MockSoftwareSurfaceOzone(controller_.get()); |
+ |
+ EXPECT_TRUE(surface->Initialize()); |
+ EXPECT_TRUE(controller_->BindSurfaceToController(surface)); |
+ |
+ EXPECT_EQ(gfx::HardwareDisplayControllerOzone::SURFACE_INITIALIZED, |
+ controller_->get_state()); |
+ |
+ controller_.reset(); |
+ |
+ EXPECT_EQ(2, drm_->get_remove_framebuffer_call_count()); |
+ EXPECT_EQ(1, drm_->get_restore_crtc_call_count()); |
+ EXPECT_EQ(1, drm_->get_free_crtc_call_count()); |
+} |