• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 #include <fcntl.h>
16 #include <sys/mman.h>
17 #include <securec.h>
18 #include <gtest/gtest.h>
19 #include <surface.h>
20 #include <consumer_surface.h>
21 #include <sys/time.h>
22 #include <producer_surface.h>
23 #include "buffer_consumer_listener.h"
24 #include <native_window.h>
25 #include "sync_fence.h"
26 #include "producer_surface_delegator.h"
27 #include "metadata_helper.h"
28 #include "surface_buffer_impl.h"
29 
30 using namespace testing;
31 using namespace testing::ext;
32 using namespace OHOS::HDI::Display::Graphic::Common::V1_0;
33 
34 namespace OHOS::Rosen {
35 class ProducerSurfaceTest : public testing::Test {
36 public:
37     static void SetUpTestCase();
38     static void TearDownTestCase();
39     void SetUp() override;
40     void TearDown() override;
41 
42     static inline BufferRequestConfig requestConfig = {
43         .width = 0x100,
44         .height = 0x100,
45         .strideAlignment = 0x8,
46         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
47         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
48         .timeout = 0,
49     };
50     static inline BufferFlushConfig flushConfig = {
51         .damage = {
52             .w = 0x100,
53             .h = 0x100,
54         },
55     };
56     static inline int64_t timestamp = 0;
57     static inline Rect damage = {};
58     static inline sptr<IConsumerSurface> csurf = nullptr;
59     static inline sptr<IBufferProducer> producer = nullptr;
60     static inline sptr<Surface> pSurface = nullptr;
61     static inline sptr<ProducerSurfaceDelegator> surfaceDelegator = nullptr;
62     static inline uint32_t firstSeqnum = 0;
63 
OnBufferRelease(sptr<SurfaceBuffer> & buffer)64     static inline GSError OnBufferRelease(sptr<SurfaceBuffer> &buffer)
65     {
66         return GSERROR_OK;
67     }
OnBufferReleaseWithFence(const sptr<SurfaceBuffer> & buffer,const sptr<SyncFence> & fence)68     static inline GSError OnBufferReleaseWithFence(const sptr<SurfaceBuffer> &buffer, const sptr<SyncFence> &fence)
69     {
70         return GSERROR_OK;
71     }
72     sptr<ProducerSurface> surface_ = nullptr;
73     sptr<ProducerSurface> surfaceMd_ = nullptr;
74 };
75 
SetUpTestCase()76 void ProducerSurfaceTest::SetUpTestCase()
77 {
78     csurf = IConsumerSurface::Create();
79     sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
80     csurf->RegisterConsumerListener(listener);
81     producer = csurf->GetProducer();
82     pSurface = Surface::CreateSurfaceAsProducer(producer);
83     pSurface->RegisterReleaseListener(OnBufferRelease);
84 }
85 
TearDownTestCase()86 void ProducerSurfaceTest::TearDownTestCase()
87 {
88     pSurface->UnRegisterReleaseListener();
89     csurf = nullptr;
90     producer = nullptr;
91     pSurface = nullptr;
92 }
93 
SetUp()94 void ProducerSurfaceTest::SetUp()
95 {
96     surface_ = new ProducerSurface(producer);
97     ASSERT_NE(surface_, nullptr);
98     surface_->producer_ = nullptr;
99 
100     surfaceMd_ = new ProducerSurface(producer);
101     ASSERT_NE(surfaceMd_, nullptr);
102     surfaceMd_->producer_ = nullptr;
103 }
104 
TearDown()105 void ProducerSurfaceTest::TearDown()
106 {
107     surface_ = nullptr;
108 }
109 
110 /*
111 * Function: ProducerSurface
112 * Type: Function
113 * Rank: Important(2)
114 * EnvConditions: N/A
115 * CaseDescription: 1. check pSurface
116  */
117 HWTEST_F(ProducerSurfaceTest, ProducerSurface001, TestSize.Level0)
118 {
119     ASSERT_NE(pSurface, nullptr);
120 }
121 
122 /*
123 * Function: GetProducerInitInfo
124 * Type: Function
125 * Rank: Important(2)
126 * EnvConditions: N/A
127 * CaseDescription: 1. check pSurface
128  */
129 HWTEST_F(ProducerSurfaceTest, GetProducerInitInfo001, TestSize.Level0)
130 {
131     ProducerInitInfo info;
132     GSError ret = surface_->GetProducerInitInfo(info);
133     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
134 }
135 
136 /*
137 * Function: RequestBuffer
138 * Type: Function
139 * Rank: Important(2)
140 * EnvConditions: N/A
141 * CaseDescription: 1. call RequestBuffer with producer_ is nullptr
142 *                  2. check ret
143  */
144 HWTEST_F(ProducerSurfaceTest, RequestBuffer001, TestSize.Level0)
145 {
146     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
147     int releaseFence = -1;
148     GSError ret = surface_->RequestBuffer(buffer, releaseFence, requestConfig);
149     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
150 }
151 
152 /*
153 * Function: RequestBuffer
154 * Type: Function
155 * Rank: Important(2)
156 * EnvConditions: N/A
157 * CaseDescription: 1. call RequestBuffer with nullptr params
158 *                  2. check ret
159  */
160 HWTEST_F(ProducerSurfaceTest, RequestBuffer002, TestSize.Level0)
161 {
162     sptr<SurfaceBuffer> buffer = nullptr;
163     int releaseFence = -1;
164     GSError ret = surface_->RequestBuffer(buffer, releaseFence, requestConfig);
165     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
166 }
167 
168 /*
169 * Function: RequestBuffer
170 * Type: Function
171 * Rank: Important(2)
172 * EnvConditions: N/A
173 * CaseDescription: 1. call RequestBuffer with nullptr params
174 *                  2. check ret
175  */
176 HWTEST_F(ProducerSurfaceTest, RequestBuffer003, TestSize.Level0)
177 {
178     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
179     sptr<SyncFence> releaseFence = nullptr;
180     GSError ret = surface_->RequestBuffer(buffer, releaseFence, requestConfig);
181     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
182 }
183 
184 /*
185 * Function: RequestBuffer
186 * Type: Function
187 * Rank: Important(2)
188 * EnvConditions: N/A
189 * CaseDescription: 1. call RequestBuffer with nullptr params
190 *                  2. check ret
191  */
192 HWTEST_F(ProducerSurfaceTest, RequestBuffer004, TestSize.Level0)
193 {
194     sptr<SurfaceBuffer> buffer = nullptr;
195     sptr<SyncFence> releaseFence = nullptr;
196     GSError ret = surface_->RequestBuffer(buffer, releaseFence, requestConfig);
197     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
198 }
199 
200 /*
201 * Function: RequestBuffers
202 * Type: Function
203 * Rank: Important(2)
204 * EnvConditions: N/A
205 * CaseDescription: 1. call RequestBuffers with producer_ is nullptr
206 *                  2. check ret
207  */
208 HWTEST_F(ProducerSurfaceTest, RequestBuffers001, TestSize.Level0)
209 {
210     std::vector<sptr<SurfaceBuffer>> sfbuffers;
211     std::vector<sptr<SyncFence>> releaseFences;
212     GSError ret = surface_->RequestBuffers(sfbuffers, releaseFences, requestConfig);
213     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
214 }
215 
216 /*
217 * Function: FlushBuffer
218 * Type: Function
219 * Rank: Important(2)
220 * EnvConditions: N/A
221 * CaseDescription: 1. call FlushBuffer with producer_ is nullptr
222 *                  2. check ret
223  */
224 HWTEST_F(ProducerSurfaceTest, FlushBuffer001, TestSize.Level0)
225 {
226     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
227     GSError ret = surface_->FlushBuffer(buffer, SyncFence::INVALID_FENCE, flushConfig);
228     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
229 }
230 
231 /*
232 * Function: FlushBuffer
233 * Type: Function
234 * Rank: Important(2)
235 * EnvConditions: N/A
236 * CaseDescription: 1. call FlushBuffer with nullptr params
237 *                  2. check ret
238  */
239 HWTEST_F(ProducerSurfaceTest, FlushBuffer002, TestSize.Level0)
240 {
241     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
242     GSError ret = surface_->FlushBuffer(buffer, nullptr, flushConfig);
243     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
244 }
245 
246 /*
247 * Function: FlushBuffer
248 * Type: Function
249 * Rank: Important(2)
250 * EnvConditions: N/A
251 * CaseDescription: 1. call FlushBuffer with nullptr params
252 *                  2. check ret
253  */
254 HWTEST_F(ProducerSurfaceTest, FlushBuffer003, TestSize.Level0)
255 {
256     sptr<SurfaceBuffer> buffer = nullptr;
257     GSError ret = surface_->FlushBuffer(buffer, SyncFence::INVALID_FENCE, flushConfig);
258     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
259 }
260 
261 /*
262 * Function: FlushBuffers
263 * Type: Function
264 * Rank: Important(2)
265 * EnvConditions: N/A
266 * CaseDescription: 1. call FlushBuffers with producer_ is nullptr
267 *                  2. check ret
268  */
269 HWTEST_F(ProducerSurfaceTest, FlushBuffers001, TestSize.Level0)
270 {
271     std::vector<sptr<SurfaceBuffer>> buffers;
272     buffers.push_back(SurfaceBuffer::Create());
273     std::vector<sptr<SyncFence>> flushFences;
274     std::vector<BufferFlushConfigWithDamages> configs;
275     GSError ret = surface_->FlushBuffers(buffers, flushFences, configs);
276     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
277 }
278 
279 /*
280 * Function: GetLastFlushedBuffer
281 * Type: Function
282 * Rank: Important(2)
283 * EnvConditions: N/A
284 * CaseDescription: 1. call GetLastFlushedBuffer with producer_ is nullptr
285 *                  2. check ret
286  */
287 HWTEST_F(ProducerSurfaceTest, GetLastFlushedBuffer001, TestSize.Level0)
288 {
289     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
290     sptr<SyncFence> fence;
291     float matrix[16];
292     GSError ret = surface_->GetLastFlushedBuffer(buffer, fence, matrix, false);
293     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
294 }
295 
296 /*
297 * Function: CancelBuffer
298 * Type: Function
299 * Rank: Important(2)
300 * EnvConditions: N/A
301 * CaseDescription: 1. call CancelBuffer with producer_ is nullptr
302 *                  2. check ret
303  */
304 HWTEST_F(ProducerSurfaceTest, CancelBuffer001, TestSize.Level0)
305 {
306     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
307     GSError ret = surface_->CancelBuffer(buffer);
308     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_UNKOWN);
309 }
310 
311 /*
312 * Function: AttachBufferToQueue
313 * Type: Function
314 * Rank: Important(2)
315 * EnvConditions: N/A
316 * CaseDescription: 1. call AttachBufferToQueue with producer_ is nullptr
317 *                  2. check ret
318  */
319 HWTEST_F(ProducerSurfaceTest, AttachBufferToQueue001, TestSize.Level0)
320 {
321     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
322     GSError ret = surface_->AttachBufferToQueue(buffer);
323     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_UNKOWN);
324 }
325 
326 /*
327 * Function: DetachBufferFromQueue
328 * Type: Function
329 * Rank: Important(2)
330 * EnvConditions: N/A
331 * CaseDescription: 1. call DetachBufferFromQueue with producer_ is nullptr
332 *                  2. check ret
333  */
334 HWTEST_F(ProducerSurfaceTest, DetachBufferFromQueue001, TestSize.Level0)
335 {
336     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
337     GSError ret = surface_->DetachBufferFromQueue(buffer);
338     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_UNKOWN);
339 }
340 
341 /*
342 * Function: DetachBuffer
343 * Type: Function
344 * Rank: Important(2)
345 * EnvConditions: N/A
346 * CaseDescription: 1. call DetachBuffer with producer_ is nullptr
347 *                  2. check ret
348  */
349 HWTEST_F(ProducerSurfaceTest, DetachBuffer001, TestSize.Level0)
350 {
351     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
352     GSError ret = surface_->DetachBuffer(buffer);
353     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
354 }
355 
356 /*
357 * Function: SetQueueSize and GetQueueSize
358 * Type: Function
359 * Rank: Important(2)
360 * EnvConditions: N/A
361 * CaseDescription: 1. call GetQueueSize and get default value
362 *                  2. call SetQueueSize
363 *                  3. call SetQueueSize again with abnormal value
364 *                  4. call GetQueueSize
365 *                  5. check ret
366  */
367 HWTEST_F(ProducerSurfaceTest, QueueSize001, TestSize.Level0)
368 {
369     ASSERT_EQ(pSurface->GetQueueSize(), (uint32_t)SURFACE_DEFAULT_QUEUE_SIZE);
370     GSError ret = pSurface->SetQueueSize(2);
371     ASSERT_EQ(ret, OHOS::GSERROR_OK);
372 
373     ret = pSurface->SetQueueSize(SURFACE_MAX_QUEUE_SIZE + 1);
374     ASSERT_NE(ret, OHOS::GSERROR_OK);
375 
376     ASSERT_EQ(pSurface->GetQueueSize(), 2u);
377 }
378 
379 /*
380 * Function: SetQueueSize and GetQueueSize
381 * Type: Function
382 * Rank: Important(2)
383 * EnvConditions: N/A
384 * CaseDescription: 1. call GetQueueSize with producer_ is nullptr and check ret
385 *                  2. call SetQueueSize with producer_ is nullptr and check ret
386  */
387 HWTEST_F(ProducerSurfaceTest, QueueSize002, TestSize.Level0)
388 {
389     uint32_t queueSize = surface_->GetQueueSize();
390     ASSERT_EQ(queueSize, 0);
391     GSError ret = surface_->SetQueueSize(queueSize);
392     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
393 }
394 
395 /*
396 * Function: GetDefaultWidth, GetDefaultHeight and SetDefaultWidthAndHeight
397 * Type: Function
398 * Rank: Important(2)
399 * EnvConditions: N/A
400 * CaseDescription: 1. call SetDefaultWidthAndHeight with producer_ is nullptr and check ret
401 *                  2. call GetDefaultWidth with producer_ is nullptr and check ret
402 *                  3. call GetDefaultHeight with producer_ is nullptr and check ret
403  */
404 HWTEST_F(ProducerSurfaceTest, DefaultWidthAndHeight001, TestSize.Level0)
405 {
406     GSError ret = surface_->SetDefaultWidthAndHeight(0, 0);
407     ASSERT_EQ(ret, OHOS::GSERROR_NOT_SUPPORT);
408     int32_t width = surface_->GetDefaultWidth();
409     ASSERT_EQ(width, -1);  // -1 is default width
410     int32_t height = surface_->GetDefaultHeight();
411     ASSERT_EQ(height, -1);  // -1 is default height
412 }
413 
414 /*
415 * Function: SetTransformHint and GetTransformHint
416 * Type: Function
417 * Rank: Important(2)
418 * EnvConditions: N/A
419 * CaseDescription: 1. call SetTransformHint with producer_ is nullptr and check ret
420 *                  2. call GetTransformHint with producer_ is nullptr and check ret
421  */
422 HWTEST_F(ProducerSurfaceTest, TransformHint001, TestSize.Level0)
423 {
424     GSError ret = surface_->SetTransformHint(GraphicTransformType::GRAPHIC_ROTATE_NONE);
425     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
426     GraphicTransformType type = surface_->GetTransformHint();
427     ASSERT_EQ(type, GraphicTransformType::GRAPHIC_ROTATE_NONE);
428 }
429 
430 /*
431 * Function: SetDefaultUsage and GetDefaultUsage
432 * Type: Function
433 * Rank: Important(2)
434 * EnvConditions: N/A
435 * CaseDescription: 1. call SetDefaultUsage with producer_ is nullptr and check ret
436 *                  2. call GetDefaultUsage with producer_ is nullptr and check ret
437  */
438 HWTEST_F(ProducerSurfaceTest, DefaultUsage001, TestSize.Level0)
439 {
440     GSError ret = surface_->SetDefaultUsage(0);
441     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
442     uint64_t usage = surface_->GetDefaultUsage();
443     ASSERT_EQ(usage, 0);
444 }
445 
446 /*
447 * Function: RequestBuffer and FlushBuffer
448 * Type: Function
449 * Rank: Important(2)
450 * EnvConditions: N/A
451 * CaseDescription: 1. call RequestBuffer
452 *                  2. call FlushBuffer
453 *                  3. check ret
454  */
455 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel001, TestSize.Level0)
456 {
457     sptr<SurfaceBuffer> buffer;
458 
459     int releaseFence = -1;
460     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
461     ASSERT_EQ(ret, OHOS::GSERROR_OK);
462     ASSERT_NE(buffer, nullptr);
463     firstSeqnum = buffer->GetSeqNum();
464 
465     ret = pSurface->FlushBuffer(buffer, -1, flushConfig);
466     ASSERT_EQ(ret, OHOS::GSERROR_OK);
467 }
468 
469 /*
470 * Function: RequestBuffer and FlushBuffer
471 * Type: Function
472 * Rank: Important(2)
473 * EnvConditions: N/A
474 * CaseDescription: 1. call RequestBuffer
475 *                  2. call FlushBuffer 2 times
476 *                  3. check ret
477  */
478 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel002, TestSize.Level0)
479 {
480     sptr<SurfaceBuffer> buffer;
481     int releaseFence = -1;
482 
483     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
484     ASSERT_EQ(ret, OHOS::GSERROR_OK);
485     ASSERT_NE(buffer, nullptr);
486 
487     ret = pSurface->FlushBuffer(buffer, -1, flushConfig);
488     ASSERT_EQ(ret, OHOS::GSERROR_OK);
489 
490     ret = pSurface->FlushBuffer(buffer, -1, flushConfig);
491     ASSERT_NE(ret, OHOS::GSERROR_OK);
492 }
493 
494 /*
495 * Function: AcquireBuffer and ReleaseBuffer
496 * Type: Function
497 * Rank: Important(2)
498 * EnvConditions: N/A
499 * CaseDescription: 1. call AcquireBuffer and ReleaseBuffer many times
500 *                  2. check ret
501  */
502 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel003, TestSize.Level0)
503 {
504     sptr<SurfaceBuffer> buffer;
505     int32_t flushFence;
506 
507     GSError ret = csurf->AcquireBuffer(buffer, flushFence, timestamp, damage);
508     ASSERT_EQ(ret, OHOS::GSERROR_OK);
509 
510     ret = csurf->ReleaseBuffer(buffer, -1);
511     ASSERT_EQ(ret, OHOS::GSERROR_OK);
512 
513     ret = csurf->AcquireBuffer(buffer, flushFence, timestamp, damage);
514     ASSERT_EQ(ret, OHOS::GSERROR_OK);
515 
516     ret = csurf->ReleaseBuffer(buffer, -1);
517     ASSERT_EQ(ret, OHOS::GSERROR_OK);
518 }
519 
520 /*
521 * Function: RequestBuffer and CancelBuffer
522 * Type: Function
523 * Rank: Important(2)
524 * EnvConditions: N/A
525 * CaseDescription: 1. call RequestBuffer
526 *                  2. call CancelBuffer
527 *                  3. check ret
528  */
529 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel004, TestSize.Level0)
530 {
531     sptr<SurfaceBuffer> buffer;
532 
533     int releaseFence = -1;
534     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
535     ASSERT_EQ(ret, OHOS::GSERROR_OK);
536 
537     ret = pSurface->CancelBuffer(buffer);
538     ASSERT_EQ(ret, OHOS::GSERROR_OK);
539 }
540 
541 /*
542 * Function: RequestBuffer and CancelBuffer
543 * Type: Function
544 * Rank: Important(2)
545 * EnvConditions: N/A
546 * CaseDescription: 1. call RequestBuffer
547 *                  2. call CancelBuffer 2 times
548 *                  3. check ret
549  */
550 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel005, TestSize.Level0)
551 {
552     sptr<SurfaceBuffer> buffer;
553 
554     int releaseFence = -1;
555     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
556     ASSERT_EQ(ret, OHOS::GSERROR_OK);
557 
558     ret = pSurface->CancelBuffer(buffer);
559     ASSERT_EQ(ret, OHOS::GSERROR_OK);
560 
561     ret = pSurface->CancelBuffer(buffer);
562     ASSERT_NE(ret, OHOS::GSERROR_OK);
563 }
564 
565 /*
566 * Function: RequestBuffer and CancelBuffer
567 * Type: Function
568 * Rank: Important(2)
569 * EnvConditions: N/A
570 * CaseDescription: 1. call RequestBuffer and CancelBuffer many times
571 *                  2. check ret
572  */
573 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel006, TestSize.Level0)
574 {
575     sptr<SurfaceBuffer> buffer;
576     sptr<SurfaceBuffer> buffer1;
577     sptr<SurfaceBuffer> buffer2;
578     int releaseFence = -1;
579 
580     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
581     ASSERT_EQ(ret, OHOS::GSERROR_OK);
582 
583     ret = pSurface->RequestBuffer(buffer1, releaseFence, requestConfig);
584     ASSERT_EQ(ret, OHOS::GSERROR_OK);
585 
586     ret = pSurface->RequestBuffer(buffer2, releaseFence, requestConfig);
587     ASSERT_NE(ret, OHOS::GSERROR_OK);
588 
589     ret = pSurface->CancelBuffer(buffer);
590     ASSERT_EQ(ret, OHOS::GSERROR_OK);
591 
592     ret = pSurface->CancelBuffer(buffer1);
593     ASSERT_EQ(ret, OHOS::GSERROR_OK);
594 
595     ret = pSurface->CancelBuffer(buffer2);
596     ASSERT_NE(ret, OHOS::GSERROR_OK);
597 }
598 
599 /*
600 * Function: GetQueueSize and SetQueueSize
601 * Type: Function
602 * Rank: Important(2)
603 * EnvConditions: N/A
604 * CaseDescription: 1. call GetQeueSize
605 *                  2. call SetQueueSize 2 times
606 *                  3. check ret
607  */
608 HWTEST_F(ProducerSurfaceTest, SetQueueSizeDeleting001, TestSize.Level0)
609 {
610     sptr<ConsumerSurface> cs = static_cast<ConsumerSurface*>(csurf.GetRefPtr());
611     sptr<BufferQueueProducer> bqp = static_cast<BufferQueueProducer*>(cs->GetProducer().GetRefPtr());
612     ASSERT_EQ(bqp->GetQueueSize(), 2u);
613 
614     GSError ret = pSurface->SetQueueSize(1);
615     ASSERT_EQ(ret, OHOS::GSERROR_OK);
616 
617     ret = pSurface->SetQueueSize(2);
618     ASSERT_EQ(ret, OHOS::GSERROR_OK);
619 }
620 
621 /*
622 * Function: SetRequestBufferNoblockMode
623 * Type: Function
624 * Rank: Important(2)
625 * EnvConditions: N/A
626 * CaseDescription: 1. call SetRequestBufferNoblockMode
627 *                  2. check ret
628  */
629 HWTEST_F(ProducerSurfaceTest, SetRequestBufferNoblockMode, TestSize.Level0)
630 {
631     sptr<ProducerSurface> producerSurface = nullptr;
632     producerSurface = new ProducerSurface(producer);
633     ASSERT_NE(producerSurface, nullptr);
634     ASSERT_EQ(producerSurface->SetRequestBufferNoblockMode(true), OHOS::GSERROR_OK);
635 }
636 
637 /*
638 * Function: RequestBuffer, ReleaseBuffer and CancelBuffer
639 * Type: Function
640 * Rank: Important(2)
641 * EnvConditions: N/A
642 * CaseDescription: 1. call RequestBuffer
643 *                  2. call ReleaseBuffer
644 *                  3. call CancelBuffer
645 *                  4. check ret
646  */
647 HWTEST_F(ProducerSurfaceTest, ReqCanFluAcqRel007, TestSize.Level0)
648 {
649     sptr<SurfaceBuffer> buffer;
650 
651     int releaseFence = -1;
652     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
653     ASSERT_EQ(ret, OHOS::GSERROR_OK);
654 
655     ret = pSurface->CancelBuffer(buffer);
656     ASSERT_EQ(ret, OHOS::GSERROR_OK);
657 }
658 
659 /*
660 * Function: SetUserData and GetUserData
661 * Type: Function
662 * Rank: Important(2)
663 * EnvConditions: N/A
664 * CaseDescription: 1. call SetUserData and GetUserData many times
665 *                  2. check ret
666  */
667 HWTEST_F(ProducerSurfaceTest, UserData001, TestSize.Level0)
668 {
669     GSError ret;
670 
671     std::string strs[SURFACE_MAX_USER_DATA_COUNT];
672     constexpr int32_t stringLengthMax = 32;
673     char str[stringLengthMax] = {};
674     for (int i = 0; i < SURFACE_MAX_USER_DATA_COUNT; i++) {
675         auto secRet = snprintf_s(str, sizeof(str), sizeof(str) - 1, "%d", i);
676         ASSERT_GT(secRet, 0);
677 
678         strs[i] = str;
679         ret = pSurface->SetUserData(strs[i], "magic");
680         ASSERT_EQ(ret, OHOS::GSERROR_OK);
681     }
682 
683     ret = pSurface->SetUserData("-1", "error");
684     ASSERT_NE(ret, OHOS::GSERROR_OK);
685 
686     std::string retStr;
687     for (int i = 0; i < SURFACE_MAX_USER_DATA_COUNT; i++) {
688         retStr = pSurface->GetUserData(strs[i]);
689         ASSERT_EQ(retStr, "magic");
690     }
691 }
692 
693 /*
694 * Function: UserDataChangeListen
695 * Type: Function
696 * Rank: Important(2)
697 * EnvConditions: N/A
698 * CaseDescription: 1. RegisterUserDataChangeListen
699 *                  2. SetUserData
700 *                  3. check ret
701  */
702 HWTEST_F(ProducerSurfaceTest, UserDataChangeListen001, TestSize.Level0)
703 {
704     sptr<IConsumerSurface> csurfTestUserData = IConsumerSurface::Create();
705     sptr<IBufferConsumerListener> listenerTestUserData = new BufferConsumerListener();
706     csurfTestUserData->RegisterConsumerListener(listenerTestUserData);
707     sptr<IBufferProducer> producerTestUserData = csurf->GetProducer();
708     sptr<Surface> pSurfaceTestUserData = Surface::CreateSurfaceAsProducer(producerTestUserData);
709 
710     GSError ret1 = OHOS::GSERROR_INVALID_ARGUMENTS;
711     GSError ret2 = OHOS::GSERROR_INVALID_ARGUMENTS;
__anonca276fe50102(const std::string& key, const std::string& value) 712     auto func1 = [&ret1](const std::string& key, const std::string& value) {
713         ret1 = OHOS::GSERROR_OK;
714     };
__anonca276fe50202(const std::string& key, const std::string& value) 715     auto func2 = [&ret2](const std::string& key, const std::string& value) {
716         ret2 = OHOS::GSERROR_OK;
717     };
718     pSurfaceTestUserData->RegisterUserDataChangeListener("func1", func1);
719     pSurfaceTestUserData->RegisterUserDataChangeListener("func2", func2);
720     pSurfaceTestUserData->RegisterUserDataChangeListener("func3", nullptr);
721     ASSERT_EQ(pSurfaceTestUserData->RegisterUserDataChangeListener("func2", func2), OHOS::GSERROR_INVALID_ARGUMENTS);
722 
723     if (pSurfaceTestUserData->SetUserData("Regist", "OK") == OHOS::GSERROR_OK) {
724         ASSERT_EQ(ret1, OHOS::GSERROR_OK);
725         ASSERT_EQ(ret2, OHOS::GSERROR_OK);
726     }
727 
728     ret1 = OHOS::GSERROR_INVALID_ARGUMENTS;
729     ret2 = OHOS::GSERROR_INVALID_ARGUMENTS;
730     pSurfaceTestUserData->UnRegisterUserDataChangeListener("func1");
731     ASSERT_EQ(pSurfaceTestUserData->UnRegisterUserDataChangeListener("func1"), OHOS::GSERROR_INVALID_ARGUMENTS);
732 
733     if (pSurfaceTestUserData->SetUserData("UnRegist", "INVALID") == OHOS::GSERROR_OK) {
734         ASSERT_EQ(ret1, OHOS::GSERROR_INVALID_ARGUMENTS);
735         ASSERT_EQ(ret2, OHOS::GSERROR_OK);
736     }
737 
738     ret1 = OHOS::GSERROR_INVALID_ARGUMENTS;
739     ret2 = OHOS::GSERROR_INVALID_ARGUMENTS;
740     pSurfaceTestUserData->ClearUserDataChangeListener();
741     pSurfaceTestUserData->RegisterUserDataChangeListener("func1", func1);
742     if (pSurfaceTestUserData->SetUserData("Clear", "OK") == OHOS::GSERROR_OK) {
743         ASSERT_EQ(ret1, OHOS::GSERROR_OK);
744         ASSERT_EQ(ret2, OHOS::GSERROR_INVALID_ARGUMENTS);
745     }
746 }
747 
748 /*
749 * Function: UserDataChangeListen
750 * Type: Function
751 * Rank: Important(2)
752 * EnvConditions: N/A
753 * CaseDescription: 1. RegisterUserDataChangeListen
754 *                  2. SetUserData
755 *                  3. check ret
756  */
757 HWTEST_F(ProducerSurfaceTest, UserDataChangeListen002, TestSize.Level0)
758 {
759     sptr<IConsumerSurface> csurfTestUserData = IConsumerSurface::Create();
760     sptr<IBufferConsumerListener> listenerTestUserData = new BufferConsumerListener();
761     csurfTestUserData->RegisterConsumerListener(listenerTestUserData);
762     sptr<IBufferProducer> producerTestUserData = csurf->GetProducer();
763     sptr<Surface> pSurfaceTestUserData = Surface::CreateSurfaceAsProducer(producerTestUserData);
764 
__anonca276fe50302(const std::string& FuncName) 765     auto func = [&pSurfaceTestUserData](const std::string& FuncName) {
766         constexpr int32_t registerListenerNum = 1000;
767         std::vector<GSError> ret(registerListenerNum, OHOS::GSERROR_INVALID_ARGUMENTS);
768         std::string strs[registerListenerNum];
769         constexpr int32_t stringLengthMax = 32;
770         char str[stringLengthMax] = {};
771         for (int i = 0; i < registerListenerNum; i++) {
772             auto secRet = snprintf_s(str, sizeof(str), sizeof(str) - 1, "%s%d", FuncName.c_str(), i);
773             ASSERT_GT(secRet, 0);
774             strs[i] = str;
775             ASSERT_EQ(pSurfaceTestUserData->RegisterUserDataChangeListener(strs[i], [i, &ret]
776             (const std::string& key, const std::string& value) {
777                 ret[i] = OHOS::GSERROR_OK;
778             }), OHOS::GSERROR_OK);
779         }
780 
781         if (pSurfaceTestUserData->SetUserData("Regist", FuncName) == OHOS::GSERROR_OK) {
782             for (int i = 0; i < registerListenerNum; i++) {
783                 ASSERT_EQ(ret[i], OHOS::GSERROR_OK);
784             }
785         }
786 
787         for (int i = 0; i < registerListenerNum; i++) {
788             pSurfaceTestUserData->UnRegisterUserDataChangeListener(strs[i]);
789         }
790     };
791 
792     std::thread t1(func, "thread1");
793     std::thread t2(func, "thread2");
794     t1.join();
795     t2.join();
796 }
797 
798 /*
799 * Function: GetUniqueId
800 * Type: Function
801 * Rank: Important(2)
802 * EnvConditions: N/A
803 * CaseDescription: 1. call GetUniqueId
804 *                  2. check ret
805  */
806 HWTEST_F(ProducerSurfaceTest, UniqueId001, TestSize.Level0)
807 {
808     uint64_t uniqueId = pSurface->GetUniqueId();
809     ASSERT_NE(uniqueId, 0);
810 }
811 
812 /*
813 * Function: SetTransform and GetTransform
814 * Type: Function
815 * Rank: Important(2)
816 * EnvConditions: N/A
817 * CaseDescription: 1. call GetTransform with default and check ret
818  */
819 HWTEST_F(ProducerSurfaceTest, transform001, TestSize.Level0)
820 {
821     GSError ret = pSurface->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_NONE);
822     ASSERT_EQ(ret, OHOS::GSERROR_OK);
823 }
824 
825 /*
826 * Function: SetTransform and GetTransform
827 * Type: Function
828 * Rank: Important(1)
829 * EnvConditions: N/A
830 * CaseDescription: 1. call SetTransform with other parameters and check ret
831  */
832 HWTEST_F(ProducerSurfaceTest, transform002, TestSize.Level0)
833 {
834     GSError ret = pSurface->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_90);
835     ASSERT_EQ(ret, OHOS::GSERROR_OK);
836 }
837 
838 /*
839 * Function: SetTransform and GetTransform
840 * Type: Function
841 * Rank: Important(1)
842 * EnvConditions: N/A
843 * CaseDescription: 1. call SetTransform with other parameters and check ret
844  */
845 HWTEST_F(ProducerSurfaceTest, transform003, TestSize.Level0)
846 {
847     GSError ret = pSurface->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_180);
848     ASSERT_EQ(ret, OHOS::GSERROR_OK);
849 }
850 
851 /*
852 * Function: SetTransform and GetTransform
853 * Type: Function
854 * Rank: Important(1)
855 * EnvConditions: N/A
856 * CaseDescription: 1. call SetTransform with other parameters and check ret
857  */
858 HWTEST_F(ProducerSurfaceTest, transform004, TestSize.Level0)
859 {
860     GSError ret = pSurface->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_270);
861     ASSERT_EQ(ret, OHOS::GSERROR_OK);
862 }
863 
864 /*
865 * Function: SetTransform and GetTransform
866 * Type: Function
867 * Rank: Important(1)
868 * EnvConditions: N/A
869 * CaseDescription: 1. call SetTransform with producer_ is nullptr and check ret
870 *                  2. call GetTransform with producer_ is nullptr and check ret
871  */
872 HWTEST_F(ProducerSurfaceTest, transform005, TestSize.Level0)
873 {
874     GSError ret = surface_->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_270);
875     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
876     GraphicTransformType type = surface_->GetTransform();
877     ASSERT_EQ(type, GraphicTransformType::GRAPHIC_ROTATE_BUTT);
878 }
879 
880 /*
881 * Function: SetScalingMode and GetScalingMode
882 * Type: Function
883 * Rank: Important(2)
884 * EnvConditions: N/A
885 * CaseDescription: 1. preSetUp: create produce
886 *                  2. operation: produce SetScalingMode with invaild sequece number
887 *                  3. result: SetScalingMode failed and return GSERROR_NO_ENTRY
888  */
889 HWTEST_F(ProducerSurfaceTest, scalingMode001, TestSize.Level0)
890 {
891     ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
892     GSError ret = pSurface->SetScalingMode(-1, scalingMode);
893     ASSERT_EQ(ret, OHOS::GSERROR_NO_ENTRY);
894 }
895 
896 /*
897 * Function: SetScalingMode and GetScalingMode
898 * Type: Function
899 * Rank: Important(1)
900 * EnvConditions: N/A
901 * CaseDescription: 1. call SetScalingMode with normal parameters and check ret
902 *                  2. call GetScalingMode and check ret
903  */
904 HWTEST_F(ProducerSurfaceTest, scalingMode002, TestSize.Level0)
905 {
906     ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
907     sptr<SurfaceBuffer> buffer;
908     int releaseFence = -1;
909     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
910     ASSERT_EQ(ret, OHOS::GSERROR_OK);
911     ASSERT_NE(buffer, nullptr);
912 
913     uint32_t sequence = buffer->GetSeqNum();
914     ret = pSurface->SetScalingMode(sequence, scalingMode);
915     ASSERT_EQ(ret, OHOS::GSERROR_OK);
916 
917     ret = pSurface->CancelBuffer(buffer);
918     ASSERT_EQ(ret, OHOS::GSERROR_OK);
919 }
920 
921 /*
922 * Function: SetScalingMode003
923 * Type: Function
924 * Rank: Important(2)
925 * EnvConditions: N/A
926 * CaseDescription: 1. call SetScalingMode with abnormal parameters and check ret
927  */
928 HWTEST_F(ProducerSurfaceTest, scalingMode003, TestSize.Level0)
929 {
930     ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
931     GSError ret = pSurface->SetScalingMode(scalingMode);
932     ASSERT_EQ(ret, OHOS::GSERROR_OK);
933 }
934 
935 /*
936 * Function: SetScalingMode and GetScalingMode
937 * Type: Function
938 * Rank: Important(2)
939 * EnvConditions: N/A
940 * CaseDescription: 1. call SetScalingMode with producer_ is nullptr and check ret
941 *                  2. call GetScalingMode and check ret
942  */
943 HWTEST_F(ProducerSurfaceTest, scalingMode004, TestSize.Level0)
944 {
945     ScalingMode scalingMode = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
946     GSError ret = surface_->SetScalingMode(scalingMode);
947     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
948     ret = surface_->SetScalingMode(0, scalingMode);
949     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
950     ret = surface_->GetScalingMode(0, scalingMode);
951     ASSERT_EQ(ret, OHOS::GSERROR_NOT_SUPPORT);
952 }
953 
954 /*
955 * Function: SetMetaData and GetMetaData
956 * Type: Function
957 * Rank: Important(2)
958 * EnvConditions: N/A
959 * CaseDescription: 1. call SetMetaData with abnormal parameters and check ret
960  */
961 HWTEST_F(ProducerSurfaceTest, metaData001, TestSize.Level0)
962 {
963     std::vector<GraphicHDRMetaData> metaData;
964     GSError ret = pSurface->SetMetaData(firstSeqnum, metaData);
965     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
966 }
967 
968 /*
969 * Function: SetMetaData and GetMetaData
970 * Type: Function
971 * Rank: Important(2)
972 * EnvConditions: N/A
973 * CaseDescription: 1. call SetMetaData with abnormal parameters and check ret
974  */
975 HWTEST_F(ProducerSurfaceTest, metaData002, TestSize.Level0)
976 {
977     std::vector<GraphicHDRMetaData> metaData;
978     GraphicHDRMetaData data = {
979         .key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X,
980         .value = 100,  // for test
981     };
982     metaData.push_back(data);
983     GSError ret = pSurface->SetMetaData(-1, metaData);
984     ASSERT_EQ(ret, OHOS::GSERROR_NO_ENTRY);
985 }
986 
987 /*
988 * Function: SetMetaData and GetMetaData
989 * Type: Function
990 * Rank: Important(1)
991 * EnvConditions: N/A
992 * CaseDescription: 1. call SetMetaData with normal parameters and check ret
993 *                  2. call GetMetaData and check ret
994  */
995 HWTEST_F(ProducerSurfaceTest, metaData003, TestSize.Level0)
996 {
997     std::vector<GraphicHDRMetaData> metaData;
998     GraphicHDRMetaData data = {
999         .key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X,
1000         .value = 100,  // for test
1001     };
1002     metaData.push_back(data);
1003     sptr<SurfaceBuffer> buffer;
1004     int releaseFence = -1;
1005     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
1006     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1007     ASSERT_NE(buffer, nullptr);
1008 
1009     uint32_t sequence = buffer->GetSeqNum();
1010     ret = pSurface->SetMetaData(sequence, metaData);
1011     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1012 
1013     ret = pSurface->CancelBuffer(buffer);
1014     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1015 }
1016 
1017 /*
1018 * Function: SetMetaData and GetMetaData
1019 * Type: Function
1020 * Rank: Important(2)
1021 * EnvConditions: N/A
1022 * CaseDescription: 1. call SetMetaData with producer_ is nullptr and check ret
1023 *                  2. call GetMetaData and check ret
1024  */
1025 HWTEST_F(ProducerSurfaceTest, metaData004, TestSize.Level0)
1026 {
1027     std::vector<GraphicHDRMetaData> metaData;
1028     GSError ret = surface_->SetMetaData(0, metaData);
1029     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1030     GraphicHDRMetaData data = {
1031         .key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X,
1032         .value = 100,  // 100 metaData value for test
1033     };
1034     metaData.push_back(data);
1035     ret = surface_->SetMetaData(0, metaData);
1036     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1037     ret = surface_->GetMetaData(0, metaData);
1038     ASSERT_EQ(ret, OHOS::GSERROR_NOT_SUPPORT);
1039 }
1040 
1041 /*
1042 * Function: SetMetadataValue
1043 * Type: Function
1044 * Rank: Important(2)
1045 * EnvConditions:
1046 * CaseDescription: 1. call SetUserData then SetMetadataValue and check ret
1047 *                  2. call get functions and compare
1048  */
1049 HWTEST_F(ProducerSurfaceTest, SetMetadataValue001, TestSize.Level0)
1050 {
1051     GSError ret;
1052     sptr<SurfaceBuffer> buffer_;
1053     int releaseFence = -1;
1054     ret = pSurface->RequestBuffer(buffer_, releaseFence, requestConfig);
1055 
1056     std::string valueInfo = "mockInfo";
1057     std::string valueDynamic = "mockDynamic";
1058     std::string valueStatic = "mockStatic";
1059     std::string valueType = "mockType";
1060 
1061     surfaceMd_->SetUserData("ATTRKEY_COLORSPACE_INFO", valueInfo);
1062     surfaceMd_->SetUserData("OH_HDR_DYNAMIC_METADATA", valueDynamic);
1063     surfaceMd_->SetUserData("OH_HDR_STATIC_METADATA", valueStatic);
1064     surfaceMd_->SetUserData("OH_HDR_METADATA_TYPE", valueType);
1065 
1066     ret = surfaceMd_->SetMetadataValue(buffer_);
1067     if (ret == OHOS::GSERROR_OK) {
1068         CM_ColorSpaceType colorSpaceType;
1069         MetadataHelper::GetColorSpaceType(buffer_, colorSpaceType);
1070         EXPECT_EQ(static_cast<CM_ColorSpaceType>(atoi(valueInfo.c_str())), colorSpaceType);
1071 
1072         std::vector<uint8_t> setDynamicMetadata, getDynamicMetadata;
1073         setDynamicMetadata.resize(valueDynamic.size());
1074         setDynamicMetadata.assign(valueDynamic.begin(), valueDynamic.end());
1075         MetadataHelper::GetHDRDynamicMetadata(buffer_, getDynamicMetadata);
1076         EXPECT_EQ(setDynamicMetadata, getDynamicMetadata);
1077 
1078         std::vector<uint8_t> setStaticMetadata, getStaticMetadata;
1079         setStaticMetadata.resize(valueStatic.size());
1080         setStaticMetadata.assign(valueStatic.begin(), valueStatic.end());
1081         MetadataHelper::GetHDRStaticMetadata(buffer_, getStaticMetadata);
1082         EXPECT_EQ(setStaticMetadata, getStaticMetadata);
1083 
1084         CM_HDR_Metadata_Type hdrMetadataType;
1085         MetadataHelper::GetHDRMetadataType(buffer_, hdrMetadataType);
1086         EXPECT_EQ(static_cast<CM_HDR_Metadata_Type>(atoi(valueType.c_str())), hdrMetadataType);
1087     } else {
1088         EXPECT_EQ(ret, OHOS::GSERROR_HDI_ERROR);
1089     }
1090 }
1091 
1092 /*
1093 * Function: SetMetaDataSet and GetMetaDataSet
1094 * Type: Function
1095 * Rank: Important(2)
1096 * EnvConditions: N/A
1097 * CaseDescription: 1. call SetMetaDataSet with abnormal parameters and check ret
1098  */
1099 HWTEST_F(ProducerSurfaceTest, metaDataSet001, TestSize.Level0)
1100 {
1101     GraphicHDRMetadataKey key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR10_PLUS;
1102     std::vector<uint8_t> metaData;
1103 
1104     GSError ret = pSurface->SetMetaDataSet(firstSeqnum, key, metaData);
1105     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1106 }
1107 
1108 /*
1109 * Function: SetMetaDataSet and GetMetaDataSet
1110 * Type: Function
1111 * Rank: Important(2)
1112 * EnvConditions: N/A
1113 * CaseDescription: 1. call SetMetaDataSet with abnormal parameters and check ret
1114  */
1115 HWTEST_F(ProducerSurfaceTest, metaDataSet002, TestSize.Level0)
1116 {
1117     GraphicHDRMetadataKey key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR10_PLUS;
1118     std::vector<uint8_t> metaData;
1119 
1120     uint8_t data = 10;  // for test
1121     metaData.push_back(data);
1122     GSError ret = pSurface->SetMetaDataSet(-1, key, metaData);
1123     ASSERT_EQ(ret, OHOS::GSERROR_NO_ENTRY);
1124 }
1125 
1126 /*
1127 * Function: SetMetaDataSet and GetMetaDataSet
1128 * Type: Function
1129 * Rank: Important(1)
1130 * EnvConditions: N/A
1131 * CaseDescription: 1. call SetMetaDataSet with normal parameters and check ret
1132 *                  2. call GetMetaDataSet and check ret
1133  */
1134 HWTEST_F(ProducerSurfaceTest, metaDataSet003, TestSize.Level0)
1135 {
1136     GraphicHDRMetadataKey key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR10_PLUS;
1137     std::vector<uint8_t> metaData;
1138     uint8_t data = 10;  // for test
1139     metaData.push_back(data);
1140 
1141     sptr<SurfaceBuffer> buffer;
1142     int releaseFence = -1;
1143     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
1144     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1145     ASSERT_NE(buffer, nullptr);
1146 
1147     uint32_t sequence = buffer->GetSeqNum();
1148     ret = pSurface->SetMetaDataSet(sequence, key, metaData);
1149     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1150 
1151     ret = pSurface->CancelBuffer(buffer);
1152     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1153 }
1154 
1155 /*
1156 * Function: SetMetaDataSet and GetMetaDataSet
1157 * Type: Function
1158 * Rank: Important(2)
1159 * EnvConditions: N/A
1160 * CaseDescription: 1. call SetMetaDataSet with producer_ is nullptr and check ret
1161 *                  2. call GetMetaDataSet and check ret
1162  */
1163 HWTEST_F(ProducerSurfaceTest, metaDataSet004, TestSize.Level0)
1164 {
1165     GraphicHDRMetadataKey key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_HDR10_PLUS;
1166     std::vector<uint8_t> metaData;
1167 
1168     uint8_t data = 10;  // metaData value for test
1169     metaData.push_back(data);
1170     GSError ret = surface_->SetMetaDataSet(0, key, metaData);
1171     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1172     ret = surface_->GetMetaDataSet(0, key, metaData);
1173     ASSERT_EQ(ret, OHOS::GSERROR_NOT_SUPPORT);
1174 }
1175 
1176 /*
1177 * Function: SetTunnelHandle and GetTunnelHandle
1178 * Type: Function
1179 * Rank: Important(2)
1180 * EnvConditions: N/A
1181 * CaseDescription: 1. call SetTunnelhandle with producer_ is nullptr and check ret
1182  */
1183 HWTEST_F(ProducerSurfaceTest, tunnelHandle001, TestSize.Level0)
1184 {
1185     GraphicExtDataHandle *handle = nullptr;
1186     handle = static_cast<GraphicExtDataHandle *>(malloc(sizeof(GraphicExtDataHandle) + sizeof(int32_t) * 1));
1187     ASSERT_NE(handle, nullptr);
1188     handle->fd = -1;
1189     handle->reserveInts = 1;
1190     handle->reserve[0] = 0;
1191     GSError ret = surface_->SetTunnelHandle(handle);
1192     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1193 
1194     sptr<SurfaceTunnelHandle> handleGet = surface_->GetTunnelHandle();
1195     ASSERT_EQ(handleGet, nullptr);
1196     free(handle);
1197 }
1198 
1199 /*
1200 * Function: SetTunnelHandle and GetTunnelHandle
1201 * Type: Function
1202 * Rank: Important(2)
1203 * EnvConditions: N/A
1204 * CaseDescription: 1. call SetTunnelhandle with normal parameters and check ret
1205  */
1206 HWTEST_F(ProducerSurfaceTest, tunnelHandle002, TestSize.Level0)
1207 {
1208     GraphicExtDataHandle *handle = nullptr;
1209     handle = static_cast<GraphicExtDataHandle *>(malloc(sizeof(GraphicExtDataHandle) + sizeof(int32_t) * 1));
1210     ASSERT_NE(handle, nullptr);
1211     handle->fd = -1;
1212     handle->reserveInts = 1;
1213     handle->reserve[0] = 0;
1214     GSError ret = pSurface->SetTunnelHandle(handle);
1215     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1216 
1217     ret = pSurface->SetTunnelHandle(handle);
1218     ASSERT_EQ(ret, OHOS::GSERROR_NO_ENTRY);
1219     free(handle);
1220 }
1221 
1222 /*
1223 * Function: connect
1224 * Type: Function
1225 * Rank: Important(1)
1226 * EnvConditions: N/A
1227 * CaseDescription: 1. call connect and check ret
1228  */
1229 HWTEST_F(ProducerSurfaceTest, connect001, TestSize.Level0)
1230 {
1231     GSError ret = pSurface->Connect();
1232     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_CONSUMER_IS_CONNECTED);
1233 }
1234 
1235 /*
1236 * Function: disconnect
1237 * Type: Function
1238 * Rank: Important(1)
1239 * EnvConditions: N/A
1240 * CaseDescription: 1. call Disconnect and check ret
1241  */
1242 HWTEST_F(ProducerSurfaceTest, disconnect001, TestSize.Level0)
1243 {
1244     GSError ret = pSurface->Disconnect();
1245     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1246 }
1247 
1248 /*
1249 * Function: connect
1250 * Type: Function
1251 * Rank: Important(1)
1252 * EnvConditions: N/A
1253 * CaseDescription: 1. call connect and check ret
1254  */
1255 HWTEST_F(ProducerSurfaceTest, connect002, TestSize.Level0)
1256 {
1257     GSError ret = pSurface->Connect();
1258     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1259 }
1260 
1261 /*
1262 * Function: disconnect
1263 * Type: Function
1264 * Rank: Important(1)
1265 * EnvConditions: N/A
1266 * CaseDescription: 1. call Disconnect and check ret
1267  */
1268 HWTEST_F(ProducerSurfaceTest, disconnect002, TestSize.Level0)
1269 {
1270     GSError ret = pSurface->Disconnect();
1271     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1272 }
1273 
1274 /*
1275 * Function: connect
1276 * Type: Function
1277 * Rank: Important(1)
1278 * EnvConditions: N/A
1279 * CaseDescription: 1. call connect with producer_ is nullptr and check ret
1280  */
1281 HWTEST_F(ProducerSurfaceTest, connect003, TestSize.Level0)
1282 {
1283     GSError ret = surface_->Connect();
1284     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1285 }
1286 
1287 /*
1288 * Function: disconnect
1289 * Type: Function
1290 * Rank: Important(1)
1291 * EnvConditions: N/A
1292 * CaseDescription: 1. call Disconnect with producer_ is nullptr and check ret
1293  */
1294 HWTEST_F(ProducerSurfaceTest, disconnect003, TestSize.Level0)
1295 {
1296     GSError ret = surface_->Disconnect();
1297     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1298 }
1299 
1300 /*
1301 * Function: SetPresentTimestamp and GetPresentTimestamp
1302 * Type: Function
1303 * Rank: Important(2)
1304 * EnvConditions: N/A
1305 * CaseDescription: 1. call GetPresentTimestamp with producer_ is nullptr and check ret
1306 *                  2. call SetPresentTimestamp and check ret
1307  */
1308 HWTEST_F(ProducerSurfaceTest, presentTimestamp001, TestSize.Level0)
1309 {
1310     GraphicPresentTimestampType type = GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED;
1311     int64_t time = 0;
1312 
1313     GSError ret = surface_->GetPresentTimestamp(firstSeqnum, type, time);
1314     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1315     GraphicPresentTimestamp timestamp;
1316     ret = surface_->SetPresentTimestamp(firstSeqnum, timestamp);
1317     ASSERT_EQ(ret, OHOS::GSERROR_NOT_SUPPORT);
1318 }
1319 
1320 /*
1321 * Function: SetPresentTimestamp and GetPresentTimestamp
1322 * Type: Function
1323 * Rank: Important(2)
1324 * EnvConditions: N/A
1325 * CaseDescription: 1. call GetPresentTimestamp with normal parameters and check ret
1326 * @tc.require: issueI5I57K
1327  */
1328 HWTEST_F(ProducerSurfaceTest, presentTimestamp002, TestSize.Level0)
1329 {
1330     GraphicPresentTimestampType type = GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_UNSUPPORTED;
1331     int64_t time = 0;
1332 
1333     GSError ret = pSurface->GetPresentTimestamp(firstSeqnum, type, time);
1334     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1335 }
1336 
1337 /*
1338 * Function: SetPresentTimestamp and GetPresentTimestamp
1339 * Type: Function
1340 * Rank: Important(2)
1341 * EnvConditions: N/A
1342 * CaseDescription: 1. call SetPresentTimestamp with normal parameters and check ret
1343 * @tc.require: issueI5I57K
1344  */
1345 HWTEST_F(ProducerSurfaceTest, presentTimestamp003, TestSize.Level0)
1346 {
1347     GraphicPresentTimestampType type = GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_DELAY;
1348     int64_t time = 0;
1349     GSError ret = pSurface->GetPresentTimestamp(-1, type, time);
1350     ASSERT_EQ(ret, OHOS::GSERROR_NO_ENTRY);
1351 }
1352 
1353 /*
1354 * Function: SetPresentTimestamp and GetPresentTimestamp
1355 * Type: Function
1356 * Rank: Important(1)
1357 * EnvConditions: N/A
1358 * CaseDescription: 1. call SetPresentTimestamp and check ret
1359 * @tc.require: issueI5I57K
1360  */
1361 HWTEST_F(ProducerSurfaceTest, presentTimestamp004, TestSize.Level0)
1362 {
1363     sptr<SurfaceBuffer> buffer;
1364     int releaseFence = -1;
1365     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
1366     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1367     ASSERT_NE(buffer, nullptr);
1368 
1369     uint32_t sequence = buffer->GetSeqNum();
1370     GraphicPresentTimestampType type = GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_DELAY;
1371     int64_t time = 0;
1372     ret = pSurface->GetPresentTimestamp(sequence, type, time);
1373     ASSERT_EQ(ret, OHOS::GSERROR_NO_ENTRY);
1374 
1375     ret = pSurface->CancelBuffer(buffer);
1376     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1377 }
1378 
1379 /*
1380 * Function: SetWptrNativeWindowToPSurface
1381 * Type: Function
1382 * Rank: Important(1)
1383 * EnvConditions: N/A
1384 * CaseDescription: 1. SetWptrNativeWindowToPSurface and check ret
1385 * @tc.require: issueI7WYIY
1386  */
1387 HWTEST_F(ProducerSurfaceTest, SetWptrNativeWindowToPSurface001, TestSize.Level0)
1388 {
1389     struct NativeWindow nativeWindow;
1390     GSError ret = pSurface->SetWptrNativeWindowToPSurface(&nativeWindow);
1391     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1392 }
1393 
1394 /*
1395  * Function: SetWptrNativeWindowToPSurface
1396  * Type: Function
1397  * Rank: Important(1)
1398  * EnvConditions: N/A
1399  * CaseDescription: 1. SetWptrNativeWindowToPSurface with nullptr param and check ret
1400  * @tc.require: issueIANSVH
1401  */
1402 HWTEST_F(ProducerSurfaceTest, SetWptrNativeWindowToPSurface002, TestSize.Level0)
1403 {
1404     GSError ret = surface_->SetWptrNativeWindowToPSurface(nullptr);
1405     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1406 }
1407 
1408 /*
1409  * Function: SetWindowConfig and GetWindowConfig
1410  * Type: Function
1411  * Rank: Important(1)
1412  * EnvConditions: N/A
1413  * CaseDescription: 1. Call SetWindowConfig
1414  *                  2. Call GetWindowConfig and check ret
1415  * @tc.require: issueIANSVH
1416  */
1417 HWTEST_F(ProducerSurfaceTest, WindowConfig001, TestSize.Level0)
1418 {
1419     surface_->SetWindowConfig(requestConfig);
1420     auto configGet = surface_->GetWindowConfig();
1421     ASSERT_EQ(requestConfig, configGet);
1422 }
1423 
1424 /*
1425  * Function: SetWindowConfigOpt
1426  * Type: Function
1427  * Rank: Important(1)
1428  * EnvConditions: N/A
1429  * CaseDescription: 1. Call SetWindowConfig with params
1430  *                  2. Call GetWindowConfig and check ret
1431  * @tc.require: issueIANSVH
1432  */
1433 HWTEST_F(ProducerSurfaceTest, WindowConfig002, TestSize.Level0)
1434 {
1435     surface_->SetWindowConfigWidthAndHeight(requestConfig.width, requestConfig.height);
1436     surface_->SetWindowConfigStride(requestConfig.strideAlignment);
1437     surface_->SetWindowConfigFormat(requestConfig.format);
1438     surface_->SetWindowConfigUsage(requestConfig.usage);
1439     surface_->SetWindowConfigTimeout(requestConfig.timeout);
1440     surface_->SetWindowConfigColorGamut(requestConfig.colorGamut);
1441     surface_->SetWindowConfigTransform(requestConfig.transform);
1442     auto configGet = surface_->GetWindowConfig();
1443     ASSERT_EQ(requestConfig.width, configGet.width);
1444     ASSERT_EQ(requestConfig.height, configGet.height);
1445     ASSERT_EQ(requestConfig.strideAlignment, configGet.strideAlignment);
1446     ASSERT_EQ(requestConfig.format, configGet.format);
1447     ASSERT_EQ(requestConfig.usage, configGet.usage);
1448     ASSERT_EQ(requestConfig.timeout, configGet.timeout);
1449     ASSERT_EQ(requestConfig.colorGamut, configGet.colorGamut);
1450     ASSERT_EQ(requestConfig.transform, configGet.transform);
1451 }
1452 
1453 /*
1454 * Function: AttachBuffer
1455 * Type: Function
1456 * Rank: Important(1)
1457 * EnvConditions: N/A
1458 * CaseDescription: 1. AttachBuffer and check ret
1459 * @tc.require: issueI7WYIY
1460  */
1461 HWTEST_F(ProducerSurfaceTest, AttachBuffer001, TestSize.Level0)
1462 {
1463     GSError ret = pSurface->CleanCache();
1464     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1465     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
1466     ASSERT_NE(buffer, nullptr);
1467     sptr<SyncFence> fence = SyncFence::INVALID_FENCE;
1468     int32_t timeOut = 5;
1469     ret = pSurface->AttachBuffer(buffer, timeOut);
1470     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1471 }
1472 
1473 /*
1474 * Function: AttachBuffer
1475 * Type: Function
1476 * Rank: Important(2)
1477 * EnvConditions: N/A
1478 * CaseDescription: 1. call AttachBuffer with producer_ is nullptr
1479 *                  2. check ret
1480  */
1481 HWTEST_F(ProducerSurfaceTest, AttachBuffer002, TestSize.Level0)
1482 {
1483     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
1484     GSError ret = surface_->AttachBuffer(buffer);
1485     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1486     ret = surface_->AttachBuffer(buffer, 0);
1487     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1488 }
1489 
1490 /*
1491 * Function: RegisterSurfaceDelegator000
1492 * Type: Function
1493 * Rank: Important(1)
1494 * EnvConditions: N/A
1495 * CaseDescription: 1. RegisterSurfaceDelegator and check ret
1496 * @tc.require: issueI7WYIY
1497  */
1498 HWTEST_F(ProducerSurfaceTest, RegisterSurfaceDelegator001, TestSize.Level0)
1499 {
1500     GSError ret = pSurface->CleanCache();
1501     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1502     ret = pSurface->RegisterSurfaceDelegator(nullptr);
1503     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1504 }
1505 
1506 /*
1507 * Function: CleanCache001
1508 * Type: Function
1509 * Rank: Important(1)
1510 * EnvConditions: N/A
1511 * CaseDescription: 1. CleanCache and check ret
1512  */
1513 HWTEST_F(ProducerSurfaceTest, CleanCache001, TestSize.Level0)
1514 {
1515     GSError ret = pSurface->CleanCache(true);
1516     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1517 }
1518 
1519 /*
1520 * Function: CleanCache
1521 * Type: Function
1522 * Rank: Important(1)
1523 * EnvConditions: N/A
1524 * CaseDescription: 1. CleanCache with producer_ is nullptr and check ret
1525  */
1526 HWTEST_F(ProducerSurfaceTest, CleanCache002, TestSize.Level0)
1527 {
1528     GSError ret = surface_->CleanCache(true);
1529     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1530 }
1531 
1532 /*
1533 * Function: GoBackground
1534 * Type: Function
1535 * Rank: Important(1)
1536 * EnvConditions: N/A
1537 * CaseDescription: 1. GoBackground with producer_ is nullptr and check ret
1538  */
1539 HWTEST_F(ProducerSurfaceTest, GoBackground001, TestSize.Level0)
1540 {
1541     GSError ret = surface_->GoBackground();
1542     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1543 }
1544 
1545 /*
1546 * Function: SetSurfaceSourceType and GetSurfaceSourceType
1547 * Type: Function
1548 * Rank: Important(2)
1549 * EnvConditions: N/A
1550 * CaseDescription: 1. call SetSurfaceSourceType and check ret
1551 *                  2. call GetSurfaceSourceType and check ret
1552  */
1553 HWTEST_F(ProducerSurfaceTest, SurfaceSourceType001, TestSize.Level0)
1554 {
1555     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_VIDEO;
1556     GSError ret = pSurface->SetSurfaceSourceType(sourceType);
1557     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1558     ASSERT_EQ(pSurface->GetSurfaceSourceType(), OH_SURFACE_SOURCE_VIDEO);
1559 }
1560 
1561 /*
1562 * Function: SetSurfaceSourceType and GetSurfaceSourceType
1563 * Type: Function
1564 * Rank: Important(2)
1565 * EnvConditions: N/A
1566 * CaseDescription: 1. call SetSurfaceSourceType with producer_ is nullptr and check ret
1567 *                  2. call GetSurfaceSourceType with producer_ is nullptr and check ret
1568 */
1569 HWTEST_F(ProducerSurfaceTest, SurfaceSourceType002, TestSize.Level0)
1570 {
1571     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_VIDEO;
1572     GSError ret = surface_->SetSurfaceSourceType(sourceType);
1573     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1574     ASSERT_EQ(surface_->GetSurfaceSourceType(), OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT);
1575 }
1576 
1577 /*
1578 * Function: SetSurfaceAppFrameworkType and GetSurfaceAppFrameworkType
1579 * Type: Function
1580 * Rank: Important(2)
1581 * EnvConditions: N/A
1582 * CaseDescription: 1. call SetSurfaceAppFrameworkType and check ret
1583 *                  2. call GetSurfaceAppFrameworkType and check ret
1584 */
1585 HWTEST_F(ProducerSurfaceTest, SurfaceAppFrameworkType001, TestSize.Level0)
1586 {
1587     std::string type = "test";
1588     GSError ret = pSurface->SetSurfaceAppFrameworkType(type);
1589     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1590     ASSERT_EQ(pSurface->GetSurfaceAppFrameworkType(), "test");
1591 }
1592 
1593 /*
1594 * Function: SetSurfaceAppFrameworkType and GetSurfaceAppFrameworkType
1595 * Type: Function
1596 * Rank: Important(2)
1597 * EnvConditions: N/A
1598 * CaseDescription: 1. call SetSurfaceAppFrameworkType with producer_ is nullptr and check ret
1599 *                  2. call GetSurfaceAppFrameworkType with producer_ is nullptr and check ret
1600 */
1601 HWTEST_F(ProducerSurfaceTest, SurfaceAppFrameworkType002, TestSize.Level0)
1602 {
1603     std::string type = "test";
1604     GSError ret = surface_->SetSurfaceAppFrameworkType(type);
1605     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1606     ASSERT_EQ(surface_->GetSurfaceAppFrameworkType(), "");
1607 }
1608 
1609 /*
1610 * Function: RegisterReleaseListener and UnRegisterReleaseListener
1611 * Type: Function
1612 * Rank: Important(2)
1613 * EnvConditions: N/A
1614 * CaseDescription: 1. call RegisterReleaseListener with producer_ is nullptr and check ret
1615 *                  2. call UnRegisterReleaseListener with producer_ is nullptr and check ret
1616 */
1617 HWTEST_F(ProducerSurfaceTest, ReleaseListener001, TestSize.Level0)
1618 {
1619     GSError ret = surface_->RegisterReleaseListener(OnBufferRelease);
1620     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1621     OnReleaseFuncWithFence releaseFuncWithFence;
1622     ret = surface_->RegisterReleaseListener(releaseFuncWithFence);
1623     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1624     ret = surface_->UnRegisterReleaseListener();
1625     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1626 }
1627 
1628 /*
1629 * Function: RegisterReleaseListenerBackup and UnRegisterReleaseListenerBackup
1630 * Type: Function
1631 * Rank: Important(2)
1632 * EnvConditions: N/A
1633 * CaseDescription: 1. call RegisterReleaseListenerBackup with producer_ is nullptr and check ret
1634 *                  2. call UnRegisterReleaseListenerBackup with producer_ is nullptr and check ret
1635 */
1636 HWTEST_F(ProducerSurfaceTest, ReleaseListenerBackup001, TestSize.Level0)
1637 {
1638     OnReleaseFuncWithFence releaseFuncWithFence;
1639     GSError ret = surface_->RegisterReleaseListenerBackup(releaseFuncWithFence);
1640     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1641     ret = surface_->UnRegisterReleaseListenerBackup();
1642     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1643 }
1644 
1645 /*
1646 * Function: RegisterUserDataChangeListener
1647 * Type: Function
1648 * Rank: Important(2)
1649 * EnvConditions: N/A
1650 * CaseDescription: 1. call RegisterUserDataChangeListener with nullptr param
1651 *                  2. check ret
1652 */
1653 HWTEST_F(ProducerSurfaceTest, RegisterUserDataChangeListener001, TestSize.Level0)
1654 {
1655     GSError ret = surface_->RegisterUserDataChangeListener("test", nullptr);
1656     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1657 }
1658 
1659 /*
1660 * Function: RequestBuffersAndFlushBuffers
1661 * Type: Function
1662 * Rank: Important(1)
1663 * EnvConditions: N/A
1664 * CaseDescription: 1. call RequestBuffers and FlushBuffers
1665 * @tc.require: issueI5GMZN issueI5IWHW
1666  */
1667 HWTEST_F(ProducerSurfaceTest, RequestBuffersAndFlushBuffers, TestSize.Level0)
1668 {
1669     pSurface->SetQueueSize(12);
1670     std::vector<sptr<SurfaceBuffer>> sfbuffers;
1671     std::vector<sptr<SyncFence>> releaseFences;
1672     EXPECT_EQ(OHOS::GSERROR_OK, pSurface->RequestBuffers(sfbuffers, releaseFences, requestConfig));
1673     for (size_t i = 0; i < sfbuffers.size(); ++i) {
1674         EXPECT_NE(nullptr, sfbuffers[i]);
1675     }
1676     std::cout << sfbuffers.size() << std::endl;
1677     uint32_t num = static_cast<uint32_t>(sfbuffers.size());
1678     std::vector<sptr<SyncFence>> flushFences;
1679     std::vector<BufferFlushConfigWithDamages> configs;
1680     flushFences.resize(num);
1681     configs.reserve(num);
__anonca276fe50502(BufferFlushConfigWithDamages &config) 1682     auto handleConfig = [](BufferFlushConfigWithDamages &config) -> void {
1683         config.damages.reserve(1);
1684         OHOS::Rect damage = {
1685             .x = 0,
1686             .y = 0,
1687             .w = 0x100,
1688             .h = 0x100
1689         };
1690         config.damages.emplace_back(damage);
1691         config.timestamp = 0;
1692     };
1693     for (uint32_t i = 0; i < num; ++i) {
1694         flushFences[i] = new SyncFence(-1);
1695         BufferFlushConfigWithDamages config;
1696         handleConfig(config);
1697         configs.emplace_back(config);
1698     }
1699     flushFences[0] = nullptr;
1700     EXPECT_EQ(OHOS::GSERROR_INVALID_ARGUMENTS, pSurface->FlushBuffers(sfbuffers, flushFences, configs));
1701     flushFences[0] = new SyncFence(-1);
1702     EXPECT_EQ(OHOS::GSERROR_OK, pSurface->FlushBuffers(sfbuffers, flushFences, configs));
1703     sptr<SurfaceBuffer> buffer;
1704     int32_t flushFence;
1705     for (uint32_t i = 0; i < num; ++i) {
1706         GSError ret = csurf->AcquireBuffer(buffer, flushFence, timestamp, damage);
1707         ASSERT_EQ(ret, OHOS::GSERROR_OK);
1708         ret = csurf->ReleaseBuffer(buffer, -1);
1709         ASSERT_EQ(ret, OHOS::GSERROR_OK);
1710     }
1711     EXPECT_EQ(OHOS::GSERROR_NO_BUFFER, csurf->AcquireBuffer(buffer, flushFence, timestamp, damage));
1712     pSurface->SetQueueSize(2);
1713 }
1714 
1715 /*
1716 * Function: AcquireLastFlushedBuffer and ReleaseLastFlushedBuffer
1717 * Type: Function
1718 * Rank: Important(1)
1719 * EnvConditions: N/A
1720 * CaseDescription: 1. call AcquireLastFlushedBuffer OK
1721 *                  2. call AcquireLastFlushedBuffer FAIL
1722 *                  3. call ReleaseLastFlushedBuffer
1723  */
1724 HWTEST_F(ProducerSurfaceTest, AcquireLastFlushedBuffer001, TestSize.Level0)
1725 {
1726     sptr<SurfaceBuffer> buffer;
1727     int releaseFence = -1;
1728     EXPECT_EQ(producer->SetQueueSize(3), OHOS::GSERROR_OK);
1729     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
1730     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1731 
1732     ret = pSurface->FlushBuffer(buffer, -1, flushConfig);
1733     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1734 
1735     int32_t flushFence;
1736     ret = csurf->AcquireBuffer(buffer, flushFence, timestamp, damage);
1737     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1738     ret = csurf->ReleaseBuffer(buffer, -1);
1739     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1740 
1741     sptr<SurfaceBuffer> buffer1 = nullptr;
1742     sptr<SyncFence> fence = nullptr;
1743     float matrix[16];
1744 
1745     ret = pSurface->AcquireLastFlushedBuffer(buffer1, fence, matrix, 16, false);
1746     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1747     EXPECT_EQ(buffer->GetSeqNum(), buffer1->GetSeqNum());
1748 
1749     ret = pSurface->AcquireLastFlushedBuffer(buffer1, fence, matrix, 16, false);
1750     EXPECT_EQ(ret, OHOS::SURFACE_ERROR_BUFFER_STATE_INVALID);
1751 
1752     sptr<SurfaceBuffer> buffer2;
1753     ret = pSurface->RequestBuffer(buffer2, releaseFence, requestConfig);
1754     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1755 
1756     sptr<SurfaceBuffer> buffer3;
1757     ret = pSurface->RequestBuffer(buffer3, releaseFence, requestConfig);
1758     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1759 
1760     sptr<SurfaceBuffer> buffer4;
1761     ret = pSurface->RequestBuffer(buffer4, releaseFence, requestConfig);
1762     EXPECT_EQ(ret, OHOS::GSERROR_NO_BUFFER);
1763 
1764     ret = pSurface->ReleaseLastFlushedBuffer(buffer1);
1765     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1766 
1767     ret = pSurface->RequestBuffer(buffer4, releaseFence, requestConfig);
1768     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1769 
1770     ret = pSurface->FlushBuffer(buffer2, -1, flushConfig);
1771     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1772 
1773     ret = pSurface->FlushBuffer(buffer3, -1, flushConfig);
1774     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1775 
1776     ret = pSurface->FlushBuffer(buffer4, -1, flushConfig);
1777     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1778 
1779     ret = pSurface->ReleaseLastFlushedBuffer(buffer2);
1780     EXPECT_EQ(ret, OHOS::SURFACE_ERROR_BUFFER_STATE_INVALID);
1781 
1782     EXPECT_EQ(pSurface->CleanCache(), OHOS::GSERROR_OK);
1783 }
1784 
1785 /*
1786  * Function: SetBufferReallocFlag
1787  * Type: Function
1788  * Rank: Important(2)
1789  * EnvConditions: N/A
1790  * CaseDescription: 1. call SetBufferReallocFlag and check ret
1791  */
1792 HWTEST_F(ProducerSurfaceTest, SetBufferReallocFlag, Function | MediumTest | Level2)
1793 {
1794     EXPECT_EQ(producer->SetQueueSize(3), OHOS::GSERROR_OK);
1795     sptr<SurfaceBuffer> buffer;
1796     int releaseFence = -1;
1797     GSError ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfig);
1798     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1799 
1800     ret = pSurface->FlushBuffer(buffer, -1, flushConfig);
1801     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1802     sptr<SurfaceBuffer> buffer2;
1803     ret = pSurface->RequestBuffer(buffer2, releaseFence, requestConfig);
1804     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1805 
1806     sptr<SurfaceBuffer> buffer3;
1807     ret = pSurface->RequestBuffer(buffer3, releaseFence, requestConfig);
1808     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1809 
1810     int32_t flushFence;
1811     ret = csurf->AcquireBuffer(buffer, flushFence, timestamp, damage);
1812     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1813     ret = csurf->ReleaseBuffer(buffer, -1);
1814     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1815 
1816     ASSERT_EQ(pSurface->SetBufferReallocFlag(true), OHOS::GSERROR_OK);
1817     BufferRequestConfig requestConfigHDR = {
1818         .width = 0x200,
1819         .height = 0x200,
1820         .strideAlignment = 0x8,
1821         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
1822         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
1823         .timeout = 0,
1824     };
1825     ret = pSurface->RequestBuffer(buffer, releaseFence, requestConfigHDR);
1826     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1827     EXPECT_EQ(pSurface->CleanCache(), OHOS::GSERROR_OK);
1828 }
1829 
1830 /*
1831 * Function: AcquireLastFlushedBuffer and ReleaseLastFlushedBuffer
1832 * Type: Function
1833 * Rank: Important(1)
1834 * EnvConditions: N/A
1835 * CaseDescription: 1. call AcquireLastFlushedBuffer FAIL
1836 *                  3. call ReleaseLastFlushedBuffer FAIL
1837  */
1838 HWTEST_F(ProducerSurfaceTest, AcquireLastFlushedBuffer002, TestSize.Level0)
1839 {
1840     sptr<SurfaceBuffer> buffer1 = nullptr;
1841     sptr<SyncFence> fence = nullptr;
1842     float matrix[16];
1843     GSError ret = surface_->AcquireLastFlushedBuffer(buffer1, fence, matrix, 16, false);
1844     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1845     ret = surface_->ReleaseLastFlushedBuffer(buffer1);
1846     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1847     ret = pSurface->ReleaseLastFlushedBuffer(nullptr);
1848     EXPECT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1849 }
1850 
1851 /*
1852 * Function: SetHdrWhitePointBrightness and SetSdrWhitePointBrightness
1853 * Type: Function
1854 * Rank: Important(2)
1855 * EnvConditions: N/A
1856 * CaseDescription: 1. call SetHdrWhitePointBrightness with producer_ is nullptr and check ret
1857 *                  2. call SetSdrWhitePointBrightness with producer_ is nullptr and check ret
1858 */
1859 HWTEST_F(ProducerSurfaceTest, WhitePointBrightness001, TestSize.Level0)
1860 {
1861     GSError ret = surface_->SetHdrWhitePointBrightness(0);
1862     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1863     ret = surface_->SetSdrWhitePointBrightness(0);
1864     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1865 }
1866 
1867 /*
1868 * Function: ReleaseLastFlushedBuffer
1869 * Type: Function
1870 * Rank: Important(2)
1871 * EnvConditions: N/A
1872 * CaseDescription: 1. call ReleaseLastFlushedBuffer with buffer is nullptr and check ret
1873 *                  2. call ReleaseLastFlushedBuffer with producer_ is nullptr and check ret
1874 */
1875 HWTEST_F(ProducerSurfaceTest, ReleaseLastFlushedBuffer001, TestSize.Level0)
1876 {
1877     sptr<SurfaceBuffer> buffer = nullptr;
1878     GSError ret = surface_->ReleaseLastFlushedBuffer(buffer);
1879     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1880     buffer = SurfaceBuffer::Create();
1881     ret = surface_->ReleaseLastFlushedBuffer(buffer);
1882     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1883 }
1884 
1885 /*
1886 * Function: SetGlobalAlpha
1887 * Type: Function
1888 * Rank: Important(2)
1889 * EnvConditions: N/A
1890 * CaseDescription: 1. call SetGlobalAlpha with abnormal parameters and check ret
1891 */
1892 HWTEST_F(ProducerSurfaceTest, SetGlobalAlpha001, TestSize.Level0)
1893 {
1894     int32_t alpha = -255;
1895     GSError ret = pSurface->SetGlobalAlpha(alpha);
1896     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1897     alpha = 256;
1898     ret = pSurface->SetGlobalAlpha(alpha);
1899     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
1900     alpha = 255;
1901     ret = pSurface->SetGlobalAlpha(alpha);
1902     ASSERT_EQ(ret, OHOS::GSERROR_OK);
1903 }
1904 
1905 /*
1906 * Function: IsInHebcWhiletList
1907 * Type: Function
1908 * Rank: Important(2)
1909 * EnvConditions: N/A
1910 * CaseDescription: 1. call IsInHebcWhiletList and check ret
1911 */
1912 HWTEST_F(ProducerSurfaceTest, IsInHebcWhiletList001, TestSize.Level0)
1913 {
1914     bool isInHebcList = pSurface->IsInHebcList();
1915     ASSERT_EQ(isInHebcList, false);
1916 }
1917 
1918 /*
1919 * Function: RequestBufferConcurrence
1920 * Type: Function
1921 * Rank: Important(2)
1922 * EnvConditions: N/A
1923 * CaseDescription: 1. call RequestBuffer and check ret
1924 */
1925 HWTEST_F(ProducerSurfaceTest, RequestBufferConcurrence, TestSize.Level0)
1926 {
1927     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
1928     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
1929     cSurfTmp->RegisterConsumerListener(listenerTmp);
1930     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
1931     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
1932 
1933     GSError ret = pSurfaceTmp->SetQueueSize(3);
1934     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1935 
1936     BufferRequestConfig requestConfigTmp = {
1937         .width = 0x100,
1938         .height = 0x100,
1939         .strideAlignment = 0x8,
1940         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
1941         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
1942         .timeout = 3000,
1943     };
1944     sptr<SurfaceBuffer> buffer = nullptr;
1945     int releaseFence = -1;
1946     for (uint32_t i = 0; i < 3; i++) {
1947         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
1948         EXPECT_EQ(ret, OHOS::GSERROR_OK);
1949     }
1950 
__anonca276fe50602(const std::string& FuncName) 1951     auto func = [&pSurfaceTmp](const std::string& FuncName) {
1952         usleep(1000);
1953         clock_t start = clock();
1954         pSurfaceTmp->GetSurfaceSourceType();
1955         clock_t end = clock();
1956         int32_t time = (end - start) / CLOCKS_PER_SEC;
1957         EXPECT_EQ(time < 1, true);
1958     };
1959     std::thread t1(func, "thread1");
1960 
1961     ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
1962     EXPECT_EQ(ret, OHOS::SURFACE_ERROR_NO_BUFFER);
1963     t1.join();
1964     pSurfaceTmp = nullptr;
1965     producerTmp = nullptr;
1966     cSurfTmp = nullptr;
1967 }
1968 
1969 /*
1970 * Function: RequestBufferConcurrence002
1971 * Type: Function
1972 * Rank: Important(2)
1973 * EnvConditions: N/A
1974 * CaseDescription: 1. call RequestBuffer and check ret
1975 */
1976 HWTEST_F(ProducerSurfaceTest, RequestBufferConcurrence002, TestSize.Level0)
1977 {
1978     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
1979     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
1980     cSurfTmp->RegisterConsumerListener(listenerTmp);
1981     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
1982     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
1983 
1984     GSError ret = pSurfaceTmp->SetQueueSize(3);
1985     EXPECT_EQ(ret, OHOS::GSERROR_OK);
1986 
1987     BufferRequestConfig requestConfigTmp = {
1988         .width = 0x100,
1989         .height = 0x100,
1990         .strideAlignment = 0x8,
1991         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
1992         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
1993         .timeout = 1000,
1994     };
1995     sptr<SurfaceBuffer> buffer = nullptr;
1996     int releaseFence = -1;
1997 
__anonca276fe50702(const std::string& FuncName) 1998     auto func = [&pSurfaceTmp](const std::string& FuncName) {
1999         for (uint32_t i = 0; i < 300000; i++) {
2000             usleep(5);
2001             pSurfaceTmp->SetScalingMode(ScalingMode::SCALING_MODE_SCALE_TO_WINDOW);
2002             pSurfaceTmp->SetSurfaceSourceType(OHSurfaceSource::OH_SURFACE_SOURCE_UI);
2003             pSurfaceTmp->GetSurfaceSourceType();
2004             pSurfaceTmp->CleanCache(true);
2005         }
2006     };
2007     std::thread t1(func, "thread1");
2008     for (uint32_t i = 0; i < 300000; i++) {
2009         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2010         if (ret == SURFACE_ERROR_NO_BUFFER) {
2011             break;
2012         } else {
2013             EXPECT_EQ(ret, OHOS::GSERROR_OK);
2014         }
2015     }
2016 
2017     t1.join();
2018     pSurfaceTmp = nullptr;
2019     producerTmp = nullptr;
2020     cSurfTmp = nullptr;
2021 }
2022 
2023 /*
2024 * Function: RequestBufferConcurrence003
2025 * Type: Function
2026 * Rank: Important(2)
2027 * EnvConditions: N/A
2028 * CaseDescription: 1. preSetUp: main thread create producer client and sub thread as consumer
2029 *                  2. operation: The main thread loop executes request buffer and flush buffer 100000 times,
2030 *                     and the concurrent child thread loop executes acquire buffer, release buffer and “CleanCache”
2031 *                     100000 times.
2032 *                  3. result: The result of request buffer and acquire buffer can only be SURFACE_ERROR_NO_BUFFER or
2033 *                     GSERROR_OK. The result of release buffer of flush buffer can only be
2034 *                     SURFACE_ERROR_BUFFER_NOT_INCACHE or GSERROR_OK.
2035 */
2036 HWTEST_F(ProducerSurfaceTest, RequestBufferConcurrence003, TestSize.Level0)
2037 {
2038     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2039     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2040     cSurfTmp->RegisterConsumerListener(listenerTmp);
2041     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2042     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2043 
2044     GSError ret = pSurfaceTmp->SetQueueSize(3);
2045     EXPECT_EQ(ret, OHOS::GSERROR_OK);
2046 
2047     BufferRequestConfig requestConfigTmp = {
2048         .width = 0x100,
2049         .height = 0x100,
2050         .strideAlignment = 0x8,
2051         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2052         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2053         .timeout = 1000,
2054     };
2055     sptr<SurfaceBuffer> buffer = nullptr;
2056     int releaseFence = -1;
2057 
__anonca276fe50802(const std::string& FuncName) 2058     auto func = [&pSurfaceTmp, &cSurfTmp](const std::string& FuncName) {
2059         sptr<SurfaceBuffer> buffer;
2060         int32_t flushFence;
2061         int64_t timestamp;
2062         OHOS::Rect damage;
2063         GSError ret;
2064         for (uint32_t i = 0; i < 100000; i++) {
2065             usleep(5);
2066             ret = cSurfTmp->AcquireBuffer(buffer, flushFence, timestamp, damage);
2067             if (ret != SURFACE_ERROR_NO_BUFFER) {
2068                 EXPECT_EQ(ret, OHOS::GSERROR_OK);
2069                 ret = cSurfTmp->ReleaseBuffer(buffer, -1);
2070                 if (ret != SURFACE_ERROR_BUFFER_NOT_INCACHE) {
2071                     EXPECT_EQ(ret, OHOS::GSERROR_OK);
2072                 }
2073             }
2074             pSurfaceTmp->CleanCache(true);
2075         }
2076     };
2077     std::thread t1(func, "thread1");
2078     BufferFlushConfig flushConfig = {
2079         .damage = {
2080             .w = 0x100,
2081             .h = 0x100,
2082         },
2083     };
2084     for (uint32_t i = 0; i < 100000; i++) {
2085         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2086         if (ret == SURFACE_ERROR_NO_BUFFER) {
2087             break;
2088         } else {
2089             EXPECT_EQ(ret, OHOS::GSERROR_OK);
2090         }
2091         ret = pSurfaceTmp->FlushBuffer(buffer, -1, flushConfig);
2092         if (ret == SURFACE_ERROR_BUFFER_NOT_INCACHE) {
2093             continue;
2094         } else {
2095             EXPECT_EQ(ret, OHOS::GSERROR_OK);
2096         }
2097     }
2098 
2099     t1.join();
2100     pSurfaceTmp = nullptr;
2101     producerTmp = nullptr;
2102     cSurfTmp = nullptr;
2103 }
2104 
2105 /*
2106 * Function: RequestBufferConcurrence004
2107 * Type: Function
2108 * Rank: Important(2)
2109 * EnvConditions: N/A
2110 * CaseDescription: 1. call RequestBuffer and check ret
2111 */
2112 HWTEST_F(ProducerSurfaceTest, RequestBufferConcurrence004, TestSize.Level0)
2113 {
2114     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2115     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2116     cSurfTmp->RegisterConsumerListener(listenerTmp);
2117     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2118     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2119 
2120     GSError ret = pSurfaceTmp->SetQueueSize(10);
2121     EXPECT_EQ(ret, OHOS::GSERROR_OK);
2122 
2123     BufferRequestConfig requestConfigTmp = {
2124         .width = 0x100,
2125         .height = 0x100,
2126         .strideAlignment = 0x8,
2127         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2128         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2129         .timeout = 1000,
2130     };
2131     sptr<SurfaceBuffer> buffer = nullptr;
2132     int releaseFence = -1;
2133     BufferFlushConfig flushConfig = {
2134         .damage = {
2135             .w = 0x100,
2136             .h = 0x100,
2137         },
2138     };
2139 
__anonca276fe50902(const std::string& FuncName) 2140     auto func = [&pSurfaceTmp, &buffer, &requestConfigTmp, &releaseFence, &flushConfig](const std::string& FuncName) {
2141         for (uint32_t i = 0; i < 10000; i++) {
2142             GSError ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2143             if (ret == OHOS::GSERROR_OK) {
2144                 ret = pSurfaceTmp->FlushBuffer(buffer, -1, flushConfig);
2145                 if (ret != SURFACE_ERROR_BUFFER_NOT_INCACHE && ret != SURFACE_ERROR_BUFFER_STATE_INVALID) {
2146                     EXPECT_EQ(ret, OHOS::GSERROR_OK);
2147                 }
2148             }
2149             pSurfaceTmp->CleanCache(true);
2150         }
2151     };
2152     std::thread t1(func, "thread1");
2153     for (uint32_t i = 0; i < 10000; i++) {
2154         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2155         if (ret == OHOS::GSERROR_OK) {
2156             ret = pSurfaceTmp->FlushBuffer(buffer, -1, flushConfig);
2157             if (ret != SURFACE_ERROR_BUFFER_NOT_INCACHE && ret != SURFACE_ERROR_BUFFER_STATE_INVALID) {
2158                 EXPECT_EQ(ret, OHOS::GSERROR_OK);
2159             }
2160         }
2161         pSurfaceTmp->CleanCache(true);
2162     }
2163 
2164     t1.join();
2165     pSurfaceTmp = nullptr;
2166     producerTmp = nullptr;
2167     cSurfTmp = nullptr;
2168 }
2169 
2170 /*
2171 * Function: RequestBufferNoConsumer
2172 * Type: Function
2173 * Rank: Important(2)
2174 * EnvConditions: N/A
2175 * CaseDescription: 1. preSetUp: create produce and destroy consumer
2176 *                  2. operation: produce request buffer
2177 *                  3. result: request buffer failed and return GSERROR_NO_CONSUMER
2178 */
2179 HWTEST_F(ProducerSurfaceTest, RequestBufferNoConsumer, TestSize.Level0)
2180 {
2181     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2182     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2183     cSurfTmp->RegisterConsumerListener(listenerTmp);
2184     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2185     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2186 
2187     BufferRequestConfig requestConfigTmp = {
2188         .width = 0x100,
2189         .height = 0x100,
2190         .strideAlignment = 0x8,
2191         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2192         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2193         .timeout = 0,
2194     };
2195     sptr<SurfaceBuffer> buffer = nullptr;
2196     int releaseFence = -1;
2197     GSError ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2198     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2199 
2200     cSurfTmp = nullptr;
2201     ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2202     ASSERT_EQ(ret, OHOS::GSERROR_NO_CONSUMER);
2203 
2204     pSurfaceTmp = nullptr;
2205     producerTmp = nullptr;
2206 }
2207 
2208 /*
2209 * Function: RequestBufferNoListener
2210 * Type: Function
2211 * Rank: Important(2)
2212 * EnvConditions: N/A
2213 * CaseDescription: 1. call RequestBuffer and check ret
2214 */
2215 HWTEST_F(ProducerSurfaceTest, RequestBufferNoListener, TestSize.Level0)
2216 {
2217     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2218     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2219     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2220 
2221     BufferRequestConfig requestConfigTmp = {
2222         .width = 0x100,
2223         .height = 0x100,
2224         .strideAlignment = 0x8,
2225         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2226         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2227         .timeout = 0,
2228     };
2229     sptr<SurfaceBuffer> buffer = nullptr;
2230     int releaseFence = -1;
2231     GSError ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2232     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_CONSUMER_UNREGISTER_LISTENER);
2233 
2234     ret = pSurfaceTmp->Disconnect();
2235     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2236 
2237     ret = pSurfaceTmp->Connect();
2238     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2239 
2240     ret = pSurfaceTmp->Disconnect();
2241     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2242 
2243     pSurfaceTmp = nullptr;
2244     producerTmp = nullptr;
2245     cSurfTmp = nullptr;
2246 }
2247 
2248 /*
2249 * Function: RequestBuffersNoListener
2250 * Type: Function
2251 * Rank: Important(2)
2252 * EnvConditions: N/A
2253 * CaseDescription: 1. call RequestBuffer and check ret
2254 */
2255 HWTEST_F(ProducerSurfaceTest, RequestBuffersNoListener, TestSize.Level0)
2256 {
2257     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2258     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2259     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2260 
2261     BufferRequestConfig requestConfigTmp = {
2262         .width = 0x100,
2263         .height = 0x100,
2264         .strideAlignment = 0x8,
2265         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2266         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2267         .timeout = 0,
2268         .transform = GraphicTransformType::GRAPHIC_ROTATE_BUTT,
2269     };
2270 
2271     std::vector<sptr<SurfaceBuffer>> sfbuffers;
2272     std::vector<sptr<SyncFence>> releaseFences;
2273     GSError ret = pSurfaceTmp->RequestBuffers(sfbuffers, releaseFences, requestConfigTmp);
2274     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_UNKOWN);
2275 
2276     ret = pSurfaceTmp->Disconnect();
2277     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2278 
2279     ret = pSurfaceTmp->Connect();
2280     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2281 
2282     ret = pSurfaceTmp->Disconnect();
2283     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2284 
2285     pSurfaceTmp = nullptr;
2286     producerTmp = nullptr;
2287     cSurfTmp = nullptr;
2288 }
2289 
2290 /*
2291 * Function: ProducerSurfaceParameterNull
2292 * Type: Function
2293 * Rank: Important(2)
2294 * EnvConditions: N/A
2295 * CaseDescription: 1. call ProducerSurfuce function and check ret
2296 */
2297 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceParameterNull, TestSize.Level0)
2298 {
2299     sptr<IBufferProducer> producer = nullptr;
2300     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
2301     ProducerInitInfo info;
2302     ASSERT_EQ(pSurfaceTmp->GetProducerInitInfo(info), OHOS::GSERROR_INVALID_ARGUMENTS);
2303     sptr<SurfaceBuffer> buffer = SurfaceBuffer::Create();
2304     sptr<SyncFence> fence = SyncFence::INVALID_FENCE;
2305     BufferRequestConfig config;
2306     ASSERT_EQ(pSurfaceTmp->RequestBuffer(buffer, fence, config), OHOS::GSERROR_INVALID_ARGUMENTS);
2307     ASSERT_EQ(pSurfaceTmp->RequestAndDetachBuffer(buffer, fence, config), OHOS::GSERROR_INVALID_ARGUMENTS);
2308     std::vector<sptr<SurfaceBuffer>> buffers;
2309     std::vector<sptr<SyncFence>> fences;
2310     ASSERT_EQ(pSurfaceTmp->RequestBuffers(buffers, fences, config), OHOS::GSERROR_INVALID_ARGUMENTS);
2311     BufferFlushConfigWithDamages configWithDamage;
2312     ASSERT_EQ(pSurfaceTmp->FlushBuffer(buffer, fence, configWithDamage), OHOS::GSERROR_INVALID_ARGUMENTS);
2313     BufferFlushConfig flushConfig;
2314     ASSERT_EQ(pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false), OHOS::GSERROR_INVALID_ARGUMENTS);
2315     std::vector<BufferFlushConfigWithDamages> configWithDamages;
2316     ASSERT_EQ(pSurfaceTmp->FlushBuffers(buffers, fences, configWithDamages), OHOS::GSERROR_INVALID_ARGUMENTS);
2317     float matrix[16];
2318     bool isUseNewMatrix = false;
2319     ASSERT_EQ(pSurfaceTmp->GetLastFlushedBuffer(buffer, fence, matrix, isUseNewMatrix),
2320         OHOS::GSERROR_INVALID_ARGUMENTS);
2321     ASSERT_EQ(pSurfaceTmp->CancelBuffer(buffer), OHOS::SURFACE_ERROR_UNKOWN);
2322     ASSERT_EQ(pSurfaceTmp->AttachBufferToQueue(nullptr), OHOS::SURFACE_ERROR_UNKOWN);
2323     ASSERT_EQ(pSurfaceTmp->AttachBufferToQueue(buffer), OHOS::SURFACE_ERROR_UNKOWN);
2324     ASSERT_EQ(pSurfaceTmp->DetachBufferFromQueue(nullptr), OHOS::SURFACE_ERROR_UNKOWN);
2325     ASSERT_EQ(pSurfaceTmp->DetachBufferFromQueue(buffer), OHOS::SURFACE_ERROR_UNKOWN);
2326     sptr<SurfaceBuffer> bufferTmp;
2327     ASSERT_EQ(pSurfaceTmp->AttachBuffer(bufferTmp), OHOS::GSERROR_INVALID_ARGUMENTS);
2328     ASSERT_EQ(pSurfaceTmp->AttachBuffer(buffer), OHOS::GSERROR_INVALID_ARGUMENTS);
2329     ASSERT_EQ(pSurfaceTmp->AttachBuffer(bufferTmp, 0), OHOS::GSERROR_INVALID_ARGUMENTS);
2330     ASSERT_EQ(pSurfaceTmp->AttachBuffer(buffer, 0), OHOS::GSERROR_INVALID_ARGUMENTS);
2331     ASSERT_EQ(pSurfaceTmp->DetachBuffer(bufferTmp), OHOS::GSERROR_INVALID_ARGUMENTS);
2332     ASSERT_EQ(pSurfaceTmp->DetachBuffer(buffer), OHOS::GSERROR_INVALID_ARGUMENTS);
2333     ASSERT_EQ(pSurfaceTmp->GetQueueSize(), 0);
2334     ASSERT_EQ(pSurfaceTmp->SetQueueSize(0), OHOS::GSERROR_INVALID_ARGUMENTS);
2335     pSurfaceTmp->GetName();
2336     ASSERT_EQ(pSurfaceTmp->GetDefaultWidth(), -1);
2337     ASSERT_EQ(pSurfaceTmp->GetDefaultHeight(), -1);
2338     GraphicTransformType transform = GraphicTransformType::GRAPHIC_ROTATE_NONE;
2339     ASSERT_EQ(pSurfaceTmp->SetTransformHint(transform), OHOS::GSERROR_INVALID_ARGUMENTS);
2340     ASSERT_EQ(pSurfaceTmp->SetDefaultUsage(0), OHOS::GSERROR_INVALID_ARGUMENTS);
2341     ASSERT_EQ(pSurfaceTmp->GetDefaultUsage(), 0);
2342     OHSurfaceSource sourceType = OHSurfaceSource::OH_SURFACE_SOURCE_VIDEO;
2343     ASSERT_EQ(pSurfaceTmp->SetSurfaceSourceType(sourceType), OHOS::GSERROR_INVALID_ARGUMENTS);
2344     ASSERT_EQ(pSurfaceTmp->GetSurfaceSourceType(), OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT);
2345     std::string appFrameworkType;
2346     ASSERT_EQ(pSurfaceTmp->SetSurfaceAppFrameworkType(appFrameworkType), OHOS::GSERROR_INVALID_ARGUMENTS);
2347     ASSERT_EQ(pSurfaceTmp->GetSurfaceAppFrameworkType(), "");
2348     OnReleaseFunc func = nullptr;
2349     ASSERT_EQ(pSurfaceTmp->RegisterReleaseListener(func), OHOS::GSERROR_INVALID_ARGUMENTS);
2350     ASSERT_EQ(pSurfaceTmp->RegisterReleaseListener(OnBufferRelease), OHOS::GSERROR_INVALID_ARGUMENTS);
2351     OnReleaseFuncWithFence funcWithFence = nullptr;
2352     ASSERT_EQ(pSurfaceTmp->RegisterReleaseListener(funcWithFence), OHOS::GSERROR_INVALID_ARGUMENTS);
2353     ASSERT_EQ(pSurfaceTmp->RegisterReleaseListener(OnBufferReleaseWithFence), OHOS::GSERROR_INVALID_ARGUMENTS);
2354     ASSERT_EQ(pSurfaceTmp->UnRegisterReleaseListener(), OHOS::GSERROR_INVALID_ARGUMENTS);
2355     ASSERT_EQ(pSurfaceTmp->IsRemote(), false);
2356     ASSERT_EQ(pSurfaceTmp->CleanCache(true), OHOS::GSERROR_INVALID_ARGUMENTS);
2357     ASSERT_EQ(pSurfaceTmp->GoBackground(), OHOS::GSERROR_INVALID_ARGUMENTS);
2358     pSurfaceTmp->GetUniqueId();
2359     ASSERT_EQ(pSurfaceTmp->SetTransform(transform), OHOS::GSERROR_INVALID_ARGUMENTS);
2360     ASSERT_EQ(pSurfaceTmp->GetTransform(), GraphicTransformType::GRAPHIC_ROTATE_BUTT);
2361     ASSERT_EQ(pSurfaceTmp->Connect(), OHOS::GSERROR_INVALID_ARGUMENTS);
2362     ASSERT_EQ(pSurfaceTmp->Disconnect(), OHOS::GSERROR_INVALID_ARGUMENTS);
2363     ScalingMode scalingMode = ScalingMode::SCALING_MODE_FREEZE;
2364     ASSERT_EQ(pSurfaceTmp->SetScalingMode(0, scalingMode), OHOS::GSERROR_INVALID_ARGUMENTS);
2365     ASSERT_EQ(pSurfaceTmp->SetScalingMode(scalingMode), OHOS::GSERROR_INVALID_ARGUMENTS);
2366     pSurfaceTmp->SetBufferHold(false);
2367     ASSERT_EQ(pSurfaceTmp->SetBufferReallocFlag(true), OHOS::GSERROR_INVALID_ARGUMENTS);
2368     std::vector<GraphicHDRMetaData> metaData;
2369     ASSERT_EQ(pSurfaceTmp->SetMetaData(0, metaData), OHOS::GSERROR_INVALID_ARGUMENTS);
2370     GraphicHDRMetadataKey key = GraphicHDRMetadataKey::GRAPHIC_MATAKEY_RED_PRIMARY_X ;
2371     std::vector<uint8_t> metaData1;
2372     ASSERT_EQ(pSurfaceTmp->SetMetaDataSet(0, key, metaData1), OHOS::GSERROR_INVALID_ARGUMENTS);
2373     ASSERT_EQ(pSurfaceTmp->SetTunnelHandle(nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
2374     int64_t time;
2375     GraphicPresentTimestampType type = GraphicPresentTimestampType::GRAPHIC_DISPLAY_PTS_TIMESTAMP;
2376     ASSERT_EQ(pSurfaceTmp->GetPresentTimestamp(0, type, time), OHOS::GSERROR_INVALID_ARGUMENTS);
2377     ASSERT_EQ(pSurfaceTmp->SetWptrNativeWindowToPSurface(nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
2378     ASSERT_EQ(pSurfaceTmp->SetHdrWhitePointBrightness(0.0), OHOS::GSERROR_INVALID_ARGUMENTS);
2379     ASSERT_EQ(pSurfaceTmp->SetSdrWhitePointBrightness(0.0), OHOS::GSERROR_INVALID_ARGUMENTS);
2380     ASSERT_EQ(pSurfaceTmp->AcquireLastFlushedBuffer(buffer, fence, matrix, 0, 0), OHOS::GSERROR_INVALID_ARGUMENTS);
2381     ASSERT_EQ(pSurfaceTmp->ReleaseLastFlushedBuffer(nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
2382     ASSERT_EQ(pSurfaceTmp->ReleaseLastFlushedBuffer(buffer), OHOS::GSERROR_INVALID_ARGUMENTS);
2383     ASSERT_EQ(pSurfaceTmp->SetGlobalAlpha(0), OHOS::GSERROR_INVALID_ARGUMENTS);
2384     ASSERT_EQ(pSurfaceTmp->SetRequestBufferNoblockMode(false), OHOS::GSERROR_INVALID_ARGUMENTS);
2385 
2386     pSurfaceTmp = nullptr;
2387 }
2388 
2389 /*
2390 * Function: RequestAndDetachBuffer001
2391 * Type: Function
2392 * Rank: Important(2)
2393 * EnvConditions: N/A
2394 * CaseDescription: 1. call RequestAndDetachBuffer function and check ret
2395 */
2396 HWTEST_F(ProducerSurfaceTest, RequestAndDetachBuffer001, TestSize.Level0)
2397 {
2398     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2399     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2400     cSurfTmp->RegisterConsumerListener(listenerTmp);
2401     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2402     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2403 
2404     BufferRequestConfig requestConfigTmp = {
2405         .width = 0x100,
2406         .height = 0x100,
2407         .strideAlignment = 0x8,
2408         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2409         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2410         .timeout = 0,
2411     };
2412     BufferFlushConfig flushConfig = {
2413         .damage = {
2414             .w = 0x100,
2415             .h = 0x100,
2416         },
2417     };
2418     sptr<SurfaceBuffer> buffer = nullptr;
2419     sptr<SyncFence> fence = SyncFence::INVALID_FENCE;
2420     GSError ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false);
2421     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2422 
2423     ret = pSurfaceTmp->RequestAndDetachBuffer(buffer, fence, requestConfigTmp);
2424     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2425     fence = nullptr;
2426     ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false);
2427     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2428 
2429     pSurfaceTmp = nullptr;
2430     producerTmp = nullptr;
2431 }
2432 
2433 /*
2434 * Function: RequestAndDetachBuffer002
2435 * Type: Function
2436 * Rank: Important(2)
2437 * EnvConditions: N/A
2438 * CaseDescription: 1. call RequestAndDetachBuffer function and check ret
2439 */
2440 HWTEST_F(ProducerSurfaceTest, RequestAndDetachBuffer002, TestSize.Level0)
2441 {
2442     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2443     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2444     cSurfTmp->RegisterConsumerListener(listenerTmp);
2445     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2446     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2447 
2448     BufferRequestConfig requestConfigTmp = {
2449         .width = 0x100,
2450         .height = 0x100,
2451         .strideAlignment = 0x8,
2452         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2453         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2454         .timeout = 0,
2455     };
2456     BufferFlushConfig flushConfig = {
2457         .damage = {
2458             .w = 0x100,
2459             .h = 0x100,
2460         },
2461     };
2462     sptr<SurfaceBuffer> buffer = nullptr;
2463     sptr<SyncFence> fence = SyncFence::INVALID_FENCE;
2464     GSError ret = pSurfaceTmp->RequestAndDetachBuffer(buffer, fence, requestConfigTmp);
2465     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2466     ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false);
2467     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2468     ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false);
2469     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_BUFFER_IS_INCACHE);
2470 
2471     int32_t flushFence;
2472     sptr<SurfaceBuffer> acquireBuffer = nullptr;
2473     ret = cSurfTmp->AcquireBuffer(acquireBuffer, flushFence, timestamp, damage);
2474     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2475 
2476     ret = cSurfTmp->ReleaseBuffer(acquireBuffer, -1);
2477     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2478     ASSERT_EQ(acquireBuffer->GetSeqNum(), buffer->GetSeqNum());
2479 
2480     pSurfaceTmp = nullptr;
2481     producerTmp = nullptr;
2482 }
2483 
2484 /*
2485 * Function: RequestAndDetachBuffer003
2486 * Type: Function
2487 * Rank: Important(2)
2488 * EnvConditions: N/A
2489 * CaseDescription: 1. call RequestAndDetachBuffer function and check ret
2490 */
2491 HWTEST_F(ProducerSurfaceTest, RequestAndDetachBuffer003, TestSize.Level0)
2492 {
2493     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2494     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2495     cSurfTmp->RegisterConsumerListener(listenerTmp);
2496     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2497     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2498 
2499     BufferRequestConfig requestConfigTmp = {
2500         .width = 0x100,
2501         .height = 0x100,
2502         .strideAlignment = 0x8,
2503         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2504         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2505         .timeout = 0,
2506     };
2507     BufferFlushConfig flushConfig = {
2508         .damage = {
2509             .w = 0x100,
2510             .h = 0x100,
2511         },
2512     };
2513     BufferFlushConfig flushConfigFail = {
2514         .damage = {
2515             .w = -1,
2516             .h = -1,
2517         },
2518     };
2519     sptr<SurfaceBuffer> buffer = nullptr;
2520     sptr<SyncFence> fence = SyncFence::INVALID_FENCE;
2521     GSError ret = pSurfaceTmp->RequestAndDetachBuffer(buffer, fence, requestConfigTmp);
2522     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2523     cSurfTmp->UnregisterConsumerListener();
2524     ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false);
2525     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_CONSUMER_UNREGISTER_LISTENER);
2526     cSurfTmp->RegisterConsumerListener(listenerTmp);
2527     ret = pSurfaceTmp->FlushBuffer(buffer, fence, flushConfig);
2528     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_BUFFER_NOT_INCACHE);
2529     ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfigFail, false);
2530     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2531     cSurfTmp = nullptr;
2532     ret = pSurfaceTmp->RequestAndDetachBuffer(buffer, fence, requestConfigTmp);
2533     ASSERT_EQ(ret, OHOS::GSERROR_NO_CONSUMER);
2534     ret = pSurfaceTmp->AttachAndFlushBuffer(buffer, fence, flushConfig, false);
2535     ASSERT_EQ(ret, OHOS::GSERROR_NO_CONSUMER);
2536 
2537     pSurfaceTmp = nullptr;
2538     producerTmp = nullptr;
2539 }
2540 
2541 /*
2542 * Function: GetAndSetRotatingBuffersNumber001
2543 * Type: Function
2544 * Rank: Important(2)
2545 * EnvConditions: N/A
2546 * CaseDescription: 1. call GetCycleBuffersNumber and SetCycleBuffersNumber function and check ret
2547 */
2548 HWTEST_F(ProducerSurfaceTest, GetAndSetRotatingBuffersNumber001, TestSize.Level0)
2549 {
2550     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2551     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2552     cSurfTmp->RegisterConsumerListener(listenerTmp);
2553     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2554     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2555 
2556     uint32_t cycleBuffersNumber = 0;
2557     ASSERT_EQ(pSurfaceTmp->GetCycleBuffersNumber(cycleBuffersNumber), OHOS::GSERROR_OK);
2558     ASSERT_EQ(cycleBuffersNumber, cSurfTmp->GetQueueSize());
2559     ASSERT_EQ(pSurfaceTmp->SetCycleBuffersNumber(0), OHOS::GSERROR_INVALID_ARGUMENTS);
2560     ASSERT_EQ(pSurfaceTmp->SetCycleBuffersNumber(129), OHOS::GSERROR_INVALID_ARGUMENTS); // 129 : error num
2561     ASSERT_EQ(pSurfaceTmp->SetCycleBuffersNumber(128), OHOS::GSERROR_OK); // 128 : normal num
2562     ASSERT_EQ(pSurfaceTmp->GetCycleBuffersNumber(cycleBuffersNumber), OHOS::GSERROR_OK);
2563     ASSERT_EQ(cycleBuffersNumber, 128); // 128 : normal num
2564 
2565     pSurfaceTmp = nullptr;
2566     producerTmp = nullptr;
2567     cSurfTmp = nullptr;
2568 }
2569 
2570 /*
2571 * Function: PropertyChangeCallback
2572 * Type: Function
2573 * Rank: Important(2)
2574 * EnvConditions: N/A
2575 * CaseDescription: 1. call PropertyChangeCallback  and check ret
2576 */
2577 HWTEST_F(ProducerSurfaceTest, PropertyChangeCallback001, TestSize.Level0)
2578 {
2579     SurfaceProperty surfaceProperty;
2580     GSError ret = surface_->PropertyChangeCallback(surfaceProperty);
2581     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2582 }
2583 
2584 /*
2585 * Function: ResetPropertyListenerInner
2586 * Type: Function
2587 * Rank: Important(2)
2588 * EnvConditions: N/A
2589 * CaseDescription: 1. call ResetPropertyListenerInner  and check ret
2590 */
2591 HWTEST_F(ProducerSurfaceTest, ResetPropertyListenerInner001, TestSize.Level0)
2592 {
2593     sptr<IBufferProducer> producer_ = nullptr;
2594     GSError ret = surface_->ResetPropertyListenerInner(0);
2595     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2596 }
2597 
2598 /*
2599 * Function: PreAllocBuffersTest1
2600 * Type: Function
2601 * Rank: Important(2)
2602 * EnvConditions: N/A
2603 * CaseDescription: 1. preSetUp: producer calls PreAllocBuffers and check the ret
2604 *                  2. operation: producer sends valid config to bufferQueue then RequestBuffer
2605 *                  3. result: bufferQueue return GSERROR_OK
2606 */
2607 HWTEST_F(ProducerSurfaceTest, PreAllocBuffersTest1, TestSize.Level0)
2608 {
2609     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2610     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2611     cSurfTmp->RegisterConsumerListener(listenerTmp);
2612     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2613     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2614 
2615     GSError ret = pSurfaceTmp->SetQueueSize(3);
2616     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2617 
2618     BufferRequestConfig requestConfigTmp = {
2619         .width = 0x100,
2620         .height = 0x100,
2621         .strideAlignment = 0x8,
2622         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2623         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2624         .timeout = 0,
2625     };
2626     uint32_t allocBufferCount = 3;
2627     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, allocBufferCount);
2628     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2629 
2630     sptr<SurfaceBuffer> buffer = nullptr;
2631     int releaseFence = -1;
2632     for (uint32_t i = 0; i < allocBufferCount; i++) {
2633         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2634         ASSERT_EQ(ret, OHOS::GSERROR_OK);
2635     }
2636 
2637     pSurfaceTmp = nullptr;
2638     producerTmp = nullptr;
2639     cSurfTmp = nullptr;
2640 }
2641 
2642 /*
2643 * Function: PreAllocBuffersTest2
2644 * Type: Function
2645 * Rank: Important(2)
2646 * EnvConditions: N/A
2647 * CaseDescription: 1. preSetUp: producer calls PreAllocBuffers and check the ret
2648 *                  2. operation: producer sends valid config to bufferQueue
2649 *                  3. result: bufferQueue return GSERROR_OK
2650 */
2651 HWTEST_F(ProducerSurfaceTest, PreAllocBuffersTest2, TestSize.Level0)
2652 {
2653     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2654     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2655     cSurfTmp->RegisterConsumerListener(listenerTmp);
2656     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2657     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2658 
2659     GSError ret = pSurfaceTmp->SetQueueSize(3);
2660     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2661 
2662     BufferRequestConfig requestConfigTmp = {
2663         .width = 0x100,
2664         .height = 0x100,
2665         .strideAlignment = 0x8,
2666         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2667         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2668     };
2669     uint32_t allocBufferCount = 4;
2670     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, allocBufferCount);
2671     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2672 
2673     pSurfaceTmp = nullptr;
2674     producerTmp = nullptr;
2675     cSurfTmp = nullptr;
2676 }
2677 
2678 /*
2679 * Function: PreAllocBuffersTest3
2680 * Type: Function
2681 * Rank: Important(2)
2682 * EnvConditions: N/A
2683 * CaseDescription: 1. preSetUp: calls RequestBuffer with max queue size, then calls PreAllocBuffers and check the ret
2684 *                  2. operation: producer sends non-zero allocBufferCount config to bufferQueue then RequestBuffer
2685 *                  3. result: calls RequestBuffer return ok, calls RequestBuffer return buffer queue full
2686 */
2687 HWTEST_F(ProducerSurfaceTest, PreAllocBuffersTest3, TestSize.Level0)
2688 {
2689     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2690     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2691     cSurfTmp->RegisterConsumerListener(listenerTmp);
2692     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2693     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2694 
2695     GSError ret = pSurfaceTmp->SetQueueSize(3);
2696     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2697 
2698     BufferRequestConfig requestConfigTmp = {
2699         .width = 0x100,
2700         .height = 0x100,
2701         .strideAlignment = 0x8,
2702         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2703         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2704     };
2705     uint32_t allocBufferCount = 3;
2706     sptr<SurfaceBuffer> buffer = nullptr;
2707     int releaseFence = -1;
2708     for (uint32_t i = 0; i < allocBufferCount; i++) {
2709         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2710         ASSERT_EQ(ret, OHOS::GSERROR_OK);
2711     }
2712     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, allocBufferCount);
2713     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_BUFFER_QUEUE_FULL);
2714 
2715     pSurfaceTmp = nullptr;
2716     producerTmp = nullptr;
2717     cSurfTmp = nullptr;
2718 }
2719 
2720 /*
2721 * Function: PreAllocBuffersTest4
2722 * Type: Function
2723 * Rank: Important(2)
2724 * EnvConditions: N/A
2725 * CaseDescription: 1. call PreAllocBuffers and check ret
2726 */
2727 HWTEST_F(ProducerSurfaceTest, PreAllocBuffersTest4, TestSize.Level0)
2728 {
2729     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2730     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2731     cSurfTmp->RegisterConsumerListener(listenerTmp);
2732     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2733     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2734 
2735     GSError ret = pSurfaceTmp->SetQueueSize(3);
2736     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2737 
2738     BufferRequestConfig requestConfigTmp = {
2739         .width = 0x100,
2740         .height = 0x100,
2741         .strideAlignment = 0x8,
2742         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2743         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA | BUFFER_USAGE_PROTECTED,
2744     };
2745     uint32_t allocBufferCount = 3;
2746     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, allocBufferCount);
2747     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2748 
2749     sptr<SurfaceBuffer> buffer = nullptr;
2750     int releaseFence = -1;
2751     for (uint32_t i = 0; i < allocBufferCount; i++) {
2752         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2753         ASSERT_EQ(ret, OHOS::GSERROR_OK);
2754     }
2755 
2756     pSurfaceTmp = nullptr;
2757     producerTmp = nullptr;
2758     cSurfTmp = nullptr;
2759 }
2760 
2761 /*
2762 * Function: PreAllocBuffersTest5
2763 * Type: Function
2764 * Rank: Important(2)
2765 * EnvConditions: N/A
2766 * CaseDescription: 1. preSetUp: calls PreAllocBuffers and check the ret
2767 *                  2. operation: calls PreAllocBuffers, then calls PreAllocBuffers with new valid config
2768 *                  3. result: calls PreAllocBuffers return ok, calls RequestBuffer return ok
2769 */
2770 HWTEST_F(ProducerSurfaceTest, PreAllocBuffersTest5, TestSize.Level0)
2771 {
2772     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2773     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2774     cSurfTmp->RegisterConsumerListener(listenerTmp);
2775     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2776     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2777 
2778     GSError ret = pSurfaceTmp->SetQueueSize(3);
2779     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2780 
2781     BufferRequestConfig requestConfigTmp = {
2782         .width = 0x100,
2783         .height = 0x100,
2784         .strideAlignment = 0x8,
2785         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2786         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2787     };
2788     uint32_t allocBufferCount = 3;
2789     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, allocBufferCount);
2790     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2791 
2792     requestConfigTmp = {
2793         .width = 0x200,
2794         .height = 0x200,
2795         .strideAlignment = 0x8,
2796         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2797         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2798     };
2799 
2800     sptr<SurfaceBuffer> buffer = nullptr;
2801     int releaseFence = -1;
2802     for (uint32_t i = 0; i < allocBufferCount; i++) {
2803         ret = pSurfaceTmp->RequestBuffer(buffer, releaseFence, requestConfigTmp);
2804         ASSERT_EQ(ret, OHOS::GSERROR_OK);
2805     }
2806 
2807     pSurfaceTmp = nullptr;
2808     producerTmp = nullptr;
2809     cSurfTmp = nullptr;
2810 }
2811 
2812 /*
2813 * Function: PreAllocBuffersTest6
2814 * Type: Function
2815 * Rank: Important(2)
2816 * EnvConditions: N/A
2817 * CaseDescription: 1. preSetUp: calls PreAllocBuffers and check the ret
2818 *                  2. operation: calls PreAllocBuffers with invalid allocBufferCount/width/height/format config
2819 *                  3. result: calls PreAllocBuffers return ok, calls RequestBuffer return ok
2820 */
2821 HWTEST_F(ProducerSurfaceTest, PreAllocBuffersTest6, TestSize.Level0)
2822 {
2823     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2824     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2825     cSurfTmp->RegisterConsumerListener(listenerTmp);
2826     sptr<IBufferProducer> producerTmp = cSurfTmp->GetProducer();
2827     sptr<Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
2828 
2829     GSError ret = pSurfaceTmp->SetQueueSize(3);
2830     ASSERT_EQ(ret, OHOS::GSERROR_OK);
2831 
2832     BufferRequestConfig requestConfigTmp = {
2833         .width = 0x100,
2834         .height = 0x100,
2835         .strideAlignment = 0x8,
2836         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2837         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2838     };
2839     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, 0);
2840     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2841 
2842     requestConfigTmp = {
2843         .width = 0x0,
2844         .height = 0x100,
2845         .strideAlignment = 0x8,
2846         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2847         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2848     };
2849     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, 3);
2850     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2851 
2852     requestConfigTmp = {
2853         .width = 0x100,
2854         .height = 0x0,
2855         .strideAlignment = 0x8,
2856         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2857         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2858     };
2859     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, 3);
2860     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2861 
2862     requestConfigTmp = {
2863         .width = 0x100,
2864         .height = 0x100,
2865         .strideAlignment = 0x8,
2866         .format = GRAPHIC_PIXEL_FMT_BUTT,
2867         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2868     };
2869     ret = pSurfaceTmp->PreAllocBuffers(requestConfigTmp, 3);
2870     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2871 
2872     pSurfaceTmp = nullptr;
2873     producerTmp = nullptr;
2874     cSurfTmp = nullptr;
2875 }
2876 
2877 /*
2878 * Function: ProducerSurfaceLockBuffer
2879 * Type: Function
2880 * Rank: Important(2)
2881 * EnvConditions: N/A
2882 * CaseDescription: 1. preSetUp: producer_ is nullptr, calls locl buffer and check the ret
2883 *                  2. operation: calls ProducerSurfaceLockBuffer with valid config
2884 *                  3. result: calls lock buffer return GSE_ERROR_INVALID_ARGUMENTS
2885 */
2886 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceLockBuffer001, TestSize.Level0)
2887 {
2888     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2889     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2890     cSurfTmp->RegisterConsumerListener(listenerTmp);
2891     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
2892     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
2893 
2894     BufferRequestConfig requestConfig= {
2895         .width = 0x100,
2896         .height = 0x100,
2897         .strideAlignment = 0x8,
2898         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2899         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2900     };
2901     Region::Rect rect = {0};
2902     rect.x = 0x100;
2903     rect.y = 0x100;
2904     rect.w = 0x100;
2905     rect.h = 0x100;
2906     Region region = {.rects = &rect, .rectNumber = 1};
2907     sptr<SurfaceBuffer> buffer = nullptr;
2908     pSurfaceTmp->producer_ = nullptr;
2909     GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
2910     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
2911     ASSERT_EQ(pSurfaceTmp->region_.rects, nullptr);
2912     ASSERT_EQ(pSurfaceTmp->mLockedBuffer_, nullptr);
2913     ASSERT_EQ(buffer, nullptr);
2914 }
2915 
2916 /*
2917 * Function: ProducerSurfaceLockBuffer
2918 * Type: Function
2919 * Rank: Important(2)
2920 * EnvConditions: N/A
2921 * CaseDescription: 1. preSetUp: native window is unlocked, calls locl buffer and check the ret
2922 *                  2. operation: calls lock buffer with valid config
2923 *                  3. result: calls lock buffer return ok
2924 */
2925 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceLockBuffer002, TestSize.Level0)
2926 {
2927     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2928     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2929     cSurfTmp->RegisterConsumerListener(listenerTmp);
2930     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
2931     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
2932 
2933     BufferRequestConfig requestConfig = {
2934         .width = 0x100,
2935         .height = 0x100,
2936         .strideAlignment = 0x8,
2937         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2938         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2939     };
2940     Region::Rect rect = {0};
2941     rect.x = 0x100;
2942     rect.y = 0x100;
2943     rect.w = 0x100;
2944     rect.h = 0x100;
2945     Region region = {.rects = &rect, .rectNumber = 1};
2946     sptr<SurfaceBuffer> buffer = nullptr;
2947 
2948     GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
2949     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
2950     ASSERT_EQ(pSurfaceTmp->region_.rects->x, 0x100);
2951     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
2952     ASSERT_NE(buffer, nullptr);
2953 
2954     ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
2955     ASSERT_EQ(ret, GSERROR_INVALID_OPERATING);
2956     pSurfaceTmp = nullptr;
2957 }
2958 
2959 /*
2960  * Function: ProducerSurfaceLockBuffer
2961  * Type: Function
2962  * Rank: Important(2)
2963  * EnvConditions: N/A
2964  * CaseDescription: 1. preSetUp: native window is unlocked, calls locl buffer and check the ret
2965  *                  2. operation: calls lock buffer with valid config
2966  *                  3. result: calls lock buffer return ok
2967  */
2968 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceLockBuffer003, TestSize.Level0)
2969 {
2970     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
2971     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
2972     cSurfTmp->RegisterConsumerListener(listenerTmp);
2973     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
2974     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
2975 
2976     BufferRequestConfig requestConfig = {
2977         .width = 0x100,
2978         .height = 0x100,
2979         .strideAlignment = 0x8,
2980         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
2981         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
2982     };
2983     Region::Rect rect = {0};
2984     rect.x = 0x100;
2985     rect.y = 0x100;
2986     rect.w = 0x100;
2987     rect.h = 0x100;
2988     Region region = {.rects = &rect, .rectNumber = 1};
2989     sptr<SurfaceBuffer> buffer = nullptr;
2990     uint32_t bufferQueueSize = 3;
2991     for (uint32_t i = 0; i < bufferQueueSize; i++) {
2992         GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
2993         ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
2994         ASSERT_EQ(pSurfaceTmp->region_.rects->x, 0x100);
2995         ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
2996         ASSERT_NE(buffer, nullptr);
2997 
2998         ret = pSurfaceTmp->ProducerSurfaceUnlockAndFlushBuffer();
2999         ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3000     }
3001     buffer = nullptr;
3002     int32_t flushFence;
3003     int64_t timeStampTmp = 0;
3004     Rect damageTmp = {};
3005     for (uint32_t i = 0; i < bufferQueueSize; ++i) {
3006         GSError ret = cSurfTmp->AcquireBuffer(buffer, flushFence, timeStampTmp, damageTmp);
3007         ASSERT_EQ(ret, OHOS::GSERROR_OK);
3008         ret = cSurfTmp->ReleaseBuffer(buffer, -1);
3009         ASSERT_EQ(ret, OHOS::GSERROR_OK);
3010     }
3011     EXPECT_EQ(OHOS::GSERROR_NO_BUFFER, cSurfTmp->AcquireBuffer(buffer, flushFence, timeStampTmp, damageTmp));
3012 }
3013 
3014 /*
3015 * Function: ProducerSurfaceUnlockAndFlushBuffer
3016 * Type: Function
3017 * Rank: Important(2)
3018 * EnvConditions: N/A
3019 * CaseDescription: 1. preSetUp: producer_ is nullptr, calls unlock and flush buffer and check the ret
3020 *                  2. operation: calls unlock buffer with valid config
3021 *                  3. result: calls unlock buffer return ok
3022 */
3023 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceUnlockAndFlushBuffer001, TestSize.Level0)
3024 {
3025     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3026     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3027     cSurfTmp->RegisterConsumerListener(listenerTmp);
3028     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
3029     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
3030 
3031     BufferRequestConfig requestConfig = {
3032         .width = 0x100,
3033         .height = 0x100,
3034         .strideAlignment = 0x8,
3035         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3036         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3037     };
3038     Region::Rect rect = {0};
3039     rect.x = 0x100;
3040     rect.y = 0x100;
3041     rect.w = 0x100;
3042     rect.h = 0x100;
3043     Region region = {.rects = &rect, .rectNumber = 1};
3044     sptr<SurfaceBuffer> buffer = nullptr;
3045 
3046     GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
3047     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3048     ASSERT_EQ(pSurfaceTmp->region_.rects->x, 0x100);
3049     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
3050     ASSERT_NE(buffer, nullptr);
3051 
3052     pSurfaceTmp->producer_ = nullptr;
3053     ret = pSurfaceTmp->ProducerSurfaceUnlockAndFlushBuffer();
3054     ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
3055     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
3056     ASSERT_NE(pSurfaceTmp->region_.rects, nullptr);
3057 }
3058 
3059 /*
3060 * Function: ProducerSurfaceUnlockAndFlushBuffer
3061 * Type: Function
3062 * Rank: Important(2)
3063 * EnvConditions: N/A
3064 * CaseDescription: 1. preSetUp: native buffer is locked, calls unlock and flush buffer and check the ret
3065 *                  2. operation: calls unlock and flush buffer with valid config
3066 *                  3. result: calls unlock buffer return ok
3067 */
3068 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceUnlockAndFlushBuffer002, TestSize.Level0)
3069 {
3070     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3071     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3072     cSurfTmp->RegisterConsumerListener(listenerTmp);
3073     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
3074     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
3075 
3076     BufferRequestConfig requestConfig = {
3077         .width = 0x100,
3078         .height = 0x100,
3079         .strideAlignment = 0x8,
3080         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3081         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3082     };
3083     Region::Rect rect = {0};
3084     rect.x = 0x100;
3085     rect.y = 0x100;
3086     rect.w = 0x100;
3087     rect.h = 0x100;
3088     Region region = {.rects = &rect, .rectNumber = 1};
3089     sptr<SurfaceBuffer> buffer = nullptr;
3090 
3091     GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
3092     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3093     ASSERT_EQ(pSurfaceTmp->region_.rects->x, 0x100);
3094     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
3095     ASSERT_NE(buffer, nullptr);
3096 
3097     ret = pSurfaceTmp->ProducerSurfaceUnlockAndFlushBuffer();
3098     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3099     ASSERT_EQ(pSurfaceTmp->mLockedBuffer_, nullptr);
3100     ASSERT_EQ(pSurfaceTmp->region_.rects, nullptr);
3101 
3102     ret = pSurfaceTmp->ProducerSurfaceUnlockAndFlushBuffer();
3103     ASSERT_EQ(ret, GSERROR_INVALID_OPERATING);
3104     pSurfaceTmp = nullptr;
3105 }
3106 
3107 /*
3108 * Function: ProducerSurfaceUnlockAndFlushBuffer
3109 * Type: Function
3110 * Rank: Important(2)
3111 * EnvConditions: N/A
3112 * CaseDescription: 1. preSetUp: native buffer is locked, calls unlock and flush buffer and check the ret
3113 *                  2. operation: calls unlock and flush buffer with valid config and null rect
3114 *                  3. result: calls unlock buffer return ok
3115 */
3116 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceUnlockAndFlushBuffer003, TestSize.Level0)
3117 {
3118     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3119     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3120     cSurfTmp->RegisterConsumerListener(listenerTmp);
3121     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
3122     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
3123 
3124     BufferRequestConfig requestConfig = {
3125         .width = 0x100,
3126         .height = 0x100,
3127         .strideAlignment = 0x8,
3128         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3129         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3130     };
3131     Region region = {.rects = nullptr, .rectNumber = 0};
3132     sptr<SurfaceBuffer> buffer = nullptr;
3133 
3134     GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
3135     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3136     ASSERT_EQ(pSurfaceTmp->region_.rects, nullptr);
3137     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
3138     ASSERT_NE(buffer, nullptr);
3139 
3140     ret = pSurfaceTmp->ProducerSurfaceUnlockAndFlushBuffer();
3141     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3142     ASSERT_EQ(pSurfaceTmp->mLockedBuffer_, nullptr);
3143     ASSERT_EQ(pSurfaceTmp->region_.rects, nullptr);
3144 }
3145 
3146 /*
3147 * Function: ProducerSurfaceUnlockAndFlushBuffer
3148 * Type: Function
3149 * Rank: Important(2)
3150 * EnvConditions: N/A
3151 * CaseDescription: 1. preSetUp: native buffer is locked, calls unlock and flush buffer and check the ret
3152 *                  2. operation: calls unlock and flush buffer with valid config and null rect, but no comsumer
3153 *                  3. result: calls unlock buffer return GSERROR_NO_CONSUMER
3154 */
3155 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceUnlockAndFlushBuffer004, TestSize.Level0)
3156 {
3157     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3158     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3159     cSurfTmp->RegisterConsumerListener(listenerTmp);
3160     sptr<IBufferProducer> producer = cSurfTmp->GetProducer();
3161     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer);
3162 
3163     BufferRequestConfig requestConfig = {
3164         .width = 0x100,
3165         .height = 0x100,
3166         .strideAlignment = 0x8,
3167         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3168         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3169     };
3170     Region region = {.rects = nullptr, .rectNumber = 0};
3171     sptr<SurfaceBuffer> buffer = nullptr;
3172 
3173     GSError ret = pSurfaceTmp->ProducerSurfaceLockBuffer(requestConfig, region, buffer);
3174     ASSERT_EQ(ret, OHOS::SURFACE_ERROR_OK);
3175     ASSERT_EQ(pSurfaceTmp->region_.rects, nullptr);
3176     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
3177     ASSERT_NE(buffer, nullptr);
3178 
3179     cSurfTmp = nullptr;
3180     ret = pSurfaceTmp->ProducerSurfaceUnlockAndFlushBuffer();
3181     ASSERT_EQ(ret, OHOS::GSERROR_NO_CONSUMER);
3182     ASSERT_NE(pSurfaceTmp->mLockedBuffer_, nullptr);
3183     ASSERT_EQ(pSurfaceTmp->region_.rects, nullptr);
3184 }
3185 
3186 /*
3187 * Function: ProducerSurfaceBlockRequestAndNoBlockRequest
3188 * Type: Function
3189 * Rank: Important(2)
3190 * EnvConditions: N/A
3191 * CaseDescription: 1. preSetUp: set RequestBuffer mode is block mode.
3192 *                  2. operation: call multiple RequestBuffer between mode is block and noBlock.
3193 *                  3. result: start calling RequestBuffer and return GSERROR_OK.
3194 *                     After call RequestBuffer return GSERROR_NO_BUFFER.
3195 *                     Final call RequestBuffer return GSERROR_NO_BUFFER.
3196 */
3197 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceBlockRequestAndNoBlockRequest001, TestSize.Level0)
3198 {
3199     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3200     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3201     cSurfTmp->RegisterConsumerListener(listenerTmp);
3202     sptr<IBufferProducer> producerTest = cSurfTmp->GetProducer();
3203     sptr<ProducerSurface> pSurfaceTmpTest = new ProducerSurface(producerTest);
3204 
3205     BufferRequestConfig requestConfig = {
3206         .width = 0x100,
3207         .height = 0x100,
3208         .strideAlignment = 0x8,
3209         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3210         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3211         .timeout = 3000,
3212     };
3213 
3214     sptr<SurfaceBuffer> buffer1;
3215     int releaseFence = -1;
3216     GSError ret = pSurfaceTmpTest->RequestBuffer(buffer1, releaseFence, requestConfig);
3217     std::cout << "get buffer1: " << buffer1 << std::endl;
3218     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3219     ASSERT_NE(buffer1, nullptr);
3220 
3221     sptr<SurfaceBuffer> buffer2;
3222     ret = pSurfaceTmpTest->RequestBuffer(buffer2, releaseFence, requestConfig);
3223     std::cout << "get buffer2: " << buffer2 << std::endl;
3224     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3225     ASSERT_NE(buffer2, nullptr);
3226 
3227     sptr<SurfaceBuffer> buffer3;
3228     ret = pSurfaceTmpTest->RequestBuffer(buffer3, releaseFence, requestConfig);
3229     std::cout << "get buffer3: " << buffer3 << std::endl;
3230     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3231     ASSERT_NE(buffer3, nullptr);
3232 
3233     sptr<SurfaceBuffer> bufferBlock;
3234     auto start = std::chrono::high_resolution_clock::now();
3235     ret = pSurfaceTmpTest->RequestBuffer(bufferBlock, releaseFence, requestConfig);
3236     auto end = std::chrono::high_resolution_clock::now();
3237     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3238     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3239     ASSERT_GE(duration.count(), 3000); // 确认阻塞
3240     std::cout << "get bufferBlock: " << bufferBlock << std::endl;
3241     ASSERT_EQ(ret, OHOS::GSERROR_NO_BUFFER);
3242     ASSERT_EQ(bufferBlock, nullptr);
3243 
3244     pSurfaceTmpTest->SetRequestBufferNoblockMode(true); // 设置为非阻塞模式
3245     sptr<SurfaceBuffer> bufferNoBlock;
3246     start = std::chrono::high_resolution_clock::now();
3247     ret = pSurfaceTmpTest->RequestBuffer(bufferNoBlock, releaseFence, requestConfig);
3248     end = std::chrono::high_resolution_clock::now();
3249     duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3250     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3251     ASSERT_LT(duration.count(), 5); // 确认非阻塞 5 means timeout value
3252     ASSERT_EQ(ret, OHOS::GSERROR_NO_BUFFER);
3253     ASSERT_EQ(bufferNoBlock, nullptr);
3254 }
3255 
3256 /*
3257 * Function: ProducerSurfaceNoBlockRequestAndFlushBuffer
3258 * Type: Function
3259 * Rank: Important(2)
3260 * EnvConditions: N/A
3261 * CaseDescription: 1. preSetUp: set RequestBuffer mode is block mode.
3262 *                  2. operation: call multiple RequestBuffer and
3263 *                     set mode is noblock then call RequestBuffer once after call FlushBuffer.
3264 *                  3. result: start calling RequestBuffer and return GSERROR_OK.
3265 *                     After call RequestBuffer return GSERROR_NO_BUFFER.
3266 *                     Final call RequestBuffer return GSERROR_OK.
3267 */
3268 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceNoBlockRequestAndFlushBuffer001, TestSize.Level0)
3269 {
3270     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3271     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3272     cSurfTmp->RegisterConsumerListener(listenerTmp);
3273     sptr<IBufferProducer> producerTest = cSurfTmp->GetProducer();
3274     sptr<ProducerSurface> pSurfaceTmpTest = new ProducerSurface(producerTest);
3275 
3276     BufferRequestConfig requestConfig = {
3277         .width = 0x100,
3278         .height = 0x100,
3279         .strideAlignment = 0x8,
3280         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3281         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3282         .timeout = 3000,
3283     };
3284 
3285     sptr<SurfaceBuffer> buffer1;
3286     int releaseFence = -1;
3287     GSError ret = pSurfaceTmpTest->RequestBuffer(buffer1, releaseFence, requestConfig);
3288     std::cout << "get buffer1: " << buffer1 << std::endl;
3289     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3290     ASSERT_NE(buffer1, nullptr);
3291 
3292     sptr<SurfaceBuffer> buffer2;
3293     ret = pSurfaceTmpTest->RequestBuffer(buffer2, releaseFence, requestConfig);
3294     std::cout << "get buffer2: " << buffer2 << std::endl;
3295     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3296     ASSERT_NE(buffer2, nullptr);
3297 
3298     sptr<SurfaceBuffer> buffer3;
3299     ret = pSurfaceTmpTest->RequestBuffer(buffer3, releaseFence, requestConfig);
3300     std::cout << "get buffer3: " << buffer3 << std::endl;
3301     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3302     ASSERT_NE(buffer3, nullptr);
3303 
3304     sptr<SurfaceBuffer> bufferBlock;
3305     auto start = std::chrono::high_resolution_clock::now();
3306     ret = pSurfaceTmpTest->RequestBuffer(bufferBlock, releaseFence, requestConfig);
3307     auto end = std::chrono::high_resolution_clock::now();
3308     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3309     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3310     ASSERT_GE(duration.count(), 3000); // 确认阻塞 3000 means timeout value
3311     std::cout << "get bufferBlock: " << bufferBlock << std::endl;
3312     ASSERT_EQ(ret, OHOS::GSERROR_NO_BUFFER);
3313     ASSERT_EQ(bufferBlock, nullptr);
3314 
3315     pSurfaceTmpTest->SetRequestBufferNoblockMode(true); // 设置为非阻塞模式
3316     BufferFlushConfig flushConfig = {
3317         .damage = {
3318             .w = 0x100,
3319             .h = 0x100,
3320         },
3321     };
3322     ret = pSurfaceTmpTest->FlushBuffer(buffer3, releaseFence, flushConfig);
3323     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3324     ASSERT_NE(buffer3, nullptr);
3325 
3326     ret = pSurfaceTmpTest->FlushBuffer(buffer2, releaseFence, flushConfig);
3327     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3328     ASSERT_NE(buffer2, nullptr);
3329 
3330     sptr<SurfaceBuffer> buffer4;
3331     start = std::chrono::high_resolution_clock::now();
3332     ret = pSurfaceTmpTest->RequestBuffer(buffer4, releaseFence, requestConfig);
3333     end = std::chrono::high_resolution_clock::now();
3334     duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3335     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3336     ASSERT_LT(duration.count(), 5); // 确认非阻塞 5 means timeout value
3337     std::cout << "get buffer4: " << buffer4 << std::endl;
3338     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3339     ASSERT_NE(buffer4, nullptr);
3340 
3341     sptr<SurfaceBuffer> buffer5;
3342     start = std::chrono::high_resolution_clock::now();
3343     ret = pSurfaceTmpTest->RequestBuffer(buffer5, releaseFence, requestConfig);
3344     end = std::chrono::high_resolution_clock::now();
3345     duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3346     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3347     ASSERT_LT(duration.count(), 5); // 确认非阻塞 5 means timeout value
3348     std::cout << "get buffer5: " << buffer5 << std::endl;
3349     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3350     ASSERT_NE(buffer5, nullptr);
3351 }
3352 
3353 /*
3354 * Function: ProducerSurfaceNoBlockRequestAndReuseBuffer
3355 * Type: Function
3356 * Rank: Important(2)
3357 * EnvConditions: N/A
3358 * CaseDescription: 1. preSetUp: call multiple RequestBuffer.
3359 *                  2. operation: call multiple RequestBuffer and call FlushBuffer, AcquireBuffer, ReleaseBuffer.
3360 *                  3. result: start calling RequestBuffer and return GSERROR_OK.
3361 *                     Final call RequestBuffer return GSERROR_OK.
3362 */
3363 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceNoBlockRequestAndReuseBuffer001, TestSize.Level0)
3364 {
3365     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3366     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3367     cSurfTmp->RegisterConsumerListener(listenerTmp);
3368     sptr<IBufferProducer> producerTest = cSurfTmp->GetProducer();
3369     sptr<ProducerSurface> pSurfaceTmpTest = new ProducerSurface(producerTest);
3370 
3371     BufferRequestConfig requestConfig = {
3372         .width = 0x100,
3373         .height = 0x100,
3374         .strideAlignment = 0x8,
3375         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3376         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3377         .timeout = 3000,
3378     };
3379 
3380     sptr<SurfaceBuffer> buffer1;
3381     int releaseFence = -1;
3382     GSError ret = pSurfaceTmpTest->RequestBuffer(buffer1, releaseFence, requestConfig);
3383     std::cout << "get buffer1: " << buffer1 << std::endl;
3384     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3385     ASSERT_NE(buffer1, nullptr);
3386 
3387     sptr<SurfaceBuffer> buffer2;
3388     ret = pSurfaceTmpTest->RequestBuffer(buffer2, releaseFence, requestConfig);
3389     std::cout << "get buffer2: " << buffer2 << std::endl;
3390     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3391     ASSERT_NE(buffer2, nullptr);
3392 
3393     sptr<SurfaceBuffer> buffer3;
3394     ret = pSurfaceTmpTest->RequestBuffer(buffer3, releaseFence, requestConfig);
3395     std::cout << "get buffer3: " << buffer3 << std::endl;
3396     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3397     ASSERT_NE(buffer3, nullptr);
3398 
3399     sptr<SurfaceBuffer> bufferBlock;
3400     auto start = std::chrono::high_resolution_clock::now();
3401     ret = pSurfaceTmpTest->RequestBuffer(bufferBlock, releaseFence, requestConfig);
3402     auto end = std::chrono::high_resolution_clock::now();
3403     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3404     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3405     ASSERT_GE(duration.count(), 3000); // 确认阻塞 3000 means timeout value
3406     std::cout << "get bufferBlock: " << bufferBlock << std::endl;
3407     ASSERT_EQ(ret, OHOS::GSERROR_NO_BUFFER);
3408     ASSERT_EQ(bufferBlock, nullptr);
3409 
3410     BufferFlushConfig flushConfig = {
3411         .damage = {
3412             .w = 0x100,
3413             .h = 0x100,
3414         },
3415     };
3416     ret = pSurfaceTmpTest->FlushBuffer(buffer3, releaseFence, flushConfig);
3417     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3418     ASSERT_NE(buffer3, nullptr);
3419     std::cout << "get buffer3: " << buffer3 << std::endl;
3420 
3421     int64_t timestampTmp = 0;
3422     Rect damageTmp = {};
3423     sptr<OHOS::SyncFence> fence;
3424     ret = cSurfTmp->AcquireBuffer(buffer3, fence, timestampTmp, damageTmp);
3425     std::cout << "get buffer3: " << buffer3 << std::endl;
3426     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3427     ASSERT_NE(buffer3, nullptr);
3428 
3429     ret = cSurfTmp->ReleaseBuffer(buffer3, fence);
3430     std::cout << "get buffer3: " << buffer3 << std::endl;
3431     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3432     ASSERT_NE(buffer3, nullptr);
3433 
3434     pSurfaceTmpTest->SetRequestBufferNoblockMode(true); // 设置为非阻塞模式
3435 
3436     sptr<SurfaceBuffer> buffer4;
3437     start = std::chrono::high_resolution_clock::now();
3438     ret = pSurfaceTmpTest->RequestBuffer(buffer4, releaseFence, requestConfig);
3439     end = std::chrono::high_resolution_clock::now();
3440     duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3441     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3442     ASSERT_LT(duration.count(), 5); // 非阻塞 5 means timeout value
3443     std::cout << "get buffer4: " << buffer4 << std::endl;
3444     ASSERT_EQ(ret, OHOS::GSERROR_OK);
3445     ASSERT_NE(buffer4, nullptr);
3446 }
3447 
3448 /*
3449  * Function: ProducerSurfaceNoBlockRequestBufferLoopCallInterfaceTesting
3450  * Type: Function
3451  * Rank: Important(2)
3452  * EnvConditions: N/A
3453  * CaseDescription: 1. preSetUp: on noBlock mode
3454  *                  2. operation: call multiple RequestBuffer.
3455  *                  3. result: Interface execution without crash.
3456  */
3457 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceNoBlockRequestBufferLoopCallInterfaceTesting001, TestSize.Level0)
3458 {
3459     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3460     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3461     cSurfTmp->RegisterConsumerListener(listenerTmp);
3462     sptr<IBufferProducer> producerTest = cSurfTmp->GetProducer();
3463     sptr<ProducerSurface> pSurfaceTmpTest = new ProducerSurface(producerTest);
3464 
3465     BufferRequestConfig requestConfig = {
3466         .width = 0x100,
3467         .height = 0x100,
3468         .strideAlignment = 0x8,
3469         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3470         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3471         .timeout = 3000,
3472     };
3473     pSurfaceTmpTest->SetRequestBufferNoblockMode(true); // 设置为非阻塞模式
3474     BufferFlushConfig flushConfig = {
3475         .damage = {
3476             .w = 0x100,
3477             .h = 0x100,
3478         },
3479     };
3480     auto start = std::chrono::high_resolution_clock::now();
3481     for (auto i = 0; i != 1000; i++) { // 1000 means loop times
3482         sptr<SurfaceBuffer> bufferTmp;
3483         int releaseFence = -1;
3484         GSError ret = pSurfaceTmpTest->RequestBuffer(bufferTmp, releaseFence, requestConfig);
3485         ASSERT_EQ(ret, OHOS::GSERROR_OK);
3486         ASSERT_NE(bufferTmp, nullptr);
3487 
3488         ret = pSurfaceTmpTest->FlushBuffer(bufferTmp, releaseFence, flushConfig);
3489         ASSERT_EQ(ret, OHOS::GSERROR_OK);
3490         ASSERT_NE(bufferTmp, nullptr);
3491     }
3492     auto end = std::chrono::high_resolution_clock::now();
3493     auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3494     std::cout << "RequestBuffer costs: " << duration.count() << "ms" << std::endl;
3495 }
3496 
3497 /*
3498  * Function: ProducerSurfaceNoBlockRequestBufferLoopCallInterfaceTesting002
3499  * Type: Function
3500  * Rank: Important(2)
3501  * EnvConditions: N/A
3502  * CaseDescription: 1. preSetUp: on noBlock mode
3503  *                  2. operation: call multiple RequestBuffer.
3504  *                  3. result: Return GSERROR_OK for the first 3 times, and GSERROR_NO_BUFFER for the following times.
3505  */
3506 HWTEST_F(ProducerSurfaceTest, ProducerSurfaceNoBlockRequestBufferLoopCallInterfaceTesting002, TestSize.Level0)
3507 {
3508     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3509     sptr<IBufferConsumerListener> listenerTmp = new BufferConsumerListener();
3510     cSurfTmp->RegisterConsumerListener(listenerTmp);
3511     sptr<IBufferProducer> producerTest = cSurfTmp->GetProducer();
3512     sptr<ProducerSurface> pSurfaceTmpTest = new ProducerSurface(producerTest);
3513 
3514     BufferRequestConfig requestConfig = {
3515         .width = 0x100,
3516         .height = 0x100,
3517         .strideAlignment = 0x8,
3518         .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
3519         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
3520         .timeout = 3000,
3521     };
3522     pSurfaceTmpTest->SetRequestBufferNoblockMode(true); // 设置为非阻塞模式
3523     for (auto i = 0; i != 1000; i++) { // 1000 means loop times
3524         sptr<SurfaceBuffer> bufferTmp;
3525         int releaseFence = -1;
3526         auto start = std::chrono::high_resolution_clock::now();
3527         GSError ret = pSurfaceTmpTest->RequestBuffer(bufferTmp, releaseFence, requestConfig);
3528         auto end = std::chrono::high_resolution_clock::now();
3529         auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);
3530         ASSERT_LT(duration.count(), 5); // 5 means timeout value
3531         if (i < 3) { // 3 means the first three requests for buffer were successful
3532             ASSERT_EQ(ret, OHOS::GSERROR_OK);
3533             ASSERT_NE(bufferTmp, nullptr);
3534         } else {
3535             ASSERT_EQ(ret, OHOS::GSERROR_NO_BUFFER);
3536             ASSERT_EQ(bufferTmp, nullptr);
3537         }
3538     }
3539 }
3540 
3541 /*
3542  * Function: SetLppShareFd
3543  * Type: Function
3544  * Rank: Important(2)
3545  * EnvConditions: N/A
3546  * CaseDescription: SetLppShareFd
3547  */
3548 HWTEST_F(ProducerSurfaceTest, SetLppShareFd001, TestSize.Level0)
3549 {
3550     for (int i = 0; i < 1000; i++) {
3551         int fd = -1;
3552         bool state = false;
3553         sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3554         sptr<BufferQueueProducer> producer = static_cast<BufferQueueProducer *>((cSurfTmp->GetProducer()).GetRefPtr());
3555 
3556         sptr<IBufferProducer> producer1 = nullptr;
3557         sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer1);
3558         ASSERT_EQ(pSurfaceTmp->SetLppShareFd(fd, state), OHOS::GSERROR_INVALID_ARGUMENTS);
3559 
3560         pSurfaceTmp->producer_ = producer;
3561         producer->bufferQueue_ = nullptr;
3562         ASSERT_EQ(pSurfaceTmp->SetLppShareFd(fd, state), OHOS::GSERROR_INVALID_ARGUMENTS);
3563 
3564         fd = open("/dev/lpptest", O_RDWR | O_CREAT, static_cast<mode_t>(0600));
3565         ASSERT_NE(fd, -1);
3566         ASSERT_NE(ftruncate(fd, 0x1000), -1);
3567         ASSERT_EQ(pSurfaceTmp->SetLppShareFd(fd, state), OHOS::SURFACE_ERROR_UNKOWN);
3568         close(fd);
3569     }
3570 }
3571 
3572 /*
3573  * Function: SetAlphaType
3574  * Type: Function
3575  * Rank: Important(2)
3576  * EnvConditions: N/A
3577  * CaseDescription: SetAlphaType
3578  */
3579 HWTEST_F(ProducerSurfaceTest, SetAlphaType, TestSize.Level0)
3580 {
3581     GraphicAlphaType alphaType = GraphicAlphaType::GRAPHIC_ALPHATYPE_OPAQUE;
3582     sptr<IConsumerSurface> cSurfTmp = IConsumerSurface::Create();
3583     sptr<BufferQueueProducer> producer = static_cast<BufferQueueProducer *>((cSurfTmp->GetProducer()).GetRefPtr());
3584 
3585     sptr<IBufferProducer> producer1 = nullptr;
3586     sptr<ProducerSurface> pSurfaceTmp = new ProducerSurface(producer1);
3587     ASSERT_EQ(pSurfaceTmp->SetAlphaType(alphaType), OHOS::SURFACE_ERROR_UNKOWN);
3588 
3589     pSurfaceTmp->producer_ = producer;
3590     ASSERT_NE(pSurfaceTmp->SetAlphaType(alphaType), OHOS::SURFACE_ERROR_UNKOWN);
3591 }
3592 }
3593