Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ui / ozone / platform / dri / dri_surface_factory_unittest.cc
1 // Copyright 2014 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 <vector>
6
7 #include "base/memory/scoped_ptr.h"
8 #include "base/message_loop/message_loop.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/skia/include/core/SkCanvas.h"
11 #include "third_party/skia/include/core/SkColor.h"
12 #include "third_party/skia/include/core/SkImageInfo.h"
13 #include "ui/ozone/platform/dri/dri_buffer.h"
14 #include "ui/ozone/platform/dri/dri_surface.h"
15 #include "ui/ozone/platform/dri/dri_surface_factory.h"
16 #include "ui/ozone/platform/dri/hardware_display_controller.h"
17 #include "ui/ozone/platform/dri/screen_manager.h"
18 #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
19 #include "ui/ozone/public/surface_factory_ozone.h"
20 #include "ui/ozone/public/surface_ozone_canvas.h"
21
22 namespace {
23
24 // Mode of size 6x4.
25 const drmModeModeInfo kDefaultMode =
26     {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
27
28 const uint32_t kDefaultCrtc = 1;
29 const uint32_t kDefaultConnector = 2;
30
31 class MockScreenManager : public ui::ScreenManager {
32  public:
33   MockScreenManager(ui::DriWrapper* dri,
34                     ui::ScanoutBufferGenerator* buffer_generator)
35       : ScreenManager(dri, buffer_generator),
36         dri_(dri) {}
37   virtual ~MockScreenManager() {}
38
39   // Normally we'd use DRM to figure out the controller configuration. But we
40   // can't use DRM in unit tests, so we just create a fake configuration.
41   virtual void ForceInitializationOfPrimaryDisplay() OVERRIDE {
42     ConfigureDisplayController(
43         kDefaultCrtc, kDefaultConnector, gfx::Point(), kDefaultMode);
44   }
45
46  private:
47   ui::DriWrapper* dri_;  // Not owned.
48
49   DISALLOW_COPY_AND_ASSIGN(MockScreenManager);
50 };
51
52 }  // namespace
53
54 class DriSurfaceFactoryTest : public testing::Test {
55  public:
56   DriSurfaceFactoryTest() {}
57
58   virtual void SetUp() OVERRIDE;
59   virtual void TearDown() OVERRIDE;
60  protected:
61   scoped_ptr<base::MessageLoop> message_loop_;
62   scoped_ptr<ui::MockDriWrapper> dri_;
63   scoped_ptr<ui::DriBufferGenerator> buffer_generator_;
64   scoped_ptr<MockScreenManager> screen_manager_;
65   scoped_ptr<ui::DriSurfaceFactory> factory_;
66
67  private:
68   DISALLOW_COPY_AND_ASSIGN(DriSurfaceFactoryTest);
69 };
70
71 void DriSurfaceFactoryTest::SetUp() {
72   message_loop_.reset(new base::MessageLoopForUI);
73   dri_.reset(new ui::MockDriWrapper(3));
74   buffer_generator_.reset(new ui::DriBufferGenerator(dri_.get()));
75   screen_manager_.reset(new MockScreenManager(dri_.get(),
76                                               buffer_generator_.get()));
77   factory_.reset(new ui::DriSurfaceFactory(dri_.get(), screen_manager_.get()));
78 }
79
80 void DriSurfaceFactoryTest::TearDown() {
81   factory_.reset();
82   message_loop_.reset();
83 }
84
85 TEST_F(DriSurfaceFactoryTest, FailInitialization) {
86   dri_->fail_init();
87   EXPECT_EQ(ui::DriSurfaceFactory::FAILED, factory_->InitializeHardware());
88 }
89
90 TEST_F(DriSurfaceFactoryTest, SuccessfulInitialization) {
91   EXPECT_EQ(ui::DriSurfaceFactory::INITIALIZED,
92             factory_->InitializeHardware());
93 }
94
95 TEST_F(DriSurfaceFactoryTest, SuccessfulWidgetRealization) {
96   EXPECT_EQ(ui::DriSurfaceFactory::INITIALIZED,
97             factory_->InitializeHardware());
98
99   gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
100   EXPECT_EQ(ui::DriSurfaceFactory::kDefaultWidgetHandle, w);
101
102   EXPECT_TRUE(factory_->CreateCanvasForWidget(w));
103 }
104
105 TEST_F(DriSurfaceFactoryTest, SetCursorImage) {
106   EXPECT_EQ(ui::DriSurfaceFactory::INITIALIZED,
107             factory_->InitializeHardware());
108
109   gfx::AcceleratedWidget w = factory_->GetAcceleratedWidget();
110   EXPECT_EQ(ui::DriSurfaceFactory::kDefaultWidgetHandle, w);
111
112   scoped_ptr<ui::SurfaceOzoneCanvas> surf = factory_->CreateCanvasForWidget(w);
113   EXPECT_TRUE(surf);
114
115   SkBitmap image;
116   SkImageInfo info = SkImageInfo::Make(
117       6, 4, kN32_SkColorType, kPremul_SkAlphaType);
118   image.allocPixels(info);
119   image.eraseColor(SK_ColorWHITE);
120
121   factory_->SetHardwareCursor(w, image, gfx::Point(4, 2));
122
123   SkBitmap cursor;
124   // Buffers 0 and 1 are the cursor buffers.
125   cursor.setInfo(dri_->buffers()[1]->getCanvas()->imageInfo());
126   EXPECT_TRUE(dri_->buffers()[1]->getCanvas()->readPixels(&cursor, 0, 0));
127
128   // Check that the frontbuffer is displaying the right image as set above.
129   for (int i = 0; i < cursor.height(); ++i) {
130     for (int j = 0; j < cursor.width(); ++j) {
131       if (j < info.width() && i < info.height())
132         EXPECT_EQ(SK_ColorWHITE, cursor.getColor(j, i));
133       else
134         EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
135                   cursor.getColor(j, i));
136     }
137   }
138 }