/* * Copyright (c) 2021 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include #include #include "buffer_consumer_listener.h" #include "sync_fence.h" #include "producer_surface_delegator.h" #include "buffer_queue_consumer.h" #include "buffer_queue.h" using namespace testing; using namespace testing::ext; namespace OHOS::Rosen { class ConsumerSurfaceTest : public testing::Test { public: static void SetUpTestCase(); static void TearDownTestCase(); static inline BufferRequestConfig requestConfig = { .width = 0x100, .height = 0x100, .strideAlignment = 0x8, .format = GRAPHIC_PIXEL_FMT_RGBA_8888, .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA, .timeout = 0, }; static inline BufferFlushConfig flushConfig = { .damage = { .w = 0x100, .h = 0x100, }, }; static inline BufferFlushConfigWithDamages flushConfigWithDamages = { .damages = { { .x = 0x100, .y = 0x100, .w = 0x100, .h = 0x100, }, { .x = 0x200, .y = 0x200, .w = 0x200, .h = 0x200, }, }, .timestamp = 0x300, }; static inline int64_t timestamp = 0; static inline Rect damage = {}; static inline std::vector damages = {}; static inline sptr cs = nullptr; static inline sptr ps = nullptr; static inline sptr bq = nullptr; static inline sptr surfaceDelegator = nullptr; static inline sptr consumer_ = nullptr; }; void ConsumerSurfaceTest::SetUpTestCase() { cs = IConsumerSurface::Create(); sptr listener = new BufferConsumerListener(); cs->RegisterConsumerListener(listener); auto p = cs->GetProducer(); bq = new BufferQueue("test"); ps = Surface::CreateSurfaceAsProducer(p); surfaceDelegator = ProducerSurfaceDelegator::Create(); } void ConsumerSurfaceTest::TearDownTestCase() { cs = nullptr; } /* * @tc.name : UserDataChangeListen001 * @tc.desc : Register UserData Change Listener * @tc.size : MediumTest * @tc.type : Function * @tc.level : Level 2 */ HWTEST_F(ConsumerSurfaceTest, UserDataChangeListen001, Function | MediumTest | Level2) { sptr csTestUserData = IConsumerSurface::Create(); GSError ret1 = OHOS::GSERROR_INVALID_ARGUMENTS; GSError ret2 = OHOS::GSERROR_INVALID_ARGUMENTS; auto func1 = [&ret1](const std::string& key, const std::string& value) { ret1 = OHOS::GSERROR_OK; }; auto func2 = [&ret2](const std::string& key, const std::string& value) { ret2 = OHOS::GSERROR_OK; }; csTestUserData->RegisterUserDataChangeListener("func1", func1); csTestUserData->RegisterUserDataChangeListener("func2", func2); csTestUserData->RegisterUserDataChangeListener("func3", nullptr); ASSERT_EQ(csTestUserData->RegisterUserDataChangeListener("func2", func2), OHOS::GSERROR_INVALID_ARGUMENTS); if (csTestUserData->SetUserData("Regist", "OK") == OHOS::GSERROR_OK) { ASSERT_EQ(ret1, OHOS::GSERROR_OK); ASSERT_EQ(ret2, OHOS::GSERROR_OK); } ret1 = OHOS::GSERROR_INVALID_ARGUMENTS; ret2 = OHOS::GSERROR_INVALID_ARGUMENTS; csTestUserData->UnRegisterUserDataChangeListener("func1"); ASSERT_EQ(csTestUserData->UnRegisterUserDataChangeListener("func1"), OHOS::GSERROR_INVALID_ARGUMENTS); if (csTestUserData->SetUserData("UnRegist", "INVALID") == OHOS::GSERROR_OK) { ASSERT_EQ(ret1, OHOS::GSERROR_INVALID_ARGUMENTS); ASSERT_EQ(ret2, OHOS::GSERROR_OK); } ret1 = OHOS::GSERROR_INVALID_ARGUMENTS; ret2 = OHOS::GSERROR_INVALID_ARGUMENTS; csTestUserData->ClearUserDataChangeListener(); csTestUserData->RegisterUserDataChangeListener("func1", func1); if (csTestUserData->SetUserData("Clear", "OK") == OHOS::GSERROR_OK) { ASSERT_EQ(ret1, OHOS::GSERROR_OK); ASSERT_EQ(ret2, OHOS::GSERROR_INVALID_ARGUMENTS); } } /* * @tc.name : UserDataChangeListen002 * @tc.desc : Register UserData Change Listener * @tc.size : MediumTest * @tc.type : Function * @tc.level : Level 2 */ HWTEST_F(ConsumerSurfaceTest, UserDataChangeListen002, Function | MediumTest | Level2) { sptr csTestUserData = IConsumerSurface::Create(); auto func = [&csTestUserData](const std::string& FuncName) { constexpr int32_t RegisterListenerNum = 1000; std::vector ret(RegisterListenerNum, OHOS::GSERROR_INVALID_ARGUMENTS); std::string strs[RegisterListenerNum]; constexpr int32_t stringLengthMax = 32; char str[stringLengthMax] = {}; for (int i = 0; i < RegisterListenerNum; i++) { auto secRet = snprintf_s(str, sizeof(str), sizeof(str) - 1, "%s%d", FuncName.c_str(), i); ASSERT_GT(secRet, 0); strs[i] = str; ASSERT_EQ(csTestUserData->RegisterUserDataChangeListener(strs[i], [i, &ret] (const std::string& key, const std::string& value) { ret[i] = OHOS::GSERROR_OK; }), OHOS::GSERROR_OK); } if (csTestUserData->SetUserData("Regist", FuncName) == OHOS::GSERROR_OK) { for (int i = 0; i < RegisterListenerNum; i++) { ASSERT_EQ(ret[i], OHOS::GSERROR_OK); } } for (int i = 0; i < RegisterListenerNum; i++) { csTestUserData->UnRegisterUserDataChangeListener(strs[i]); } }; std::thread t1(func, "thread1"); std::thread t2(func, "thread2"); t1.join(); t2.join(); } }