1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 //
17 // Created on 2024/8/6.
18 //
19 // Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
20 // please include "napi/native_api.h".
21 #include "napi/native_api.h"
22 #include <IPCKit/ipc_cparcel.h>
23 #include <bits/alltypes.h>
24 #include <GLES2/gl2.h>
25 #include <multimedia/player_framework/native_avcodec_base.h>
26 #include <native_image/native_image.h>
27 #include <native_window/external_window.h>
28 #include <native_buffer/native_buffer.h>
29 
30 
31 #define SUCCESS 0
32 #define FAIL (-1)
33 
34 #define CONSTANT_0 0
35 #define CONSTANT_1 1
36 #define CONSTANT_2 2
37 #define CONSTANT_3 3
38 #define CONSTANT_4 4
39 #define CONSTANT_5 5
40 #define CONSTANT_6 6
41 #define CONSTANT_7 7
42 #define CONSTANT_8 8
43 
44 #define CONSTANT_500 500
45 #define CONSTANT_1000 1000
46 #define CONSTANT_10000 10000
47 
48 #define CONSTANT_40001000 40001000
49 #define CONSTANT_41207000 41207000
50 #define CONSTANT_41208000 41208000
51 #define CONSTANT_41210000 41210000
52 
53 #define CONSTANT_50002000 50002000
54 #define CONSTANT_50102000 50102000
55 
56 #define CONSTANT_999999999 999999999
57 #define CONSTANT_9999999999999999999 9999999999999999999
58 
59 struct result {
60     OH_NativeImage *image;
61     OHNativeWindow *nativeWindow;
62     int32_t width_;
63     int32_t height_;
64 };
65 
InitNativeWindow()66 static result InitNativeWindow()
67 {
68     struct result result1;
69     GLuint textureId;
70     glGenTextures(1, &textureId);
71     auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D);
72     result1.image = _image;
73     OHNativeWindow *_nativeWindow = OH_NativeImage_AcquireNativeWindow(_image);
74     result1.nativeWindow = _nativeWindow;
75     int code = SET_BUFFER_GEOMETRY;
76     result1.width_ = 0x100;
77     result1.height_ = 0x100;
78     int32_t ret = OH_NativeWindow_NativeWindowHandleOpt(_nativeWindow, code, result1.width_, result1.height_);
79     code = SET_USAGE;
80     int32_t usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA;
81     ret = OH_NativeWindow_NativeWindowHandleOpt(_nativeWindow, code, usage);
82     return result1;
83 }
84 
DestroyNativeWindowImage(OH_NativeImage *image, OHNativeWindow *window)85 static void DestroyNativeWindowImage(OH_NativeImage *image, OHNativeWindow *window)
86 {
87     OH_NativeImage_Destroy(&image);
88     OH_NativeWindow_DestroyNativeWindow(window);
89 }
90 
testNativeWindowCreateNativeWindowNullptr(napi_env env, napi_callback_info info)91 napi_value testNativeWindowCreateNativeWindowNullptr(napi_env env, napi_callback_info info)
92 {
93     napi_value result = nullptr;
94     auto p = OH_NativeWindow_CreateNativeWindow(nullptr);
95     if (p == nullptr) {
96         napi_create_int32(env, SUCCESS, &result);
97     } else {
98         napi_create_int32(env, FAIL, &result);
99     }
100     return result;
101 }
102 
testNativeWindowDestroyNativeWindowNullptr(napi_env env, napi_callback_info info)103 napi_value testNativeWindowDestroyNativeWindowNullptr(napi_env env, napi_callback_info info)
104 {
105     napi_value result = nullptr;
106     OH_NativeWindow_DestroyNativeWindow(nullptr);
107     napi_create_int32(env, SUCCESS, &result);
108     return result;
109 }
110 
testNativeWindowGetSurfaceIdNullptr(napi_env env, napi_callback_info info)111 napi_value testNativeWindowGetSurfaceIdNullptr(napi_env env, napi_callback_info info)
112 {
113     napi_value result = nullptr;
114     auto r = OH_NativeWindow_GetSurfaceId(nullptr, 0);
115     if (CONSTANT_40001000 == r) {
116         napi_create_int32(env, SUCCESS, &result);
117     } else {
118         napi_create_int32(env, FAIL, &result);
119     }
120     return result;
121 }
122 
123 
testNativeWindowCreateNativeWindowFromSurfaceIdNullptr(napi_env env, napi_callback_info info)124 napi_value testNativeWindowCreateNativeWindowFromSurfaceIdNullptr(napi_env env, napi_callback_info info)
125 {
126     napi_value result = nullptr;
127 
128     // 设置OH_NativeWindow_CreateNativeWindowFromSurfaceId()的surfaceId=nullptr,其他参数正常调用该接口
129     OHNativeWindow *nativeWindow = nullptr;
130     auto flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(0, &nativeWindow);
131     if (flag != CONSTANT_40001000) {
132         napi_create_int32(env, 1, &result);
133         return result;
134     }
135 
136     GLuint textureId;
137     glGenTextures(1, &textureId);
138     auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D);
139     auto _nativeWindow = OH_NativeImage_AcquireNativeWindow(_image);
140     uint64_t surfaceId;
141     OH_NativeWindow_GetSurfaceId(_nativeWindow, &surfaceId);
142     // 设置OH_NativeWindow_CreateNativeWindowFromSurfaceId()的window=nullptr,,其他参数正常调用该接口
143     flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, nullptr);
144     if (flag != CONSTANT_40001000) {
145         napi_create_int32(env, CONSTANT_2, &result);
146         return result;
147     }
148     OH_NativeImage_Destroy(&_image);
149     OH_NativeWindow_DestroyNativeWindow(_nativeWindow);
150     napi_create_int32(env, SUCCESS, &result);
151     return result;
152 }
153 
154 
testNativeWindowCreateNativeWindowFromSurfaceIdNormal(napi_env env, napi_callback_info info)155 napi_value testNativeWindowCreateNativeWindowFromSurfaceIdNormal(napi_env env, napi_callback_info info)
156 {
157     napi_value result = nullptr;
158 
159     // 创建surface实例 获取id
160     GLuint textureId;
161     glGenTextures(1, &textureId);
162     auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D);
163     auto _nativeWindow = OH_NativeImage_AcquireNativeWindow(_image);
164     uint64_t surfaceId;
165     OH_NativeWindow_GetSurfaceId(_nativeWindow, &surfaceId);
166 
167     // 声明nativeWindow空指针为window
168     OHNativeWindow *nativeWindow = nullptr;
169     auto flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(surfaceId, &nativeWindow);
170     // 接口执行成功,返回错误码0 | 声明的window指针指向NativeWindow实例
171     if (flag != 0 || nativeWindow == nullptr) {
172         napi_create_int32(env, 1, &result);
173         return result;
174     }
175 
176     // 声明一个surfaceId2
177     uint64_t surfaceId2;
178     flag = OH_NativeWindow_GetSurfaceId(nativeWindow, &surfaceId2);
179     // 接口调用成功,返回错误码0 | get获取surfaceId2与surfaceId一致
180     if (flag != 0 || surfaceId2 != surfaceId) {
181         napi_create_int32(env, CONSTANT_2, &result);
182         return result;
183     }
184 
185     OH_NativeImage_Destroy(&_image);
186     OH_NativeWindow_DestroyNativeWindow(nativeWindow);
187 
188     napi_create_int32(env, SUCCESS, &result);
189     return result;
190 }
191 
192 
testNativeWindowCreateNativeWindowFromSurfaceIdSurfaceId(napi_env env, napi_callback_info info)193 napi_value testNativeWindowCreateNativeWindowFromSurfaceIdSurfaceId(napi_env env, napi_callback_info info)
194 {
195     napi_value result = nullptr;
196 
197     // 创建surface实例 获取一个正常的id
198     GLuint textureId;
199     glGenTextures(1, &textureId);
200     auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D);
201     auto _nativeWindow = OH_NativeImage_AcquireNativeWindow(_image);
202     uint64_t surfaceId;
203     OH_NativeWindow_GetSurfaceId(_nativeWindow, &surfaceId);
204 
205     // 调用该接口,查看执行结果
206     uint64_t ids[] = {0, 1, surfaceId, 0xFFFFFFFF};
207     for (int i = 0; i < sizeof(ids) / sizeof(uint64_t); i += 1) {
208         uint64_t tmpId = ids[i];
209         OHNativeWindow *nativeWindow = nullptr;
210         auto flag = OH_NativeWindow_CreateNativeWindowFromSurfaceId(tmpId, &nativeWindow);
211         // 只有样例3成功
212         if (i == CONSTANT_2) {
213             if (flag != SUCCESS) {
214                 napi_create_int32(env, i + 1, &result);
215                 return result;
216             }
217         } else {
218             OH_NativeWindow_DestroyNativeWindow(nativeWindow);
219             if (flag == SUCCESS) {
220                 napi_create_int32(env, 1 + 1, &result);
221                 return result;
222             }
223         }
224     }
225     OH_NativeImage_Destroy(&_image);
226     OH_NativeWindow_DestroyNativeWindow(_nativeWindow);
227     napi_create_int32(env, SUCCESS, &result);
228     return result;
229 }
230 
231 
testNativeWindowCreateNativeWindowBufferFromNativeBufferNullptr(napi_env env, napi_callback_info info)232 napi_value testNativeWindowCreateNativeWindowBufferFromNativeBufferNullptr(napi_env env, napi_callback_info info)
233 {
234     napi_value result = nullptr;
235     auto buffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nullptr);
236     if (buffer == nullptr) {
237         napi_create_int32(env, SUCCESS, &result);
238     } else {
239         napi_create_int32(env, FAIL, &result);
240     }
241     return result;
242 }
243 
244 
testNativeWindowCreateNativeWindowBufferFromSurfaceBufferNullptr(napi_env env, napi_callback_info info)245 napi_value testNativeWindowCreateNativeWindowBufferFromSurfaceBufferNullptr(napi_env env, napi_callback_info info)
246 {
247     napi_value result = nullptr;
248     auto buffer = OH_NativeWindow_CreateNativeWindowBufferFromSurfaceBuffer(nullptr);
249     if (buffer == nullptr) {
250         napi_create_int32(env, SUCCESS, &result);
251     } else {
252         napi_create_int32(env, FAIL, &result);
253     }
254     return result;
255 }
256 
257 
testNativeWindowDestroyNativeWindowBufferNullptr(napi_env env, napi_callback_info info)258 napi_value testNativeWindowDestroyNativeWindowBufferNullptr(napi_env env, napi_callback_info info)
259 {
260     napi_value result = nullptr;
261     OH_NativeWindow_DestroyNativeWindowBuffer(nullptr);
262     napi_create_int32(env, SUCCESS, &result);
263     return result;
264 }
265 
testNativeWindowGetBufferHandleFromNativeNullptr(napi_env env, napi_callback_info info)266 napi_value testNativeWindowGetBufferHandleFromNativeNullptr(napi_env env, napi_callback_info info)
267 {
268     napi_value result = nullptr;
269     auto ptr = OH_NativeWindow_GetBufferHandleFromNative(nullptr);
270     if (ptr == nullptr) {
271         napi_create_int32(env, SUCCESS, &result);
272     } else {
273         napi_create_int32(env, FAIL, &result);
274     }
275     napi_create_int32(env, SUCCESS, &result);
276     return result;
277 }
278 
279 
testNativeWindowCreateNativeWindowBufferFromNativeBufferNormal(napi_env env, napi_callback_info info)280 napi_value testNativeWindowCreateNativeWindowBufferFromNativeBufferNormal(napi_env env, napi_callback_info info)
281 {
282     napi_value result = nullptr;
283 
284     // 0. 创建 native buffer 实例
285     OH_NativeBuffer_Config config{
286         .width = 0x100,
287         .height = 0x100,
288         .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888,
289         .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA,
290     };
291     OH_NativeBuffer *buffer = OH_NativeBuffer_Alloc(&config);
292     if (buffer == nullptr) {
293         napi_create_int32(env, -1, &result);
294         return result;
295     }
296 
297     // 1.
298     auto nativeWindowBuffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(buffer);
299     // 接口执行成功,返回非空指针
300     if (nativeWindowBuffer == nullptr) {
301         napi_create_int32(env, CONSTANT_1, &result);
302         return result;
303     }
304 
305     // 2.
306     auto bufferHandle = OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer);
307     if (bufferHandle == nullptr) {
308         napi_create_int32(env, CONSTANT_2, &result);
309         return result;
310     }
311 
312     // 3.
313     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
314 
315     // 4.
316     bufferHandle = OH_NativeWindow_GetBufferHandleFromNative(nativeWindowBuffer);
317     if (bufferHandle != nullptr) {
318         napi_create_int32(env, CONSTANT_4, &result);
319         return result;
320     }
321 
322     napi_create_int32(env, SUCCESS, &result);
323     return result;
324 }
325 
326 
testNativeWindowCreateNativeWindowBufferFromNativeBufferMuch(napi_env env, napi_callback_info info)327 napi_value testNativeWindowCreateNativeWindowBufferFromNativeBufferMuch(napi_env env, napi_callback_info info)
328 {
329     napi_value result = nullptr;
330 
331     // 0. 创建 native buffer 实例
332     OH_NativeBuffer_Config config{
333         .width = 0x100,
334         .height = 0x100,
335         .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888,
336         .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA,
337     };
338     OH_NativeBuffer *buffer = OH_NativeBuffer_Alloc(&config);
339     if (buffer == nullptr) {
340         napi_create_int32(env, -1, &result);
341         return result;
342     }
343 
344     for (int i = 0; i < CONSTANT_500; i += 1) {
345         auto ptr = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(buffer);
346         if (ptr == nullptr) {
347             napi_create_int32(env, i + 1, &result);
348             return result;
349         }
350     }
351 
352     napi_create_int32(env, SUCCESS, &result);
353     return result;
354 }
355 
356 
testNativeWindowNativeWindowRequestBufferNullptr(napi_env env, napi_callback_info info)357 napi_value testNativeWindowNativeWindowRequestBufferNullptr(napi_env env, napi_callback_info info)
358 {
359     napi_value result = nullptr;
360 
361     OHNativeWindowBuffer *oHNativeWindowBuffer;
362     int fenceFd;
363 
364     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nullptr, &oHNativeWindowBuffer, &fenceFd);
365     if (flag != CONSTANT_40001000) {
366         napi_create_int32(env, FAIL, &result);
367         return result;
368     }
369 
370     napi_create_int32(env, SUCCESS, &result);
371     return result;
372 }
373 
374 
testNativeWindowNativeWindowAbortBufferNullptr(napi_env env, napi_callback_info info)375 napi_value testNativeWindowNativeWindowAbortBufferNullptr(napi_env env, napi_callback_info info)
376 {
377     napi_value result = nullptr;
378 
379     // 0. 创建 native window 实例
380     struct result result1 = InitNativeWindow();
381     OH_NativeImage *image = result1.image;
382     OHNativeWindow *nativeWindow = result1.nativeWindow;
383     OHNativeWindowBuffer *oHNativeWindowBuffer;
384 
385     // 1. window 为空指针
386     auto flag = OH_NativeWindow_NativeWindowAbortBuffer(nullptr, oHNativeWindowBuffer);
387     if (flag != CONSTANT_40001000) {
388         napi_create_int32(env, 1, &result);
389         return result;
390     }
391 
392     // 2. buffer 为空指针
393     flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nullptr);
394     if (flag != CONSTANT_40001000) {
395         napi_create_int32(env, CONSTANT_2, &result);
396         return result;
397     }
398     DestroyNativeWindowImage(image, nativeWindow);
399     napi_create_int32(env, SUCCESS, &result);
400     return result;
401 }
402 
testNativeWindowNativeWindowRequestAbortBufferNormal(napi_env env, napi_callback_info info)403 napi_value testNativeWindowNativeWindowRequestAbortBufferNormal(napi_env env, napi_callback_info info)
404 {
405     napi_value result = nullptr;
406 
407     // 0. 创建 native window 实例
408     struct result result1 = InitNativeWindow();
409     OH_NativeImage *image = result1.image;
410     OHNativeWindow *nativeWindow = result1.nativeWindow;
411 
412     // 0. 新建 native window buffer 指针
413     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
414 
415     // 1.
416     int fenceFd = -1;
417     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
418     if (flag != 0 || nativeWindowBuffer == nullptr) {
419         napi_create_int32(env, 1, &result);
420         return result;
421     }
422 
423     // 2.
424     flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer);
425     if (flag != 0) {
426         napi_create_int32(env, CONSTANT_2, &result);
427         return result;
428     }
429     DestroyNativeWindowImage(image, nativeWindow);
430     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
431     napi_create_int32(env, SUCCESS, &result);
432     return result;
433 }
434 
testNativeWindowNativeWindowRequestAbortBufferAbnormal(napi_env env, napi_callback_info info)435 napi_value testNativeWindowNativeWindowRequestAbortBufferAbnormal(napi_env env, napi_callback_info info)
436 {
437     napi_value result = nullptr;
438 
439     // 0. 创建 native window 实例
440     struct result result1 = InitNativeWindow();
441     OH_NativeImage *image = result1.image;
442     OHNativeWindow *nativeWindow = result1.nativeWindow;
443     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
444 
445     // 1.
446     int fenceFd = 0;
447     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
448     if (flag != 0 || nativeWindowBuffer == nullptr) {
449         napi_create_int32(env, 1, &result);
450         return result;
451     }
452 
453     // 2.
454     flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer);
455     if (flag != 0) {
456         napi_create_int32(env, CONSTANT_2, &result);
457         return result;
458     }
459 
460     // 3.
461     flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer);
462     if (flag == 0) {
463         napi_create_int32(env, CONSTANT_3, &result);
464     }
465     DestroyNativeWindowImage(image, nativeWindow);
466     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
467     napi_create_int32(env, SUCCESS, &result);
468     return result;
469 }
470 
471 
testNativeWindowNativeWindowRequestBufferFenceFdNormal(napi_env env, napi_callback_info info)472 napi_value testNativeWindowNativeWindowRequestBufferFenceFdNormal(napi_env env, napi_callback_info info)
473 {
474     napi_value result = nullptr;
475 
476     // 0. 创建 native window 实例
477     struct result result1 = InitNativeWindow();
478     OH_NativeImage *image = result1.image;
479     OHNativeWindow *nativeWindow = result1.nativeWindow;
480     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
481 
482     int32_t ls[] = {-CONSTANT_5, -CONSTANT_1, CONSTANT_0, CONSTANT_1, CONSTANT_10000, CONSTANT_999999999};
483     for (int i = 0; i < sizeof(ls) / sizeof(int); i += 1) {
484         int fenceFd = ls[i];
485         auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
486         if (flag != 0) {
487             napi_create_int32(env, 1, &result);
488             return result;
489         }
490         flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer);
491         if (flag != 0) {
492             napi_create_int32(env, CONSTANT_2, &result);
493             return result;
494         }
495     }
496     DestroyNativeWindowImage(image, nativeWindow);
497     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
498     napi_create_int32(env, SUCCESS, &result);
499     return result;
500 }
501 
502 
testNativeWindowNativeWindowRequestBufferFenceFdAbnormal(napi_env env, napi_callback_info info)503 napi_value testNativeWindowNativeWindowRequestBufferFenceFdAbnormal(napi_env env, napi_callback_info info)
504 {
505     napi_value result = nullptr;
506 
507     // 0. 创建 native window 实例
508     struct result result1 = InitNativeWindow();
509     OH_NativeImage *image = result1.image;
510     OHNativeWindow *nativeWindow = result1.nativeWindow;
511     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
512 
513     int32_t *fenceFd1 = NULL;
514     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, fenceFd1);
515     if (flag == 0) {
516         napi_create_int32(env, 1, &result);
517         return result;
518     }
519 
520     int32_t *fenceFd2 = nullptr;
521     flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, fenceFd2);
522     if (flag == 0) {
523         napi_create_int32(env, 1, &result);
524         return result;
525     }
526     DestroyNativeWindowImage(image, nativeWindow);
527     napi_create_int32(env, SUCCESS, &result);
528     return result;
529 }
530 
531 
testNativeWindowNativeWindowRequestAbortBufferMax(napi_env env, napi_callback_info info)532 napi_value testNativeWindowNativeWindowRequestAbortBufferMax(napi_env env, napi_callback_info info)
533 {
534     napi_value result = nullptr;
535 
536     // 0. 创建 native window 实例
537     struct result result1 = InitNativeWindow();
538     OH_NativeImage *image = result1.image;
539     OHNativeWindow *nativeWindow = result1.nativeWindow;
540     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
541 
542     for (int i = 0; i < CONSTANT_4; ++i) {
543         int fenceFd = -1;
544         auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
545         if (i >= CONSTANT_3) {
546             if (flag == 0) {
547                 napi_create_int32(env, FAIL, &result);
548                 return result;
549             }
550         } else {
551             if (flag != 0) {
552                 napi_create_int32(env, i + 1, &result);
553                 return result;
554             }
555         }
556     }
557     DestroyNativeWindowImage(image, nativeWindow);
558     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
559     napi_create_int32(env, SUCCESS, &result);
560     return result;
561 }
562 
563 
testNativeWindowNativeWindowRequestAbortBufferErrorCode(napi_env env, napi_callback_info info)564 napi_value testNativeWindowNativeWindowRequestAbortBufferErrorCode(napi_env env, napi_callback_info info)
565 {
566     napi_value result = nullptr;
567     struct result result1 = InitNativeWindow();
568     OH_NativeImage *image = result1.image;
569     OHNativeWindow *nativeWindow = result1.nativeWindow;
570     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
571     int requestFenceFd;
572     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &requestFenceFd);
573     if (flag != 0) {
574         napi_create_int32(env, 1, &result);
575         return result;
576     }
577     if (nativeWindowBuffer == nullptr || requestFenceFd != -1) {
578         napi_create_int32(env, CONSTANT_2, &result);
579         return result;
580     }
581     Region::Rect rect{
582         .x = 0x100,
583         .y = 0x100,
584         .w = 0x100,
585         .h = 0x100,
586     };
587     Region region{.rects = &rect};
588     flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, requestFenceFd, region);
589     if (flag != 0) {
590         napi_create_int32(env, CONSTANT_3, &result);
591         return result;
592     }
593     flag = OH_NativeWindow_NativeWindowAbortBuffer(nativeWindow, nativeWindowBuffer);
594     if (flag == 0) {
595         napi_create_int32(env, CONSTANT_4, &result);
596     }
597 
598     DestroyNativeWindowImage(image, nativeWindow);
599     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
600     napi_create_int32(env, SUCCESS, &result);
601     return result;
602 }
603 
604 
testNativeWindowWriteToParcelErrptr(napi_env env, napi_callback_info info)605 napi_value testNativeWindowWriteToParcelErrptr(napi_env env, napi_callback_info info)
606 {
607     napi_value result = nullptr;
608 
609     // 0. 创建 native window 实例
610     struct result result1 = InitNativeWindow();
611     OH_NativeImage *image = result1.image;
612     OHNativeWindow *nativeWindow = result1.nativeWindow;
613     // 0. 已存在OHIPCParcel
614     OHIPCParcel *parcel = OH_IPCParcel_Create();
615 
616     // 1.
617     auto flag = OH_NativeWindow_WriteToParcel(nullptr, parcel);
618     if (flag != CONSTANT_40001000) {
619         napi_create_int32(env, 1, &result);
620         return result;
621     }
622 
623     // 2.
624     flag = OH_NativeWindow_WriteToParcel(nativeWindow, nullptr);
625     if (flag != CONSTANT_40001000) {
626         napi_create_int32(env, CONSTANT_2, &result);
627         return result;
628     }
629     DestroyNativeWindowImage(image, nativeWindow);
630     napi_create_int32(env, SUCCESS, &result);
631     return result;
632 }
633 
634 
testNativeWindowReadFromParcelErrptr(napi_env env, napi_callback_info info)635 napi_value testNativeWindowReadFromParcelErrptr(napi_env env, napi_callback_info info)
636 {
637     napi_value result = nullptr;
638 
639     OHNativeWindow *nativeWindow = nullptr;
640     // 0. 已存在OHIPCParcel
641     OHIPCParcel *parcel = OH_IPCParcel_Create();
642 
643     // 1.
644     auto flag = OH_NativeWindow_ReadFromParcel(parcel, nullptr);
645     if (flag != CONSTANT_40001000) {
646         napi_create_int32(env, 1, &result);
647         return result;
648     }
649 
650     // 2.
651     flag = OH_NativeWindow_ReadFromParcel(nullptr, &nativeWindow);
652     if (flag != CONSTANT_40001000) {
653         napi_create_int32(env, CONSTANT_2, &result);
654         return result;
655     }
656 
657     napi_create_int32(env, SUCCESS, &result);
658     return result;
659 }
660 
testNativeWindowWRParcelNormal(napi_env env, napi_callback_info info)661 napi_value testNativeWindowWRParcelNormal(napi_env env, napi_callback_info info)
662 {
663     napi_value result = nullptr;
664 
665     // 0. 创建 native window 实例
666     GLuint textureId;
667     glGenTextures(1, &textureId);
668     auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D);
669     auto nativeWindow1 = OH_NativeImage_AcquireNativeWindow(_image);
670     // 0. 已存在OHIPCParcel
671     OHIPCParcel *parcel1 = OH_IPCParcel_Create();
672 
673     auto flag = OH_NativeWindow_WriteToParcel(nativeWindow1, parcel1);
674     if (flag != 0) {
675         napi_create_int32(env, CONSTANT_1, &result);
676         return result;
677     }
678     OHNativeWindow *nativeWindow2;
679     flag = OH_NativeWindow_ReadFromParcel(parcel1, &nativeWindow2);
680     if (flag != 0) {
681         napi_create_int32(env, CONSTANT_2, &result);
682         return result;
683     }
684     if (nativeWindow1 != nativeWindow2) {
685         napi_create_int32(env, CONSTANT_3, &result);
686         return result;
687     }
688 
689     OH_NativeImage_Destroy(&_image);
690     OH_NativeWindow_DestroyNativeWindow(nativeWindow1);
691     OH_NativeWindow_DestroyNativeWindow(nativeWindow2);
692     napi_create_int32(env, SUCCESS, &result);
693     return result;
694 }
695 
696 
testNativeWindowWriteToParcelAbNormal(napi_env env, napi_callback_info info)697 napi_value testNativeWindowWriteToParcelAbNormal(napi_env env, napi_callback_info info)
698 {
699     napi_value result = nullptr;
700 
701     // 0.
702     GLuint textureId;
703     glGenTextures(1, &textureId);
704     auto _image = OH_NativeImage_Create(textureId, GL_TEXTURE_2D);
705     OHNativeWindow *window1 = nullptr;
706     OHIPCParcel *parcel1 = OH_IPCParcel_Create();
707 
708     // 1.
709     auto flag = OH_NativeWindow_ReadFromParcel(parcel1, &window1);
710     if (window1 != nullptr) {
711         napi_create_int32(env, CONSTANT_1, &result);
712         return result;
713     }
714     OH_NativeImage_Destroy(&_image);
715     OH_NativeWindow_DestroyNativeWindow(window1);
716     napi_create_int32(env, SUCCESS, &result);
717     return result;
718 }
719 
testNativeWindowReadFromParcelAbNormal(napi_env env, napi_callback_info info)720 napi_value testNativeWindowReadFromParcelAbNormal(napi_env env, napi_callback_info info)
721 {
722     napi_value result = nullptr;
723 
724     // 0.
725     struct result result1 = InitNativeWindow();
726     OH_NativeImage *image = result1.image;
727     OHNativeWindow *window1 = result1.nativeWindow;
728     OHIPCParcel *parcel1 = OH_IPCParcel_Create();
729 
730     // 1.
731     auto flag = OH_NativeWindow_WriteToParcel(window1, parcel1);
732     if (flag != 0) {
733         napi_create_int32(env, CONSTANT_1, &result);
734         return result;
735     }
736 
737     // 2.
738     flag = OH_NativeWindow_WriteToParcel(window1, parcel1);
739     if (flag != 0) {
740         napi_create_int32(env, CONSTANT_2, &result);
741         return result;
742     }
743     DestroyNativeWindowImage(image, window1);
744     napi_create_int32(env, SUCCESS, &result);
745     return result;
746 }
747 
testNativeWindowWRParcelDifferent(napi_env env, napi_callback_info info)748 napi_value testNativeWindowWRParcelDifferent(napi_env env, napi_callback_info info)
749 {
750     napi_value result = nullptr;
751     struct result result1, result2;
752     result1 = InitNativeWindow();
753     result2 = InitNativeWindow();
754     OH_NativeImage *image1 = result1.image;
755     OHNativeWindow *window1 = result1.nativeWindow;
756     OH_NativeImage *image2 = result2.image;
757     OHNativeWindow *window2 = result2.nativeWindow;
758     OHIPCParcel *parcel1 = OH_IPCParcel_Create();
759     OHIPCParcel *parcel2 = OH_IPCParcel_Create();
760 
761     // 1.
762     auto flag = OH_NativeWindow_WriteToParcel(window1, parcel1);
763     if (flag != 0) {
764         napi_create_int32(env, CONSTANT_1, &result);
765         return result;
766     }
767     // 2.
768     flag = OH_NativeWindow_WriteToParcel(window1, parcel2);
769     if (flag != 0) {
770         napi_create_int32(env, CONSTANT_2, &result);
771         return result;
772     }
773     // 3.
774     flag = OH_NativeWindow_WriteToParcel(window2, parcel1);
775     if (flag != 0) {
776         napi_create_int32(env, CONSTANT_3, &result);
777         return result;
778     }
779     DestroyNativeWindowImage(image1, window1);
780     DestroyNativeWindowImage(image2, window2);
781     napi_create_int32(env, SUCCESS, &result);
782     return result;
783 }
784 
785 
testNativeWindowNativeWindowFlushBufferNullptr(napi_env env, napi_callback_info info)786 napi_value testNativeWindowNativeWindowFlushBufferNullptr(napi_env env, napi_callback_info info)
787 {
788     napi_value result = nullptr;
789 
790     // 0.
791     struct result result1 = InitNativeWindow();
792     OH_NativeImage *image = result1.image;
793     OHNativeWindow *nativeWindow = result1.nativeWindow;
794     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
795     int fenceFd = -1;
796     Region::Rect rect{
797         .x = 0x100,
798         .y = 0x100,
799         .w = 0x100,
800         .h = 0x100,
801     };
802     Region region{.rects = &rect};
803     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
804 
805     // 1.
806     auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nullptr, nativeWindowBuffer, fenceFd, region);
807     if (flag != CONSTANT_40001000) {
808         napi_create_int32(env, 1, &result);
809         return result;
810     }
811     // 2.
812     flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nullptr, fenceFd, region);
813     if (flag != CONSTANT_40001000) {
814         napi_create_int32(env, CONSTANT_2, &result);
815         return result;
816     }
817     DestroyNativeWindowImage(image, nativeWindow);
818     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
819     napi_create_int32(env, SUCCESS, &result);
820     return result;
821 }
822 
823 
testNativeWindowNativeWindowFlushBufferNormal(napi_env env, napi_callback_info info)824 napi_value testNativeWindowNativeWindowFlushBufferNormal(napi_env env, napi_callback_info info)
825 {
826     napi_value result = nullptr;
827 
828     // 0.
829     struct result result1 = InitNativeWindow();
830     OH_NativeImage *image = result1.image;
831     OHNativeWindow *nativeWindow = result1.nativeWindow;
832     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
833     int fenceFd = -1;
834     Region::Rect rect{
835         .x = 0x100,
836         .y = 0x100,
837         .w = 0x100,
838         .h = 0x100,
839     };
840     Region region{.rects = &rect};
841     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
842 
843     // 1.
844     auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region);
845     if (flag != 0) {
846         napi_create_int32(env, CONSTANT_1, &result);
847         return result;
848     }
849 
850     // 2.
851     flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region);
852     if (flag != CONSTANT_41207000) {
853         napi_create_int32(env, CONSTANT_2, &result);
854         return result;
855     }
856 
857     DestroyNativeWindowImage(image, nativeWindow);
858     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
859     napi_create_int32(env, SUCCESS, &result);
860     return result;
861 }
862 
testNativeWindowNativeWindowFlushBufferAbnormal(napi_env env, napi_callback_info info)863 napi_value testNativeWindowNativeWindowFlushBufferAbnormal(napi_env env, napi_callback_info info)
864 {
865     napi_value result = nullptr;
866     // 1.
867     int fenceFdList[] = {-CONSTANT_999999999, -CONSTANT_1000, -CONSTANT_1,       CONSTANT_0,
868                          CONSTANT_1,          CONSTANT_1000,  CONSTANT_999999999};
869     for (int i = 0; i < sizeof(fenceFdList) / sizeof(int); ++i) {
870         struct result result1 = InitNativeWindow();
871         OH_NativeImage *image = result1.image;
872         OHNativeWindow *nativeWindow = result1.nativeWindow;
873         OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
874         int fenceFd = -1;
875         auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
876         Region::Rect rect{
877             .x = 0x100,
878             .y = 0x100,
879             .w = 0x100,
880             .h = 0x100,
881         };
882         Region region{.rects = &rect};
883         auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFdList[i], region);
884         if (flag != 0) {
885             napi_create_int32(env, i + 1, &result);
886             return result;
887         }
888 
889         DestroyNativeWindowImage(image, nativeWindow);
890         OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
891         napi_create_int32(env, SUCCESS, &result);
892     }
893     return result;
894 }
895 
testNativeWindowNativeWindowFlushBufferErrorCode(napi_env env, napi_callback_info info)896 napi_value testNativeWindowNativeWindowFlushBufferErrorCode(napi_env env, napi_callback_info info)
897 {
898     napi_value result = nullptr;
899     struct result result1 = InitNativeWindow();
900     OH_NativeImage *image = result1.image;
901     OHNativeWindow *nativeWindow = result1.nativeWindow;
902     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
903     int fenceFd = -1;
904     Region::Rect rect{
905         .x = 0x100,
906         .y = 0x100,
907         .w = 0x100,
908         .h = 0x100,
909     };
910     Region region{.rects = &rect};
911     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
912 
913     OH_NativeBuffer_Config config{
914         .width = 0x100,
915         .height = 0x100,
916         .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888,
917         .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA,
918     };
919     OH_NativeBuffer *newBuffer = OH_NativeBuffer_Alloc(&config);
920     nativeWindowBuffer = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(newBuffer);
921 
922     // 1.
923     auto flag = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, -1, region);
924     if (flag != CONSTANT_41210000) {
925         napi_create_int32(env, FAIL, &result);
926         return result;
927     }
928     DestroyNativeWindowImage(image, nativeWindow);
929     OH_NativeBuffer_Unreference(newBuffer);
930     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
931     napi_create_int32(env, SUCCESS, &result);
932     return result;
933 }
934 
935 
testNativeWindowGetLastFlushedBufferV2Nullptr(napi_env env, napi_callback_info info)936 napi_value testNativeWindowGetLastFlushedBufferV2Nullptr(napi_env env, napi_callback_info info)
937 {
938     napi_value result = nullptr;
939     struct result result1 = InitNativeWindow();
940     OH_NativeImage *image = result1.image;
941     OHNativeWindow *nativeWindow = result1.nativeWindow;
942     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
943     int fenceFd;
944     float matrix[16];
945 
946     // 1.
947     auto flag = OH_NativeWindow_GetLastFlushedBufferV2(nullptr, &nativeWindowBuffer, &fenceFd, matrix);
948     if (flag != CONSTANT_40001000) {
949         napi_create_int32(env, CONSTANT_1, &result);
950         return result;
951     }
952     // 2.
953     flag = OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, nullptr, &fenceFd, matrix);
954     if (flag != CONSTANT_40001000) {
955         napi_create_int32(env, CONSTANT_2, &result);
956         return result;
957     }
958     DestroyNativeWindowImage(image, nativeWindow);
959     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
960     napi_create_int32(env, SUCCESS, &result);
961     return result;
962 }
963 
964 
testNativeWindowGetLastFlushedBufferNullptr(napi_env env, napi_callback_info info)965 napi_value testNativeWindowGetLastFlushedBufferNullptr(napi_env env, napi_callback_info info)
966 {
967     napi_value result = nullptr;
968     struct result result1 = InitNativeWindow();
969     OH_NativeImage *image = result1.image;
970     OHNativeWindow *nativeWindow = result1.nativeWindow;
971     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
972     int fenceFd;
973     float matrix[16];
974 
975     // 1.
976     auto flag = OH_NativeWindow_GetLastFlushedBuffer(nullptr, &nativeWindowBuffer, &fenceFd, matrix);
977     if (flag != CONSTANT_40001000) {
978         napi_create_int32(env, 1, &result);
979         return result;
980     }
981     // 2.
982     flag = OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, nullptr, &fenceFd, matrix);
983     if (flag != CONSTANT_40001000) {
984         napi_create_int32(env, CONSTANT_2, &result);
985         return result;
986     }
987     DestroyNativeWindowImage(image, nativeWindow);
988     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
989     napi_create_int32(env, SUCCESS, &result);
990     return result;
991 }
992 
testNativeWindowGetLastFlushedBufferV2Normal(napi_env env, napi_callback_info info)993 napi_value testNativeWindowGetLastFlushedBufferV2Normal(napi_env env, napi_callback_info info)
994 {
995     napi_value result = nullptr;
996     struct result result1 = InitNativeWindow();
997     OH_NativeImage *image = result1.image;
998     OHNativeWindow *nativeWindow = result1.nativeWindow;
999     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1000     int fenceFd;
1001     float matrix[16];
1002     Region::Rect rect{
1003         .x = 0x100,
1004         .y = 0x100,
1005         .w = 0x100,
1006         .h = 0x100,
1007     };
1008     Region region{.rects = &rect};
1009     auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1010     ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region);
1011     auto flag = OH_NativeWindow_GetLastFlushedBufferV2(nativeWindow, &nativeWindowBuffer, &fenceFd, matrix);
1012     if (flag != 0) {
1013         napi_create_int32(env, 1, &result);
1014         return result;
1015     }
1016     DestroyNativeWindowImage(image, nativeWindow);
1017     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1018     napi_create_int32(env, SUCCESS, &result);
1019     return result;
1020 }
1021 
testNativeWindowGetLastFlushedBufferNormal(napi_env env, napi_callback_info info)1022 napi_value testNativeWindowGetLastFlushedBufferNormal(napi_env env, napi_callback_info info)
1023 {
1024     napi_value result = nullptr;
1025     struct result result1 = InitNativeWindow();
1026     OH_NativeImage *image = result1.image;
1027     OHNativeWindow *nativeWindow = result1.nativeWindow;
1028     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1029     int fenceFd;
1030     float matrix[16];
1031     Region::Rect rect{
1032         .x = 0x100,
1033         .y = 0x100,
1034         .w = 0x100,
1035         .h = 0x100,
1036     };
1037     Region region{.rects = &rect};
1038     auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1039     ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region);
1040     auto flag = OH_NativeWindow_GetLastFlushedBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd, matrix);
1041     if (flag != 0) {
1042         napi_create_int32(env, 1, &result);
1043         return result;
1044     }
1045     DestroyNativeWindowImage(image, nativeWindow);
1046     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1047     napi_create_int32(env, SUCCESS, &result);
1048     return result;
1049 }
1050 
1051 
testNativeWindowSetBufferHold(napi_env env, napi_callback_info info)1052 napi_value testNativeWindowSetBufferHold(napi_env env, napi_callback_info info)
1053 {
1054     napi_value result = nullptr;
1055     struct result result1 = InitNativeWindow();
1056     OH_NativeImage *image = result1.image;
1057     OHNativeWindow *nativeWindow = result1.nativeWindow;
1058 
1059     OH_NativeWindow_SetBufferHold(nullptr);
1060     OH_NativeWindow_SetBufferHold(nativeWindow);
1061 
1062     DestroyNativeWindowImage(image, nativeWindow);
1063     napi_create_int32(env, SUCCESS, &result);
1064     return result;
1065 }
1066 
testNativeWindowGetNativeObjectMagicNullptr(napi_env env, napi_callback_info info)1067 napi_value testNativeWindowGetNativeObjectMagicNullptr(napi_env env, napi_callback_info info)
1068 {
1069     napi_value result = nullptr;
1070     auto flag = OH_NativeWindow_GetNativeObjectMagic(nullptr);
1071     if (flag != -1) {
1072         napi_create_int32(env, FAIL, &result);
1073         return result;
1074     }
1075     napi_create_int32(env, SUCCESS, &result);
1076     return result;
1077 }
1078 
testNativeWindowGetNativeObjectMagicNormal(napi_env env, napi_callback_info info)1079 napi_value testNativeWindowGetNativeObjectMagicNormal(napi_env env, napi_callback_info info)
1080 {
1081     napi_value result = nullptr;
1082 
1083     struct result result1 = InitNativeWindow();
1084     OH_NativeImage *image = result1.image;
1085     OHNativeWindow *nativeWindow = result1.nativeWindow;
1086     OHNativeWindowBuffer *nativeWindowBuffer;
1087     int fenceFd = -1;
1088     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1089 
1090     auto magicId = OH_NativeWindow_GetNativeObjectMagic(nativeWindow);
1091     if (magicId == -1) {
1092         napi_create_int32(env, CONSTANT_1, &result);
1093         return result;
1094     }
1095     auto magicId2 = OH_NativeWindow_GetNativeObjectMagic(nativeWindow);
1096     if (magicId2 == -1) {
1097         napi_create_int32(env, CONSTANT_1, &result);
1098         return result;
1099     }
1100     if (magicId != magicId2) {
1101         napi_create_int32(env, CONSTANT_3, &result);
1102         return result;
1103     }
1104     auto magicId3 = OH_NativeWindow_GetNativeObjectMagic(nativeWindowBuffer);
1105     if (magicId3 == -1) {
1106         napi_create_int32(env, CONSTANT_2, &result);
1107         return result;
1108     }
1109     auto magicId4 = OH_NativeWindow_GetNativeObjectMagic(nativeWindowBuffer);
1110     if (magicId4 == -1) {
1111         napi_create_int32(env, CONSTANT_2, &result);
1112         return result;
1113     }
1114 
1115     if (magicId3 != magicId4) {
1116         napi_create_int32(env, CONSTANT_3, &result);
1117         return result;
1118     }
1119     DestroyNativeWindowImage(image, nativeWindow);
1120     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1121     napi_create_int32(env, SUCCESS, &result);
1122     return result;
1123 }
1124 
testNativeWindowNativeObjectReferenceNullptr(napi_env env, napi_callback_info info)1125 napi_value testNativeWindowNativeObjectReferenceNullptr(napi_env env, napi_callback_info info)
1126 {
1127     napi_value result = nullptr;
1128 
1129     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1130 
1131     auto magicId = OH_NativeWindow_NativeObjectReference(nullptr);
1132     if (magicId != CONSTANT_40001000) {
1133         napi_create_int32(env, CONSTANT_1, &result);
1134         return result;
1135     }
1136 
1137     magicId = OH_NativeWindow_NativeObjectReference(nativeWindowBuffer);
1138     if (magicId != CONSTANT_40001000) {
1139         napi_create_int32(env, CONSTANT_2, &result);
1140         return result;
1141     }
1142 
1143     napi_create_int32(env, SUCCESS, &result);
1144     return result;
1145 }
1146 
1147 
testNativeWindowNativeObjectReferenceNormal(napi_env env, napi_callback_info info)1148 napi_value testNativeWindowNativeObjectReferenceNormal(napi_env env, napi_callback_info info)
1149 {
1150     napi_value result = nullptr;
1151 
1152     struct result result1 = InitNativeWindow();
1153     OH_NativeImage *image = result1.image;
1154     OHNativeWindow *nativeWindow = result1.nativeWindow;
1155     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1156     int fenceFd = -1;
1157     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1158 
1159     auto magicId = OH_NativeWindow_NativeObjectReference(nativeWindow);
1160     if (magicId != 0) {
1161         napi_create_int32(env, CONSTANT_1, &result);
1162         return result;
1163     }
1164 
1165     magicId = OH_NativeWindow_NativeObjectReference(nativeWindowBuffer);
1166     if (magicId != 0) {
1167         napi_create_int32(env, CONSTANT_2, &result);
1168         return result;
1169     }
1170     DestroyNativeWindowImage(image, nativeWindow);
1171     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1172     napi_create_int32(env, SUCCESS, &result);
1173     return result;
1174 }
1175 
testNativeWindowNativeObjectUnreferenceNullptr(napi_env env, napi_callback_info info)1176 napi_value testNativeWindowNativeObjectUnreferenceNullptr(napi_env env, napi_callback_info info)
1177 {
1178     napi_value result = nullptr;
1179 
1180     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1181 
1182     auto magicId = OH_NativeWindow_NativeObjectUnreference(nullptr);
1183     if (magicId != CONSTANT_40001000) {
1184         napi_create_int32(env, CONSTANT_1, &result);
1185         return result;
1186     }
1187 
1188     magicId = OH_NativeWindow_NativeObjectUnreference(nativeWindowBuffer);
1189     if (magicId != CONSTANT_40001000) {
1190         napi_create_int32(env, CONSTANT_2, &result);
1191         return result;
1192     }
1193 
1194     napi_create_int32(env, SUCCESS, &result);
1195     return result;
1196 }
1197 
testNativeWindowNativeObjectUnreferenceNormal(napi_env env, napi_callback_info info)1198 napi_value testNativeWindowNativeObjectUnreferenceNormal(napi_env env, napi_callback_info info)
1199 {
1200     napi_value result = nullptr;
1201 
1202     struct result result1 = InitNativeWindow();
1203     OH_NativeImage *image = result1.image;
1204     OHNativeWindow *nativeWindow = result1.nativeWindow;
1205     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1206     int fenceFd = -1;
1207     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1208 
1209     auto magicId = OH_NativeWindow_NativeObjectUnreference(nativeWindow);
1210     if (magicId != 0) {
1211         napi_create_int32(env, CONSTANT_1, &result);
1212         return result;
1213     }
1214 
1215     magicId = OH_NativeWindow_NativeObjectUnreference(nativeWindowBuffer);
1216     if (magicId != 0) {
1217         napi_create_int32(env, CONSTANT_2, &result);
1218         return result;
1219     }
1220     DestroyNativeWindowImage(image, nativeWindow);
1221     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1222     napi_create_int32(env, SUCCESS, &result);
1223     return result;
1224 }
1225 
1226 
testNativeWindowNativeWindowAttachBufferNullptr(napi_env env, napi_callback_info info)1227 napi_value testNativeWindowNativeWindowAttachBufferNullptr(napi_env env, napi_callback_info info)
1228 {
1229     napi_value result = nullptr;
1230 
1231     struct result result1 = InitNativeWindow();
1232     OH_NativeImage *image = result1.image;
1233     OHNativeWindow *nativeWindow = result1.nativeWindow;
1234     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1235     int fenceFd = -1;
1236     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1237 
1238     auto flag = OH_NativeWindow_NativeWindowAttachBuffer(nullptr, nativeWindowBuffer);
1239     if (flag != CONSTANT_40001000) {
1240         napi_create_int32(env, CONSTANT_1, &result);
1241         return result;
1242     }
1243 
1244     flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nullptr);
1245     if (flag != CONSTANT_40001000) {
1246         napi_create_int32(env, CONSTANT_1, &result);
1247         return result;
1248     }
1249     DestroyNativeWindowImage(image, nativeWindow);
1250     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1251     napi_create_int32(env, SUCCESS, &result);
1252     return result;
1253 }
1254 
testNativeWindowNativeWindowDetachBufferNullptr(napi_env env, napi_callback_info info)1255 napi_value testNativeWindowNativeWindowDetachBufferNullptr(napi_env env, napi_callback_info info)
1256 {
1257     napi_value result = nullptr;
1258 
1259     struct result result1 = InitNativeWindow();
1260     OH_NativeImage *image = result1.image;
1261     OHNativeWindow *nativeWindow = result1.nativeWindow;
1262     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1263     int fenceFd = -1;
1264     OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1265 
1266     auto flag = OH_NativeWindow_NativeWindowDetachBuffer(nullptr, nativeWindowBuffer);
1267     if (flag != CONSTANT_40001000) {
1268         napi_create_int32(env, CONSTANT_1, &result);
1269         return result;
1270     }
1271 
1272     flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nullptr);
1273     if (flag != CONSTANT_40001000) {
1274         napi_create_int32(env, CONSTANT_2, &result);
1275         return result;
1276     }
1277     DestroyNativeWindowImage(image, nativeWindow);
1278     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1279     napi_create_int32(env, SUCCESS, &result);
1280     return result;
1281 }
1282 
1283 
testNativeWindowNativeWindowDetachBufferNormal(napi_env env, napi_callback_info info)1284 napi_value testNativeWindowNativeWindowDetachBufferNormal(napi_env env, napi_callback_info info)
1285 {
1286     napi_value result = nullptr;
1287 
1288     struct result result1 = InitNativeWindow();
1289     OH_NativeImage *image = result1.image;
1290     OHNativeWindow *nativeWindow = result1.nativeWindow;
1291     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1292     int fenceFd = -1;
1293     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1294     if (flag != 0) {
1295         napi_create_int32(env, FAIL, &result);
1296         return result;
1297     }
1298 
1299     flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer);
1300     if (flag != 0) {
1301         napi_create_int32(env, 1, &result);
1302         return result;
1303     }
1304 
1305     flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer);
1306     if (flag != CONSTANT_41210000) {
1307         napi_create_int32(env, CONSTANT_2, &result);
1308         return result;
1309     }
1310 
1311     DestroyNativeWindowImage(image, nativeWindow);
1312     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1313 
1314     napi_create_int32(env, SUCCESS, &result);
1315     return result;
1316 }
1317 
1318 
testNativeWindowNativeWindowAttachBufferErrorCode(napi_env env, napi_callback_info info)1319 napi_value testNativeWindowNativeWindowAttachBufferErrorCode(napi_env env, napi_callback_info info)
1320 {
1321     napi_value result = nullptr;
1322 
1323     struct result result1 = InitNativeWindow();
1324     OH_NativeImage *image = result1.image;
1325     OHNativeWindow *nativeWindow = result1.nativeWindow;
1326     OHNativeWindowBuffer *nwb1, *nwb2, *nwb3, *nwb4;
1327     int fenceFd = -1;
1328     OH_NativeBuffer_Config config{
1329         .width = 0x100,
1330         .height = 0x100,
1331         .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888,
1332         .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA,
1333     };
1334     OH_NativeBuffer *nativeBuffer = OH_NativeBuffer_Alloc(&config);
1335     OHNativeWindowBuffer **arr[] = {&nwb1, &nwb2, &nwb3, &nwb4};
1336     nwb1 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer);
1337     nwb2 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer);
1338     nwb3 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer);
1339     nwb4 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(nativeBuffer);
1340 
1341     auto flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb1);
1342     flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb2);
1343     flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb3);
1344     flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nwb4);
1345     DestroyNativeWindowImage(image, nativeWindow);
1346     OH_NativeBuffer_Unreference(nativeBuffer);
1347     napi_create_int32(env, SUCCESS, &result);
1348     return result;
1349 }
1350 
1351 
testNativeWindowNativeWindowAttachBufferNormal(napi_env env, napi_callback_info info)1352 napi_value testNativeWindowNativeWindowAttachBufferNormal(napi_env env, napi_callback_info info)
1353 {
1354     napi_value result = nullptr;
1355 
1356     struct result result1 = InitNativeWindow();
1357     OH_NativeImage *image = result1.image;
1358     OHNativeWindow *nativeWindow = result1.nativeWindow;
1359     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1360     int fenceFd = -1;
1361     auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1362     if (flag != 0) {
1363         napi_create_int32(env, FAIL, &result);
1364         return result;
1365     }
1366 
1367     flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nativeWindowBuffer);
1368     if (flag != CONSTANT_41208000) {
1369         napi_create_int32(env, CONSTANT_1, &result);
1370         return result;
1371     }
1372 
1373     flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer);
1374     if (flag != 0) {
1375         napi_create_int32(env, CONSTANT_2, &result);
1376         return result;
1377     }
1378 
1379     flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nativeWindowBuffer);
1380     if (flag != 0) {
1381         napi_create_int32(env, CONSTANT_3, &result);
1382         return result;
1383     }
1384 
1385     DestroyNativeWindowImage(image, nativeWindow);
1386     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1387 
1388     napi_create_int32(env, SUCCESS, &result);
1389     return result;
1390 }
1391 
1392 
testNativeWindowNativeWindowDetachBufferErrorCode(napi_env env, napi_callback_info info)1393 napi_value testNativeWindowNativeWindowDetachBufferErrorCode(napi_env env, napi_callback_info info)
1394 {
1395     napi_value result = nullptr;
1396 
1397     struct result result1 = InitNativeWindow();
1398     OH_NativeImage *image = result1.image;
1399     OHNativeWindow *nativeWindow = result1.nativeWindow;
1400     OHNativeWindowBuffer *nativeWindowBuffer = nullptr;
1401     int fenceFd;
1402     Region::Rect rect{
1403         .x = 0x100,
1404         .y = 0x100,
1405         .w = 0x100,
1406         .h = 0x100,
1407     };
1408     Region region{.rects = &rect};
1409     auto ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
1410     ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, fenceFd, region);
1411     if (ret != 0) {
1412         napi_create_int32(env, FAIL, &result);
1413         return result;
1414     }
1415     // 3.
1416     auto flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, nativeWindowBuffer);
1417     if (flag != CONSTANT_41207000) {
1418         napi_create_int32(env, FAIL, &result);
1419         return result;
1420     }
1421 
1422     DestroyNativeWindowImage(image, nativeWindow);
1423     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer);
1424 
1425     napi_create_int32(env, SUCCESS, &result);
1426     return result;
1427 }
1428 
1429 
testNativeWindowNativeWindowAtDetachDifferentBufferNormal(napi_env env, napi_callback_info info)1430 napi_value testNativeWindowNativeWindowAtDetachDifferentBufferNormal(napi_env env, napi_callback_info info)
1431 {
1432     napi_value result = nullptr;
1433 
1434     struct result result1 = InitNativeWindow();
1435     OH_NativeImage *image = result1.image;
1436     OHNativeWindow *nativeWindow = result1.nativeWindow;
1437     OHNativeWindowBuffer *nativeWindowBuffer1, *nativeWindowBuffer2, *nativeWindowBuffer3;
1438     int fenceFd = -1;
1439     OHNativeWindowBuffer **nativeWindowBuffers[] = {&nativeWindowBuffer1, &nativeWindowBuffer2, &nativeWindowBuffer3};
1440     for (int i = 0; i < CONSTANT_3; ++i) {
1441         auto flag = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, nativeWindowBuffers[i], &fenceFd);
1442         if (flag != 0) {
1443             napi_create_int32(env, CONSTANT_1000 + i + 1, &result);
1444             return result;
1445         }
1446     }
1447 
1448     for (int i = 0; i < CONSTANT_3; ++i) {
1449         auto flag = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindow, *nativeWindowBuffers[i]);
1450         if (flag != 0) {
1451             napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + i + 1, &result);
1452             return result;
1453         }
1454     }
1455 
1456     for (int i = 0; i < CONSTANT_3; ++i) {
1457         auto flag = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, *nativeWindowBuffers[i]);
1458         if (flag != 0) {
1459             napi_create_int32(env, CONSTANT_3 * CONSTANT_1000 + i + 1, &result);
1460             return result;
1461         }
1462     }
1463 
1464     DestroyNativeWindowImage(image, nativeWindow);
1465     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer1);
1466     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer2);
1467     OH_NativeWindow_DestroyNativeWindowBuffer(nativeWindowBuffer3);
1468 
1469     napi_create_int32(env, SUCCESS, &result);
1470     return result;
1471 }
1472 
1473 struct  Paramater {
1474     OHNativeWindow *nativeWindow1 = nullptr;
1475     OHNativeWindow *nativeWindow2 = nullptr;
1476     OHNativeWindowBuffer *nativeWindowBuffer1 = nullptr;
1477     OHNativeWindowBuffer *nativeWindowBuffer2 = nullptr;
1478     OH_NativeBuffer *nativeBuffer1 = nullptr;
1479     OH_NativeBuffer *nativeBuffer2 = nullptr;
1480 };
1481 
testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal1( napi_env env, napi_callback_info info, Paramater paramater)1482 napi_value testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal1(
1483     napi_env env, napi_callback_info info, Paramater paramater)
1484 {
1485     napi_value result = nullptr;
1486     int32_t flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer1);
1487     if (flag != 0) {
1488         napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_1, &result);
1489         return result;
1490     }
1491     flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer2);
1492     if (flag != 0) {
1493         napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_2, &result);
1494         return result;
1495     }
1496     return result;
1497 }
1498 
1499 
testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal2(napi_env env, napi_callback_info info, Paramater paramater)1500 napi_value testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal2(napi_env env, napi_callback_info info,
1501                                                                         Paramater paramater)
1502 {
1503     napi_value result = nullptr;
1504     auto flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer1);
1505     if (flag != 0) {
1506         napi_create_int32(env, CONSTANT_3 * CONSTANT_1000 + CONSTANT_1, &result);
1507         return result;
1508     }
1509     flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer2);
1510     if (flag != 0) {
1511         napi_create_int32(env, CONSTANT_3 * CONSTANT_1000 + CONSTANT_2, &result);
1512         return result;
1513     }
1514     // 4.
1515     flag = OH_NativeWindow_NativeWindowDetachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer1);
1516     if (flag != 0) {
1517         napi_create_int32(env, CONSTANT_4 * CONSTANT_1000 + CONSTANT_1, &result);
1518         return result;
1519     }
1520     flag = OH_NativeWindow_NativeWindowDetachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer2);
1521     if (flag != 0) {
1522         napi_create_int32(env, CONSTANT_4 * CONSTANT_1000 + CONSTANT_2, &result);
1523         return result;
1524     }
1525     // 5.
1526     flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow2, paramater.nativeWindowBuffer1);
1527     if (flag == 0) {
1528         napi_create_int32(env, CONSTANT_5 * CONSTANT_1000 + CONSTANT_1, &result);
1529         return result;
1530     }
1531     flag = OH_NativeWindow_NativeWindowAttachBuffer(paramater.nativeWindow1, paramater.nativeWindowBuffer2);
1532     if (flag == 0) {
1533         napi_create_int32(env, CONSTANT_5 * CONSTANT_1000 + CONSTANT_2, &result);
1534         return result;
1535     }
1536     return result;
1537 }
1538 
testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal(napi_env env, napi_callback_info info)1539 napi_value testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal(napi_env env, napi_callback_info info)
1540 {
1541     napi_value result = nullptr;
1542     struct  Paramater paramater;
1543     struct result result1 = InitNativeWindow();
1544     struct result result2 = InitNativeWindow();
1545     OH_NativeImage *image1 = result1.image;
1546     paramater.nativeWindow1 = result1.nativeWindow;
1547     OH_NativeImage *image2 = result2.image;
1548     paramater.nativeWindow2 = result2.nativeWindow;
1549     OH_NativeBuffer_Config config{
1550         .width = 0x100,
1551         .height = 0x100,
1552         .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888,
1553         .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA,
1554     };
1555     paramater.nativeBuffer1 = OH_NativeBuffer_Alloc(&config);
1556     paramater.nativeBuffer2 = OH_NativeBuffer_Alloc(&config);
1557     paramater.nativeWindowBuffer1 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(paramater.nativeBuffer1);
1558     if (paramater.nativeWindowBuffer1 == nullptr) {
1559         napi_create_int32(env, CONSTANT_1000 + CONSTANT_1, &result);
1560         return result;
1561     }
1562     paramater.nativeWindowBuffer2 = OH_NativeWindow_CreateNativeWindowBufferFromNativeBuffer(paramater.nativeBuffer2);
1563     if (paramater.nativeWindowBuffer2 == nullptr) {
1564         napi_create_int32(env, CONSTANT_1000 + CONSTANT_2, &result);
1565         return result;
1566     }
1567     result = testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal1(env, info, paramater);
1568     if (result != nullptr) {
1569         return result;
1570     }
1571     result = testNativeWindowNativeWindowAtDetachDifferentBufferAbnormal2(env, info, paramater);
1572     if (result != nullptr) {
1573         return result;
1574     }
1575     DestroyNativeWindowImage(image1, paramater.nativeWindow1);
1576     DestroyNativeWindowImage(image2, paramater.nativeWindow2);
1577     OH_NativeWindow_DestroyNativeWindowBuffer(paramater.nativeWindowBuffer1);
1578     OH_NativeWindow_DestroyNativeWindowBuffer(paramater.nativeWindowBuffer2);
1579     OH_NativeBuffer_Unreference(paramater.nativeBuffer1);
1580     OH_NativeBuffer_Unreference(paramater.nativeBuffer2);
1581     napi_create_int32(env, SUCCESS, &result);
1582     return result;
1583 }
1584 
testNativeWindowNativeWindowHandleOptNullptr(napi_env env, napi_callback_info info)1585 napi_value testNativeWindowNativeWindowHandleOptNullptr(napi_env env, napi_callback_info info)
1586 {
1587     napi_value result = nullptr;
1588 
1589     int code = SET_BUFFER_GEOMETRY;
1590     auto flag = OH_NativeWindow_NativeWindowHandleOpt(nullptr, code, 100, 100);
1591     if (flag != CONSTANT_40001000) {
1592         napi_create_int32(env, FAIL, &result);
1593         return result;
1594     }
1595 
1596     napi_create_int32(env, SUCCESS, &result);
1597     return result;
1598 }
1599 
1600 
testNativeWindowNativeWindowHandleOptSetGetBufferGeometryNormal(napi_env env, napi_callback_info info)1601 napi_value testNativeWindowNativeWindowHandleOptSetGetBufferGeometryNormal(napi_env env, napi_callback_info info)
1602 {
1603     napi_value result = nullptr;
1604 
1605     struct result result1 = InitNativeWindow();
1606     OH_NativeImage *image = result1.image;
1607     OHNativeWindow *nativeWindow = result1.nativeWindow;
1608 
1609     int arr[][2] = {{0, 0},        {2147483647, 2147483647},   {100, 100}, {-1000, -1000}, {-1000, 1000},
1610                     {1000, -1000}, {-2147483647, -2147483647}, {-1, -1}};
1611     int width1, height1;
1612     auto ret = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &width1, &height1);
1613     if (ret != 0) {
1614         napi_create_int32(env, CONSTANT_1, &result);
1615         return result;
1616     }
1617 
1618     for (int i = 0; i < sizeof(arr) / sizeof(int[2]); ++i) {
1619         int width = arr[i][0];
1620         int height = arr[i][1];
1621         auto flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, width, height);
1622         if (flag != 0) {
1623             napi_create_int32(env, (i + 1) * CONSTANT_1000 + CONSTANT_1, &result);
1624             return result;
1625         }
1626         int width2, height2;
1627         flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &height2, &width2);
1628         if (flag != 0) {
1629             napi_create_int32(env, (i + 1) * CONSTANT_1000 + CONSTANT_2, &result);
1630             return result;
1631         }
1632         if (width != width2 || height != height2) {
1633             napi_create_int32(env, (i + 1) * CONSTANT_1000 + CONSTANT_3, &result);
1634             return result;
1635         }
1636     }
1637 
1638     DestroyNativeWindowImage(image, nativeWindow);
1639     napi_create_int32(env, SUCCESS, &result);
1640     return result;
1641 }
1642 
testNativeWindowNativeWindowHandleOptSetGetBufferGeometryAbnormal(napi_env env, napi_callback_info info)1643 napi_value testNativeWindowNativeWindowHandleOptSetGetBufferGeometryAbnormal(napi_env env, napi_callback_info info)
1644 {
1645     napi_value result = nullptr;
1646     OH_NativeImage *image1 = InitNativeWindow().image;
1647     OHNativeWindow *nativeWindow = InitNativeWindow().nativeWindow;
1648 
1649     int32_t width, height;
1650 
1651     // 1.
1652     auto flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, NULL, NULL);
1653     if (flag != 0) { // 应为 非0
1654         napi_create_int32(env, CONSTANT_1000 + CONSTANT_1, &result);
1655         return result;
1656     }
1657     flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &height, &width);
1658     if (flag != 0) { // 应为 成功
1659         napi_create_int32(env, CONSTANT_1000 + CONSTANT_2, &result);
1660         return result;
1661     }
1662     if (width != 0 || height != 0) {
1663         napi_create_int32(env, CONSTANT_1000 + CONSTANT_3, &result);
1664         return result;
1665     }
1666     // 2.2147483648
1667     flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, CONSTANT_9999999999999999999,
1668                                                  CONSTANT_9999999999999999999);
1669     if (flag != 0) { // 应为 非0
1670         napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_1, &result);
1671         return result;
1672     }
1673     flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, GET_BUFFER_GEOMETRY, &height, &width);
1674     if (flag != 0) { // 应为 成功
1675         napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_2, &result);
1676         return result;
1677     }
1678     // 3.
1679     flag = OH_NativeWindow_NativeWindowHandleOpt(nativeWindow, SET_BUFFER_GEOMETRY, "abc", "abc");
1680     if (flag != 0) { // 应为 失败
1681         napi_create_int32(env, CONSTANT_2 * CONSTANT_1000 + CONSTANT_3, &result);
1682         return result;
1683     }
1684 
1685     DestroyNativeWindowImage(image1, nativeWindow);
1686     napi_create_int32(env, SUCCESS, &result);
1687     return result;
1688 }
1689