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}