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