1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <cstring>
17 #include <gmock/gmock.h>
18 #include <gtest/gtest.h>
19 #include <securec.h>
20 #include <unordered_map>
21 
22 #include "nweb_create_window.h"
23 #include "graphic_common.h"
24 #include "graphic_common_c.h"
25 #include "key_event.h"
26 #include "surface_buffer_impl.h"
27 
28 #define protected public
29 #define private public
30 
31 #include "nweb_surface_adapter.h"
32 #include <ui/rs_surface_node.h>
33 #include "ui/rs_canvas_node.h"
34 #include "ui/rs_root_node.h"
35 #include "ui/rs_ui_director.h"
36 #include "nweb.h"
37 #include "nweb_adapter_helper.h"
38 #include "surface_buffer.h"
39 #include "surface_type.h"
40 #include "pointer_event.h"
41 
42 using namespace testing;
43 using namespace testing::ext;
44 using namespace OHOS;
45 using namespace OHOS::Rosen;
46 
47 namespace OHOS::NWeb {
48 namespace {
49 std::shared_ptr<NWebCreateInfoImpl> g_info;
50 sptr<Surface> g_surface = nullptr;
51 sptr<SurfaceBuffer> g_surfaceBuffer = nullptr;
52 const uint32_t DEFAULT_WIDTH = 2560;
53 const uint32_t DEFAULT_HEIGHT = 1396;
54 constexpr int BITS_PER_PIXEL = 4;
55 } // namespace
56 
57 class NWebSurfaceAdapterTest : public testing::Test, public IBufferConsumerListenerClazz {
58 public:
59     static void SetUpTestCase(void);
60     static void TearDownTestCase(void);
61     void SetUp() override;
62     void TearDown() override;
63     void OnBufferAvailable() override;
64 };
65 
OnBufferAvailable()66 void NWebSurfaceAdapterTest::OnBufferAvailable()
67 {}
68 
SetUpTestCase(void)69 void NWebSurfaceAdapterTest::SetUpTestCase(void)
70 {
71     RSSurfaceNodeConfig config;
72     config.SurfaceNodeName = "webTestSurfaceName";
73     auto surfaceNode = RSSurfaceNode::Create(config, false);
74     EXPECT_NE(surfaceNode, nullptr);
75     g_surface = surfaceNode->GetSurface();
76     EXPECT_NE(g_surface, nullptr);
77 }
78 
TearDownTestCase(void)79 void NWebSurfaceAdapterTest::TearDownTestCase(void)
80 {}
81 
SetUp(void)82 void NWebSurfaceAdapterTest::SetUp(void)
83 {}
84 
TearDown(void)85 void NWebSurfaceAdapterTest::TearDown(void)
86 {}
87 
88 class SurfaceBufferImplMock : public SurfaceBufferImpl {
89 public:
90     MOCK_METHOD0(GetVirAddr, void *());
91     MOCK_CONST_METHOD0(GetSize, uint32_t());
92 };
93 
94 /**
95  * @tc.name: NWebSurfaceAdapterTest_GetCreateInfo_001.
96  * @tc.desc: Test the GetCreateInfo.
97  * @tc.type: FUNC
98  * @tc.require:
99  */
100 HWTEST_F(NWebSurfaceAdapterTest, NWebSurfaceAdapterTest_GetCreateInfo_001, TestSize.Level1)
101 {
102     auto surfaceAdapter = NWebSurfaceAdapter::Instance();
103     g_info = surfaceAdapter.GetCreateInfo(g_surface, GetInitArgs(), DEFAULT_WIDTH, DEFAULT_HEIGHT);
104     EXPECT_NE(g_info->GetWidth(), 0);
105     sptr<Surface> surface = nullptr;
106     surfaceAdapter.GetCreateInfo(surface, GetInitArgs(), DEFAULT_WIDTH, DEFAULT_HEIGHT);
107 }
108 
109 /**
110  * @tc.name: NWebSurfaceAdapterTest_RequestBuffer_003.
111  * @tc.desc: Test the RequestBuffer.
112  * @tc.type: FUNC
113  * @tc.require:
114  */
115 HWTEST_F(NWebSurfaceAdapterTest, NWebSurfaceAdapterTest_RequestBuffer_003, TestSize.Level1)
116 {
117     auto surfaceAdapter = NWebSurfaceAdapter::Instance();
118     sptr<SurfaceBuffer> surfaceBuffer = surfaceAdapter.RequestBuffer(g_surface, DEFAULT_WIDTH, DEFAULT_HEIGHT);
119     EXPECT_NE(surfaceBuffer, nullptr);
120     sptr<Surface> surfaceInfo = nullptr;
121     surfaceBuffer = surfaceAdapter.RequestBuffer(surfaceInfo, DEFAULT_WIDTH, DEFAULT_HEIGHT);
122     EXPECT_EQ(surfaceBuffer, nullptr);
123 }
124 
125 /**
126  * @tc.name: NWebSurfaceAdapterTest_CopyFrame_004.
127  * @tc.desc: Test the CopyFrame.
128  * @tc.type: FUNC
129  * @tc.require:
130  */
131 HWTEST_F(NWebSurfaceAdapterTest, NWebSurfaceAdapterTest_CopyFrame_004, TestSize.Level1)
132 {
133     auto surfaceAdapter = NWebSurfaceAdapter::Instance();
__anon4366d1840202null134     char *src = new char[DEFAULT_WIDTH * DEFAULT_HEIGHT * BITS_PER_PIXEL] {0};
135     bool result = surfaceAdapter.CopyFrame(g_surfaceBuffer, src, DEFAULT_WIDTH, DEFAULT_HEIGHT);
136     EXPECT_FALSE(result);
137     int32_t releaseFence = -1;
138     BufferRequestConfig requestConfig = {
139         .width = DEFAULT_WIDTH,
140         .height = DEFAULT_HEIGHT,
141         .strideAlignment = sizeof(void *),
142         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
143         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
144         .timeout = 0,
145     };
146     g_surface->RequestBuffer(g_surfaceBuffer, releaseFence, requestConfig);
147     EXPECT_NE(g_surfaceBuffer, nullptr);
148     result = surfaceAdapter.CopyFrame(g_surfaceBuffer, src, DEFAULT_WIDTH, DEFAULT_HEIGHT);
149     EXPECT_TRUE(result);
150     (void)memset_s(src, DEFAULT_WIDTH * DEFAULT_HEIGHT * BITS_PER_PIXEL, 0,
151         DEFAULT_WIDTH * DEFAULT_HEIGHT * BITS_PER_PIXEL);
152     SurfaceBufferImplMock *mock = new SurfaceBufferImplMock();
153     EXPECT_CALL(*mock, GetVirAddr())
154         .Times(1)
155         .WillRepeatedly(::testing::Return(nullptr));
156     result = surfaceAdapter.CopyFrame((SurfaceBuffer *)mock, src, DEFAULT_WIDTH, DEFAULT_HEIGHT);
157     EXPECT_FALSE(result);
158     delete[] src;
159 }
160 
161 /**
162  * @tc.name: NWebSurfaceAdapterTest_FlushBuffer_005.
163  * @tc.desc: Test the FlushBuffer.
164  * @tc.type: FUNC
165  * @tc.require:
166  */
167 HWTEST_F(NWebSurfaceAdapterTest, NWebSurfaceAdapterTest_FlushBuffer_005, TestSize.Level1)
168 {
169     auto surfaceAdapter = NWebSurfaceAdapter::Instance();
170     sptr<Surface> surface = nullptr;
171     bool result = surfaceAdapter.FlushBuffer(surface, g_surfaceBuffer, DEFAULT_WIDTH, DEFAULT_WIDTH);
172     EXPECT_FALSE(result);
173     wptr<Surface> surfaceWeak(surface);
174     result = surfaceAdapter.OutputFrameCallback("buffer", 1, 1, surfaceWeak);
175     EXPECT_FALSE(result);
176 }
177 }
178