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