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