1 /*
2 * Copyright (c) 2021 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 <map>
17 #include <gtest/gtest.h>
18
19 #include <surface.h>
20 #include "buffer_extra_data_impl.h"
21 #include "buffer_queue.h"
22 #include "buffer_consumer_listener.h"
23 #include "buffer_log.h"
24 #include "iconsumer_surface.h"
25 #include "test_header.h"
26
27 using namespace testing;
28 using namespace testing::ext;
29
30 namespace OHOS::Rosen {
31 class BufferSharedTest : public testing::Test, public IBufferConsumerListenerClazz {
32 public:
33 static void SetUpTestCase();
34 void OnBufferAvailable() override;
35 static void TearDownTestCase();
36
37 static inline sptr<IConsumerSurface> surf = nullptr;
38 static inline sptr<Surface> producerSurface1 = nullptr;
39 static inline sptr<Surface> producerSurface2 = nullptr;
40 static inline sptr<SurfaceBuffer> buffer1 = nullptr;
41 static inline sptr<SurfaceBuffer> buffer2 = nullptr;
42 static inline sptr<SurfaceBuffer> sbuffer1 = nullptr;
43 static inline sptr<SurfaceBuffer> sbuffer2 = nullptr;
44 };
45
SetUpTestCase()46 void BufferSharedTest::SetUpTestCase()
47 {
48 GTEST_LOG_(INFO) << getpid() << std::endl;
49 surf = IConsumerSurface::Create("shared", true);
50 sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
51 surf->RegisterConsumerListener(listener);
52 auto producer1 = surf->GetProducer();
53 producerSurface1 = Surface::CreateSurfaceAsProducer(producer1);
54 auto producer2 = surf->GetProducer();
55 producerSurface2 = Surface::CreateSurfaceAsProducer(producer2);
56 }
57
OnBufferAvailable()58 void BufferSharedTest::OnBufferAvailable() {}
59
TearDownTestCase()60 void BufferSharedTest::TearDownTestCase()
61 {
62 }
63
64 /*
65 * Function: RequestBuffer
66 * Type: Reliability
67 * Rank: Important(2)
68 * EnvConditions: N/A
69 * CaseDescription: 1. call RequestBuffer with buffer=buffer1, buffer2,the param is same
70 * 2. check ret1 and ret2 are OHOS::GSERROR_OK, check buffer1 and buffer2 is not nullptr
71 * 3. check the addr of buffer1 EQ buffer2
72 * */
73
74 HWTEST_F(BufferSharedTest, RequestBuffer001, Function | MediumTest | Level2)
75 {
76 PART("REQUEST BUFFER TWO TIMES") {
77 GSError ret1, ret2;
78 STEP("1: request buffer") {
79 BufferRequestConfig requestConfig = {
80 .width = 0x100,
81 .height = 0x100,
82 .strideAlignment = 0x8,
83 .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
84 .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
85 .timeout = 0,
86 };
87 int releaseFence = -1;
88 ret1 = producerSurface1->RequestBuffer(buffer1, releaseFence, requestConfig);
89 ret2 = producerSurface2->RequestBuffer(buffer2, releaseFence, requestConfig);
90 }
91 STEP("2: check ret1 ret2 buffer1 buffer2") {
92 STEP_ASSERT_EQ(ret1, OHOS::GSERROR_OK);
93 STEP_ASSERT_NE(buffer1, nullptr);
94 STEP_ASSERT_EQ(ret2, OHOS::GSERROR_OK);
95 STEP_ASSERT_NE(buffer2, nullptr);
96 }
97 STEP("3: check buffer addr") {
98 STEP_ASSERT_EQ(buffer2, buffer1);
99 }
100 }
101 }
102 /*
103 * Function: RequestBuffer with different requestconfig
104 * Type: Reliability
105 * Rank: Important(2)
106 * EnvConditions: N/A
107 * CaseDescription: 1. call RequestBuffer with buffer=bufferDiff,
108 * the requestconfig is not same with buffer1
109 * 2. check ret1 is GSERROR_INVALID_ARGUMENTS
110 * */
111
112 HWTEST_F(BufferSharedTest, RequestBufferDiff001, Function | MediumTest | Level2)
113 {
114 PART("REQUEST BUFFER with different requestconfig") {
115 GSError ret1;
116 sptr<SurfaceBuffer> bufferDiff = nullptr;
117 STEP("1: request buffer") {
118 BufferRequestConfig diffRequestConfig = {
119 .width = 0x200,
120 .height = 0x100,
121 .strideAlignment = 0x8,
122 .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
123 .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
124 .timeout = 0,
125 };
126 int releaseFence = -1;
127 ret1 = producerSurface1->RequestBuffer(bufferDiff, releaseFence, diffRequestConfig);
128 }
129 STEP("2: check ret1") {
130 STEP_ASSERT_EQ(ret1, SURFACE_ERROR_UNKOWN);
131 }
132 }
133 }
134 /*
135 * Function: FlushBuffer
136 * Type: Reliability
137 * Rank: Important(2)
138 * EnvConditions: N/A
139 * CaseDescription: 1. call FlushBuffer with buffer=buffer1, buffer2
140 * 2. check ret1 and ret2 is OHOS::GSERROR_OK
141 * */
142 HWTEST_F(BufferSharedTest, FlushBuffer001, Function | MediumTest | Level2)
143 {
144 PART("FlushBuffer") {
145 GSError ret1, ret2;
146 STEP("1: FlushBuffer two times") {
147 BufferFlushConfig flushConfig = { .damage = { .w = 0x100, .h = 0x100, }, };
148 ret1 = producerSurface1->FlushBuffer(buffer1, -1, flushConfig);
149 ret2 = producerSurface2->FlushBuffer(buffer2, -1, flushConfig);
150 }
151 STEP("2: check ret1 ret2") {
152 STEP_ASSERT_EQ(ret1, OHOS::GSERROR_OK);
153 STEP_ASSERT_EQ(ret2, OHOS::GSERROR_OK);
154 }
155 }
156 }
157 /*
158 * Function: AquiredBuffer
159 * Type: Reliability
160 * Rank: Important(2)
161 * EnvConditions: N/A
162 * CaseDescription: 1. call AcquireBuffer with buffer=sbuffer1, sbuffer2
163 * 2. check ret1 and ret2 are GSERROR_INVALID_ARGUMENTS
164 * */
165 HWTEST_F(BufferSharedTest, AquiredBuffer001, Function | MediumTest | Level2)
166 {
167 PART("AquiredBuffer") {
168 GSError ret1, ret2;
169 STEP("1: AcquireBuffer two times") {
170 int64_t timestamp = 0;
171 Rect damage = {};
172 int32_t fence = -1;
173
174 ret1 = surf->AcquireBuffer(sbuffer1, fence, timestamp, damage);
175 ret2 = surf->AcquireBuffer(sbuffer2, fence, timestamp, damage);
176 }
177 STEP("2: check ret1 ret2") {
178 STEP_ASSERT_EQ(ret1, OHOS::GSERROR_OK);
179 STEP_ASSERT_EQ(ret2, OHOS::GSERROR_OK);
180 }
181 STEP("3: check addr sbuffer1 and sbuffer2") {
182 STEP_ASSERT_EQ(sbuffer1, sbuffer2);
183 }
184 }
185 }
186 /*
187 * Function: CancelBuffer
188 * Type: Reliability
189 * Rank: Important(2)
190 * EnvConditions: N/A
191 * CaseDescription: 1. call cancelBuffer with buffer=buffer1
192 * 2. check ret1 is GSERROR_INVALID_OPERATING
193 * 3. call cancelBuffer with buffer=buffer2
194 * 4. check ret2 is GSERROR_INVALID_OPERATING
195 * */
196 HWTEST_F(BufferSharedTest, CancelBuffer001, Function | MediumTest | Level2)
197 {
198 PART("CancelBuffer") {
199 GSError ret1, ret2;
200 STEP("1: Cancel buffer1") {
201 ret1 = producerSurface1->CancelBuffer(buffer1);
202 }
203 STEP("2: check ret1") {
204 STEP_ASSERT_EQ(ret1, GSERROR_INVALID_OPERATING);
205 }
206 STEP("3: Cancel buffer2") {
207 ret2 = producerSurface2->CancelBuffer(buffer2);
208 }
209 STEP("4: check ret2") {
210 STEP_ASSERT_EQ(ret2, GSERROR_INVALID_OPERATING);
211 }
212 }
213 }
214 /*
215 * Function: RelaseBuffer
216 * Type: Reliability
217 * Rank: Important(2)
218 * EnvConditions: N/A
219 * CaseDescription: 1. releaseBuffer two times
220 * 2. check ret1 is GSERROR_INVALID_OPERATING, check ret1 is OHOS::GSERROR_OK
221 * */
222 HWTEST_F(BufferSharedTest, ReleaseBuffer001, Function | MediumTest | Level2)
223 {
224 PART("ReleaseBuffer") {
225 GSError ret1, ret2;
226 STEP("1: releaseBuffer two times") {
227 ret1 = surf->ReleaseBuffer(sbuffer1, -1);
228 ret2 = surf->ReleaseBuffer(sbuffer2, -1);
229 }
230 STEP("2: check ret1, ret2") {
231 STEP_ASSERT_EQ(ret1, OHOS::GSERROR_OK);
232 STEP_ASSERT_EQ(ret2, OHOS::GSERROR_OK);
233 }
234 }
235 }
236 }
237