132a6e48fSopenharmony_ci/*
232a6e48fSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd.
332a6e48fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
432a6e48fSopenharmony_ci * you may not use this file except in compliance with the License.
532a6e48fSopenharmony_ci * You may obtain a copy of the License at
632a6e48fSopenharmony_ci *
732a6e48fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
832a6e48fSopenharmony_ci *
932a6e48fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1032a6e48fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1132a6e48fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1232a6e48fSopenharmony_ci * See the License for the specific language governing permissions and
1332a6e48fSopenharmony_ci * limitations under the License.
1432a6e48fSopenharmony_ci */
1532a6e48fSopenharmony_ci#include <chrono>
1632a6e48fSopenharmony_ci#include <thread>
1732a6e48fSopenharmony_ci#include <unistd.h>
1832a6e48fSopenharmony_ci#include <gtest/gtest.h>
1932a6e48fSopenharmony_ci#include <securec.h>
2032a6e48fSopenharmony_ci#include <native_window.h>
2132a6e48fSopenharmony_ci#include "external_window.h"
2232a6e48fSopenharmony_ci#include "iconsumer_surface.h"
2332a6e48fSopenharmony_ci#include "event_handler.h"
2432a6e48fSopenharmony_ci
2532a6e48fSopenharmony_ciusing namespace testing;
2632a6e48fSopenharmony_ciusing namespace testing::ext;
2732a6e48fSopenharmony_ci
2832a6e48fSopenharmony_cinamespace OHOS::Rosen {
2932a6e48fSopenharmony_ciconstexpr uint32_t QUEUE_SIZE = 5;
3032a6e48fSopenharmony_ciclass NativeWindowTest : public testing::Test, public IBufferConsumerListenerClazz {
3132a6e48fSopenharmony_cipublic:
3232a6e48fSopenharmony_ci    static void SetUpTestCase();
3332a6e48fSopenharmony_ci    void OnBufferAvailable() override;
3432a6e48fSopenharmony_ci    void SetData(NativeWindowBuffer *nativeWindowBuffer, NativeWindow *nativeWindow);
3532a6e48fSopenharmony_ci    bool GetData(sptr<SurfaceBuffer> &buffer);
3632a6e48fSopenharmony_ci
3732a6e48fSopenharmony_ci    // OH_NativeWindow_CreateNativeWindow001
3832a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess001(int32_t *pipeFd, sptr<IBufferProducer> producer);
3932a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer001(sptr<IBufferProducer> producer, NativeWindow **nativeWindow);
4032a6e48fSopenharmony_ci
4132a6e48fSopenharmony_ci    // OH_NativeWindow_CreateNativeWindow002
4232a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess002(int32_t *pipeFd, sptr<IBufferProducer> producer);
4332a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer002(sptr<IBufferProducer> producer, NativeWindow **nativeWindow);
4432a6e48fSopenharmony_ci
4532a6e48fSopenharmony_ci    // OH_NativeWindow_CreateNativeWindowFromSurfaceId001
4632a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess003(int32_t *pipeFd, uint64_t uniqueId);
4732a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer003(uint64_t uniqueId, NativeWindow **nativeWindow);
4832a6e48fSopenharmony_ci
4932a6e48fSopenharmony_ci    // OH_NativeWindow_CreateNativeWindowFromSurfaceId002
5032a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess004(int32_t *pipeFd, uint64_t uniqueId);
5132a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer004(uint64_t uniqueId, NativeWindow **nativeWindow);
5232a6e48fSopenharmony_ci    int32_t RequestBuffer001(NativeWindow *nativeWindow);
5332a6e48fSopenharmony_ci
5432a6e48fSopenharmony_ci    // OH_NativeWindow_GetLastFlushedBufferV2001
5532a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess005(int32_t *pipeFd, uint64_t uniqueId);
5632a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer005(uint64_t uniqueId, NativeWindow **nativeWindow);
5732a6e48fSopenharmony_ci
5832a6e48fSopenharmony_ci    // OH_NativeWindow_NativeObjectReference001
5932a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess006(int32_t *pipeFd, uint64_t uniqueId);
6032a6e48fSopenharmony_ci
6132a6e48fSopenharmony_ci    // OH_NativeWindow_GetSurfaceId001
6232a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess007(int32_t *pipeFd, sptr<IBufferProducer> producer, uint64_t *uniqueId);
6332a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer007(sptr<IBufferProducer> producer, NativeWindow **nativeWindow);
6432a6e48fSopenharmony_ci
6532a6e48fSopenharmony_ci    // OH_NativeWindow_NativeWindowAttachBuffer001
6632a6e48fSopenharmony_ci    int32_t ThreadNativeWindowProcess008(int32_t *pipeFd, uint64_t uniqueId);
6732a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndRequestBuffer008(uint64_t uniqueId, NativeWindow **nativeWindow);
6832a6e48fSopenharmony_ci    int32_t CreateNativeWindowAndAttachBuffer001(NativeWindow *nativeWindow);
6932a6e48fSopenharmony_ci
7032a6e48fSopenharmony_ci    int32_t g_onBufferAvailable_ = 0;
7132a6e48fSopenharmony_ci};
7232a6e48fSopenharmony_ci
7332a6e48fSopenharmony_ciclass OnBufferAvailableTest : public IBufferConsumerListenerClazz, public RefBase {
7432a6e48fSopenharmony_cipublic:
7532a6e48fSopenharmony_ci    void OnBufferAvailable() override;
7632a6e48fSopenharmony_ci};
7732a6e48fSopenharmony_ci
7832a6e48fSopenharmony_civoid OnBufferAvailableTest::OnBufferAvailable() {};
7932a6e48fSopenharmony_ci
8032a6e48fSopenharmony_civoid NativeWindowTest::SetUpTestCase() {}
8132a6e48fSopenharmony_ci
8232a6e48fSopenharmony_civoid NativeWindowTest::OnBufferAvailable()
8332a6e48fSopenharmony_ci{
8432a6e48fSopenharmony_ci    g_onBufferAvailable_++;
8532a6e48fSopenharmony_ci}
8632a6e48fSopenharmony_ci
8732a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer001(sptr<IBufferProducer> producer,
8832a6e48fSopenharmony_ci    NativeWindow **nativeWindow)
8932a6e48fSopenharmony_ci{
9032a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
9132a6e48fSopenharmony_ci    *nativeWindow = OH_NativeWindow_CreateNativeWindow(&pSurface);
9232a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
9332a6e48fSopenharmony_ci
9432a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
9532a6e48fSopenharmony_ci    int32_t height = 0x100;
9632a6e48fSopenharmony_ci    int32_t width = 0x100;
9732a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
9832a6e48fSopenharmony_ci
9932a6e48fSopenharmony_ci    int32_t fenceFd = -1;
10032a6e48fSopenharmony_ci    auto ret = OH_NativeWindow_NativeWindowRequestBuffer(*nativeWindow, &nativeWindowBuffer, &fenceFd);
10132a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
10232a6e48fSopenharmony_ci        return ret;
10332a6e48fSopenharmony_ci    }
10432a6e48fSopenharmony_ci
10532a6e48fSopenharmony_ci    struct Region *region = new Region();
10632a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
10732a6e48fSopenharmony_ci    rect->w = 0x100;
10832a6e48fSopenharmony_ci    rect->h = 0x100;
10932a6e48fSopenharmony_ci    region->rects = rect;
11032a6e48fSopenharmony_ci    region->rectNumber = 1;
11132a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeWindowFlushBuffer(*nativeWindow, nativeWindowBuffer, -1, *region);
11232a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
11332a6e48fSopenharmony_ci        delete rect;
11432a6e48fSopenharmony_ci        delete region;
11532a6e48fSopenharmony_ci        return ret;
11632a6e48fSopenharmony_ci    }
11732a6e48fSopenharmony_ci    delete rect;
11832a6e48fSopenharmony_ci    delete region;
11932a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
12032a6e48fSopenharmony_ci}
12132a6e48fSopenharmony_ci
12232a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess001(int32_t *pipeFd, sptr<IBufferProducer> producer)
12332a6e48fSopenharmony_ci{
12432a6e48fSopenharmony_ci    int64_t data;
12532a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
12632a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer001(producer, &nativeWindow);
12732a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
12832a6e48fSopenharmony_ci        data = ret;
12932a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
13032a6e48fSopenharmony_ci        return -1;
13132a6e48fSopenharmony_ci    }
13232a6e48fSopenharmony_ci
13332a6e48fSopenharmony_ci    data = ret;
13432a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
13532a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
13632a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
13732a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
13832a6e48fSopenharmony_ci    return 0;
13932a6e48fSopenharmony_ci}
14032a6e48fSopenharmony_ci
14132a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_CreateNativeWindow001, Function | MediumTest | Level2)
14232a6e48fSopenharmony_ci{
14332a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
14432a6e48fSopenharmony_ci    pipe(pipeFd);
14532a6e48fSopenharmony_ci
14632a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("OH_NativeWindow_CreateNativeWindow001");
14732a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
14832a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
14932a6e48fSopenharmony_ci
15032a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, producer]() {
15132a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess001((int32_t*)(pipeFd), producer);
15232a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
15332a6e48fSopenharmony_ci    });
15432a6e48fSopenharmony_ci
15532a6e48fSopenharmony_ci    int64_t data = 0;
15632a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
15732a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
15832a6e48fSopenharmony_ci
15932a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
16032a6e48fSopenharmony_ci    int32_t fence = -1;
16132a6e48fSopenharmony_ci    int64_t timestamp;
16232a6e48fSopenharmony_ci    Rect damage;
16332a6e48fSopenharmony_ci    auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
16432a6e48fSopenharmony_ci    EXPECT_EQ(ret, OHOS::GSERROR_OK);
16532a6e48fSopenharmony_ci    EXPECT_NE(buffer, nullptr);
16632a6e48fSopenharmony_ci
16732a6e48fSopenharmony_ci    ret = cSurface->ReleaseBuffer(buffer, -1);
16832a6e48fSopenharmony_ci    EXPECT_EQ(ret, OHOS::GSERROR_OK);
16932a6e48fSopenharmony_ci
17032a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
17132a6e48fSopenharmony_ci    close(pipeFd[0]);
17232a6e48fSopenharmony_ci    close(pipeFd[1]);
17332a6e48fSopenharmony_ci    if (thread.joinable()) {
17432a6e48fSopenharmony_ci        thread.join();
17532a6e48fSopenharmony_ci    }
17632a6e48fSopenharmony_ci    producer = nullptr;
17732a6e48fSopenharmony_ci    cSurface = nullptr;
17832a6e48fSopenharmony_ci}
17932a6e48fSopenharmony_ci
18032a6e48fSopenharmony_civoid NativeWindowTest::SetData(NativeWindowBuffer *nativeWindowBuffer, NativeWindow *nativeWindow)
18132a6e48fSopenharmony_ci{
18232a6e48fSopenharmony_ci    nativeWindowBuffer->sfbuffer->GetExtraData()->ExtraSet("123", 0x123);
18332a6e48fSopenharmony_ci    nativeWindowBuffer->sfbuffer->GetExtraData()->ExtraSet("345", (int64_t)0x345);
18432a6e48fSopenharmony_ci    nativeWindowBuffer->sfbuffer->GetExtraData()->ExtraSet("567", "567");
18532a6e48fSopenharmony_ci}
18632a6e48fSopenharmony_ci
18732a6e48fSopenharmony_cibool NativeWindowTest::GetData(sptr<SurfaceBuffer> &buffer)
18832a6e48fSopenharmony_ci{
18932a6e48fSopenharmony_ci    int32_t int32;
19032a6e48fSopenharmony_ci    int64_t int64;
19132a6e48fSopenharmony_ci    std::string str;
19232a6e48fSopenharmony_ci    buffer->GetExtraData()->ExtraGet("123", int32);
19332a6e48fSopenharmony_ci    buffer->GetExtraData()->ExtraGet("345", int64);
19432a6e48fSopenharmony_ci    buffer->GetExtraData()->ExtraGet("567", str);
19532a6e48fSopenharmony_ci    if ((int32 != 0x123) || (int64 != 0x345) || (str != "567")) {
19632a6e48fSopenharmony_ci        return false;
19732a6e48fSopenharmony_ci    }
19832a6e48fSopenharmony_ci
19932a6e48fSopenharmony_ci    return true;
20032a6e48fSopenharmony_ci}
20132a6e48fSopenharmony_ci
20232a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer002(sptr<IBufferProducer> producer,
20332a6e48fSopenharmony_ci    NativeWindow **nativeWindow)
20432a6e48fSopenharmony_ci{
20532a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
20632a6e48fSopenharmony_ci    *nativeWindow = OH_NativeWindow_CreateNativeWindow(&pSurface);
20732a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
20832a6e48fSopenharmony_ci
20932a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
21032a6e48fSopenharmony_ci    int32_t height = 0x100;
21132a6e48fSopenharmony_ci    int32_t width = 0x100;
21232a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
21332a6e48fSopenharmony_ci    code = SET_FORMAT;
21432a6e48fSopenharmony_ci    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
21532a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, format);
21632a6e48fSopenharmony_ci
21732a6e48fSopenharmony_ci    int32_t fenceFd = -1;
21832a6e48fSopenharmony_ci    auto ret = OH_NativeWindow_NativeWindowRequestBuffer(*nativeWindow, &nativeWindowBuffer, &fenceFd);
21932a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
22032a6e48fSopenharmony_ci        return ret;
22132a6e48fSopenharmony_ci    }
22232a6e48fSopenharmony_ci    SetData(nativeWindowBuffer, *nativeWindow);
22332a6e48fSopenharmony_ci
22432a6e48fSopenharmony_ci    struct Region *region = new Region();
22532a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
22632a6e48fSopenharmony_ci    rect->w = 0x100;
22732a6e48fSopenharmony_ci    rect->h = 0x100;
22832a6e48fSopenharmony_ci    region->rects = rect;
22932a6e48fSopenharmony_ci    region->rectNumber = 1;
23032a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeWindowFlushBuffer(*nativeWindow, nativeWindowBuffer, -1, *region);
23132a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
23232a6e48fSopenharmony_ci        delete rect;
23332a6e48fSopenharmony_ci        delete region;
23432a6e48fSopenharmony_ci        return ret;
23532a6e48fSopenharmony_ci    }
23632a6e48fSopenharmony_ci    delete rect;
23732a6e48fSopenharmony_ci    delete region;
23832a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
23932a6e48fSopenharmony_ci}
24032a6e48fSopenharmony_ci
24132a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess002(int32_t *pipeFd, sptr<IBufferProducer> producer)
24232a6e48fSopenharmony_ci{
24332a6e48fSopenharmony_ci    int64_t data;
24432a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
24532a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer002(producer, &nativeWindow);
24632a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
24732a6e48fSopenharmony_ci        data = ret;
24832a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
24932a6e48fSopenharmony_ci        return -1;
25032a6e48fSopenharmony_ci    }
25132a6e48fSopenharmony_ci
25232a6e48fSopenharmony_ci    data = ret;
25332a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
25432a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
25532a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
25632a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
25732a6e48fSopenharmony_ci    return 0;
25832a6e48fSopenharmony_ci}
25932a6e48fSopenharmony_ci
26032a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_CreateNativeWindow002, Function | MediumTest | Level2)
26132a6e48fSopenharmony_ci{
26232a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
26332a6e48fSopenharmony_ci    pipe(pipeFd);
26432a6e48fSopenharmony_ci
26532a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("OH_NativeWindow_CreateNativeWindow002");
26632a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
26732a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
26832a6e48fSopenharmony_ci
26932a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, producer]() {
27032a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess002((int32_t*)(pipeFd), producer);
27132a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
27232a6e48fSopenharmony_ci    });
27332a6e48fSopenharmony_ci
27432a6e48fSopenharmony_ci    int64_t data = 0;
27532a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
27632a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
27732a6e48fSopenharmony_ci
27832a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
27932a6e48fSopenharmony_ci    int32_t fence = -1;
28032a6e48fSopenharmony_ci    int64_t timestamp;
28132a6e48fSopenharmony_ci    Rect damage;
28232a6e48fSopenharmony_ci    auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
28332a6e48fSopenharmony_ci    EXPECT_EQ(ret, OHOS::GSERROR_OK);
28432a6e48fSopenharmony_ci    EXPECT_NE(buffer, nullptr);
28532a6e48fSopenharmony_ci    EXPECT_EQ(GetData(buffer), true);
28632a6e48fSopenharmony_ci
28732a6e48fSopenharmony_ci    ret = cSurface->ReleaseBuffer(buffer, -1);
28832a6e48fSopenharmony_ci    EXPECT_EQ(ret, OHOS::GSERROR_OK);
28932a6e48fSopenharmony_ci
29032a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
29132a6e48fSopenharmony_ci    close(pipeFd[0]);
29232a6e48fSopenharmony_ci    close(pipeFd[1]);
29332a6e48fSopenharmony_ci    if (thread.joinable()) {
29432a6e48fSopenharmony_ci        thread.join();
29532a6e48fSopenharmony_ci    }
29632a6e48fSopenharmony_ci    producer = nullptr;
29732a6e48fSopenharmony_ci    cSurface = nullptr;
29832a6e48fSopenharmony_ci}
29932a6e48fSopenharmony_ci
30032a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer003(uint64_t uniqueId, NativeWindow **nativeWindow)
30132a6e48fSopenharmony_ci{
30232a6e48fSopenharmony_ci    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(uniqueId, nativeWindow);
30332a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
30432a6e48fSopenharmony_ci        return ret;
30532a6e48fSopenharmony_ci    }
30632a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
30732a6e48fSopenharmony_ci
30832a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
30932a6e48fSopenharmony_ci    int32_t height = 0x100;
31032a6e48fSopenharmony_ci    int32_t width = 0x100;
31132a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
31232a6e48fSopenharmony_ci    code = SET_FORMAT;
31332a6e48fSopenharmony_ci    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
31432a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, format);
31532a6e48fSopenharmony_ci
31632a6e48fSopenharmony_ci    int32_t fenceFd = -1;
31732a6e48fSopenharmony_ci    struct Region *region = new Region();
31832a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
31932a6e48fSopenharmony_ci    rect->w = 0x100;
32032a6e48fSopenharmony_ci    rect->h = 0x100;
32132a6e48fSopenharmony_ci    region->rects = rect;
32232a6e48fSopenharmony_ci    region->rectNumber = 1;
32332a6e48fSopenharmony_ci    for (int32_t i = 0; i < QUEUE_SIZE; i++) {
32432a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowRequestBuffer(*nativeWindow, &nativeWindowBuffer, &fenceFd);
32532a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
32632a6e48fSopenharmony_ci            delete rect;
32732a6e48fSopenharmony_ci            delete region;
32832a6e48fSopenharmony_ci            return ret;
32932a6e48fSopenharmony_ci        }
33032a6e48fSopenharmony_ci        SetData(nativeWindowBuffer, *nativeWindow);
33132a6e48fSopenharmony_ci
33232a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowFlushBuffer(*nativeWindow, nativeWindowBuffer, -1, *region);
33332a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
33432a6e48fSopenharmony_ci            delete rect;
33532a6e48fSopenharmony_ci            delete region;
33632a6e48fSopenharmony_ci            return ret;
33732a6e48fSopenharmony_ci        }
33832a6e48fSopenharmony_ci    }
33932a6e48fSopenharmony_ci    delete rect;
34032a6e48fSopenharmony_ci    delete region;
34132a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
34232a6e48fSopenharmony_ci}
34332a6e48fSopenharmony_ci
34432a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess003(int32_t *pipeFd, uint64_t uniqueId)
34532a6e48fSopenharmony_ci{
34632a6e48fSopenharmony_ci    int64_t data;
34732a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
34832a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer003(uniqueId, &nativeWindow);
34932a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
35032a6e48fSopenharmony_ci        data = ret;
35132a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
35232a6e48fSopenharmony_ci        return -1;
35332a6e48fSopenharmony_ci    }
35432a6e48fSopenharmony_ci
35532a6e48fSopenharmony_ci    data = ret;
35632a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
35732a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
35832a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
35932a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
36032a6e48fSopenharmony_ci    return 0;
36132a6e48fSopenharmony_ci}
36232a6e48fSopenharmony_ci
36332a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_CreateNativeWindowFromSurfaceId001, Function | MediumTest | Level2)
36432a6e48fSopenharmony_ci{
36532a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
36632a6e48fSopenharmony_ci    pipe(pipeFd);
36732a6e48fSopenharmony_ci
36832a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface =
36932a6e48fSopenharmony_ci        IConsumerSurface::Create("OH_NativeWindow_CreateNativeWindowFromSurfaceId001");
37032a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
37132a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
37232a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
37332a6e48fSopenharmony_ci    EXPECT_NE(pSurface, nullptr);
37432a6e48fSopenharmony_ci    EXPECT_EQ(cSurface->SetQueueSize(QUEUE_SIZE), OHOS::GSERROR_OK);
37532a6e48fSopenharmony_ci
37632a6e48fSopenharmony_ci    uint64_t uniqueId = cSurface->GetUniqueId();
37732a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, uniqueId]() {
37832a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess003((int32_t*)(pipeFd), uniqueId);
37932a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
38032a6e48fSopenharmony_ci    });
38132a6e48fSopenharmony_ci
38232a6e48fSopenharmony_ci    int64_t data = 0;
38332a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
38432a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
38532a6e48fSopenharmony_ci
38632a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
38732a6e48fSopenharmony_ci    int32_t fence = -1;
38832a6e48fSopenharmony_ci    int64_t timestamp;
38932a6e48fSopenharmony_ci    Rect damage;
39032a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
39132a6e48fSopenharmony_ci    while (g_onBufferAvailable_ > 0) {
39232a6e48fSopenharmony_ci        auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
39332a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
39432a6e48fSopenharmony_ci        EXPECT_NE(buffer, nullptr);
39532a6e48fSopenharmony_ci        EXPECT_EQ(GetData(buffer), true);
39632a6e48fSopenharmony_ci
39732a6e48fSopenharmony_ci        ret = cSurface->ReleaseBuffer(buffer, -1);
39832a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
39932a6e48fSopenharmony_ci        g_onBufferAvailable_--;
40032a6e48fSopenharmony_ci    }
40132a6e48fSopenharmony_ci
40232a6e48fSopenharmony_ci    g_onBufferAvailable_ = 0;
40332a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
40432a6e48fSopenharmony_ci    close(pipeFd[0]);
40532a6e48fSopenharmony_ci    close(pipeFd[1]);
40632a6e48fSopenharmony_ci    if (thread.joinable()) {
40732a6e48fSopenharmony_ci        thread.join();
40832a6e48fSopenharmony_ci    }
40932a6e48fSopenharmony_ci    producer = nullptr;
41032a6e48fSopenharmony_ci    cSurface = nullptr;
41132a6e48fSopenharmony_ci}
41232a6e48fSopenharmony_ci
41332a6e48fSopenharmony_ciint32_t NativeWindowTest::RequestBuffer001(NativeWindow *nativeWindow)
41432a6e48fSopenharmony_ci{
41532a6e48fSopenharmony_ci    int32_t fenceFd = -1;
41632a6e48fSopenharmony_ci    struct Region *region = new Region();
41732a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
41832a6e48fSopenharmony_ci    rect->w = 0x100;
41932a6e48fSopenharmony_ci    rect->h = 0x100;
42032a6e48fSopenharmony_ci    region->rects = rect;
42132a6e48fSopenharmony_ci    region->rectNumber = 1;
42232a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
42332a6e48fSopenharmony_ci    int32_t ret;
42432a6e48fSopenharmony_ci    for (int32_t i = 0; i < QUEUE_SIZE; i++) {
42532a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindow, &nativeWindowBuffer, &fenceFd);
42632a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
42732a6e48fSopenharmony_ci            delete rect;
42832a6e48fSopenharmony_ci            delete region;
42932a6e48fSopenharmony_ci            return ret;
43032a6e48fSopenharmony_ci        }
43132a6e48fSopenharmony_ci        SetData(nativeWindowBuffer, nativeWindow);
43232a6e48fSopenharmony_ci
43332a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, -1, *region);
43432a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
43532a6e48fSopenharmony_ci            delete rect;
43632a6e48fSopenharmony_ci            delete region;
43732a6e48fSopenharmony_ci            return ret;
43832a6e48fSopenharmony_ci        }
43932a6e48fSopenharmony_ci    }
44032a6e48fSopenharmony_ci    delete rect;
44132a6e48fSopenharmony_ci    delete region;
44232a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
44332a6e48fSopenharmony_ci}
44432a6e48fSopenharmony_ci
44532a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer004(uint64_t uniqueId, NativeWindow **nativeWindow)
44632a6e48fSopenharmony_ci{
44732a6e48fSopenharmony_ci    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(uniqueId, nativeWindow);
44832a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
44932a6e48fSopenharmony_ci        return ret;
45032a6e48fSopenharmony_ci    }
45132a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
45232a6e48fSopenharmony_ci
45332a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
45432a6e48fSopenharmony_ci    int32_t height = 0x100;
45532a6e48fSopenharmony_ci    int32_t width = 0x100;
45632a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
45732a6e48fSopenharmony_ci    code = SET_FORMAT;
45832a6e48fSopenharmony_ci    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
45932a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, format);
46032a6e48fSopenharmony_ci
46132a6e48fSopenharmony_ci    int32_t fenceFd = -1;
46232a6e48fSopenharmony_ci    struct Region *region = new Region();
46332a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
46432a6e48fSopenharmony_ci    rect->w = 0x100;
46532a6e48fSopenharmony_ci    rect->h = 0x100;
46632a6e48fSopenharmony_ci    region->rects = rect;
46732a6e48fSopenharmony_ci    region->rectNumber = 1;
46832a6e48fSopenharmony_ci    for (int32_t i = 0; i < QUEUE_SIZE; i++) {
46932a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowRequestBuffer(*nativeWindow, &nativeWindowBuffer, &fenceFd);
47032a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
47132a6e48fSopenharmony_ci            delete rect;
47232a6e48fSopenharmony_ci            delete region;
47332a6e48fSopenharmony_ci            return ret;
47432a6e48fSopenharmony_ci        }
47532a6e48fSopenharmony_ci        SetData(nativeWindowBuffer, *nativeWindow);
47632a6e48fSopenharmony_ci
47732a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowFlushBuffer(*nativeWindow, nativeWindowBuffer, -1, *region);
47832a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
47932a6e48fSopenharmony_ci            delete rect;
48032a6e48fSopenharmony_ci            delete region;
48132a6e48fSopenharmony_ci            return ret;
48232a6e48fSopenharmony_ci        }
48332a6e48fSopenharmony_ci    }
48432a6e48fSopenharmony_ci    delete rect;
48532a6e48fSopenharmony_ci    delete region;
48632a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
48732a6e48fSopenharmony_ci}
48832a6e48fSopenharmony_ci
48932a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess004(int32_t *pipeFd, uint64_t uniqueId)
49032a6e48fSopenharmony_ci{
49132a6e48fSopenharmony_ci    int64_t data;
49232a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
49332a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer004(uniqueId, &nativeWindow);
49432a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
49532a6e48fSopenharmony_ci        data = ret;
49632a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
49732a6e48fSopenharmony_ci        return -1;
49832a6e48fSopenharmony_ci    }
49932a6e48fSopenharmony_ci
50032a6e48fSopenharmony_ci    data = ret;
50132a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
50232a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
50332a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
50432a6e48fSopenharmony_ci    ret = RequestBuffer001(nativeWindow);
50532a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
50632a6e48fSopenharmony_ci        data = ret;
50732a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
50832a6e48fSopenharmony_ci        return -1;
50932a6e48fSopenharmony_ci    }
51032a6e48fSopenharmony_ci    data = ret;
51132a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
51232a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
51332a6e48fSopenharmony_ci    return 0;
51432a6e48fSopenharmony_ci}
51532a6e48fSopenharmony_ci
51632a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_CreateNativeWindowFromSurfaceId002, Function | MediumTest | Level2)
51732a6e48fSopenharmony_ci{
51832a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
51932a6e48fSopenharmony_ci    pipe(pipeFd);
52032a6e48fSopenharmony_ci
52132a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface =
52232a6e48fSopenharmony_ci        IConsumerSurface::Create("OH_NativeWindow_CreateNativeWindowFromSurfaceId002");
52332a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
52432a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
52532a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
52632a6e48fSopenharmony_ci    EXPECT_NE(pSurface, nullptr);
52732a6e48fSopenharmony_ci    EXPECT_EQ(cSurface->SetQueueSize(QUEUE_SIZE), OHOS::GSERROR_OK);
52832a6e48fSopenharmony_ci
52932a6e48fSopenharmony_ci    uint64_t uniqueId = cSurface->GetUniqueId();
53032a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, uniqueId]() {
53132a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess004((int32_t*)(pipeFd), uniqueId);
53232a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
53332a6e48fSopenharmony_ci    });
53432a6e48fSopenharmony_ci
53532a6e48fSopenharmony_ci    int64_t data = 0;
53632a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
53732a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
53832a6e48fSopenharmony_ci
53932a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
54032a6e48fSopenharmony_ci    int32_t fence = -1;
54132a6e48fSopenharmony_ci    int64_t timestamp;
54232a6e48fSopenharmony_ci    Rect damage;
54332a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
54432a6e48fSopenharmony_ci    while (g_onBufferAvailable_ > 0) {
54532a6e48fSopenharmony_ci        auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
54632a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
54732a6e48fSopenharmony_ci        EXPECT_NE(buffer, nullptr);
54832a6e48fSopenharmony_ci        EXPECT_EQ(GetData(buffer), true);
54932a6e48fSopenharmony_ci
55032a6e48fSopenharmony_ci        ret = cSurface->ReleaseBuffer(buffer, -1);
55132a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
55232a6e48fSopenharmony_ci        g_onBufferAvailable_--;
55332a6e48fSopenharmony_ci    }
55432a6e48fSopenharmony_ci
55532a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
55632a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
55732a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
55832a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
55932a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
56032a6e48fSopenharmony_ci    g_onBufferAvailable_ = 0;
56132a6e48fSopenharmony_ci    close(pipeFd[0]);
56232a6e48fSopenharmony_ci    close(pipeFd[1]);
56332a6e48fSopenharmony_ci    if (thread.joinable()) {
56432a6e48fSopenharmony_ci        thread.join();
56532a6e48fSopenharmony_ci    }
56632a6e48fSopenharmony_ci    producer = nullptr;
56732a6e48fSopenharmony_ci    cSurface = nullptr;
56832a6e48fSopenharmony_ci}
56932a6e48fSopenharmony_ci
57032a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer005(uint64_t uniqueId, NativeWindow **nativeWindow)
57132a6e48fSopenharmony_ci{
57232a6e48fSopenharmony_ci    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(uniqueId, nativeWindow);
57332a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
57432a6e48fSopenharmony_ci        return ret;
57532a6e48fSopenharmony_ci    }
57632a6e48fSopenharmony_ci
57732a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
57832a6e48fSopenharmony_ci    struct NativeWindowBuffer *lastNativeWindowBuffer = nullptr;
57932a6e48fSopenharmony_ci
58032a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
58132a6e48fSopenharmony_ci    int32_t height = 0x100;
58232a6e48fSopenharmony_ci    int32_t width = 0x100;
58332a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
58432a6e48fSopenharmony_ci    code = SET_FORMAT;
58532a6e48fSopenharmony_ci    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
58632a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, format);
58732a6e48fSopenharmony_ci
58832a6e48fSopenharmony_ci    int32_t fenceFd = -1;
58932a6e48fSopenharmony_ci    struct Region *region = new Region();
59032a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
59132a6e48fSopenharmony_ci    rect->w = 0x100;
59232a6e48fSopenharmony_ci    rect->h = 0x100;
59332a6e48fSopenharmony_ci    region->rects = rect;
59432a6e48fSopenharmony_ci    region->rectNumber = 1;
59532a6e48fSopenharmony_ci    float matrix[16] = {0};
59632a6e48fSopenharmony_ci    for (int32_t i = 0; i < QUEUE_SIZE; i++) {
59732a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowRequestBuffer(*nativeWindow, &nativeWindowBuffer, &fenceFd);
59832a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
59932a6e48fSopenharmony_ci            delete rect;
60032a6e48fSopenharmony_ci            delete region;
60132a6e48fSopenharmony_ci            return ret;
60232a6e48fSopenharmony_ci        }
60332a6e48fSopenharmony_ci        SetData(nativeWindowBuffer, *nativeWindow);
60432a6e48fSopenharmony_ci
60532a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowFlushBuffer(*nativeWindow, nativeWindowBuffer, -1, *region);
60632a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
60732a6e48fSopenharmony_ci            delete rect;
60832a6e48fSopenharmony_ci            delete region;
60932a6e48fSopenharmony_ci            return ret;
61032a6e48fSopenharmony_ci        }
61132a6e48fSopenharmony_ci        ret = OH_NativeWindow_GetLastFlushedBufferV2(*nativeWindow, &lastNativeWindowBuffer, &fenceFd, matrix);
61232a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
61332a6e48fSopenharmony_ci            delete rect;
61432a6e48fSopenharmony_ci            delete region;
61532a6e48fSopenharmony_ci            return ret;
61632a6e48fSopenharmony_ci        }
61732a6e48fSopenharmony_ci        if (!GetData(lastNativeWindowBuffer->sfbuffer)) {
61832a6e48fSopenharmony_ci            delete rect;
61932a6e48fSopenharmony_ci            delete region;
62032a6e48fSopenharmony_ci            return -1;
62132a6e48fSopenharmony_ci        }
62232a6e48fSopenharmony_ci    }
62332a6e48fSopenharmony_ci    delete rect;
62432a6e48fSopenharmony_ci    delete region;
62532a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
62632a6e48fSopenharmony_ci}
62732a6e48fSopenharmony_ci
62832a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess005(int32_t *pipeFd, uint64_t uniqueId)
62932a6e48fSopenharmony_ci{
63032a6e48fSopenharmony_ci    int64_t data;
63132a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
63232a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer005(uniqueId, &nativeWindow);
63332a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
63432a6e48fSopenharmony_ci        data = ret;
63532a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
63632a6e48fSopenharmony_ci        return -1;
63732a6e48fSopenharmony_ci    }
63832a6e48fSopenharmony_ci
63932a6e48fSopenharmony_ci    data = ret;
64032a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
64132a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
64232a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
64332a6e48fSopenharmony_ci    ret = RequestBuffer001(nativeWindow);
64432a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
64532a6e48fSopenharmony_ci        data = ret;
64632a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
64732a6e48fSopenharmony_ci        return -1;
64832a6e48fSopenharmony_ci    }
64932a6e48fSopenharmony_ci    data = ret;
65032a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
65132a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
65232a6e48fSopenharmony_ci    return 0;
65332a6e48fSopenharmony_ci}
65432a6e48fSopenharmony_ci
65532a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_GetLastFlushedBufferV2001, Function | MediumTest | Level2)
65632a6e48fSopenharmony_ci{
65732a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
65832a6e48fSopenharmony_ci    pipe(pipeFd);
65932a6e48fSopenharmony_ci
66032a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("OH_NativeWindow_GetLastFlushedBufferV2001");
66132a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
66232a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
66332a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
66432a6e48fSopenharmony_ci    EXPECT_NE(pSurface, nullptr);
66532a6e48fSopenharmony_ci    EXPECT_EQ(cSurface->SetQueueSize(QUEUE_SIZE), OHOS::GSERROR_OK);
66632a6e48fSopenharmony_ci
66732a6e48fSopenharmony_ci    uint64_t uniqueId = cSurface->GetUniqueId();
66832a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, uniqueId]() {
66932a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess005((int32_t*)(pipeFd), uniqueId);
67032a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
67132a6e48fSopenharmony_ci    });
67232a6e48fSopenharmony_ci
67332a6e48fSopenharmony_ci    int64_t data = 0;
67432a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
67532a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
67632a6e48fSopenharmony_ci
67732a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
67832a6e48fSopenharmony_ci    int32_t fence = -1;
67932a6e48fSopenharmony_ci    int64_t timestamp;
68032a6e48fSopenharmony_ci    Rect damage;
68132a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
68232a6e48fSopenharmony_ci    while (g_onBufferAvailable_ > 0) {
68332a6e48fSopenharmony_ci        auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
68432a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
68532a6e48fSopenharmony_ci        EXPECT_NE(buffer, nullptr);
68632a6e48fSopenharmony_ci        EXPECT_EQ(GetData(buffer), true);
68732a6e48fSopenharmony_ci
68832a6e48fSopenharmony_ci        ret = cSurface->ReleaseBuffer(buffer, -1);
68932a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
69032a6e48fSopenharmony_ci        g_onBufferAvailable_--;
69132a6e48fSopenharmony_ci    }
69232a6e48fSopenharmony_ci
69332a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
69432a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
69532a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
69632a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
69732a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
69832a6e48fSopenharmony_ci    g_onBufferAvailable_ = 0;
69932a6e48fSopenharmony_ci    close(pipeFd[0]);
70032a6e48fSopenharmony_ci    close(pipeFd[1]);
70132a6e48fSopenharmony_ci    if (thread.joinable()) {
70232a6e48fSopenharmony_ci        thread.join();
70332a6e48fSopenharmony_ci    }
70432a6e48fSopenharmony_ci    producer = nullptr;
70532a6e48fSopenharmony_ci    cSurface = nullptr;
70632a6e48fSopenharmony_ci}
70732a6e48fSopenharmony_ci
70832a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess006(int32_t *pipeFd, uint64_t uniqueId)
70932a6e48fSopenharmony_ci{
71032a6e48fSopenharmony_ci    int64_t data;
71132a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
71232a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer005(uniqueId, &nativeWindow);
71332a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
71432a6e48fSopenharmony_ci        data = ret;
71532a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
71632a6e48fSopenharmony_ci        return -1;
71732a6e48fSopenharmony_ci    }
71832a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeObjectReference(nativeWindow);
71932a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
72032a6e48fSopenharmony_ci        data = ret;
72132a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
72232a6e48fSopenharmony_ci        return -1;
72332a6e48fSopenharmony_ci    }
72432a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
72532a6e48fSopenharmony_ci
72632a6e48fSopenharmony_ci    data = ret;
72732a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
72832a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
72932a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
73032a6e48fSopenharmony_ci    ret = RequestBuffer001(nativeWindow);
73132a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
73232a6e48fSopenharmony_ci        data = ret;
73332a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
73432a6e48fSopenharmony_ci        return -1;
73532a6e48fSopenharmony_ci    }
73632a6e48fSopenharmony_ci    data = ret;
73732a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
73832a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeObjectUnreference(nativeWindow);
73932a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
74032a6e48fSopenharmony_ci        return -1;
74132a6e48fSopenharmony_ci    }
74232a6e48fSopenharmony_ci    return 0;
74332a6e48fSopenharmony_ci}
74432a6e48fSopenharmony_ci
74532a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_NativeObjectReference001, Function | MediumTest | Level2)
74632a6e48fSopenharmony_ci{
74732a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
74832a6e48fSopenharmony_ci    pipe(pipeFd);
74932a6e48fSopenharmony_ci
75032a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("OH_NativeWindow_NativeObjectReference001");
75132a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
75232a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
75332a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
75432a6e48fSopenharmony_ci    EXPECT_NE(pSurface, nullptr);
75532a6e48fSopenharmony_ci    EXPECT_EQ(cSurface->SetQueueSize(QUEUE_SIZE), OHOS::GSERROR_OK);
75632a6e48fSopenharmony_ci
75732a6e48fSopenharmony_ci    uint64_t uniqueId = cSurface->GetUniqueId();
75832a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, uniqueId]() {
75932a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess006((int32_t*)(pipeFd), uniqueId);
76032a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
76132a6e48fSopenharmony_ci    });
76232a6e48fSopenharmony_ci
76332a6e48fSopenharmony_ci    int64_t data = 0;
76432a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
76532a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
76632a6e48fSopenharmony_ci
76732a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
76832a6e48fSopenharmony_ci    int32_t fence = -1;
76932a6e48fSopenharmony_ci    int64_t timestamp;
77032a6e48fSopenharmony_ci    Rect damage;
77132a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
77232a6e48fSopenharmony_ci    while (g_onBufferAvailable_ > 0) {
77332a6e48fSopenharmony_ci        auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
77432a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
77532a6e48fSopenharmony_ci        EXPECT_NE(buffer, nullptr);
77632a6e48fSopenharmony_ci        EXPECT_EQ(GetData(buffer), true);
77732a6e48fSopenharmony_ci
77832a6e48fSopenharmony_ci        ret = cSurface->ReleaseBuffer(buffer, -1);
77932a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
78032a6e48fSopenharmony_ci        g_onBufferAvailable_--;
78132a6e48fSopenharmony_ci    }
78232a6e48fSopenharmony_ci
78332a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
78432a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
78532a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
78632a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
78732a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
78832a6e48fSopenharmony_ci    g_onBufferAvailable_ = 0;
78932a6e48fSopenharmony_ci    close(pipeFd[0]);
79032a6e48fSopenharmony_ci    close(pipeFd[1]);
79132a6e48fSopenharmony_ci    if (thread.joinable()) {
79232a6e48fSopenharmony_ci        thread.join();
79332a6e48fSopenharmony_ci    }
79432a6e48fSopenharmony_ci    producer = nullptr;
79532a6e48fSopenharmony_ci    cSurface = nullptr;
79632a6e48fSopenharmony_ci}
79732a6e48fSopenharmony_ci
79832a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer007(sptr<IBufferProducer> producer,
79932a6e48fSopenharmony_ci    NativeWindow **nativeWindow)
80032a6e48fSopenharmony_ci{
80132a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
80232a6e48fSopenharmony_ci    *nativeWindow = OH_NativeWindow_CreateNativeWindow(&pSurface);
80332a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
80432a6e48fSopenharmony_ci
80532a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
80632a6e48fSopenharmony_ci    int32_t height = 0x100;
80732a6e48fSopenharmony_ci    int32_t width = 0x100;
80832a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
80932a6e48fSopenharmony_ci    code = SET_FORMAT;
81032a6e48fSopenharmony_ci    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
81132a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, format);
81232a6e48fSopenharmony_ci
81332a6e48fSopenharmony_ci    int32_t fenceFd = -1;
81432a6e48fSopenharmony_ci    auto ret = OH_NativeWindow_NativeWindowRequestBuffer(*nativeWindow, &nativeWindowBuffer, &fenceFd);
81532a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
81632a6e48fSopenharmony_ci        return ret;
81732a6e48fSopenharmony_ci    }
81832a6e48fSopenharmony_ci    SetData(nativeWindowBuffer, *nativeWindow);
81932a6e48fSopenharmony_ci
82032a6e48fSopenharmony_ci    struct Region *region = new Region();
82132a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
82232a6e48fSopenharmony_ci    rect->w = 0x100;
82332a6e48fSopenharmony_ci    rect->h = 0x100;
82432a6e48fSopenharmony_ci    region->rects = rect;
82532a6e48fSopenharmony_ci    region->rectNumber = 1;
82632a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeWindowFlushBuffer(*nativeWindow, nativeWindowBuffer, -1, *region);
82732a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
82832a6e48fSopenharmony_ci        delete rect;
82932a6e48fSopenharmony_ci        delete region;
83032a6e48fSopenharmony_ci        return ret;
83132a6e48fSopenharmony_ci    }
83232a6e48fSopenharmony_ci    delete rect;
83332a6e48fSopenharmony_ci    delete region;
83432a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
83532a6e48fSopenharmony_ci}
83632a6e48fSopenharmony_ci
83732a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess007(int32_t *pipeFd,
83832a6e48fSopenharmony_ci    sptr<IBufferProducer> producer, uint64_t *uniqueId)
83932a6e48fSopenharmony_ci{
84032a6e48fSopenharmony_ci    int64_t data;
84132a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
84232a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer007(producer, &nativeWindow);
84332a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
84432a6e48fSopenharmony_ci        data = ret;
84532a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
84632a6e48fSopenharmony_ci        return -1;
84732a6e48fSopenharmony_ci    }
84832a6e48fSopenharmony_ci    ret = OH_NativeWindow_GetSurfaceId(nativeWindow, uniqueId);
84932a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
85032a6e48fSopenharmony_ci        data = ret;
85132a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
85232a6e48fSopenharmony_ci        return -1;
85332a6e48fSopenharmony_ci    }
85432a6e48fSopenharmony_ci
85532a6e48fSopenharmony_ci    data = ret;
85632a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
85732a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
85832a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
85932a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
86032a6e48fSopenharmony_ci    return 0;
86132a6e48fSopenharmony_ci}
86232a6e48fSopenharmony_ci
86332a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_GetSurfaceId001, Function | MediumTest | Level2)
86432a6e48fSopenharmony_ci{
86532a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
86632a6e48fSopenharmony_ci    pipe(pipeFd);
86732a6e48fSopenharmony_ci
86832a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("OH_NativeWindow_CreateNativeWindow002");
86932a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
87032a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
87132a6e48fSopenharmony_ci    uint64_t cUniqueId = cSurface->GetUniqueId();
87232a6e48fSopenharmony_ci
87332a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, producer, cUniqueId]() {
87432a6e48fSopenharmony_ci        uint64_t uniqueId = 0;
87532a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess007((int32_t*)(pipeFd), producer, &uniqueId);
87632a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
87732a6e48fSopenharmony_ci        EXPECT_EQ(uniqueId, cUniqueId);
87832a6e48fSopenharmony_ci    });
87932a6e48fSopenharmony_ci
88032a6e48fSopenharmony_ci    int64_t data = 0;
88132a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
88232a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
88332a6e48fSopenharmony_ci
88432a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
88532a6e48fSopenharmony_ci    int32_t fence = -1;
88632a6e48fSopenharmony_ci    int64_t timestamp;
88732a6e48fSopenharmony_ci    Rect damage;
88832a6e48fSopenharmony_ci    auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
88932a6e48fSopenharmony_ci    EXPECT_EQ(ret, OHOS::GSERROR_OK);
89032a6e48fSopenharmony_ci    EXPECT_NE(buffer, nullptr);
89132a6e48fSopenharmony_ci    EXPECT_EQ(GetData(buffer), true);
89232a6e48fSopenharmony_ci
89332a6e48fSopenharmony_ci    ret = cSurface->ReleaseBuffer(buffer, -1);
89432a6e48fSopenharmony_ci    EXPECT_EQ(ret, OHOS::GSERROR_OK);
89532a6e48fSopenharmony_ci
89632a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
89732a6e48fSopenharmony_ci    close(pipeFd[0]);
89832a6e48fSopenharmony_ci    close(pipeFd[1]);
89932a6e48fSopenharmony_ci    if (thread.joinable()) {
90032a6e48fSopenharmony_ci        thread.join();
90132a6e48fSopenharmony_ci    }
90232a6e48fSopenharmony_ci    producer = nullptr;
90332a6e48fSopenharmony_ci    cSurface = nullptr;
90432a6e48fSopenharmony_ci}
90532a6e48fSopenharmony_ci
90632a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndAttachBuffer001(NativeWindow *nativeWindow)
90732a6e48fSopenharmony_ci{
90832a6e48fSopenharmony_ci    sptr<OnBufferAvailableTest> onBufferAvailableTest = new OnBufferAvailableTest();
90932a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("CreateNativeWindowAndAttachBuffer001");
91032a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(onBufferAvailableTest);
91132a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
91232a6e48fSopenharmony_ci    cSurface->SetQueueSize(QUEUE_SIZE);
91332a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
91432a6e48fSopenharmony_ci    if (pSurface == nullptr) {
91532a6e48fSopenharmony_ci        return -1;
91632a6e48fSopenharmony_ci    }
91732a6e48fSopenharmony_ci
91832a6e48fSopenharmony_ci    NativeWindow *nativeWindowNew = OH_NativeWindow_CreateNativeWindow(&pSurface);
91932a6e48fSopenharmony_ci    if (nativeWindowNew == nullptr) {
92032a6e48fSopenharmony_ci        return -1;
92132a6e48fSopenharmony_ci    }
92232a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
92332a6e48fSopenharmony_ci    int32_t height = 0x100;
92432a6e48fSopenharmony_ci    int32_t width = 0x100;
92532a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(nativeWindowNew, code, height, width);
92632a6e48fSopenharmony_ci    int32_t fenceFd = -1;
92732a6e48fSopenharmony_ci    struct Region *region = new Region();
92832a6e48fSopenharmony_ci    struct Region::Rect *rect = new Region::Rect();
92932a6e48fSopenharmony_ci    rect->w = 0x100;
93032a6e48fSopenharmony_ci    rect->h = 0x100;
93132a6e48fSopenharmony_ci    region->rects = rect;
93232a6e48fSopenharmony_ci    region->rectNumber = 1;
93332a6e48fSopenharmony_ci    struct NativeWindowBuffer *nativeWindowBuffer = nullptr;
93432a6e48fSopenharmony_ci    int32_t ret;
93532a6e48fSopenharmony_ci    for (int32_t i = 0; i < QUEUE_SIZE; i++) {
93632a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowRequestBuffer(nativeWindowNew, &nativeWindowBuffer, &fenceFd);
93732a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
93832a6e48fSopenharmony_ci            delete rect;
93932a6e48fSopenharmony_ci            delete region;
94032a6e48fSopenharmony_ci            return ret;
94132a6e48fSopenharmony_ci        }
94232a6e48fSopenharmony_ci        SetData(nativeWindowBuffer, nativeWindowNew);
94332a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowDetachBuffer(nativeWindowNew, nativeWindowBuffer);
94432a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
94532a6e48fSopenharmony_ci            delete rect;
94632a6e48fSopenharmony_ci            delete region;
94732a6e48fSopenharmony_ci            return ret;
94832a6e48fSopenharmony_ci        }
94932a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowAttachBuffer(nativeWindow, nativeWindowBuffer);
95032a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
95132a6e48fSopenharmony_ci            delete rect;
95232a6e48fSopenharmony_ci            delete region;
95332a6e48fSopenharmony_ci            return ret;
95432a6e48fSopenharmony_ci        }
95532a6e48fSopenharmony_ci        ret = OH_NativeWindow_NativeWindowFlushBuffer(nativeWindow, nativeWindowBuffer, -1, *region);
95632a6e48fSopenharmony_ci        if (ret != OHOS::GSERROR_OK) {
95732a6e48fSopenharmony_ci            delete rect;
95832a6e48fSopenharmony_ci            delete region;
95932a6e48fSopenharmony_ci            return ret;
96032a6e48fSopenharmony_ci        }
96132a6e48fSopenharmony_ci    }
96232a6e48fSopenharmony_ci    delete rect;
96332a6e48fSopenharmony_ci    delete region;
96432a6e48fSopenharmony_ci
96532a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindowNew);
96632a6e48fSopenharmony_ci    return OHOS::GSERROR_OK;
96732a6e48fSopenharmony_ci}
96832a6e48fSopenharmony_ci
96932a6e48fSopenharmony_ciint32_t NativeWindowTest::CreateNativeWindowAndRequestBuffer008(uint64_t uniqueId, NativeWindow **nativeWindow)
97032a6e48fSopenharmony_ci{
97132a6e48fSopenharmony_ci    int32_t ret = OH_NativeWindow_CreateNativeWindowFromSurfaceId(uniqueId, nativeWindow);
97232a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
97332a6e48fSopenharmony_ci        return ret;
97432a6e48fSopenharmony_ci    }
97532a6e48fSopenharmony_ci
97632a6e48fSopenharmony_ci    int32_t code = SET_BUFFER_GEOMETRY;
97732a6e48fSopenharmony_ci    int32_t height = 0x100;
97832a6e48fSopenharmony_ci    int32_t width = 0x100;
97932a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, height, width);
98032a6e48fSopenharmony_ci    code = SET_FORMAT;
98132a6e48fSopenharmony_ci    int32_t format = GRAPHIC_PIXEL_FMT_RGBA_8888;
98232a6e48fSopenharmony_ci    OH_NativeWindow_NativeWindowHandleOpt(*nativeWindow, code, format);
98332a6e48fSopenharmony_ci
98432a6e48fSopenharmony_ci    return CreateNativeWindowAndAttachBuffer001(*nativeWindow);
98532a6e48fSopenharmony_ci}
98632a6e48fSopenharmony_ci
98732a6e48fSopenharmony_ciint32_t NativeWindowTest::ThreadNativeWindowProcess008(int32_t *pipeFd, uint64_t uniqueId)
98832a6e48fSopenharmony_ci{
98932a6e48fSopenharmony_ci    int64_t data;
99032a6e48fSopenharmony_ci    NativeWindow *nativeWindow = nullptr;
99132a6e48fSopenharmony_ci    int32_t ret = CreateNativeWindowAndRequestBuffer008(uniqueId, &nativeWindow);
99232a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
99332a6e48fSopenharmony_ci        data = ret;
99432a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
99532a6e48fSopenharmony_ci        return -1;
99632a6e48fSopenharmony_ci    }
99732a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeObjectReference(nativeWindow);
99832a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
99932a6e48fSopenharmony_ci        data = ret;
100032a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
100132a6e48fSopenharmony_ci        return -1;
100232a6e48fSopenharmony_ci    }
100332a6e48fSopenharmony_ci    OH_NativeWindow_DestroyNativeWindow(nativeWindow);
100432a6e48fSopenharmony_ci
100532a6e48fSopenharmony_ci    data = ret;
100632a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
100732a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
100832a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
100932a6e48fSopenharmony_ci    ret = RequestBuffer001(nativeWindow);
101032a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
101132a6e48fSopenharmony_ci        data = ret;
101232a6e48fSopenharmony_ci        write(pipeFd[1], &data, sizeof(data));
101332a6e48fSopenharmony_ci        return -1;
101432a6e48fSopenharmony_ci    }
101532a6e48fSopenharmony_ci    data = ret;
101632a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
101732a6e48fSopenharmony_ci    ret = OH_NativeWindow_NativeObjectUnreference(nativeWindow);
101832a6e48fSopenharmony_ci    if (ret != OHOS::GSERROR_OK) {
101932a6e48fSopenharmony_ci        return -1;
102032a6e48fSopenharmony_ci    }
102132a6e48fSopenharmony_ci    return 0;
102232a6e48fSopenharmony_ci}
102332a6e48fSopenharmony_ci
102432a6e48fSopenharmony_ciHWTEST_F(NativeWindowTest, OH_NativeWindow_NativeWindowAttachBuffer001, Function | MediumTest | Level2)
102532a6e48fSopenharmony_ci{
102632a6e48fSopenharmony_ci    int32_t pipeFd[2] = {};
102732a6e48fSopenharmony_ci    pipe(pipeFd);
102832a6e48fSopenharmony_ci
102932a6e48fSopenharmony_ci    sptr<OHOS::IConsumerSurface> cSurface = IConsumerSurface::Create("OH_NativeWindow_NativeWindowAttachBuffer001");
103032a6e48fSopenharmony_ci    cSurface->RegisterConsumerListener(this);
103132a6e48fSopenharmony_ci    auto producer = cSurface->GetProducer();
103232a6e48fSopenharmony_ci    sptr<Surface> pSurface = Surface::CreateSurfaceAsProducer(producer);
103332a6e48fSopenharmony_ci    EXPECT_NE(pSurface, nullptr);
103432a6e48fSopenharmony_ci    EXPECT_EQ(cSurface->SetQueueSize(QUEUE_SIZE), OHOS::GSERROR_OK);
103532a6e48fSopenharmony_ci
103632a6e48fSopenharmony_ci    uint64_t uniqueId = cSurface->GetUniqueId();
103732a6e48fSopenharmony_ci    std::thread thread([this, pipeFd, uniqueId]() {
103832a6e48fSopenharmony_ci        int32_t ret = this->ThreadNativeWindowProcess008((int32_t*)(pipeFd), uniqueId);
103932a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
104032a6e48fSopenharmony_ci    });
104132a6e48fSopenharmony_ci
104232a6e48fSopenharmony_ci    int64_t data = 0;
104332a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
104432a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
104532a6e48fSopenharmony_ci
104632a6e48fSopenharmony_ci    OHOS::sptr<SurfaceBuffer> buffer = nullptr;
104732a6e48fSopenharmony_ci    int32_t fence = -1;
104832a6e48fSopenharmony_ci    int64_t timestamp;
104932a6e48fSopenharmony_ci    Rect damage;
105032a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
105132a6e48fSopenharmony_ci    while (g_onBufferAvailable_ > 0) {
105232a6e48fSopenharmony_ci        auto ret = cSurface->AcquireBuffer(buffer, fence, timestamp, damage);
105332a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
105432a6e48fSopenharmony_ci        EXPECT_NE(buffer, nullptr);
105532a6e48fSopenharmony_ci        EXPECT_EQ(GetData(buffer), true);
105632a6e48fSopenharmony_ci
105732a6e48fSopenharmony_ci        ret = cSurface->ReleaseBuffer(buffer, -1);
105832a6e48fSopenharmony_ci        EXPECT_EQ(ret, OHOS::GSERROR_OK);
105932a6e48fSopenharmony_ci        g_onBufferAvailable_--;
106032a6e48fSopenharmony_ci    }
106132a6e48fSopenharmony_ci
106232a6e48fSopenharmony_ci    write(pipeFd[1], &data, sizeof(data));
106332a6e48fSopenharmony_ci    usleep(1000); // sleep 1000 microseconds (equals 1 milliseconds)
106432a6e48fSopenharmony_ci    read(pipeFd[0], &data, sizeof(data));
106532a6e48fSopenharmony_ci    EXPECT_EQ(data, OHOS::GSERROR_OK);
106632a6e48fSopenharmony_ci    EXPECT_EQ(g_onBufferAvailable_, QUEUE_SIZE);
106732a6e48fSopenharmony_ci    g_onBufferAvailable_ = 0;
106832a6e48fSopenharmony_ci    close(pipeFd[0]);
106932a6e48fSopenharmony_ci    close(pipeFd[1]);
107032a6e48fSopenharmony_ci    if (thread.joinable()) {
107132a6e48fSopenharmony_ci        thread.join();
107232a6e48fSopenharmony_ci    }
107332a6e48fSopenharmony_ci    producer = nullptr;
107432a6e48fSopenharmony_ci    cSurface = nullptr;
107532a6e48fSopenharmony_ci}
107632a6e48fSopenharmony_ci}
1077