Upstream version 8.37.180.0
[platform/framework/web/crosswalk.git] / src / ui / ozone / platform / dri / dri_surface_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 "testing/gtest/include/gtest/gtest.h"
6 #include "third_party/skia/include/core/SkCanvas.h"
7 #include "third_party/skia/include/core/SkColor.h"
8 #include "third_party/skia/include/core/SkDevice.h"
9 #include "ui/ozone/platform/dri/dri_buffer.h"
10 #include "ui/ozone/platform/dri/dri_surface.h"
11 #include "ui/ozone/platform/dri/hardware_display_controller.h"
12 #include "ui/ozone/platform/dri/test/mock_dri_surface.h"
13 #include "ui/ozone/platform/dri/test/mock_dri_wrapper.h"
14
15 namespace {
16
17 // Create a basic mode for a 6x4 screen.
18 const drmModeModeInfo kDefaultMode =
19     {0, 6, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, {'\0'}};
20
21 }  // namespace
22
23 class DriSurfaceTest : public testing::Test {
24  public:
25   DriSurfaceTest() {}
26
27   virtual void SetUp() OVERRIDE;
28   virtual void TearDown() OVERRIDE;
29
30  protected:
31   scoped_ptr<ui::MockDriWrapper> drm_;
32   scoped_ptr<ui::HardwareDisplayController> controller_;
33   scoped_ptr<ui::MockDriSurface> surface_;
34
35  private:
36   DISALLOW_COPY_AND_ASSIGN(DriSurfaceTest);
37 };
38
39 void DriSurfaceTest::SetUp() {
40   drm_.reset(new ui::MockDriWrapper(3));
41   controller_.reset(new ui::HardwareDisplayController(drm_.get(), 1, 1));
42
43   surface_.reset(new ui::MockDriSurface(
44       drm_.get(), gfx::Size(kDefaultMode.hdisplay, kDefaultMode.vdisplay)));
45 }
46
47 void DriSurfaceTest::TearDown() {
48   surface_.reset();
49   controller_.reset();
50   drm_.reset();
51 }
52
53 TEST_F(DriSurfaceTest, FailInitialization) {
54   surface_->set_initialize_expectation(false);
55   EXPECT_FALSE(surface_->Initialize());
56 }
57
58 TEST_F(DriSurfaceTest, SuccessfulInitialization) {
59   EXPECT_TRUE(surface_->Initialize());
60 }
61
62 TEST_F(DriSurfaceTest, CheckFBIDOnSwap) {
63   EXPECT_TRUE(surface_->Initialize());
64   controller_->BindSurfaceToController(surface_.PassAs<ui::ScanoutSurface>(),
65                                        kDefaultMode);
66
67   // Check that the framebuffer ID is correct.
68   EXPECT_EQ(2u, controller_->surface()->GetFramebufferId());
69
70   controller_->surface()->SwapBuffers();
71
72   EXPECT_EQ(1u, controller_->surface()->GetFramebufferId());
73 }
74
75 TEST_F(DriSurfaceTest, CheckPixelPointerOnSwap) {
76   EXPECT_TRUE(surface_->Initialize());
77
78   void* bitmap_pixels1 = surface_->GetDrawableForWidget()->getDevice()
79       ->accessBitmap(false).getPixels();
80
81   surface_->SwapBuffers();
82
83   void* bitmap_pixels2 = surface_->GetDrawableForWidget()->getDevice()
84       ->accessBitmap(false).getPixels();
85
86   // Check that once the buffers have been swapped the drawable's underlying
87   // pixels have been changed.
88   EXPECT_NE(bitmap_pixels1, bitmap_pixels2);
89 }
90
91 TEST_F(DriSurfaceTest, CheckCorrectBufferSync) {
92   EXPECT_TRUE(surface_->Initialize());
93
94   SkCanvas* canvas = surface_->GetDrawableForWidget();
95   SkRect clip;
96   // Modify part of the canvas.
97   clip.set(0, 0,
98            canvas->getDeviceSize().width() / 2,
99            canvas->getDeviceSize().height() / 2);
100   canvas->clipRect(clip, SkRegion::kReplace_Op);
101
102   canvas->drawColor(SK_ColorWHITE);
103
104   surface_->SwapBuffers();
105
106   // Verify that the modified contents have been copied over on swap (make sure
107   // the 2 buffers have the same content).
108   for (int i = 0; i < canvas->getDeviceSize().height(); ++i) {
109     for (int j = 0; j < canvas->getDeviceSize().width(); ++j) {
110       if (i < clip.height() && j < clip.width())
111         EXPECT_EQ(SK_ColorWHITE,
112                   canvas->getDevice()->accessBitmap(false).getColor(j, i));
113       else
114         EXPECT_EQ(SK_ColorBLACK,
115                   canvas->getDevice()->accessBitmap(false).getColor(j, i));
116     }
117   }
118 }