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.
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/dri_window_delegate_impl.h"
17 #include "ui/ozone/platform/dri/dri_window_delegate_manager.h"
18 #include "ui/ozone/platform/dri/hardware_display_controller.h"
19 #include "ui/ozone/platform/dri/screen_manager.h"
20 #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
21 #include "ui/ozone/public/surface_ozone_canvas.h"
26 const drmModeModeInfo kDefaultMode
=
27 {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
29 const gfx::AcceleratedWidget kDefaultWidgetHandle
= 1;
30 const uint32_t kDefaultCrtc
= 1;
31 const uint32_t kDefaultConnector
= 2;
33 class MockScreenManager
: public ui::ScreenManager
{
35 MockScreenManager(ui::DriWrapper
* dri
,
36 ui::ScanoutBufferGenerator
* buffer_generator
)
37 : ScreenManager(dri
, buffer_generator
), dri_(dri
) {}
38 ~MockScreenManager() override
{}
40 // Normally we'd use DRM to figure out the controller configuration. But we
41 // can't use DRM in unit tests, so we just create a fake configuration.
42 void ForceInitializationOfPrimaryDisplay() override
{
43 ConfigureDisplayController(kDefaultCrtc
, kDefaultConnector
, gfx::Point(),
48 ui::DriWrapper
* dri_
; // Not owned.
50 DISALLOW_COPY_AND_ASSIGN(MockScreenManager
);
55 class DriWindowDelegateImplTest
: public testing::Test
{
57 DriWindowDelegateImplTest() {}
59 void SetUp() override
;
60 void TearDown() override
;
63 scoped_ptr
<base::MessageLoop
> message_loop_
;
64 scoped_ptr
<ui::MockDriWrapper
> dri_
;
65 scoped_ptr
<ui::DriBufferGenerator
> buffer_generator_
;
66 scoped_ptr
<MockScreenManager
> screen_manager_
;
67 scoped_ptr
<ui::DriWindowDelegateManager
> window_delegate_manager_
;
70 DISALLOW_COPY_AND_ASSIGN(DriWindowDelegateImplTest
);
73 void DriWindowDelegateImplTest::SetUp() {
74 message_loop_
.reset(new base::MessageLoopForUI
);
75 dri_
.reset(new ui::MockDriWrapper(3));
76 buffer_generator_
.reset(new ui::DriBufferGenerator());
77 screen_manager_
.reset(
78 new MockScreenManager(dri_
.get(), buffer_generator_
.get()));
79 window_delegate_manager_
.reset(new ui::DriWindowDelegateManager());
81 scoped_ptr
<ui::DriWindowDelegate
> window_delegate(
82 new ui::DriWindowDelegateImpl(kDefaultWidgetHandle
, dri_
.get(),
83 window_delegate_manager_
.get(),
84 screen_manager_
.get()));
85 window_delegate
->Initialize();
86 window_delegate_manager_
->AddWindowDelegate(kDefaultWidgetHandle
,
87 window_delegate
.Pass());
90 void DriWindowDelegateImplTest::TearDown() {
91 scoped_ptr
<ui::DriWindowDelegate
> delegate
=
92 window_delegate_manager_
->RemoveWindowDelegate(kDefaultWidgetHandle
);
94 message_loop_
.reset();
97 TEST_F(DriWindowDelegateImplTest
, SetCursorImage
) {
100 SkImageInfo::Make(6, 4, kN32_SkColorType
, kPremul_SkAlphaType
);
101 image
.allocPixels(info
);
102 image
.eraseColor(SK_ColorWHITE
);
104 std::vector
<SkBitmap
> cursor_bitmaps
;
105 cursor_bitmaps
.push_back(image
);
106 window_delegate_manager_
->GetWindowDelegate(kDefaultWidgetHandle
)
107 ->SetCursor(cursor_bitmaps
, gfx::Point(4, 2), 0);
110 // Buffers 0 and 1 are the cursor buffers.
111 cursor
.setInfo(dri_
->buffers()[1]->getCanvas()->imageInfo());
112 EXPECT_TRUE(dri_
->buffers()[1]->getCanvas()->readPixels(&cursor
, 0, 0));
114 // Check that the frontbuffer is displaying the right image as set above.
115 for (int i
= 0; i
< cursor
.height(); ++i
) {
116 for (int j
= 0; j
< cursor
.width(); ++j
) {
117 if (j
< info
.width() && i
< info
.height())
118 EXPECT_EQ(SK_ColorWHITE
, cursor
.getColor(j
, i
));
120 EXPECT_EQ(static_cast<SkColor
>(SK_ColorTRANSPARENT
),
121 cursor
.getColor(j
, i
));