132a6e48fSopenharmony_ci/* 232a6e48fSopenharmony_ci * Copyright (c) 2021 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 <securec.h> 1632a6e48fSopenharmony_ci#include <gtest/gtest.h> 1732a6e48fSopenharmony_ci#include <surface.h> 1832a6e48fSopenharmony_ci#include <consumer_surface.h> 1932a6e48fSopenharmony_ci#include <surface_utils.h> 2032a6e48fSopenharmony_ci#include "buffer_consumer_listener.h" 2132a6e48fSopenharmony_ci#include "surface_buffer_impl.h" 2232a6e48fSopenharmony_ci 2332a6e48fSopenharmony_ciusing namespace testing; 2432a6e48fSopenharmony_ciusing namespace testing::ext; 2532a6e48fSopenharmony_ci 2632a6e48fSopenharmony_cinamespace OHOS::Rosen { 2732a6e48fSopenharmony_ciclass SurfaceUtilsTest : public testing::Test { 2832a6e48fSopenharmony_cipublic: 2932a6e48fSopenharmony_ci static void SetUpTestCase(); 3032a6e48fSopenharmony_ci static void TearDownTestCase(); 3132a6e48fSopenharmony_ci static bool IsArrayEmpty(const float arr[16]); 3232a6e48fSopenharmony_ci static inline sptr<IConsumerSurface> csurface1 = nullptr; 3332a6e48fSopenharmony_ci static inline sptr<IBufferProducer> producer1 = nullptr; 3432a6e48fSopenharmony_ci static inline sptr<Surface> psurface1 = nullptr; 3532a6e48fSopenharmony_ci 3632a6e48fSopenharmony_ci static inline sptr<IConsumerSurface> csurface2 = nullptr; 3732a6e48fSopenharmony_ci static inline sptr<IBufferProducer> producer2 = nullptr; 3832a6e48fSopenharmony_ci static inline sptr<Surface> psurface2 = nullptr; 3932a6e48fSopenharmony_ci 4032a6e48fSopenharmony_ci static inline SurfaceUtils *utils = nullptr; 4132a6e48fSopenharmony_ci static constexpr const int32_t TRANSFORM_MATRIX_SIZE = 16; 4232a6e48fSopenharmony_ci}; 4332a6e48fSopenharmony_ci 4432a6e48fSopenharmony_civoid SurfaceUtilsTest::SetUpTestCase() 4532a6e48fSopenharmony_ci{ 4632a6e48fSopenharmony_ci csurface1 = IConsumerSurface::Create(); 4732a6e48fSopenharmony_ci sptr<IBufferConsumerListener> listener1 = new BufferConsumerListener(); 4832a6e48fSopenharmony_ci csurface1->RegisterConsumerListener(listener1); 4932a6e48fSopenharmony_ci producer1 = csurface1->GetProducer(); 5032a6e48fSopenharmony_ci psurface1 = Surface::CreateSurfaceAsProducer(producer1); 5132a6e48fSopenharmony_ci 5232a6e48fSopenharmony_ci csurface2 = IConsumerSurface::Create(); 5332a6e48fSopenharmony_ci sptr<IBufferConsumerListener> listener2 = new BufferConsumerListener(); 5432a6e48fSopenharmony_ci csurface2->RegisterConsumerListener(listener2); 5532a6e48fSopenharmony_ci producer2 = csurface2->GetProducer(); 5632a6e48fSopenharmony_ci psurface2 = Surface::CreateSurfaceAsProducer(producer2); 5732a6e48fSopenharmony_ci} 5832a6e48fSopenharmony_ci 5932a6e48fSopenharmony_civoid SurfaceUtilsTest::TearDownTestCase() 6032a6e48fSopenharmony_ci{ 6132a6e48fSopenharmony_ci csurface1 = nullptr; 6232a6e48fSopenharmony_ci producer1 = nullptr; 6332a6e48fSopenharmony_ci psurface1 = nullptr; 6432a6e48fSopenharmony_ci 6532a6e48fSopenharmony_ci csurface2 = nullptr; 6632a6e48fSopenharmony_ci producer2 = nullptr; 6732a6e48fSopenharmony_ci psurface2 = nullptr; 6832a6e48fSopenharmony_ci utils = nullptr; 6932a6e48fSopenharmony_ci} 7032a6e48fSopenharmony_ci 7132a6e48fSopenharmony_ci/* 7232a6e48fSopenharmony_ci* Function: GetInstance 7332a6e48fSopenharmony_ci* Type: Function 7432a6e48fSopenharmony_ci* Rank: Important(2) 7532a6e48fSopenharmony_ci* EnvConditions: N/A 7632a6e48fSopenharmony_ci* CaseDescription: 1. call GetInstance 7732a6e48fSopenharmony_ci* 2. check ret 7832a6e48fSopenharmony_ci */ 7932a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, GetInstance001, Function | MediumTest | Level2) 8032a6e48fSopenharmony_ci{ 8132a6e48fSopenharmony_ci utils = SurfaceUtils::GetInstance(); 8232a6e48fSopenharmony_ci ASSERT_NE(utils, nullptr); 8332a6e48fSopenharmony_ci} 8432a6e48fSopenharmony_ci 8532a6e48fSopenharmony_ci/* 8632a6e48fSopenharmony_ci* Function: GetInstance 8732a6e48fSopenharmony_ci* Type: Function 8832a6e48fSopenharmony_ci* Rank: Important(2) 8932a6e48fSopenharmony_ci* EnvConditions: N/A 9032a6e48fSopenharmony_ci* CaseDescription: 1. call Add 9132a6e48fSopenharmony_ci* 2. check ret 9232a6e48fSopenharmony_ci */ 9332a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, Add001, Function | MediumTest | Level2) 9432a6e48fSopenharmony_ci{ 9532a6e48fSopenharmony_ci GSError ret = utils->Add(psurface1->GetUniqueId(), nullptr); 9632a6e48fSopenharmony_ci ASSERT_EQ(ret, OHOS::GSERROR_INVALID_ARGUMENTS); 9732a6e48fSopenharmony_ci} 9832a6e48fSopenharmony_ci 9932a6e48fSopenharmony_ci/* 10032a6e48fSopenharmony_ci* Function: GetInstance 10132a6e48fSopenharmony_ci* Type: Function 10232a6e48fSopenharmony_ci* Rank: Important(2) 10332a6e48fSopenharmony_ci* EnvConditions: N/A 10432a6e48fSopenharmony_ci* CaseDescription: 1. call Add 2 times 10532a6e48fSopenharmony_ci* 2. check ret 10632a6e48fSopenharmony_ci */ 10732a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, Add002, Function | MediumTest | Level2) 10832a6e48fSopenharmony_ci{ 10932a6e48fSopenharmony_ci GSError ret = utils->Add(psurface1->GetUniqueId(), psurface1); 11032a6e48fSopenharmony_ci ASSERT_EQ(ret, OHOS::GSERROR_OK); 11132a6e48fSopenharmony_ci 11232a6e48fSopenharmony_ci ret = utils->Add(psurface1->GetUniqueId(), psurface1); 11332a6e48fSopenharmony_ci ASSERT_EQ(ret, OHOS::GSERROR_OK); 11432a6e48fSopenharmony_ci} 11532a6e48fSopenharmony_ci 11632a6e48fSopenharmony_ci/* 11732a6e48fSopenharmony_ci* Function: GetSurface 11832a6e48fSopenharmony_ci* Type: Function 11932a6e48fSopenharmony_ci* Rank: Important(2) 12032a6e48fSopenharmony_ci* EnvConditions: N/A 12132a6e48fSopenharmony_ci* CaseDescription: 1. call GetSurface by abnormal uniqueId 12232a6e48fSopenharmony_ci* 2. check ret 12332a6e48fSopenharmony_ci */ 12432a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, GetSurface001, Function | MediumTest | Level2) 12532a6e48fSopenharmony_ci{ 12632a6e48fSopenharmony_ci sptr<Surface> surface = utils->GetSurface(0); 12732a6e48fSopenharmony_ci ASSERT_EQ(surface, nullptr); 12832a6e48fSopenharmony_ci} 12932a6e48fSopenharmony_ci 13032a6e48fSopenharmony_ci/* 13132a6e48fSopenharmony_ci* Function: GetSurface 13232a6e48fSopenharmony_ci* Type: Function 13332a6e48fSopenharmony_ci* Rank: Important(2) 13432a6e48fSopenharmony_ci* EnvConditions: N/A 13532a6e48fSopenharmony_ci* CaseDescription: 1. call GetSurface 13632a6e48fSopenharmony_ci* 2. check ret 13732a6e48fSopenharmony_ci */ 13832a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, GetSurface002, Function | MediumTest | Level2) 13932a6e48fSopenharmony_ci{ 14032a6e48fSopenharmony_ci sptr<Surface> surface1 = utils->GetSurface(psurface1->GetUniqueId()); 14132a6e48fSopenharmony_ci ASSERT_NE(surface1, nullptr); 14232a6e48fSopenharmony_ci} 14332a6e48fSopenharmony_ci 14432a6e48fSopenharmony_ci/* 14532a6e48fSopenharmony_ci* Function: GetSurface 14632a6e48fSopenharmony_ci* Type: Function 14732a6e48fSopenharmony_ci* Rank: Important(2) 14832a6e48fSopenharmony_ci* EnvConditions: N/A 14932a6e48fSopenharmony_ci* CaseDescription: 1. call GetSurface 15032a6e48fSopenharmony_ci* 2. call Add 15132a6e48fSopenharmony_ci* 3. call GetSurface again 15232a6e48fSopenharmony_ci* 4. check ret 15332a6e48fSopenharmony_ci */ 15432a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, GetSurface003, Function | MediumTest | Level2) 15532a6e48fSopenharmony_ci{ 15632a6e48fSopenharmony_ci sptr<Surface> surface2 = utils->GetSurface(psurface2->GetUniqueId()); 15732a6e48fSopenharmony_ci ASSERT_NE(surface2, nullptr); 15832a6e48fSopenharmony_ci 15932a6e48fSopenharmony_ci GSError ret = utils->Add(psurface2->GetUniqueId(), psurface2); 16032a6e48fSopenharmony_ci ASSERT_EQ(ret, OHOS::GSERROR_OK); 16132a6e48fSopenharmony_ci 16232a6e48fSopenharmony_ci surface2 = utils->GetSurface(psurface2->GetUniqueId()); 16332a6e48fSopenharmony_ci ASSERT_NE(surface2, nullptr); 16432a6e48fSopenharmony_ci} 16532a6e48fSopenharmony_ci 16632a6e48fSopenharmony_ci/* 16732a6e48fSopenharmony_ci* Function: Remove 16832a6e48fSopenharmony_ci* Type: Function 16932a6e48fSopenharmony_ci* Rank: Important(2) 17032a6e48fSopenharmony_ci* EnvConditions: N/A 17132a6e48fSopenharmony_ci* CaseDescription: 1. call Remove 17232a6e48fSopenharmony_ci* 2. check ret 17332a6e48fSopenharmony_ci */ 17432a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, Remove001, Function | MediumTest | Level2) 17532a6e48fSopenharmony_ci{ 17632a6e48fSopenharmony_ci GSError ret = utils->Remove(0); 17732a6e48fSopenharmony_ci ASSERT_EQ(ret, GSERROR_INVALID_OPERATING); 17832a6e48fSopenharmony_ci} 17932a6e48fSopenharmony_ci 18032a6e48fSopenharmony_ci/* 18132a6e48fSopenharmony_ci* Function: Remove 18232a6e48fSopenharmony_ci* Type: Function 18332a6e48fSopenharmony_ci* Rank: Important(2) 18432a6e48fSopenharmony_ci* EnvConditions: N/A 18532a6e48fSopenharmony_ci* CaseDescription: 1. call Remove 2 times 18632a6e48fSopenharmony_ci* 2. check ret 18732a6e48fSopenharmony_ci */ 18832a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, Remove002, Function | MediumTest | Level2) 18932a6e48fSopenharmony_ci{ 19032a6e48fSopenharmony_ci GSError ret = utils->Remove(psurface1->GetUniqueId()); 19132a6e48fSopenharmony_ci ASSERT_EQ(ret, OHOS::GSERROR_OK); 19232a6e48fSopenharmony_ci 19332a6e48fSopenharmony_ci ret = utils->Remove(psurface1->GetUniqueId()); 19432a6e48fSopenharmony_ci ASSERT_EQ(ret, SURFACE_ERROR_INVALID_OPERATING); 19532a6e48fSopenharmony_ci} 19632a6e48fSopenharmony_ci 19732a6e48fSopenharmony_ci/* 19832a6e48fSopenharmony_ci* Function: ComputeTransformMatrix 19932a6e48fSopenharmony_ci* Type: Function 20032a6e48fSopenharmony_ci* Rank: Important(2) 20132a6e48fSopenharmony_ci* EnvConditions: N/A 20232a6e48fSopenharmony_ci* CaseDescription: 1. call ComputeTransformMatrix 20332a6e48fSopenharmony_ci* 2. call ComputeTransformMatrixV2 20432a6e48fSopenharmony_ci */ 20532a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, ComputeTransformMatrix001, Function | MediumTest | Level2) 20632a6e48fSopenharmony_ci{ 20732a6e48fSopenharmony_ci // Prepare params 20832a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer = new SurfaceBufferImpl(); 20932a6e48fSopenharmony_ci buffer->SetSurfaceBufferWidth(1920); 21032a6e48fSopenharmony_ci buffer->SetSurfaceBufferHeight(1920); 21132a6e48fSopenharmony_ci float matrix[TRANSFORM_MATRIX_SIZE]; 21232a6e48fSopenharmony_ci Rect crop = {}; 21332a6e48fSopenharmony_ci crop.w = buffer->GetWidth(); 21432a6e48fSopenharmony_ci crop.h = buffer->GetHeight(); 21532a6e48fSopenharmony_ci GraphicTransformType transform = GraphicTransformType::GRAPHIC_FLIP_H; 21632a6e48fSopenharmony_ci float emptyMatrix[TRANSFORM_MATRIX_SIZE]; 21732a6e48fSopenharmony_ci //invalid parameter 21832a6e48fSopenharmony_ci sptr<SurfaceBuffer> tmpBuffer = nullptr; 21932a6e48fSopenharmony_ci utils->ComputeTransformMatrix(matrix, TRANSFORM_MATRIX_SIZE, tmpBuffer, transform, crop); 22032a6e48fSopenharmony_ci ASSERT_TRUE(IsArrayEmpty(matrix)); 22132a6e48fSopenharmony_ci utils->ComputeTransformMatrixV2(matrix, TRANSFORM_MATRIX_SIZE, tmpBuffer, transform, crop); 22232a6e48fSopenharmony_ci ASSERT_TRUE(IsArrayEmpty(matrix)); 22332a6e48fSopenharmony_ci 22432a6e48fSopenharmony_ci // Compute matrix with normal crop 22532a6e48fSopenharmony_ci utils->ComputeTransformMatrix(matrix, 16, buffer, transform, crop); 22632a6e48fSopenharmony_ci ASSERT_NE(matrix, emptyMatrix); 22732a6e48fSopenharmony_ci utils->ComputeTransformMatrixV2(matrix, 16, buffer, transform, crop); 22832a6e48fSopenharmony_ci ASSERT_NE(matrix, emptyMatrix); 22932a6e48fSopenharmony_ci} 23032a6e48fSopenharmony_ci 23132a6e48fSopenharmony_cibool SurfaceUtilsTest::IsArrayEmpty(const float arr[TRANSFORM_MATRIX_SIZE]) 23232a6e48fSopenharmony_ci{ 23332a6e48fSopenharmony_ci return std::all_of(arr, arr + TRANSFORM_MATRIX_SIZE, [](float value) { return value == 0.0f; }); 23432a6e48fSopenharmony_ci} 23532a6e48fSopenharmony_ci 23632a6e48fSopenharmony_ci/* 23732a6e48fSopenharmony_ci* Function: ComputeTransformMatrix 23832a6e48fSopenharmony_ci* Type: Function 23932a6e48fSopenharmony_ci* Rank: Important(2) 24032a6e48fSopenharmony_ci* EnvConditions: N/A 24132a6e48fSopenharmony_ci* CaseDescription: 1. call ComputeTransformMatrix with small crop 24232a6e48fSopenharmony_ci* 2. call ComputeTransformMatrixV2 with small crop 24332a6e48fSopenharmony_ci */ 24432a6e48fSopenharmony_ciHWTEST_F(SurfaceUtilsTest, ComputeTransformMatrix002, Function | MediumTest | Level2) 24532a6e48fSopenharmony_ci{ 24632a6e48fSopenharmony_ci // Prepare params 24732a6e48fSopenharmony_ci sptr<SurfaceBuffer> buffer = new SurfaceBufferImpl(); 24832a6e48fSopenharmony_ci buffer->SetSurfaceBufferWidth(1920); 24932a6e48fSopenharmony_ci buffer->SetSurfaceBufferHeight(1920); 25032a6e48fSopenharmony_ci float matrix[16]; 25132a6e48fSopenharmony_ci Rect crop = {}; 25232a6e48fSopenharmony_ci crop.w = 100; 25332a6e48fSopenharmony_ci crop.h = 100; 25432a6e48fSopenharmony_ci GraphicTransformType transform = GraphicTransformType::GRAPHIC_FLIP_H; 25532a6e48fSopenharmony_ci 25632a6e48fSopenharmony_ci // Compute matrix with normal crop 25732a6e48fSopenharmony_ci float emptyMatrix[16]; 25832a6e48fSopenharmony_ci utils->ComputeTransformMatrix(matrix, 16, buffer, transform, crop); 25932a6e48fSopenharmony_ci ASSERT_NE(matrix, emptyMatrix); 26032a6e48fSopenharmony_ci utils->ComputeTransformMatrixV2(matrix, 16, buffer, transform, crop); 26132a6e48fSopenharmony_ci ASSERT_NE(matrix, emptyMatrix); 26232a6e48fSopenharmony_ci} 26332a6e48fSopenharmony_ci}