148f512ceSopenharmony_ci/*
248f512ceSopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
348f512ceSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
448f512ceSopenharmony_ci * you may not use this file except in compliance with the License.
548f512ceSopenharmony_ci * You may obtain a copy of the License at
648f512ceSopenharmony_ci *
748f512ceSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
848f512ceSopenharmony_ci *
948f512ceSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1048f512ceSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1148f512ceSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1248f512ceSopenharmony_ci * See the License for the specific language governing permissions and
1348f512ceSopenharmony_ci * limitations under the License.
1448f512ceSopenharmony_ci */
1548f512ceSopenharmony_ci
1648f512ceSopenharmony_ci#include <vector>
1748f512ceSopenharmony_ci
1848f512ceSopenharmony_ci#include <gmock/gmock.h>
1948f512ceSopenharmony_ci#include <gtest/gtest.h>
2048f512ceSopenharmony_ci
2148f512ceSopenharmony_ci#include "dwarf_test.h"
2248f512ceSopenharmony_ci
2348f512ceSopenharmony_ciusing namespace testing::ext;
2448f512ceSopenharmony_ciusing namespace std;
2548f512ceSopenharmony_ci// using namespace OHOS::HiviewDFX;
2648f512ceSopenharmony_cinamespace OHOS {
2748f512ceSopenharmony_cinamespace Developtools {
2848f512ceSopenharmony_cinamespace HiPerf {
2948f512ceSopenharmony_cinamespace {
3048f512ceSopenharmony_ciconst unsigned char absptr {0xff};
3148f512ceSopenharmony_ciconstexpr int data2Size {2};
3248f512ceSopenharmony_ciconst unsigned char data2[data2Size] {0xff, 0xff};
3348f512ceSopenharmony_ciconst unsigned char data4[sizeof(int32_t)] {0xff, 0xff, 0xff, 0xff};
3448f512ceSopenharmony_ciconst unsigned char data8[sizeof(int64_t)] {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
3548f512ceSopenharmony_ciconstexpr int data128Size {128};
3648f512ceSopenharmony_ciunsigned char data128[data128Size] {};
3748f512ceSopenharmony_ci#ifdef NOT_USE
3848f512ceSopenharmony_ciconstexpr int num {9};
3948f512ceSopenharmony_ci#else
4048f512ceSopenharmony_ciconstexpr int num {7};
4148f512ceSopenharmony_ci#endif
4248f512ceSopenharmony_ciconst unsigned char *data[num] {};
4348f512ceSopenharmony_cistd::vector<uint64_t> values {
4448f512ceSopenharmony_ci    65535ULL,
4548f512ceSopenharmony_ci    4294967295ULL,
4648f512ceSopenharmony_ci    18446744073709551615ULL,
4748f512ceSopenharmony_ci    18446744073709551615ULL,
4848f512ceSopenharmony_ci    18446744073709551615ULL,
4948f512ceSopenharmony_ci    18446744073709551615ULL,
5048f512ceSopenharmony_ci    65535ULL,
5148f512ceSopenharmony_ci    4294967295ULL,
5248f512ceSopenharmony_ci    1921026034567241472ULL,
5348f512ceSopenharmony_ci    18446744073709551615ULL,
5448f512ceSopenharmony_ci    18446744073709551615ULL,
5548f512ceSopenharmony_ci    1921026034567241472ULL,
5648f512ceSopenharmony_ci    65535ULL,
5748f512ceSopenharmony_ci    4294967295ULL,
5848f512ceSopenharmony_ci    1921010641404477184ULL,
5948f512ceSopenharmony_ci    18446744073709551615ULL,
6048f512ceSopenharmony_ci    18446744073709551615ULL,
6148f512ceSopenharmony_ci    1921010641404477184ULL,
6248f512ceSopenharmony_ci    65535ULL,
6348f512ceSopenharmony_ci    447241984ULL,
6448f512ceSopenharmony_ci    1940452206006808832ULL,
6548f512ceSopenharmony_ci    18446744073709551615ULL,
6648f512ceSopenharmony_ci    447241984ULL,
6748f512ceSopenharmony_ci    1940452206006808832ULL,
6848f512ceSopenharmony_ci    65535ULL,
6948f512ceSopenharmony_ci    447273728ULL,
7048f512ceSopenharmony_ci    1940830438011371264ULL,
7148f512ceSopenharmony_ci    18446744073709551615ULL,
7248f512ceSopenharmony_ci    447273728ULL,
7348f512ceSopenharmony_ci    1940830438011371264ULL,
7448f512ceSopenharmony_ci    65535ULL,
7548f512ceSopenharmony_ci    447266560ULL,
7648f512ceSopenharmony_ci    1940830438011385600ULL,
7748f512ceSopenharmony_ci    18446744073709551615ULL,
7848f512ceSopenharmony_ci    447266560ULL,
7948f512ceSopenharmony_ci    1940830438011385600ULL,
8048f512ceSopenharmony_ci};
8148f512ceSopenharmony_cistd::vector<dw_encode_t> vfs {
8248f512ceSopenharmony_ci    DW_EH_PE_absptr,
8348f512ceSopenharmony_ci#ifdef NOT_USE
8448f512ceSopenharmony_ci    DW_EH_PE_uleb128,
8548f512ceSopenharmony_ci#endif
8648f512ceSopenharmony_ci    DW_EH_PE_udata2,  DW_EH_PE_udata4, DW_EH_PE_udata8,
8748f512ceSopenharmony_ci#ifdef NOT_USE
8848f512ceSopenharmony_ci    DW_EH_PE_sleb128,
8948f512ceSopenharmony_ci#endif
9048f512ceSopenharmony_ci    DW_EH_PE_sdata2,  DW_EH_PE_sdata4, DW_EH_PE_sdata8,
9148f512ceSopenharmony_ci};
9248f512ceSopenharmony_civector<dw_encode_t> ehas {
9348f512ceSopenharmony_ci    DW_EH_PE_nothing, DW_EH_PE_pcrel,   DW_EH_PE_textrel, DW_EH_PE_datarel,
9448f512ceSopenharmony_ci    DW_EH_PE_funcrel, DW_EH_PE_aligned, DW_EH_PE_omit,
9548f512ceSopenharmony_ci};
9648f512ceSopenharmony_ci} // namespace
9748f512ceSopenharmony_ci
9848f512ceSopenharmony_ciclass DwarfTest : public testing::Test {
9948f512ceSopenharmony_cipublic:
10048f512ceSopenharmony_ci    static void SetUpTestCase(void);
10148f512ceSopenharmony_ci    static void TearDownTestCase(void);
10248f512ceSopenharmony_ci    void SetUp();
10348f512ceSopenharmony_ci    void TearDown();
10448f512ceSopenharmony_ci};
10548f512ceSopenharmony_ci
10648f512ceSopenharmony_civoid DwarfTest::SetUpTestCase(void) {}
10748f512ceSopenharmony_ci
10848f512ceSopenharmony_civoid DwarfTest::TearDownTestCase(void) {}
10948f512ceSopenharmony_ci
11048f512ceSopenharmony_civoid DwarfTest::SetUp()
11148f512ceSopenharmony_ci{
11248f512ceSopenharmony_ci    for (std::size_t index = 0; index < data128Size; ++index) {
11348f512ceSopenharmony_ci        data128[index] = 0xff;
11448f512ceSopenharmony_ci    }
11548f512ceSopenharmony_ci    std::size_t index {0};
11648f512ceSopenharmony_ci    data[index++] = &absptr;
11748f512ceSopenharmony_ci#ifdef NOT_USE
11848f512ceSopenharmony_ci    data[index++] = data128;
11948f512ceSopenharmony_ci#endif
12048f512ceSopenharmony_ci    data[index++] = data2;
12148f512ceSopenharmony_ci    data[index++] = data4;
12248f512ceSopenharmony_ci    data[index++] = data8;
12348f512ceSopenharmony_ci#ifdef NOT_USE
12448f512ceSopenharmony_ci    data[index++] = data128;
12548f512ceSopenharmony_ci#endif
12648f512ceSopenharmony_ci    data[index++] = data2;
12748f512ceSopenharmony_ci    data[index++] = data4;
12848f512ceSopenharmony_ci    data[index++] = data8;
12948f512ceSopenharmony_ci}
13048f512ceSopenharmony_ci
13148f512ceSopenharmony_civoid DwarfTest::TearDown() {}
13248f512ceSopenharmony_ci
13348f512ceSopenharmony_ciHWTEST_F(DwarfTest, GetEnd, TestSize.Level1)
13448f512ceSopenharmony_ci{
13548f512ceSopenharmony_ci    for (std::size_t i = 0; i < ehas.size(); ++i) {
13648f512ceSopenharmony_ci        for (std::size_t j = 0; j < num; ++j) {
13748f512ceSopenharmony_ci            {
13848f512ceSopenharmony_ci                dw_encode_t dwe = ehas[i] | vfs[j];
13948f512ceSopenharmony_ci                DwarfEncoding dw {dwe, data[j]};
14048f512ceSopenharmony_ci                if (!dw.IsOmit()) {
14148f512ceSopenharmony_ci                    if (vfs[j] == DW_EH_PE_absptr) {
14248f512ceSopenharmony_ci                        EXPECT_TRUE(data[j] == dw.GetEnd() - dw.GetSize());
14348f512ceSopenharmony_ci                    } else {
14448f512ceSopenharmony_ci                        EXPECT_TRUE(data[j] == dw.GetEnd());
14548f512ceSopenharmony_ci                    }
14648f512ceSopenharmony_ci                }
14748f512ceSopenharmony_ci            }
14848f512ceSopenharmony_ci        }
14948f512ceSopenharmony_ci    }
15048f512ceSopenharmony_ci}
15148f512ceSopenharmony_ci
15248f512ceSopenharmony_ciHWTEST_F(DwarfTest, GetData, TestSize.Level1)
15348f512ceSopenharmony_ci{
15448f512ceSopenharmony_ci    for (std::size_t i = 0; i < ehas.size(); ++i) {
15548f512ceSopenharmony_ci        for (std::size_t j = 0; j < num; ++j) {
15648f512ceSopenharmony_ci            {
15748f512ceSopenharmony_ci                dw_encode_t dwe = ehas[i] | vfs[j];
15848f512ceSopenharmony_ci                DwarfEncoding dw {dwe, data[j]};
15948f512ceSopenharmony_ci                if (!dw.IsOmit()) {
16048f512ceSopenharmony_ci                    if (vfs[j] == DW_EH_PE_absptr) {
16148f512ceSopenharmony_ci                        EXPECT_TRUE(data[j] == dw.GetData());
16248f512ceSopenharmony_ci                    } else {
16348f512ceSopenharmony_ci                        EXPECT_TRUE(data[j] == dw.GetData() + dw.GetSize());
16448f512ceSopenharmony_ci                    }
16548f512ceSopenharmony_ci                }
16648f512ceSopenharmony_ci            }
16748f512ceSopenharmony_ci        }
16848f512ceSopenharmony_ci    }
16948f512ceSopenharmony_ci}
17048f512ceSopenharmony_ci
17148f512ceSopenharmony_ciHWTEST_F(DwarfTest, GetSize, TestSize.Level1)
17248f512ceSopenharmony_ci{
17348f512ceSopenharmony_ci    for (std::size_t i = 0; i < ehas.size(); ++i) {
17448f512ceSopenharmony_ci        for (std::size_t j = 0; j < num; ++j) {
17548f512ceSopenharmony_ci            {
17648f512ceSopenharmony_ci                dw_encode_t dwe = ehas[i] | vfs[j];
17748f512ceSopenharmony_ci                DwarfEncoding dw {dwe, data[j]};
17848f512ceSopenharmony_ci                if (!dw.IsOmit()) {
17948f512ceSopenharmony_ci                    EXPECT_TRUE(DWFormatSizeMap.at(vfs[j]) == dw.GetSize());
18048f512ceSopenharmony_ci                }
18148f512ceSopenharmony_ci            }
18248f512ceSopenharmony_ci        }
18348f512ceSopenharmony_ci    }
18448f512ceSopenharmony_ci}
18548f512ceSopenharmony_ci
18648f512ceSopenharmony_ciHWTEST_F(DwarfTest, ToString, TestSize.Level1)
18748f512ceSopenharmony_ci{
18848f512ceSopenharmony_ci    for (std::size_t j = 0; j < num; ++j) {
18948f512ceSopenharmony_ci        dw_encode_t dwe = ehas[0] | vfs[j];
19048f512ceSopenharmony_ci        DwarfEncoding dw {dwe, data[j]};
19148f512ceSopenharmony_ci        EXPECT_TRUE(!dw.ToString().empty());
19248f512ceSopenharmony_ci        printf("%s\n", dw.ToString().c_str());
19348f512ceSopenharmony_ci    }
19448f512ceSopenharmony_ci}
19548f512ceSopenharmony_ci
19648f512ceSopenharmony_ciHWTEST_F(DwarfTest, IsOmit, TestSize.Level1)
19748f512ceSopenharmony_ci{
19848f512ceSopenharmony_ci    for (std::size_t i = 0; i < ehas.size(); ++i) {
19948f512ceSopenharmony_ci        for (std::size_t j = 0; j < num; ++j) {
20048f512ceSopenharmony_ci            {
20148f512ceSopenharmony_ci                dw_encode_t dwe = ehas[i] | vfs[j];
20248f512ceSopenharmony_ci                DwarfEncoding dw {dwe, data[j]};
20348f512ceSopenharmony_ci                if (ehas[i] == DW_EH_PE_omit) {
20448f512ceSopenharmony_ci                    EXPECT_TRUE(dw.IsOmit());
20548f512ceSopenharmony_ci                } else {
20648f512ceSopenharmony_ci                    EXPECT_FALSE(dw.IsOmit());
20748f512ceSopenharmony_ci                }
20848f512ceSopenharmony_ci            }
20948f512ceSopenharmony_ci        }
21048f512ceSopenharmony_ci    }
21148f512ceSopenharmony_ci}
21248f512ceSopenharmony_ci} // namespace HiPerf
21348f512ceSopenharmony_ci} // namespace Developtools
21448f512ceSopenharmony_ci} // namespace OHOS
215