1/*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15#include <gtest/gtest.h>
16#include "iconsumer_surface.h"
17#include <iservice_registry.h>
18#include <native_window.h>
19#include <securec.h>
20#include <ctime>
21#include "buffer_log.h"
22#include "external_window.h"
23#include "surface_utils.h"
24#include "sync_fence.h"
25#include "ipc_inner_object.h"
26#include "ipc_cparcel.h"
27
28using namespace std;
29using namespace testing;
30using namespace testing::ext;
31
32namespace OHOS::Rosen {
33class BufferConsumerListener : public IBufferConsumerListener {
34public:
35    void OnBufferAvailable() override
36    {
37    }
38};
39
40static OHExtDataHandle *AllocOHExtDataHandle(uint32_t reserveInts)
41{
42    size_t handleSize = sizeof(OHExtDataHandle) + (sizeof(int32_t) * reserveInts);
43    OHExtDataHandle *handle = static_cast<OHExtDataHandle *>(malloc(handleSize));
44    if (handle == nullptr) {
45        BLOGE("AllocOHExtDataHandle malloc %zu failed", handleSize);
46        return nullptr;
47    }
48    auto ret = memset_s(handle, handleSize, 0, handleSize);
49    if (ret != EOK) {
50        BLOGE("AllocOHExtDataHandle memset_s failed");
51        free(handle);
52        return nullptr;
53    }
54    handle->fd = -1;
55    handle->reserveInts = reserveInts;
56    for (uint32_t i = 0; i < reserveInts; i++) {
57        handle->reserve[i] = -1;
58    }
59    return handle;
60}
61
62static void FreeOHExtDataHandle(OHExtDataHandle *handle)
63{
64    if (handle == nullptr) {
65        BLOGW("FreeOHExtDataHandle with nullptr handle");
66        return ;
67    }
68    if (handle->fd >= 0) {
69        close(handle->fd);
70        handle->fd = -1;
71    }
72    free(handle);
73}
74
75class NativeWindowTest : public testing::Test {
76public:
77    static void SetUpTestCase();
78    static void TearDownTestCase();
79
80    static inline BufferRequestConfig requestConfig = {};
81    static inline BufferFlushConfig flushConfig = {};
82    static inline sptr<OHOS::IConsumerSurface> cSurface = nullptr;
83    static inline sptr<OHOS::IBufferProducer> producer = nullptr;
84    static inline sptr<OHOS::Surface> pSurface = nullptr;
85    static inline sptr<OHOS::SurfaceBuffer> sBuffer = nullptr;
86    static inline NativeWindow* nativeWindow = nullptr;
87    static inline NativeWindowBuffer* nativeWindowBuffer = nullptr;
88    static inline uint32_t firstSeqnum = 0;
89};
90
91void NativeWindowTest::SetUpTestCase()
92{
93    requestConfig = {
94        .width = 0x100,  // small
95        .height = 0x100, // small
96        .strideAlignment = 0x8,
97        .format = GRAPHIC_PIXEL_FMT_RGBA_8888,
98        .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
99        .timeout = 0,
100    };
101
102    cSurface = IConsumerSurface::Create();
103    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
104    cSurface->RegisterConsumerListener(listener);
105    producer = cSurface->GetProducer();
106    pSurface = Surface::CreateSurfaceAsProducer(producer);
107    int32_t fence;
108    pSurface->RequestBuffer(sBuffer, fence, requestConfig);
109    firstSeqnum = sBuffer->GetSeqNum();
110}
111
112void NativeWindowTest::TearDownTestCase()
113{
114    flushConfig = { .damage = {
115        .w = 0x100,
116        .h = 0x100,
117    } };
118    pSurface->FlushBuffer(sBuffer, -1, flushConfig);
119    sBuffer = nullptr;
120    cSurface = nullptr;
121    producer = nullptr;
122    pSurface = nullptr;
123    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
124    nativeWindow = nullptr;
125    nativeWindowBuffer = nullptr;
126}
127
128/*
129* Function: OH_NativeWindow_CreateNativeWindow
130* Type: Function
131* Rank: Important(2)
132* EnvConditions: N/A
133* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindow by abnormal input
134*                  2. check ret
135 */
136HWTEST_F(NativeWindowTest, CreateNativeWindow001, Function | MediumTest | Level2)
137{
138    ASSERT_EQ(OH_NativeWindow_CreateNativeWindow(nullptr), nullptr);
139}
140
141/*
142* Function: OH_NativeWindow_CreateNativeWindow
143* Type: Function
144* Rank: Important(2)
145* EnvConditions: N/A
146* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindow
147*                  2. check ret
148 */
149HWTEST_F(NativeWindowTest, CreateNativeWindow002, Function | MediumTest | Level2)
150{
151    nativeWindow = OH_NativeWindow_CreateNativeWindow(&pSurface);
152    ASSERT_NE(nativeWindow, nullptr);
153}
154
155/*
156* Function: OH_NativeWindow_CreateNativeWindow
157* Type: Function
158* Rank: Important(2)
159* EnvConditions: N/A
160* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindow
161*                  2. check ret
162 */
163HWTEST_F(NativeWindowTest, CreateNativeWindow003, Function | MediumTest | Level2)
164{
165    uint64_t surfaceId = 0;
166    int32_t ret = OH_NativeWindow_GetSurfaceId(nativeWindow, &surfaceId);
167    ASSERT_EQ(ret, OHOS::GSERROR_OK);
168    ASSERT_EQ(surfaceId, pSurface->GetUniqueId());
169}
170
171/*
172* Function: OH_NativeWindow_CreateNativeWindow
173* Type: Function
174* Rank: Important(2)
175* EnvConditions: N/A
176* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindow
177*                  2. check ret
178 */
179HWTEST_F(NativeWindowTest, CreateNativeWindow004, Function | MediumTest | Level2)
180{
181    sptr<OHOS::Surface> surfaceTmp = nullptr;
182    auto nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&surfaceTmp);
183    ASSERT_EQ(nativeWindowTmp, nullptr);
184}
185
186/*
187* Function: OH_NativeWindow_CreateNativeWindowFromSurfaceId
188* Type: Function
189* Rank: Important(2)
190* EnvConditions: N/A
191* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindowFromSurfaceId
192*                  2. check ret
193 */
194HWTEST_F(NativeWindowTest, CreateNativeWindowFromSurfaceId001, Function | MediumTest | Level2)
195{
196    uint64_t surfaceId = static_cast<uint64_t>(pSurface->GetUniqueId());
197    OHNativeWindow *window = nullptr;
198    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &window);
199    ASSERT_EQ(ret, OHOS::GSERROR_OK);
200    surfaceId = 0;
201    ret = OH_NativeWindow_GetSurfaceId(window, &surfaceId);
202    ASSERT_EQ(ret, OHOS::GSERROR_OK);
203    ASSERT_EQ(surfaceId, pSurface->GetUniqueId());
204    OH_NativeWindow_DestroyNativeWindow(window);
205}
206
207/*
208* Function: OH_NativeWindow_CreateNativeWindowFromSurfaceId
209* Type: Function
210* Rank: Important(2)
211* EnvConditions: N/A
212* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindowFromSurfaceId
213*                  2. check ret
214 */
215HWTEST_F(NativeWindowTest, CreateNativeWindowFromSurfaceId002, Function | MediumTest | Level2)
216{
217    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(0, nullptr);
218    ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
219    ret = OH_NativeWindow_GetSurfaceId(nullptr, nullptr);
220    ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
221}
222
223/*
224* Function: OH_NativeWindow_CreateNativeWindowFromSurfaceId
225* Type: Function
226* Rank: Important(2)
227* EnvConditions: N/A
228* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindowFromSurfaceId
229*                  2. check ret
230 */
231HWTEST_F(NativeWindowTest, CreateNativeWindowFromSurfaceId003, Function | MediumTest | Level2)
232{
233    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
234    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
235    cSurfaceTmp->RegisterConsumerListener(listener);
236    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
237    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
238
239    uint64_t surfaceId = static_cast<uint64_t>(pSurfaceTmp->GetUniqueId());
240    auto utils = SurfaceUtils::GetInstance();
241    utils->Add(surfaceId, pSurfaceTmp);
242    OHNativeWindow *nativeWindowTmp = nullptr;
243    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(0xFFFFFFFF, &nativeWindowTmp);
244    ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS);
245    ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &nativeWindowTmp);
246    ASSERT_EQ(ret, OHOS::GSERROR_OK);
247    surfaceId = 0;
248    ret = OH_NativeWindow_GetSurfaceId(nativeWindowTmp, &surfaceId);
249    ASSERT_EQ(ret, OHOS::GSERROR_OK);
250    ASSERT_EQ(surfaceId, pSurfaceTmp->GetUniqueId());
251
252    cSurfaceTmp = nullptr;
253    producerTmp = nullptr;
254    pSurfaceTmp = nullptr;
255    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
256}
257
258/*
259* Function: OH_NativeWindow_NativeWindowHandleOpt
260* Type: Function
261* Rank: Important(2)
262* EnvConditions: N/A
263* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by abnormal input
264*                  2. check ret
265 */
266HWTEST_F(NativeWindowTest, HandleOpt001, Function | MediumTest | Level2)
267{
268    int code = SET_USAGE;
269    uint64_t usage = BUFFER_USAGE_CPU_READ;
270    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nullptr, code, usage), OHOS::GSERROR_INVALID_ARGUMENTS);
271}
272
273/*
274* Function: OH_NativeWindow_NativeWindowHandleOpt
275* Type: Function
276* Rank: Important(2)
277* EnvConditions: N/A
278* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
279*                  2. check ret
280 */
281HWTEST_F(NativeWindowTest, HandleOpt002, Function | MediumTest | Level2)
282{
283    int code = SET_USAGE;
284    uint64_t usageSet = BUFFER_USAGE_CPU_READ;
285    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, usageSet), OHOS::GSERROR_OK);
286
287    code = GET_USAGE;
288    uint64_t usageGet = BUFFER_USAGE_CPU_WRITE;
289    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &usageGet), OHOS::GSERROR_OK);
290    ASSERT_EQ(usageSet, usageGet);
291}
292
293/*
294* Function: OH_NativeWindow_NativeWindowHandleOpt
295* Type: Function
296* Rank: Important(2)
297* EnvConditions: N/A
298* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
299*                  2. check ret
300 */
301HWTEST_F(NativeWindowTest, HandleOpt003, Function | MediumTest | Level2)
302{
303    int code = SET_BUFFER_GEOMETRY;
304    int32_t heightSet = 0x100;
305    int32_t widthSet = 0x100;
306    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, heightSet, widthSet), OHOS::GSERROR_OK);
307
308    code = GET_BUFFER_GEOMETRY;
309    int32_t heightGet = 0;
310    int32_t widthGet = 0;
311    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &heightGet, &widthGet), OHOS::GSERROR_OK);
312    ASSERT_EQ(heightSet, heightGet);
313    ASSERT_EQ(widthSet, widthGet);
314}
315
316/*
317* Function: OH_NativeWindow_NativeWindowHandleOpt
318* Type: Function
319* Rank: Important(2)
320* EnvConditions: N/A
321* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
322*                  2. check ret
323 */
324HWTEST_F(NativeWindowTest, HandleOpt004, Function | MediumTest | Level2)
325{
326    int code = SET_FORMAT;
327    int32_t formatSet = GRAPHIC_PIXEL_FMT_RGBA_8888;
328    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, formatSet), OHOS::GSERROR_OK);
329
330    code = GET_FORMAT;
331    int32_t formatGet = GRAPHIC_PIXEL_FMT_CLUT8;
332    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &formatGet), OHOS::GSERROR_OK);
333    ASSERT_EQ(formatSet, formatGet);
334}
335
336/*
337* Function: OH_NativeWindow_NativeWindowHandleOpt
338* Type: Function
339* Rank: Important(2)
340* EnvConditions: N/A
341* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
342*                  2. check ret
343 */
344HWTEST_F(NativeWindowTest, HandleOpt005, Function | MediumTest | Level2)
345{
346    int code = SET_STRIDE;
347    int32_t strideSet = 0x8;
348    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, strideSet), OHOS::GSERROR_OK);
349
350    code = GET_STRIDE;
351    int32_t strideGet = 0;
352    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &strideGet), OHOS::GSERROR_OK);
353    ASSERT_EQ(strideSet, strideGet);
354}
355
356/*
357* Function: OH_NativeWindow_NativeWindowHandleOpt
358* Type: Function
359* Rank: Important(2)
360* EnvConditions: N/A
361* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
362*                  2. check ret
363 */
364HWTEST_F(NativeWindowTest, HandleOpt006, Function | MediumTest | Level2)
365{
366    int code = SET_COLOR_GAMUT;
367    int32_t colorGamutSet = static_cast<int32_t>(GraphicColorGamut::GRAPHIC_COLOR_GAMUT_DCI_P3);
368    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, colorGamutSet), OHOS::GSERROR_OK);
369
370    code = GET_COLOR_GAMUT;
371    int32_t colorGamutGet = 0;
372    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &colorGamutGet), OHOS::GSERROR_OK);
373    ASSERT_EQ(colorGamutSet, colorGamutGet);
374}
375
376/*
377* Function: OH_NativeWindow_NativeWindowHandleOpt
378* Type: Function
379* Rank: Important(2)
380* EnvConditions: N/A
381* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
382*                  2. check ret
383 */
384HWTEST_F(NativeWindowTest, HandleOpt007, Function | MediumTest | Level2)
385{
386    int code = SET_TIMEOUT;
387    int32_t timeoutSet = 10;  // 10: for test
388    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, timeoutSet), OHOS::GSERROR_OK);
389
390    code = GET_TIMEOUT;
391    int32_t timeoutGet = 0;
392    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &timeoutGet), OHOS::GSERROR_OK);
393    ASSERT_EQ(timeoutSet, timeoutGet);
394}
395
396/*
397* Function: OH_NativeWindow_NativeWindowHandleOpt
398* Type: Function
399* Rank: Important(2)
400* EnvConditions: N/A
401* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
402*                  2. check ret
403 */
404HWTEST_F(NativeWindowTest, HandleOpt008, Function | MediumTest | Level1)
405{
406    int code = GET_TRANSFORM;
407    int32_t transform = 0;
408    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &transform), OHOS::GSERROR_OK);
409    transform = GraphicTransformType::GRAPHIC_ROTATE_90;
410    code = SET_TRANSFORM;
411    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, transform), OHOS::GSERROR_OK);
412    int32_t transformTmp = 0;
413    code = GET_TRANSFORM;
414    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &transformTmp), OHOS::GSERROR_OK);
415    ASSERT_EQ(transformTmp, GraphicTransformType::GRAPHIC_ROTATE_90);
416    nativeWindow->surface->SetTransform(GraphicTransformType::GRAPHIC_ROTATE_180);
417    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &transformTmp), OHOS::GSERROR_OK);
418    ASSERT_EQ(transformTmp, GraphicTransformType::GRAPHIC_ROTATE_180);
419}
420
421/*
422* Function: OH_NativeWindow_NativeWindowHandleOpt
423* Type: Function
424* Rank: Important(2)
425* EnvConditions: N/A
426* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
427*                  2. check ret
428 */
429HWTEST_F(NativeWindowTest, HandleOpt009, Function | MediumTest | Level1)
430{
431    int code = GET_BUFFERQUEUE_SIZE;
432    int32_t queueSize = 0;
433    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &queueSize), OHOS::GSERROR_OK);
434    ASSERT_EQ(queueSize, 3);
435    nativeWindow->surface->SetQueueSize(5);
436    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &queueSize), OHOS::GSERROR_OK);
437    ASSERT_EQ(queueSize, 5);
438}
439
440/*
441* Function: OH_NativeWindow_NativeWindowHandleOpt
442* Type: Function
443* Rank: Important(2)
444* EnvConditions: N/A
445* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
446*                  2. check ret
447 */
448HWTEST_F(NativeWindowTest, HandleOpt010, Function | MediumTest | Level2)
449{
450    int code = SET_USAGE;
451    uint64_t usageSet = NATIVEBUFFER_USAGE_HW_RENDER | NATIVEBUFFER_USAGE_HW_TEXTURE |
452    NATIVEBUFFER_USAGE_CPU_READ_OFTEN | NATIVEBUFFER_USAGE_ALIGNMENT_512;
453    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, usageSet), OHOS::GSERROR_OK);
454
455    code = GET_USAGE;
456    uint64_t usageGet = usageSet;
457    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &usageGet), OHOS::GSERROR_OK);
458    ASSERT_EQ(usageSet, usageGet);
459
460    code = SET_FORMAT;
461    int32_t formatSet = NATIVEBUFFER_PIXEL_FMT_YCBCR_P010;
462    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, formatSet), OHOS::GSERROR_OK);
463
464    code = GET_FORMAT;
465    int32_t formatGet = NATIVEBUFFER_PIXEL_FMT_YCBCR_P010;
466    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &formatGet), OHOS::GSERROR_OK);
467    ASSERT_EQ(formatSet, formatGet);
468}
469
470/*
471* Function: OH_NativeWindow_NativeWindowHandleOpt
472* Type: Function
473* Rank: Important(2)
474* EnvConditions: N/A
475* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
476*                  2. check ret
477 */
478HWTEST_F(NativeWindowTest, HandleOpt011, Function | MediumTest | Level1)
479{
480    int code = SET_SOURCE_TYPE;
481    OHSurfaceSource typeSet = OHSurfaceSource::OH_SURFACE_SOURCE_GAME;
482    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, typeSet), OHOS::GSERROR_OK);
483
484    code = GET_SOURCE_TYPE;
485    OHSurfaceSource typeGet = OHSurfaceSource::OH_SURFACE_SOURCE_DEFAULT;
486    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &typeGet), OHOS::GSERROR_OK);
487    ASSERT_EQ(typeSet, typeGet);
488}
489
490/*
491* Function: OH_NativeWindow_NativeWindowHandleOpt
492* Type: Function
493* Rank: Important(2)
494* EnvConditions: N/A
495* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
496*                  2. check ret
497 */
498HWTEST_F(NativeWindowTest, HandleOpt012, Function | MediumTest | Level1)
499{
500    int code = SET_APP_FRAMEWORK_TYPE;
501    const char* typeSet = "test";
502    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, typeSet), OHOS::GSERROR_OK);
503
504    code = GET_APP_FRAMEWORK_TYPE;
505    const char* typeGet;
506    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, &typeGet), OHOS::GSERROR_OK);
507    ASSERT_EQ(0, strcmp(typeSet, typeGet));
508}
509
510/*
511* Function: OH_NativeWindow_NativeWindowHandleOpt
512* Type: Function
513* Rank: Important(2)
514* EnvConditions: N/A
515* CaseDescription: 1. call OH_NativeWindow_NativeWindowHandleOpt by different param
516*                  2. check ret
517 */
518HWTEST_F(NativeWindowTest, HandleOpt013, Function | MediumTest | Level1)
519{
520    int code = SET_HDR_WHITE_POINT_BRIGHTNESS;
521    float brightness = 0.8;
522    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
523
524    code = SET_SDR_WHITE_POINT_BRIGHTNESS;
525    brightness = 0.5;
526    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
527
528    ASSERT_EQ(fabs(cSurface->GetHdrWhitePointBrightness() - 0.8) < 1e-6, true);
529    ASSERT_EQ(fabs(cSurface->GetSdrWhitePointBrightness() - 0.5) < 1e-6, true);
530
531    code = SET_HDR_WHITE_POINT_BRIGHTNESS;
532    brightness = 1.8;
533    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
534    ASSERT_EQ(fabs(cSurface->GetHdrWhitePointBrightness() - 0.8) < 1e-6, true);
535    brightness = -0.5;
536    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
537    ASSERT_EQ(fabs(cSurface->GetHdrWhitePointBrightness() - 0.8) < 1e-6, true);
538    brightness = 0.5;
539    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
540    ASSERT_EQ(fabs(cSurface->GetHdrWhitePointBrightness() - 0.5) < 1e-6, true);
541
542    code = SET_SDR_WHITE_POINT_BRIGHTNESS;
543    brightness = 1.5;
544    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
545    ASSERT_EQ(fabs(cSurface->GetSdrWhitePointBrightness() - 0.5) < 1e-6, true);
546    brightness = -0.1;
547    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
548    ASSERT_EQ(fabs(cSurface->GetSdrWhitePointBrightness() - 0.5) < 1e-6, true);
549    brightness = 0.8;
550    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, brightness), OHOS::GSERROR_OK);
551    ASSERT_EQ(fabs(cSurface->GetSdrWhitePointBrightness() - 0.8) < 1e-6, true);
552}
553
554/*
555* Function: OH_NativeWindow_NativeWindowAttachBuffer
556* Type: Function
557* Rank: Important(2)
558* EnvConditions: N/A
559* CaseDescription: 1. call OH_NativeWindow_NativeWindowAttachBuffer by abnormal input
560*                  2. check ret
561 */
562HWTEST_F(NativeWindowTest, NativeWindowAttachBuffer001, Function | MediumTest | Level1)
563{
564    ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nullptr, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
565    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nullptr, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
566    ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
567    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
568}
569
570void SetNativeWindowConfig(NativeWindow *nativeWindow)
571{
572    int code = SET_USAGE;
573    uint64_t usageSet = BUFFER_USAGE_CPU_READ;
574    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, usageSet), OHOS::GSERROR_OK);
575
576    code = SET_BUFFER_GEOMETRY;
577    int32_t heightSet = 0x100;
578    int32_t widthSet = 0x100;
579    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, heightSet, widthSet), OHOS::GSERROR_OK);
580
581    code = SET_FORMAT;
582    int32_t formatSet = GRAPHIC_PIXEL_FMT_RGBA_8888;
583    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, formatSet), OHOS::GSERROR_OK);
584
585    code = SET_STRIDE;
586    int32_t strideSet = 0x8;
587    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, strideSet), OHOS::GSERROR_OK);
588
589    code = SET_COLOR_GAMUT;
590    int32_t colorGamutSet = static_cast<int32_t>(GraphicColorGamut::GRAPHIC_COLOR_GAMUT_DCI_P3);
591    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, colorGamutSet), OHOS::GSERROR_OK);
592
593    code = SET_TIMEOUT;
594    int32_t timeoutSet = 10;  // 10: for test
595    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, timeoutSet), OHOS::GSERROR_OK);
596}
597
598/*
599* Function: OH_NativeWindow_NativeWindowAttachBuffer
600* Type: Function
601* Rank: Important(2)
602* EnvConditions: N/A
603* CaseDescription: 1. call OH_NativeWindow_NativeWindowAttachBuffer by normal input
604*                  2. check ret
605 */
606HWTEST_F(NativeWindowTest, NativeWindowAttachBuffer002, Function | MediumTest | Level1)
607{
608    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
609    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
610    cSurfaceTmp->RegisterConsumerListener(listener);
611    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
612    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
613
614    NativeWindow *nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp);
615    ASSERT_NE(nativeWindowTmp, nullptr);
616    SetNativeWindowConfig(nativeWindowTmp);
617
618    NativeWindowBuffer *nativeWindowBuffer = nullptr;
619    int fenceFd = -1;
620    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer, &fenceFd);
621    ASSERT_EQ(ret, GSERROR_OK);
622
623    int code = GET_BUFFERQUEUE_SIZE;
624    int32_t queueSize = 0;
625    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindowTmp, code, &queueSize), OHOS::GSERROR_OK);
626    ASSERT_EQ(queueSize, 3);
627
628    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowTmp, nativeWindowBuffer), OHOS::GSERROR_OK);
629
630    ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nativeWindowBuffer), OHOS::GSERROR_OK);
631
632    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer), OHOS::GSERROR_OK);
633
634    ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nativeWindowTmp, nativeWindowBuffer), OHOS::GSERROR_OK);
635    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindowTmp, code, &queueSize), OHOS::GSERROR_OK);
636    ASSERT_EQ(queueSize, 3);
637    ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nativeWindowTmp, nativeWindowBuffer),
638        OHOS::GSERROR_BUFFER_IS_INCACHE);
639
640    struct Region *region = new Region();
641    struct Region::Rect *rect = new Region::Rect();
642    rect->x = 0x100;
643    rect->y = 0x100;
644    rect->w = 0x100;
645    rect->h = 0x100;
646    region->rects = rect;
647    ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindowTmp, nativeWindowBuffer, fenceFd, *region);
648    ASSERT_EQ(ret, GSERROR_OK);
649
650    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
651}
652
653void NativeWindowAttachBuffer003Test(NativeWindow *nativeWindowTmp, NativeWindow *nativeWindowTmp1)
654{
655    NativeWindowBuffer *nativeWindowBuffer1 = nullptr;
656    int fenceFd = -1;
657    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer1, &fenceFd);
658    ASSERT_EQ(ret, GSERROR_OK);
659
660    NativeWindowBuffer *nativeWindowBuffer2 = nullptr;
661    fenceFd = -1;
662    ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer2, &fenceFd);
663    ASSERT_EQ(ret, GSERROR_OK);
664
665    NativeWindowBuffer *nativeWindowBuffer3 = nullptr;
666    fenceFd = -1;
667    ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer3, &fenceFd);
668    ASSERT_EQ(ret, GSERROR_OK);
669
670    int code = GET_BUFFERQUEUE_SIZE;
671    int32_t queueSize = 0;
672    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindowTmp, code, &queueSize), OHOS::GSERROR_OK);
673    ASSERT_EQ(queueSize, 3);
674
675    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowTmp, nativeWindowBuffer1), OHOS::GSERROR_OK);
676    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowTmp, nativeWindowBuffer2), OHOS::GSERROR_OK);
677    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowTmp, nativeWindowBuffer3), OHOS::GSERROR_OK);
678
679    NativeWindowBuffer *nativeWindowBuffer4 = nullptr;
680    fenceFd = -1;
681    ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer4, &fenceFd);
682    ASSERT_EQ(ret, GSERROR_OK);
683
684    NativeWindowBuffer *nativeWindowBuffer10 = nullptr;
685    fenceFd = -1;
686    ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp1, &nativeWindowBuffer10, &fenceFd);
687    ASSERT_EQ(ret, GSERROR_OK);
688
689    NativeWindowBuffer *nativeWindowBuffer11 = nullptr;
690    fenceFd = -1;
691    ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp1, &nativeWindowBuffer11, &fenceFd);
692    ASSERT_EQ(ret, GSERROR_OK);
693
694    NativeWindowBuffer *nativeWindowBuffer12 = nullptr;
695    fenceFd = -1;
696    ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp1, &nativeWindowBuffer12, &fenceFd);
697    ASSERT_EQ(ret, GSERROR_OK);
698
699    ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nativeWindowTmp1, nativeWindowBuffer1),
700        OHOS::SURFACE_ERROR_BUFFER_QUEUE_FULL);
701}
702
703/*
704* Function: OH_NativeWindow_NativeWindowAttachBuffer
705* Type: Function
706* Rank: Important(2)
707* EnvConditions: N/A
708* CaseDescription: 1. call OH_NativeWindow_NativeWindowAttachBuffer by normal input
709*                  2. check ret
710 */
711HWTEST_F(NativeWindowTest, NativeWindowAttachBuffer003, Function | MediumTest | Level1)
712{
713    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
714    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
715    cSurfaceTmp->RegisterConsumerListener(listener);
716    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
717    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
718
719    NativeWindow *nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp);
720    ASSERT_NE(nativeWindowTmp, nullptr);
721    SetNativeWindowConfig(nativeWindowTmp);
722
723    sptr<OHOS::IConsumerSurface> cSurfaceTmp1 = IConsumerSurface::Create();
724    sptr<IBufferConsumerListener> listener1 = new BufferConsumerListener();
725    cSurfaceTmp1->RegisterConsumerListener(listener1);
726    sptr<OHOS::IBufferProducer> producerTmp1 = cSurfaceTmp1->GetProducer();
727    sptr<OHOS::Surface> pSurfaceTmp1 = Surface::CreateSurfaceAsProducer(producerTmp1);
728
729    NativeWindow *nativeWindowTmp1 = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp1);
730    ASSERT_NE(nativeWindowTmp1, nullptr);
731    SetNativeWindowConfig(nativeWindowTmp1);
732
733    NativeWindowAttachBuffer003Test(nativeWindowTmp, nativeWindowTmp1);
734
735    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
736    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp1);
737}
738
739/*
740* Function: OH_NativeWindow_NativeWindowAttachBuffer
741* Type: Function
742* Rank: Important(2)
743* EnvConditions: N/A
744* CaseDescription: 1. call OH_NativeWindow_NativeWindowAttachBuffer by normal input
745*                  2. check ret
746 */
747HWTEST_F(NativeWindowTest, NativeWindowAttachBuffer004, Function | MediumTest | Level1)
748{
749    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
750    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
751    cSurfaceTmp->RegisterConsumerListener(listener);
752    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
753    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
754
755    NativeWindow *nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp);
756    ASSERT_NE(nativeWindowTmp, nullptr);
757    SetNativeWindowConfig(nativeWindowTmp);
758
759    NativeWindowBuffer *nativeWindowBuffer = nullptr;
760    int fenceFd = -1;
761    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer, &fenceFd);
762    ASSERT_EQ(ret, GSERROR_OK);
763
764    struct Region *region = new Region();
765    struct Region::Rect *rect = new Region::Rect();
766    rect->x = 0x100;
767    rect->y = 0x100;
768    rect->w = 0x100;
769    rect->h = 0x100;
770    region->rects = rect;
771    ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindowTmp, nativeWindowBuffer, fenceFd, *region);
772    ASSERT_EQ(ret, GSERROR_OK);
773
774    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowTmp, nativeWindowBuffer),
775        OHOS::SURFACE_ERROR_BUFFER_STATE_INVALID);
776
777    ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer),
778        OHOS::SURFACE_ERROR_BUFFER_NOT_INCACHE);
779
780    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
781}
782
783/*
784* Function: OH_NativeWindow_NativeWindowAttachBuffer
785* Type: Function
786* Rank: Important(2)
787* EnvConditions: N/A
788* CaseDescription: 1. call OH_NativeWindow_NativeWindowAttachBuffer by normal input
789*                  2. check ret
790 */
791HWTEST_F(NativeWindowTest, NativeWindowAttachBuffer005, Function | MediumTest | Level1)
792{
793    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
794    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
795    cSurfaceTmp->RegisterConsumerListener(listener);
796    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
797    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
798
799    NativeWindow *nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp);
800    ASSERT_NE(nativeWindowTmp, nullptr);
801    SetNativeWindowConfig(nativeWindowTmp);
802
803    NativeWindowBuffer *nativeWindowBuffer = nullptr;
804    int fenceFd = -1;
805    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer, &fenceFd);
806    ASSERT_EQ(ret, GSERROR_OK);
807
808    ASSERT_EQ(cSurface->AttachBufferToQueue(nativeWindowBuffer->sfbuffer), GSERROR_OK);
809
810    ASSERT_EQ(cSurface->DetachBufferFromQueue(nativeWindowBuffer->sfbuffer), GSERROR_OK);
811
812    ASSERT_EQ(cSurface->AttachBufferToQueue(nativeWindowBuffer->sfbuffer), GSERROR_OK);
813
814    sptr<SyncFence> fence = SyncFence::INVALID_FENCE;
815    ASSERT_EQ(cSurface->ReleaseBuffer(nativeWindowBuffer->sfbuffer, fence), GSERROR_OK);
816
817    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
818}
819
820/*
821* Function: OH_NativeWindow_NativeWindowAttachBuffer
822* Type: Function
823* Rank: Important(2)
824* EnvConditions: N/A
825* CaseDescription: 1. call OH_NativeWindow_NativeWindowAttachBuffer by normal input
826*                  2. check ret
827 */
828HWTEST_F(NativeWindowTest, NativeWindowAttachBuffer006, Function | MediumTest | Level1)
829{
830    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
831    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
832    cSurfaceTmp->RegisterConsumerListener(listener);
833    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
834    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
835
836    NativeWindow *nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp);
837    ASSERT_NE(nativeWindowTmp, nullptr);
838    SetNativeWindowConfig(nativeWindowTmp);
839
840    NativeWindowBuffer *nativeWindowBuffer1 = nullptr;
841    int fenceFd = -1;
842    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer1, &fenceFd);
843    ASSERT_EQ(ret, GSERROR_OK);
844
845    int code = GET_BUFFERQUEUE_SIZE;
846    int32_t queueSize = 0;
847    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindowTmp, code, &queueSize), OHOS::GSERROR_OK);
848    ASSERT_EQ(queueSize, 3);
849    clock_t startTime, endTime;
850    startTime = clock();
851    for (int32_t i = 0; i < 1000; i++) {
852        ASSERT_EQ(OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowTmp, nativeWindowBuffer1), OHOS::GSERROR_OK);
853        ASSERT_EQ(OH_NativeWindow_NativeWindowAttachBuffer(nativeWindowTmp, nativeWindowBuffer1), OHOS::GSERROR_OK);
854    }
855    endTime = clock();
856    cout << "DetachBuffer and AttachBuffer 1000 times cost time: " << (endTime - startTime) << "ms" << endl;
857    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindowTmp, code, &queueSize), OHOS::GSERROR_OK);
858    ASSERT_EQ(queueSize, 3);
859    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
860}
861
862/*
863* Function: OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer
864* Type: Function
865* Rank: Important(2)
866* EnvConditions: N/A
867* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer by abnormal input
868*                  2. check ret
869 */
870HWTEST_F(NativeWindowTest, CreateNativeWindowBuffer001, Function | MediumTest | Level2)
871{
872    ASSERT_EQ(OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(nullptr), nullptr);
873}
874
875/*
876* Function: OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer
877* Type: Function
878* Rank: Important(2)
879* EnvConditions: N/A
880* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer
881*                  2. check ret
882 */
883HWTEST_F(NativeWindowTest, CreateNativeWindowBuffer002, Function | MediumTest | Level2)
884{
885    nativeWindowBuffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(&sBuffer);
886    ASSERT_NE(nativeWindowBuffer, nullptr);
887}
888
889/*
890* Function: OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer
891* Type: Function
892* Rank: Important(2)
893* EnvConditions: N/A
894* CaseDescription: 1. call OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer
895*                  2. check ret
896*/
897HWTEST_F(NativeWindowTest, CreateNativeWindowBuffer003, Function | MediumTest | Level2)
898{
899    OH_NativeBuffer* nativeBuffer = sBuffer->SurfaceBufferToNativeBuffer();
900    ASSERT_NE(nativeBuffer, nullptr);
901    NativeWindowBuffer* nwBuffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer);
902    ASSERT_NE(nwBuffer, nullptr);
903    OH_NativeWindow_DestroyNativeWindowBuffer(nwBuffer);
904}
905
906/*
907* Function: OH_NativeWindow_NativeWindowRequestBuffer
908* Type: Function
909* Rank: Important(2)
910* EnvConditions: N/A
911* CaseDescription: 1. call OH_NativeWindow_NativeWindowRequestBuffer by abnormal input
912*                  2. check ret
913 */
914HWTEST_F(NativeWindowTest, RequestBuffer001, Function | MediumTest | Level2)
915{
916    ASSERT_EQ(OH_NativeWindow_NativeWindowRequestBuffer(nullptr, &nativeWindowBuffer, nullptr),
917              OHOS::GSERROR_INVALID_ARGUMENTS);
918}
919
920/*
921* Function: OH_NativeWindow_NativeWindowRequestBuffer
922* Type: Function
923* Rank: Important(2)
924* EnvConditions: N/A
925* CaseDescription: 1. call OH_NativeWindow_NativeWindowRequestBuffer by abnormal input
926*                  2. check ret
927 */
928HWTEST_F(NativeWindowTest, RequestBuffer002, Function | MediumTest | Level2)
929{
930    ASSERT_EQ(OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, nullptr, nullptr),
931              OHOS::GSERROR_INVALID_ARGUMENTS);
932}
933
934/*
935* Function: OH_NativeWindow_GetBufferHandleFromNative
936* Type: Function
937* Rank: Important(2)
938* EnvConditions: N/A
939* CaseDescription: 1. call OH_NativeWindow_GetBufferHandleFromNative by abnormal input
940*                  2. check ret
941 */
942HWTEST_F(NativeWindowTest, GetBufferHandle001, Function | MediumTest | Level2)
943{
944    ASSERT_EQ(OH_NativeWindow_GetBufferHandleFromNative(nullptr), nullptr);
945}
946
947/*
948* Function: OH_NativeWindow_GetBufferHandleFromNative
949* Type: Function
950* Rank: Important(2)
951* EnvConditions: N/A
952* CaseDescription: 1. call OH_NativeWindow_GetBufferHandleFromNative
953*                  2. check ret
954 */
955HWTEST_F(NativeWindowTest, GetBufferHandle002, Function | MediumTest | Level2)
956{
957    struct NativeWindowBuffer *buffer = new NativeWindowBuffer();
958    buffer->sfbuffer = sBuffer;
959    ASSERT_NE(OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer), nullptr);
960    delete buffer;
961}
962
963/*
964* Function: OH_NativeWindow_NativeWindowFlushBuffer
965* Type: Function
966* Rank: Important(2)
967* EnvConditions: N/A
968* CaseDescription: 1. call OH_NativeWindow_NativeWindowFlushBuffer by abnormal input
969*                  2. check ret
970 */
971HWTEST_F(NativeWindowTest, FlushBuffer001, Function | MediumTest | Level2)
972{
973    int fenceFd = -1;
974    struct Region *region = new Region();
975    struct Region::Rect * rect = new Region::Rect();
976    rect->x = 0x100;
977    rect->y = 0x100;
978    rect->w = 0x100;
979    rect->h = 0x100;
980    region->rects = rect;
981
982    ASSERT_EQ(OH_NativeWindow_NativeWindowFlushBuffer(nullptr, nullptr, fenceFd, *region),
983              OHOS::GSERROR_INVALID_ARGUMENTS);
984    delete region;
985}
986
987/*
988* Function: OH_NativeWindow_NativeWindowFlushBuffer
989* Type: Function
990* Rank: Important(2)
991* EnvConditions: N/A
992* CaseDescription: 1. call OH_NativeWindow_NativeWindowFlushBuffer by abnormal input
993*                  2. check ret
994 */
995HWTEST_F(NativeWindowTest, FlushBuffer002, Function | MediumTest | Level2)
996{
997    int fenceFd = -1;
998    struct Region *region = new Region();
999    struct Region::Rect * rect = new Region::Rect();
1000    rect->x = 0x100;
1001    rect->y = 0x100;
1002    rect->w = 0x100;
1003    rect->h = 0x100;
1004    region->rects = rect;
1005
1006    ASSERT_EQ(OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nullptr, fenceFd, *region),
1007              OHOS::GSERROR_INVALID_ARGUMENTS);
1008    delete region;
1009}
1010
1011/*
1012* Function: OH_NativeWindow_NativeWindowFlushBuffer
1013* Type: Function
1014* Rank: Important(2)
1015* EnvConditions: N/A
1016* CaseDescription: 1. call OH_NativeWindow_NativeWindowFlushBuffer
1017*                  2. check ret
1018 */
1019HWTEST_F(NativeWindowTest, FlushBuffer003, Function | MediumTest | Level2)
1020{
1021    int fenceFd = -1;
1022    struct Region *region = new Region();
1023    region->rectNumber = 0;
1024    region->rects = nullptr;
1025    ASSERT_EQ(OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region),
1026              OHOS::GSERROR_OK);
1027
1028    region->rectNumber = 1;
1029    struct Region::Rect * rect = new Region::Rect();
1030    rect->x = 0x100;
1031    rect->y = 0x100;
1032    rect->w = 0x100;
1033    rect->h = 0x100;
1034    region->rects = rect;
1035    ASSERT_EQ(OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region),
1036              OHOS::SURFACE_ERROR_BUFFER_STATE_INVALID);
1037    delete rect;
1038    delete region;
1039}
1040constexpr int32_t MATRIX_SIZE = 16;
1041bool CheckMatricIsSame(float matrixOld[MATRIX_SIZE], float matrixNew[MATRIX_SIZE])
1042{
1043    for (int32_t i = 0; i < MATRIX_SIZE; i++) {
1044        if (fabs(matrixOld[i] - matrixNew[i]) > 1e-6) {
1045            return false;
1046        }
1047    }
1048    return true;
1049}
1050
1051/*
1052* Function: OH_NativeWindow_GetLastFlushedBuffer
1053* Type: Function
1054* Rank: Important(2)
1055* EnvConditions: N/A
1056* CaseDescription: 1. call OH_NativeWindow_NativeWindowRequestBuffer
1057*                  2. call OH_NativeWindow_NativeWindowFlushBuffer
1058*                  3. call OH_NativeWindow_GetLastFlushedBuffer
1059*                  4. check ret
1060 */
1061HWTEST_F(NativeWindowTest, GetLastFlushedBuffer001, Function | MediumTest | Level2)
1062{
1063    int code = SET_TRANSFORM;
1064    int32_t transform = GraphicTransformType::GRAPHIC_ROTATE_90;
1065    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, transform), OHOS::GSERROR_OK);
1066
1067    code = SET_FORMAT;
1068    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
1069    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, code, format), OHOS::GSERROR_OK);
1070
1071    NativeWindowBuffer *nativeWindowBuffer = nullptr;
1072    int fenceFd = -1;
1073    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1074    ASSERT_EQ(ret, GSERROR_OK);
1075
1076    struct Region *region = new Region();
1077    struct Region::Rect *rect = new Region::Rect();
1078    rect->x = 0x100;
1079    rect->y = 0x100;
1080    rect->w = 0x100;
1081    rect->h = 0x100;
1082    region->rects = rect;
1083    BufferHandle *bufferHanlde = OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer);
1084    ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region);
1085    ASSERT_EQ(ret, GSERROR_OK);
1086    NativeWindowBuffer *lastFlushedBuffer;
1087    int lastFlushedFenceFd;
1088    float matrix[16];
1089    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, &lastFlushedBuffer, nullptr, matrix),
1090        SURFACE_ERROR_INVALID_PARAM);
1091    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, &lastFlushedBuffer, &lastFlushedFenceFd, matrix),
1092        OHOS::GSERROR_OK);
1093    BufferHandle *lastFlushedHanlde = OH_NativeWindow_GetBufferHandleFromNative(lastFlushedBuffer);
1094    ASSERT_EQ(bufferHanlde->virAddr, lastFlushedHanlde->virAddr);
1095
1096    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, &lastFlushedBuffer, &lastFlushedFenceFd, matrix),
1097        OHOS::GSERROR_OK);
1098    float matrix90[16] = {0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1};
1099    bool bRet = CheckMatricIsSame(matrix90, matrix);
1100    ASSERT_EQ(bRet, true);
1101}
1102
1103/*
1104* Function: OH_NativeWindow_GetLastFlushedBuffer
1105* Type: Function
1106* Rank: Important(2)
1107* EnvConditions: N/A
1108* CaseDescription: 1. call NativeWindowHandleOpt set BUFFER_USAGE_PROTECTED
1109*                  2. call OH_NativeWindow_NativeWindowRequestBuffer
1110*                  3. call OH_NativeWindow_NativeWindowFlushBuffer
1111*                  4. call OH_NativeWindow_GetLastFlushedBuffer
1112*                  5. check ret
1113 */
1114HWTEST_F(NativeWindowTest, GetLastFlushedBuffer002, Function | MediumTest | Level2)
1115{
1116    int code = SET_USAGE;
1117    uint64_t usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_MEM_DMA | BUFFER_USAGE_PROTECTED;
1118    ASSERT_EQ(NativeWindowHandleOpt(nativeWindow, code, usage), OHOS::GSERROR_OK);
1119
1120    NativeWindowBuffer* nativeWindowBuffer = nullptr;
1121    int fenceFd = -1;
1122    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1123    ASSERT_EQ(ret, GSERROR_OK);
1124
1125    struct Region *region = new Region();
1126    struct Region::Rect *rect = new Region::Rect();
1127    rect->x = 0x100;
1128    rect->y = 0x100;
1129    rect->w = 0x100;
1130    rect->h = 0x100;
1131    region->rects = rect;
1132    ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region);
1133    ASSERT_EQ(ret, GSERROR_OK);
1134    NativeWindowBuffer* lastFlushedBuffer;
1135    int lastFlushedFenceFd;
1136    float matrix[16];
1137    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, &lastFlushedBuffer, &lastFlushedFenceFd, matrix),
1138        OHOS::SURFACE_ERROR_NOT_SUPPORT);
1139}
1140
1141/*
1142* Function: OH_NativeWindow_SetColorSpace
1143* Type: Function
1144* Rank: Important(2)
1145* EnvConditions: N/A
1146* CaseDescription: 1. call OH_NativeWindow_SetColorSpace
1147*                  2. check ret
1148 */
1149HWTEST_F(NativeWindowTest, OH_NativeWindow_SetColorSpace001, Function | MediumTest | Level2)
1150{
1151    OH_NativeBuffer_ColorSpace colorSpace = OH_COLORSPACE_BT709_LIMIT;
1152    auto ret = OH_NativeWindow_GetColorSpace(nullptr, &colorSpace);
1153    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1154        ASSERT_NE(ret, GSERROR_INTERNAL);
1155    }
1156}
1157
1158/*
1159* Function: OH_NativeWindow_SetColorSpace
1160* Type: Function
1161* Rank: Important(2)
1162* EnvConditions: N/A
1163* CaseDescription: 1. call OH_NativeWindow_SetColorSpace
1164*                  2. check ret
1165 */
1166HWTEST_F(NativeWindowTest, OH_NativeWindow_SetColorSpace002, Function | MediumTest | Level2)
1167{
1168    OH_NativeBuffer_ColorSpace colorSpace = OH_COLORSPACE_BT709_LIMIT;
1169    auto ret = OH_NativeWindow_SetColorSpace(nativeWindow, colorSpace);
1170    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1171        ASSERT_EQ(ret, GSERROR_OK);
1172    }
1173}
1174
1175/*
1176* Function: OH_NativeWindow_GetColorSpace
1177* Type: Function
1178* Rank: Important(2)
1179* EnvConditions: N/A
1180* CaseDescription: 1. call OH_NativeWindow_GetColorSpace
1181*                  2. check ret
1182 */
1183HWTEST_F(NativeWindowTest, OH_NativeWindow_GetColorSpace001, Function | MediumTest | Level2)
1184{
1185    OH_NativeBuffer_ColorSpace colorSpace = OH_COLORSPACE_NONE;
1186    auto ret = OH_NativeWindow_GetColorSpace(nativeWindow, &colorSpace);
1187    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1188        ASSERT_EQ(ret, GSERROR_OK);
1189    }
1190}
1191
1192/*
1193* Function: OH_NativeWindow_GetColorSpace
1194* Type: Function
1195* Rank: Important(2)
1196* EnvConditions: N/A
1197* CaseDescription: 1. call OH_NativeWindow_GetColorSpace
1198*                  2. check ret
1199 */
1200HWTEST_F(NativeWindowTest, OH_NativeWindow_GetColorSpace002, Function | MediumTest | Level2)
1201{
1202    OH_NativeBuffer_ColorSpace colorSpace = OH_COLORSPACE_NONE;
1203    OH_NativeBuffer_ColorSpace colorSpaceSet = OH_COLORSPACE_BT709_FULL;
1204    auto ret = OH_NativeWindow_SetColorSpace(nativeWindow, colorSpaceSet);
1205    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1206        ASSERT_EQ(ret, GSERROR_OK);
1207    }
1208    ret = OH_NativeWindow_GetColorSpace(nativeWindow, &colorSpace);
1209    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1210        ASSERT_EQ(ret, GSERROR_OK);
1211        ASSERT_EQ(colorSpace, colorSpaceSet);
1212    }
1213}
1214
1215/*
1216* Function: OH_NativeWindow_SetMetadataValue
1217* Type: Function
1218* Rank: Important(2)
1219* EnvConditions: N/A
1220* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1221*                  2. check ret
1222 */
1223HWTEST_F(NativeWindowTest, OH_NativeWindow_SetMetadataValue001, Function | MediumTest | Level2)
1224{
1225    int len = 60;
1226    uint8_t buff[len];
1227    for (int i = 0; i < 60; ++i) {
1228        buff[i] = static_cast<uint8_t>(i);
1229    }
1230    int32_t buffSize;
1231    uint8_t *checkMetaData;
1232    auto ret = OH_NativeWindow_GetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, &buffSize, &checkMetaData);
1233    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1234        ASSERT_NE(ret, GSERROR_OK);
1235    }
1236    ret = OH_NativeWindow_SetMetadataValue(nullptr, OH_HDR_STATIC_METADATA, (int32_t)len, buff);
1237    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1238        ASSERT_NE(ret, GSERROR_OK);
1239    }
1240}
1241
1242/*
1243* Function: OH_NativeWindow_SetMetadataValue
1244* Type: Function
1245* Rank: Important(2)
1246* EnvConditions: N/A
1247* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1248*                  2. check ret
1249 */
1250HWTEST_F(NativeWindowTest, OH_NativeWindow_SetMetadataValue002, Function | MediumTest | Level2)
1251{
1252    int len = 60;
1253    uint8_t buff[len];
1254    for (int i = 0; i < 60; ++i) {
1255        buff[i] = static_cast<uint8_t>(i);
1256    }
1257    int32_t max_size = -1;
1258    auto ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, (int32_t)max_size, buff);
1259    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1260        ASSERT_NE(ret, GSERROR_OK);
1261    }
1262}
1263
1264/*
1265* Function: OH_NativeWindow_SetMetadataValue
1266* Type: Function
1267* Rank: Important(2)
1268* EnvConditions: N/A
1269* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1270*                  2. check ret
1271 */
1272HWTEST_F(NativeWindowTest, OH_NativeWindow_SetMetadataValue003, Function | MediumTest | Level2)
1273{
1274    int len = 60;
1275    uint8_t buff[len];
1276    for (int i = 0; i < 60; ++i) {
1277        buff[i] = static_cast<uint8_t>(i);
1278    }
1279    auto ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, (int32_t)len, buff);
1280    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1281        ASSERT_EQ(ret, GSERROR_OK);
1282    }
1283    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_DYNAMIC_METADATA, (int32_t)len, buff);
1284    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1285        ASSERT_EQ(ret, GSERROR_OK);
1286    }
1287    OH_NativeBuffer_MetadataType type = OH_VIDEO_HDR_HLG;
1288    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, sizeof(type),
1289                                           reinterpret_cast<uint8_t *>(&type));
1290    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1291        ASSERT_EQ(ret, GSERROR_OK);
1292    }
1293}
1294
1295/*
1296* Function: OH_NativeWindow_SetMetadataValue
1297* Type: Function
1298* Rank: Important(2)
1299* EnvConditions: N/A
1300* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1301*                  2. check ret
1302 */
1303HWTEST_F(NativeWindowTest, OH_NativeWindow_SetMetadataValue004, Function | MediumTest | Level2)
1304{
1305    int len = 60;
1306    uint8_t buff[len];
1307    for (int i = 0; i < 60; ++i) {
1308        buff[i] = static_cast<uint8_t>(i);
1309    }
1310    auto ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, (int32_t)len, buff);
1311    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1312        ASSERT_EQ(ret, GSERROR_OK);
1313    }
1314    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, (int32_t)len, buff);
1315    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1316        ASSERT_EQ(ret, GSERROR_OK);
1317    }
1318    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_DYNAMIC_METADATA, (int32_t)len, buff);
1319    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1320        ASSERT_EQ(ret, GSERROR_OK);
1321    }
1322    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_DYNAMIC_METADATA, (int32_t)len, buff);
1323    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1324        ASSERT_EQ(ret, GSERROR_OK);
1325    }
1326    OH_NativeBuffer_MetadataType type = OH_VIDEO_HDR_HLG;
1327    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, sizeof(type),
1328                                           reinterpret_cast<uint8_t *>(&type));
1329    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1330        ASSERT_EQ(ret, GSERROR_OK);
1331    }
1332    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, sizeof(type),
1333                                           reinterpret_cast<uint8_t *>(&type));
1334    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1335        ASSERT_EQ(ret, GSERROR_OK);
1336    }
1337}
1338
1339/*
1340* Function: OH_NativeWindow_SetMetadataValue
1341* Type: Function
1342* Rank: Important(2)
1343* EnvConditions: N/A
1344* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1345*                  2. check ret
1346 */
1347HWTEST_F(NativeWindowTest, OH_NativeWindow_SetMetadataValue005, Function | MediumTest | Level2)
1348{
1349    int len = 60;
1350    uint8_t buff[len];
1351    for (int i = 0; i < 60; ++i) {
1352        buff[i] = static_cast<uint8_t>(i);
1353    }
1354    NativeWindowBuffer *nativeWindowbuffer1 = nullptr;
1355    int fenceFd = -1;
1356    auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowbuffer1, &fenceFd);
1357    if (ret != GSERROR_HDI_ERROR) {
1358        ASSERT_EQ(ret, GSERROR_OK);
1359    }
1360    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, (int32_t)len, buff);
1361    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1362        ASSERT_EQ(ret, GSERROR_OK);
1363    }
1364    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_DYNAMIC_METADATA, (int32_t)len, buff);
1365    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1366        ASSERT_EQ(ret, GSERROR_OK);
1367    }
1368    OH_NativeBuffer_MetadataType type = OH_VIDEO_HDR_HLG;
1369    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, sizeof(type),
1370                                           reinterpret_cast<uint8_t *>(&type));
1371    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1372        ASSERT_EQ(ret, GSERROR_OK);
1373    }
1374}
1375
1376/*
1377* Function: OH_NativeWindow_GetMetadataValue
1378* Type: Function
1379* Rank: Important(2)
1380* EnvConditions: N/A
1381* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1382*                  2. check ret
1383 */
1384HWTEST_F(NativeWindowTest, OH_NativeWindow_GetMetadataValue001, Function | MediumTest | Level2)
1385{
1386    int32_t buffSize;
1387    uint8_t *checkMetaData;
1388    auto ret = OH_NativeWindow_GetMetadataValue(nullptr, OH_HDR_STATIC_METADATA, &buffSize, &checkMetaData);
1389    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1390        ASSERT_NE(ret, GSERROR_OK);
1391    }
1392}
1393
1394/*
1395* Function: OH_NativeWindow_GetMetadataValue
1396* Type: Function
1397* Rank: Important(2)
1398* EnvConditions: N/A
1399* CaseDescription: 1. call OH_NativeWindow_GetMetadataValue
1400*                  2. check ret
1401 */
1402HWTEST_F(NativeWindowTest, OH_NativeWindow_GetMetadataValue002, Function | MediumTest | Level2)
1403{
1404    uint8_t *checkMetaData;
1405    auto ret = OH_NativeWindow_GetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, nullptr, &checkMetaData);
1406    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1407        ASSERT_NE(ret, GSERROR_OK);
1408    }
1409}
1410
1411/*
1412* Function: OH_NativeWindow_SetMetadataValue
1413* Type: Function
1414* Rank: Important(2)
1415* EnvConditions: N/A
1416* CaseDescription: 1. call OH_NativeWindow_SetMetadataValue
1417*                  2. check ret
1418 */
1419HWTEST_F(NativeWindowTest, OH_NativeWindow_GetMetadataValue003, Function | MediumTest | Level2)
1420{
1421    int len = 60;
1422    uint8_t buff[len];
1423    for (int i = 0; i < 60; ++i) {
1424        buff[i] = static_cast<uint8_t>(60 - i);
1425    }
1426    int32_t buffSize;
1427    uint8_t *checkMetaData;
1428    auto ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, (int32_t)len, buff);
1429    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set metadataValue
1430        ASSERT_EQ(ret, GSERROR_OK);
1431    }
1432    ret = OH_NativeWindow_GetMetadataValue(nativeWindow, OH_HDR_STATIC_METADATA, &buffSize, &checkMetaData);
1433    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set metadataValue
1434        ASSERT_EQ(memcmp(checkMetaData, buff, 60), 0);
1435        delete[] checkMetaData;
1436        checkMetaData = nullptr;
1437        ASSERT_EQ(ret, GSERROR_OK);
1438    }
1439    for (int i = 0; i < 60; i++) {
1440        buff[i] = static_cast<uint8_t>(70 - i);
1441    }
1442    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_DYNAMIC_METADATA, (int32_t)len, buff);
1443    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set metadataValue
1444        ASSERT_EQ(ret, GSERROR_OK);
1445    }
1446    ret = OH_NativeWindow_GetMetadataValue(nativeWindow, OH_HDR_DYNAMIC_METADATA, &buffSize, &checkMetaData);
1447    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set metadataValue
1448        ASSERT_EQ(memcmp(checkMetaData, buff, 60), 0);
1449        delete[] checkMetaData;
1450        checkMetaData = nullptr;
1451        ASSERT_EQ(ret, GSERROR_OK);
1452    }
1453    OH_NativeBuffer_MetadataType type = OH_VIDEO_HDR_HDR10;
1454    int32_t typeSize = sizeof(type);
1455    uint8_t pa = static_cast<uint8_t>(type);
1456    ret = OH_NativeWindow_SetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, sizeof(type), &pa);
1457    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set colorspace
1458        ASSERT_EQ(ret, GSERROR_OK);
1459    }
1460    ret = OH_NativeWindow_GetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, &typeSize, &checkMetaData);
1461    if (ret != GSERROR_NOT_SUPPORT) { // some device not support set metadataValue
1462        ASSERT_EQ(static_cast<uint8_t>(type), checkMetaData[0]);
1463        delete[] checkMetaData;
1464        checkMetaData = nullptr;
1465        ASSERT_EQ(ret, GSERROR_OK);
1466    }
1467}
1468/*
1469* Function: OH_NativeWindow_NativeWindowAbortBuffer
1470* Type: Function
1471* Rank: Important(2)
1472* EnvConditions: N/A
1473* CaseDescription: 1. call OH_NativeWindow_NativeWindowAbortBuffer by abnormal input
1474*                  2. check ret
1475 */
1476HWTEST_F(NativeWindowTest, CancelBuffer001, Function | MediumTest | Level2)
1477{
1478    ASSERT_EQ(OH_NativeWindow_NativeWindowAbortBuffer(nullptr, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1479}
1480
1481/*
1482* Function: OH_NativeWindow_NativeWindowAbortBuffer
1483* Type: Function
1484* Rank: Important(2)
1485* EnvConditions: N/A
1486* CaseDescription: 1. call OH_NativeWindow_NativeWindowAbortBuffer by abnormal input
1487*                  2. check ret
1488 */
1489HWTEST_F(NativeWindowTest, CancelBuffer002, Function | MediumTest | Level2)
1490{
1491    ASSERT_EQ(OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1492}
1493
1494/*
1495* Function: OH_NativeWindow_NativeWindowAbortBuffer
1496* Type: Function
1497* Rank: Important(2)
1498* EnvConditions: N/A
1499* CaseDescription: 1. call OH_NativeWindow_NativeWindowAbortBuffer
1500*                  2. check ret
1501 */
1502HWTEST_F(NativeWindowTest, CancelBuffer003, Function | MediumTest | Level2)
1503{
1504    ASSERT_EQ(OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer),
1505        OHOS::SURFACE_ERROR_BUFFER_STATE_INVALID);
1506
1507    sptr<OHOS::IConsumerSurface> cSurfaceTmp = IConsumerSurface::Create();
1508    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
1509    cSurfaceTmp->RegisterConsumerListener(listener);
1510    sptr<OHOS::IBufferProducer> producerTmp = cSurfaceTmp->GetProducer();
1511    sptr<OHOS::Surface> pSurfaceTmp = Surface::CreateSurfaceAsProducer(producerTmp);
1512
1513    NativeWindow *nativeWindowTmp = OH_NativeWindow_CreateNativeWindow(&pSurfaceTmp);
1514    ASSERT_NE(nativeWindowTmp, nullptr);
1515    SetNativeWindowConfig(nativeWindowTmp);
1516
1517    NativeWindowBuffer *nativeWindowBuffer1 = nullptr;
1518    int fenceFd = -1;
1519    int32_t ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowTmp, &nativeWindowBuffer1, &fenceFd);
1520    ASSERT_EQ(ret, GSERROR_OK);
1521    ASSERT_EQ(OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer1),
1522        OHOS::SURFACE_ERROR_BUFFER_NOT_INCACHE);
1523    OH_NativeWindow_DestroyNativeWindow(nativeWindowTmp);
1524}
1525
1526/*
1527* Function: OH_NativeWindow_NativeObjectReference
1528* Type: Function
1529* Rank: Important(2)
1530* EnvConditions: N/A
1531* CaseDescription: 1. call OH_NativeWindow_NativeObjectReference
1532*                  2. check ret
1533 */
1534HWTEST_F(NativeWindowTest, Reference001, Function | MediumTest | Level2)
1535{
1536    struct NativeWindowBuffer *buffer = new NativeWindowBuffer();
1537    buffer->sfbuffer = sBuffer;
1538    ASSERT_EQ(OH_NativeWindow_NativeObjectReference(reinterpret_cast<void *>(buffer)), OHOS::GSERROR_OK);
1539    delete buffer;
1540}
1541
1542/*
1543* Function: OH_NativeWindow_NativeObjectUnreference
1544* Type: Function
1545* Rank: Important(2)
1546* EnvConditions: N/A
1547* CaseDescription: 1. call OH_NativeWindow_NativeObjectUnreference
1548*                  2. check ret
1549 */
1550HWTEST_F(NativeWindowTest, Unreference001, Function | MediumTest | Level2)
1551{
1552    struct NativeWindowBuffer *buffer = new NativeWindowBuffer();
1553    buffer->sfbuffer = sBuffer;
1554    ASSERT_EQ(OH_NativeWindow_NativeObjectUnreference(reinterpret_cast<void *>(buffer)), OHOS::GSERROR_OK);
1555    delete buffer;
1556}
1557
1558/*
1559* Function: OH_NativeWindow_DestroyNativeWindow
1560* Type: Function
1561* Rank: Important(2)
1562* EnvConditions: N/A
1563* CaseDescription: 1. call OH_NativeWindow_DestroyNativeWindow by abnormal input
1564*                  2. check ret
1565 */
1566HWTEST_F(NativeWindowTest, DestroyNativeWindow001, Function | MediumTest | Level2)
1567{
1568    OHNativeWindow* window = nullptr;
1569    ASSERT_EQ(window, nullptr);
1570    OH_NativeWindow_DestroyNativeWindow(window);
1571}
1572
1573/*
1574* Function: OH_NativeWindow_DestroyNativeWindowBuffer
1575* Type: Function
1576* Rank: Important(2)
1577* EnvConditions: N/A
1578* CaseDescription: 1. call OH_NativeWindow_DestroyNativeWindowBuffer by abnormal input
1579*                  2. check ret
1580 */
1581HWTEST_F(NativeWindowTest, OH_NativeWindow_DestroyNativeWindowBuffer001, Function | MediumTest | Level2)
1582{
1583    OHNativeWindowBuffer* buffer = nullptr;
1584    ASSERT_EQ(buffer, nullptr);
1585    OH_NativeWindow_DestroyNativeWindowBuffer(buffer);
1586}
1587
1588/*
1589* Function: OH_NativeWindow_NativeWindowSetScalingMode
1590* Type: Function
1591* Rank: Important(2)
1592* EnvConditions: N/A
1593* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetScalingMode with abnormal parameters and check ret
1594 */
1595HWTEST_F(NativeWindowTest, SetScalingMode001, Function | MediumTest | Level2)
1596{
1597    OHScalingMode scalingMode = OHScalingMode::OH_SCALING_MODE_SCALE_TO_WINDOW;
1598    ASSERT_EQ(OH_NativeWindow_NativeWindowSetScalingMode(nullptr, -1, scalingMode), OHOS::GSERROR_INVALID_ARGUMENTS);
1599}
1600
1601/*
1602* Function: OH_NativeWindow_NativeWindowSetScalingMode
1603* Type: Function
1604* Rank: Important(2)
1605* EnvConditions: N/A
1606* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetScalingMode with abnormal parameters and check ret
1607 */
1608HWTEST_F(NativeWindowTest, SetScalingMode002, Function | MediumTest | Level2)
1609{
1610    OHScalingMode scalingMode = OHScalingMode::OH_SCALING_MODE_SCALE_TO_WINDOW;
1611    ASSERT_EQ(OH_NativeWindow_NativeWindowSetScalingMode(nativeWindow, -1, scalingMode), OHOS::GSERROR_NO_ENTRY);
1612}
1613
1614/*
1615* Function: OH_NativeWindow_NativeWindowSetScalingMode
1616* Type: Function
1617* Rank: Important(2)
1618* EnvConditions: N/A
1619* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetScalingMode with abnormal parameters and check ret
1620 */
1621HWTEST_F(NativeWindowTest, SetScalingMode003, Function | MediumTest | Level2)
1622{
1623    ASSERT_EQ(OH_NativeWindow_NativeWindowSetScalingMode(nativeWindow, firstSeqnum,
1624                                         static_cast<OHScalingMode>(OHScalingMode::OH_SCALING_MODE_NO_SCALE_CROP + 1)),
1625                                         OHOS::GSERROR_INVALID_ARGUMENTS);
1626}
1627
1628/*
1629* Function: OH_NativeWindow_NativeWindowSetScalingMode
1630* Type: Function
1631* Rank: Important(1)
1632* EnvConditions: N/A
1633* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetScalingMode with abnormal parameters and check ret
1634*                  2. call OH_NativeWindow_NativeWindowSetScalingMode with normal parameters and check ret
1635 */
1636HWTEST_F(NativeWindowTest, SetScalingMode004, Function | MediumTest | Level1)
1637{
1638    OHScalingMode scalingMode = OHScalingMode::OH_SCALING_MODE_SCALE_TO_WINDOW;
1639    ASSERT_EQ(OH_NativeWindow_NativeWindowSetScalingMode(nativeWindow, firstSeqnum, scalingMode), OHOS::GSERROR_OK);
1640}
1641
1642/*
1643* Function: OH_NativeWindow_NativeWindowSetScalingModeV2
1644* Type: Function
1645* Rank: Important(1)
1646* EnvConditions: N/A
1647* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetScalingModeV2 with abnormal parameters and check ret
1648*                  2. call OH_NativeWindow_NativeWindowSetScalingModeV2 with normal parameters and check ret
1649 */
1650HWTEST_F(NativeWindowTest, SetScalingMode005, Function | MediumTest | Level1)
1651{
1652    OHScalingModeV2 scalingMode = OHScalingModeV2::OH_SCALING_MODE_SCALE_TO_WINDOW_V2;
1653    ASSERT_EQ(OH_NativeWindow_NativeWindowSetScalingModeV2(nativeWindow, scalingMode), OHOS::GSERROR_OK);
1654}
1655
1656
1657/*
1658* Function: OH_NativeWindow_NativeWindowSetMetaData
1659* Type: Function
1660* Rank: Important(2)
1661* EnvConditions: N/A
1662* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaData with abnormal parameters and check ret
1663 */
1664HWTEST_F(NativeWindowTest, SetMetaData001, Function | MediumTest | Level2)
1665{
1666    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaData(nullptr, -1, 0, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1667}
1668
1669/*
1670* Function: OH_NativeWindow_NativeWindowSetMetaData
1671* Type: Function
1672* Rank: Important(2)
1673* EnvConditions: N/A
1674* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaData with abnormal parameters and check ret
1675 */
1676HWTEST_F(NativeWindowTest, SetMetaData002, Function | MediumTest | Level2)
1677{
1678    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaData(nativeWindow, -1, 0, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1679}
1680
1681/*
1682* Function: OH_NativeWindow_NativeWindowSetMetaData
1683* Type: Function
1684* Rank: Important(2)
1685* EnvConditions: N/A
1686* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaData with abnormal parameters and check ret
1687*                  2. call OH_NativeWindow_NativeWindowSetMetaData with normal parameters and check ret
1688 */
1689HWTEST_F(NativeWindowTest, SetMetaData003, Function | MediumTest | Level2)
1690{
1691    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaData(nativeWindow, firstSeqnum, 0, nullptr),
1692              OHOS::GSERROR_INVALID_ARGUMENTS);
1693}
1694
1695/*
1696* Function: OH_NativeWindow_NativeWindowSetMetaData
1697* Type: Function
1698* Rank: Important(2)
1699* EnvConditions: N/A
1700* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaData with abnormal parameters and check ret
1701 */
1702HWTEST_F(NativeWindowTest, SetMetaData004, Function | MediumTest | Level2)
1703{
1704    int32_t size = 1;
1705    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaData(nativeWindow, firstSeqnum, size, nullptr),
1706              OHOS::GSERROR_INVALID_ARGUMENTS);
1707}
1708
1709/*
1710* Function: OH_NativeWindow_NativeWindowSetMetaData
1711* Type: Function
1712* Rank: Important(2)
1713* EnvConditions: N/A
1714* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaData with abnormal parameters and check ret
1715 */
1716HWTEST_F(NativeWindowTest, SetMetaData005, Function | MediumTest | Level2)
1717{
1718    int32_t size = 1;
1719    const OHHDRMetaData metaData[] = {{OH_METAKEY_RED_PRIMARY_X, 0}};
1720    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaData(nativeWindow, -1, size, metaData), OHOS::GSERROR_NO_ENTRY);
1721}
1722
1723/*
1724* Function: OH_NativeWindow_NativeWindowSetMetaData
1725* Type: Function
1726* Rank: Important(1)
1727* EnvConditions: N/A
1728* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaData with normal parameters and check ret
1729 */
1730HWTEST_F(NativeWindowTest, SetMetaData006, Function | MediumTest | Level1)
1731{
1732    int32_t size = 1;
1733    const OHHDRMetaData metaData[] = {{OH_METAKEY_RED_PRIMARY_X, 0}};
1734    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaData(nativeWindow, firstSeqnum, size, metaData), OHOS::GSERROR_OK);
1735}
1736
1737/*
1738* Function: OH_NativeWindow_NativeWindowSetMetaDataSet
1739* Type: Function
1740* Rank: Important(2)
1741* EnvConditions: N/A
1742* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaDataSet with abnormal parameters and check ret
1743 */
1744HWTEST_F(NativeWindowTest, SetMetaDataSet001, Function | MediumTest | Level2)
1745{
1746    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
1747    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaDataSet(nullptr, -1, key, 0, nullptr),
1748              OHOS::GSERROR_INVALID_ARGUMENTS);
1749}
1750
1751/*
1752* Function: OH_NativeWindow_NativeWindowSetMetaDataSet
1753* Type: Function
1754* Rank: Important(2)
1755* EnvConditions: N/A
1756* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaDataSet with abnormal parameters and check ret
1757 */
1758HWTEST_F(NativeWindowTest, SetMetaDataSet002, Function | MediumTest | Level2)
1759{
1760    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
1761    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaDataSet(nativeWindow, -1, key, 0, nullptr),
1762              OHOS::GSERROR_INVALID_ARGUMENTS);
1763}
1764
1765/*
1766* Function: OH_NativeWindow_NativeWindowSetMetaDataSet
1767* Type: Function
1768* Rank: Important(2)
1769* EnvConditions: N/A
1770* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaDataSet with abnormal parameters and check ret
1771 */
1772HWTEST_F(NativeWindowTest, SetMetaDataSet003, Function | MediumTest | Level2)
1773{
1774    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
1775    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaDataSet(nativeWindow, firstSeqnum, key, 0, nullptr),
1776              OHOS::GSERROR_INVALID_ARGUMENTS);
1777}
1778
1779/*
1780* Function: OH_NativeWindow_NativeWindowSetMetaDataSet
1781* Type: Function
1782* Rank: Important(2)
1783* EnvConditions: N/A
1784* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaDataSet with abnormal parameters and check ret
1785 */
1786HWTEST_F(NativeWindowTest, SetMetaDataSet004, Function | MediumTest | Level2)
1787{
1788    int32_t size = 1;
1789    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
1790    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaDataSet(nativeWindow, firstSeqnum, key, size, nullptr),
1791              OHOS::GSERROR_INVALID_ARGUMENTS);
1792}
1793
1794/*
1795* Function: OH_NativeWindow_NativeWindowSetMetaDataSet
1796* Type: Function
1797* Rank: Important(2)
1798* EnvConditions: N/A
1799* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaDataSet with abnormal parameters and check ret
1800 */
1801HWTEST_F(NativeWindowTest, SetMetaDataSet005, Function | MediumTest | Level2)
1802{
1803    int32_t size = 1;
1804    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
1805    const uint8_t metaData[] = {0};
1806    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaDataSet(nativeWindow, -1, key, size, metaData),
1807              OHOS::GSERROR_NO_ENTRY);
1808}
1809
1810/*
1811* Function: OH_NativeWindow_NativeWindowSetMetaDataSet
1812* Type: Function
1813* Rank: Important(1)
1814* EnvConditions: N/A
1815* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetMetaDataSet with normal parameters and check ret
1816 */
1817HWTEST_F(NativeWindowTest, SetMetaDataSet006, Function | MediumTest | Level1)
1818{
1819    int32_t size = 1;
1820    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
1821    const uint8_t metaData[] = {0};
1822    ASSERT_EQ(OH_NativeWindow_NativeWindowSetMetaDataSet(nativeWindow, firstSeqnum, key, size, metaData),
1823              OHOS::GSERROR_OK);
1824}
1825
1826/*
1827* Function: OH_NativeWindow_NativeWindowSetTunnelHandle
1828* Type: Function
1829* Rank: Important(2)
1830* EnvConditions: N/A
1831* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetTunnelHandle with abnormal parameters and check ret
1832 */
1833HWTEST_F(NativeWindowTest, SetTunnelHandle001, Function | MediumTest | Level2)
1834{
1835    ASSERT_EQ(OH_NativeWindow_NativeWindowSetTunnelHandle(nullptr, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1836}
1837
1838/*
1839* Function: OH_NativeWindow_NativeWindowSetTunnelHandle
1840* Type: Function
1841* Rank: Important(2)
1842* EnvConditions: N/A
1843* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetTunnelHandle with abnormal parameters and check ret
1844 */
1845HWTEST_F(NativeWindowTest, SetTunnelHandle002, Function | MediumTest | Level2)
1846{
1847    ASSERT_EQ(OH_NativeWindow_NativeWindowSetTunnelHandle(nativeWindow, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1848}
1849
1850/*
1851* Function: OH_NativeWindow_NativeWindowSetTunnelHandle
1852* Type: Function
1853* Rank: Important(2)
1854* EnvConditions: N/A
1855* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetTunnelHandle with normal parameters and check ret
1856 */
1857HWTEST_F(NativeWindowTest, SetTunnelHandle003, Function | MediumTest | Level2)
1858{
1859    uint32_t reserveInts = 1;
1860    OHExtDataHandle *handle = AllocOHExtDataHandle(reserveInts);
1861    ASSERT_EQ(OH_NativeWindow_NativeWindowSetTunnelHandle(nativeWindow, handle), OHOS::GSERROR_OK);
1862    FreeOHExtDataHandle(handle);
1863}
1864
1865/*
1866* Function: OH_NativeWindow_NativeWindowSetTunnelHandle
1867* Type: Function
1868* Rank: Important(1)
1869* EnvConditions: N/A
1870* CaseDescription: 1. call OH_NativeWindow_NativeWindowSetTunnelHandle with normal parameters and check ret
1871* @tc.require: issueI5GMZN issueI5IWHW
1872 */
1873HWTEST_F(NativeWindowTest, SetTunnelHandle004, Function | MediumTest | Level1)
1874{
1875    uint32_t reserveInts = 2;
1876    OHExtDataHandle *handle = AllocOHExtDataHandle(reserveInts);
1877    nativeWindow = OH_NativeWindow_CreateNativeWindow(&pSurface);
1878    ASSERT_NE(nativeWindow, nullptr);
1879    ASSERT_EQ(OH_NativeWindow_NativeWindowSetTunnelHandle(nativeWindow, handle), OHOS::GSERROR_OK);
1880    ASSERT_EQ(OH_NativeWindow_NativeWindowSetTunnelHandle(nativeWindow, handle), OHOS::GSERROR_NO_ENTRY);
1881    FreeOHExtDataHandle(handle);
1882}
1883
1884/*
1885* Function: NativeWindowGetTransformHint
1886* Type: Function
1887* Rank: Important(1)
1888* EnvConditions: N/A
1889* CaseDescription: 1. call NativeWindowGetTransformHint with normal parameters and check ret
1890* @tc.require: issueI5GMZN issueI5IWHW
1891 */
1892HWTEST_F(NativeWindowTest, NativeWindowGetTransformHint001, Function | MediumTest | Level1)
1893{
1894    OH_NativeBuffer_TransformType transform = OH_NativeBuffer_TransformType::NATIVEBUFFER_ROTATE_180;
1895    ASSERT_EQ(NativeWindowGetTransformHint(nullptr, &transform), OHOS::GSERROR_INVALID_ARGUMENTS);
1896    ASSERT_EQ(NativeWindowSetTransformHint(nullptr, transform), OHOS::GSERROR_INVALID_ARGUMENTS);
1897    ASSERT_EQ(NativeWindowSetTransformHint(nativeWindow, transform), OHOS::GSERROR_OK);
1898    transform = OH_NativeBuffer_TransformType::NATIVEBUFFER_ROTATE_NONE;
1899    ASSERT_EQ(NativeWindowGetTransformHint(nativeWindow, &transform), OHOS::GSERROR_OK);
1900    ASSERT_EQ(transform, OH_NativeBuffer_TransformType::NATIVEBUFFER_ROTATE_180);
1901}
1902
1903/*
1904* Function: NativeWindowGetDefaultWidthAndHeight
1905* Type: Function
1906* Rank: Important(1)
1907* EnvConditions: N/A
1908* CaseDescription: 1. call NativeWindowGetDefaultWidthAndHeight with normal parameters and check ret
1909* @tc.require: issueI5GMZN issueI5IWHW
1910 */
1911HWTEST_F(NativeWindowTest, NativeWindowGetDefaultWidthAndHeight001, Function | MediumTest | Level1)
1912{
1913    ASSERT_EQ(NativeWindowGetDefaultWidthAndHeight(nullptr, nullptr, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
1914    cSurface->SetDefaultWidthAndHeight(300, 400);
1915    int32_t width;
1916    int32_t height;
1917    ASSERT_EQ(NativeWindowGetDefaultWidthAndHeight(nativeWindow, &width, &height), OHOS::GSERROR_OK);
1918    ASSERT_EQ(width, 300);
1919    ASSERT_EQ(height, 400);
1920}
1921
1922/*
1923* Function: NativeWindowSetBufferHold
1924* Type: Function
1925* Rank: Important(1)
1926* EnvConditions: N/A
1927* CaseDescription: 1. call NativeWindowSetBufferHold and no ret
1928* @tc.require: issueI5GMZN issueI5IWHW
1929 */
1930HWTEST_F(NativeWindowTest, NativeWindowSetBufferHold001, Function | MediumTest | Level1)
1931{
1932    NativeWindowSetBufferHold(nullptr);
1933    NativeWindowSetBufferHold(nativeWindow);
1934    int fenceFd = -1;
1935    struct Region *region = new Region();
1936    region->rectNumber = 0;
1937    region->rects = nullptr;
1938    ASSERT_EQ(OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region),
1939              OHOS::GSERROR_BUFFER_STATE_INVALID);
1940    region->rectNumber = 1;
1941    struct Region::Rect * rect = new Region::Rect();
1942    rect->x = 0x100;
1943    rect->y = 0x100;
1944    rect->w = 0x100;
1945    rect->h = 0x100;
1946    region->rects = rect;
1947    ASSERT_EQ(OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, *region),
1948              OHOS::GSERROR_BUFFER_STATE_INVALID);
1949    cSurface->SetBufferHold(false);
1950    delete rect;
1951    delete region;
1952}
1953
1954/*
1955* Function: NativeWindow_ReadWriteWindow
1956* Type: Function
1957* Rank: Important(1)
1958* EnvConditions: N/A
1959* CaseDescription: 1. call OH_NativeWindow_WriteToParcel and OH_NativeWindow_ReadFromParcel
1960* @tc.require: issueI5GMZN issueI5IWHW
1961 */
1962HWTEST_F(NativeWindowTest, NativeWindowReadWriteWindow001, Function | MediumTest | Level1)
1963{
1964    using namespace OHOS;
1965    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create();
1966    sptr<IBufferConsumerListener> listener = new BufferConsumerListener();
1967    cSurface->RegisterConsumerListener(listener);
1968    sptr<OHOS::IBufferProducer> producer = cSurface->GetProducer();
1969    sptr<OHOS::Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
1970    OHNativeWindow* nativeWindow = CreateNativeWindowFromSurface(&pSurface);
1971    auto uniqueId = nativeWindow->surface->GetUniqueId();
1972    ASSERT_NE(nativeWindow, nullptr);
1973    OHIPCParcel *parcel1 = OH_IPCParcel_Create();
1974    OHIPCParcel *parcel2 = OH_IPCParcel_Create();
1975    ASSERT_NE(parcel1, nullptr);
1976    ASSERT_NE(parcel2, nullptr);
1977    ASSERT_EQ(OH_NativeWindow_WriteToParcel(nullptr, parcel1), SURFACE_ERROR_INVALID_PARAM);
1978    ASSERT_EQ(OH_NativeWindow_WriteToParcel(nativeWindow, nullptr), SURFACE_ERROR_INVALID_PARAM);
1979    auto innerParcel = parcel1->msgParcel;
1980    parcel1->msgParcel = nullptr;
1981    ASSERT_EQ(OH_NativeWindow_WriteToParcel(nativeWindow, parcel1), SURFACE_ERROR_INVALID_PARAM);
1982    parcel1->msgParcel = innerParcel;
1983    ASSERT_EQ(OH_NativeWindow_WriteToParcel(nativeWindow, parcel1), GSERROR_OK);
1984    ASSERT_EQ(OH_NativeWindow_WriteToParcel(nativeWindow, parcel2), GSERROR_OK);
1985    // test read
1986    OHNativeWindow *readWindow = nullptr;
1987    ASSERT_EQ(OH_NativeWindow_ReadFromParcel(nullptr, &readWindow), SURFACE_ERROR_INVALID_PARAM);
1988    ASSERT_EQ(OH_NativeWindow_ReadFromParcel(parcel1, &readWindow), GSERROR_OK);
1989    ASSERT_NE(readWindow, nullptr);
1990    // test read twice
1991    OHNativeWindow *tempWindow = nullptr;
1992    ASSERT_EQ(OH_NativeWindow_ReadFromParcel(parcel1, &tempWindow), SURFACE_ERROR_INVALID_PARAM);
1993    cout << "test read write window, write window is " << nativeWindow << ", read windows is " << readWindow << endl;
1994    auto readId = readWindow->surface->GetUniqueId();
1995    ASSERT_EQ(uniqueId, readId);
1996    OHNativeWindow *readWindow1 = nullptr;
1997    SurfaceUtils::GetInstance()->RemoveNativeWindow(uniqueId);
1998    ASSERT_EQ(OH_NativeWindow_ReadFromParcel(parcel2, &readWindow1), GSERROR_OK);
1999    ASSERT_NE(readWindow1, nativeWindow);
2000    auto readId1 = readWindow1->surface->GetUniqueId();
2001    ASSERT_EQ(uniqueId, readId1);
2002    cout << "write uniqueId is " << uniqueId << ", parcel1 read id is " << readId <<
2003        ", parcel2 read id is " << readId1 << endl;
2004    OH_NativeWindow_DestroyNativeWindow(readWindow1);
2005    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
2006    OH_IPCParcel_Destroy(parcel1);
2007    OH_IPCParcel_Destroy(parcel2);
2008}
2009
2010/*
2011* Function: NativeWindow_ReadWriteWindow
2012* Type: Function
2013* Rank: Important(1)
2014* EnvConditions: N/A
2015* CaseDescription: 1. call OH_NativeWindow_WriteToParcel and OH_NativeWindow_ReadFromParcel
2016* @tc.require: issueI5GMZN issueI5IWHW
2017 */
2018HWTEST_F(NativeWindowTest, NativeWindowReadWriteWindow002, Function | MediumTest | Level1)
2019{
2020    using namespace OHOS;
2021    // test for no surface->GetUniqueId
2022    OHNativeWindow* nativeWindow1 = new OHNativeWindow();
2023    ASSERT_NE(nativeWindow1, nullptr);
2024    OHIPCParcel *parcel1 = OH_IPCParcel_Create();
2025    ASSERT_NE(parcel1, nullptr);
2026    ASSERT_EQ(OH_NativeWindow_WriteToParcel(nativeWindow1, parcel1), SURFACE_ERROR_INVALID_PARAM);
2027    OHNativeWindow *readWindow = nullptr;
2028    ASSERT_EQ(OH_NativeWindow_ReadFromParcel(parcel1, nullptr), SURFACE_ERROR_INVALID_PARAM);
2029    ASSERT_EQ(OH_NativeWindow_ReadFromParcel(parcel1, &readWindow), SURFACE_ERROR_INVALID_PARAM);
2030    OH_IPCParcel_Destroy(parcel1);
2031    delete nativeWindow1;
2032}
2033
2034/*
2035* Function: SurfaceErrorInvalidParameter
2036* Type: Function
2037* Rank: Important(2)
2038* EnvConditions: N/A
2039* CaseDescription: 1. call functions with invalid parameters and check ret
2040*/
2041HWTEST_F(NativeWindowTest, SurfaceErrorInvalidParameter001, Function | MediumTest | Level2)
2042{
2043    int fence = -1;
2044    ASSERT_EQ(OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nullptr), nullptr);
2045    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBuffer(nullptr, nullptr, &fence, nullptr), SURFACE_ERROR_INVALID_PARAM);
2046    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, nullptr, &fence, nullptr),
2047        SURFACE_ERROR_INVALID_PARAM);
2048    ASSERT_EQ(GetNativeObjectMagic(nullptr), -1);
2049    ASSERT_EQ(GetSurfaceId(nativeWindow, nullptr), SURFACE_ERROR_INVALID_PARAM);
2050    ASSERT_EQ(NativeWindowGetTransformHint(nativeWindow, nullptr), SURFACE_ERROR_INVALID_PARAM);
2051    ASSERT_EQ(NativeWindowGetDefaultWidthAndHeight(nativeWindow, nullptr, nullptr), SURFACE_ERROR_INVALID_PARAM);
2052    int32_t width;
2053    ASSERT_EQ(NativeWindowGetDefaultWidthAndHeight(nativeWindow, &width, nullptr), SURFACE_ERROR_INVALID_PARAM);
2054    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBufferV2(nullptr, nullptr, &fence, nullptr), SURFACE_ERROR_INVALID_PARAM);
2055    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, nullptr, &fence, nullptr),
2056        SURFACE_ERROR_INVALID_PARAM);
2057    ASSERT_EQ(OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, nullptr, nullptr, nullptr),
2058        SURFACE_ERROR_INVALID_PARAM);
2059    ASSERT_EQ(NativeWindowDisconnect(nullptr), SURFACE_ERROR_INVALID_PARAM);
2060    ASSERT_EQ(OH_NativeWindow_SetColorSpace(nullptr, OH_COLORSPACE_NONE), SURFACE_ERROR_INVALID_PARAM);
2061    ASSERT_EQ(OH_NativeWindow_GetColorSpace(nullptr, nullptr), SURFACE_ERROR_INVALID_PARAM);
2062    ASSERT_EQ(OH_NativeWindow_GetColorSpace(nativeWindow, nullptr), SURFACE_ERROR_INVALID_PARAM);
2063    ASSERT_EQ(OH_NativeWindow_GetMetadataValue(nullptr, OH_HDR_METADATA_TYPE, nullptr, nullptr),
2064        SURFACE_ERROR_INVALID_PARAM);
2065    ASSERT_EQ(OH_NativeWindow_GetMetadataValue(nativeWindow, OH_HDR_METADATA_TYPE, nullptr, nullptr),
2066        SURFACE_ERROR_INVALID_PARAM);
2067}
2068
2069/*
2070* Function: SurfaceErrorInvalidParameter
2071* Type: Function
2072* Rank: Important(2)
2073* EnvConditions: N/A
2074* CaseDescription: 1. call functions with invalid parameters and check ret
2075*/
2076HWTEST_F(NativeWindowTest, SurfaceErrorInvalidParameter002, Function | MediumTest | Level2)
2077{
2078    OHNativeWindow *nativeWindowTemp = new OHNativeWindow();
2079    NativeWindowBuffer *nativeWindowBuffer1;
2080    Region region;
2081    int32_t height;
2082    int32_t width;
2083    int fence = -1;
2084    ASSERT_EQ(OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer1, nullptr),
2085        SURFACE_ERROR_INVALID_PARAM);
2086    ASSERT_EQ(NativeWindowFlushBuffer(nativeWindowTemp, nativeWindowBuffer, fence, region),
2087        SURFACE_ERROR_INVALID_PARAM);
2088    ASSERT_EQ(OH_NativeWindow_NativeWindowHandleOpt(nativeWindowTemp, 0), OHOS::GSERROR_INVALID_ARGUMENTS);
2089    OHScalingMode scalingMode1 = OHScalingMode::OH_SCALING_MODE_SCALE_TO_WINDOW;
2090    OHScalingModeV2 scalingMode2 = OHScalingModeV2::OH_SCALING_MODE_SCALE_TO_WINDOW_V2;
2091    ASSERT_EQ(OH_NativeWindow_NativeWindowSetScalingMode(nativeWindowTemp, firstSeqnum, scalingMode1),
2092        OHOS::GSERROR_INVALID_ARGUMENTS);
2093    ASSERT_EQ(NativeWindowSetScalingModeV2(nativeWindowTemp, scalingMode2), OHOS::GSERROR_INVALID_ARGUMENTS);
2094    ASSERT_EQ(NativeWindowSetScalingModeV2(nullptr, scalingMode2), OHOS::GSERROR_INVALID_ARGUMENTS);
2095    ASSERT_EQ(NativeWindowSetMetaData(nativeWindowTemp, 0, 0, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
2096    OHHDRMetadataKey key = OHHDRMetadataKey::OH_METAKEY_HDR10_PLUS;
2097    ASSERT_EQ(NativeWindowSetMetaDataSet(nativeWindowTemp, 0, key, 0, nullptr), OHOS::GSERROR_INVALID_ARGUMENTS);
2098    OHExtDataHandle *handle = AllocOHExtDataHandle(1);
2099    ASSERT_EQ(NativeWindowSetTunnelHandle(nativeWindowTemp, handle), OHOS::GSERROR_INVALID_ARGUMENTS);
2100    OH_NativeBuffer_TransformType transform = OH_NativeBuffer_TransformType::NATIVEBUFFER_ROTATE_180;
2101    ASSERT_EQ(NativeWindowGetTransformHint(nativeWindowTemp, &transform), OHOS::GSERROR_INVALID_ARGUMENTS);
2102    ASSERT_EQ(NativeWindowSetTransformHint(nativeWindowTemp, transform), OHOS::GSERROR_INVALID_ARGUMENTS);
2103    ASSERT_EQ(NativeWindowGetDefaultWidthAndHeight(nativeWindowTemp, &width, &height), OHOS::GSERROR_INVALID_ARGUMENTS);
2104    NativeWindowSetBufferHold(nativeWindowTemp);
2105}
2106
2107/*
2108* Function: NativeWindowSetRequestWidthAndHeight
2109* Type: Function
2110* Rank: Important(2)
2111* EnvConditions: N/A
2112* CaseDescription: 1. call NativeWindowSetRequestWidthAndHeight with invalid parameters and check ret
2113*                  2. call NativeWindowSetRequestWidthAndHeight with normal parameters and check ret
2114*                  3. call NativeWindowSetRequestWidthAndHeight with zore width and check ret
2115*                  3. call NativeWindowSetRequestWidthAndHeight with zore height and check ret
2116 */
2117HWTEST_F(NativeWindowTest, NativeWindowSetRequestWidthAndHeight001, Function | MediumTest | Level2)
2118{
2119    int fence = -1;
2120    ASSERT_EQ(NativeWindowSetRequestWidthAndHeight(nullptr, 0, 0), SURFACE_ERROR_INVALID_PARAM);
2121    cSurface->SetDefaultWidthAndHeight(300, 400);
2122    //分支1:走使用requestWidth/Height新建config分支
2123    ASSERT_EQ(NativeWindowSetRequestWidthAndHeight(nativeWindow, 100, 200), OHOS::GSERROR_OK);
2124    NativeWindowBuffer *nativeWindowBuffer1 = nullptr;
2125    auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer1, &fence);
2126    if (ret != GSERROR_HDI_ERROR) {
2127        ASSERT_EQ(ret, GSERROR_OK);
2128        ASSERT_EQ(nativeWindowBuffer1->sfbuffer->GetWidth(), 100);
2129        ASSERT_EQ(nativeWindowBuffer1->sfbuffer->GetHeight(), 200);
2130        ASSERT_EQ(NativeWindowCancelBuffer(nativeWindow, nativeWindowBuffer1), GSERROR_OK);
2131    }
2132    //分支2:使用surface成员变量windowConfig_(未初始化)
2133    ASSERT_EQ(NativeWindowSetRequestWidthAndHeight(nativeWindow, 0, 200), OHOS::GSERROR_OK);
2134    ASSERT_NE(OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer1, &fence),
2135        OHOS::GSERROR_OK);
2136    ASSERT_EQ(NativeWindowSetRequestWidthAndHeight(nativeWindow, 100, 0), OHOS::GSERROR_OK);
2137    ASSERT_NE(OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer1, &fence),
2138        OHOS::GSERROR_OK);
2139}
2140
2141/*
2142* Function: OH_NativeWindow_DestroyNativeWindowBuffer
2143* Type: Function
2144* Rank: Important(2)
2145* EnvConditions: N/A
2146* CaseDescription: 1. call OH_NativeWindow_DestroyNativeWindowBuffer again
2147*                  2. check ret
2148 */
2149HWTEST_F(NativeWindowTest, OH_NativeWindow_DestroyNativeWindowBuffer002, Function | MediumTest | Level2)
2150{
2151    ASSERT_NE(nativeWindowBuffer, nullptr);
2152    OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
2153}
2154}
2155