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