148f512ceSopenharmony_ci/*
248f512ceSopenharmony_ci * Copyright (c) 2021 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 "register_test.h"
1748f512ceSopenharmony_ci
1848f512ceSopenharmony_ci#include <bitset>
1948f512ceSopenharmony_ci
2048f512ceSopenharmony_ciusing namespace testing::ext;
2148f512ceSopenharmony_ciusing namespace std;
2248f512ceSopenharmony_ciusing namespace OHOS::HiviewDFX;
2348f512ceSopenharmony_cinamespace OHOS {
2448f512ceSopenharmony_cinamespace Developtools {
2548f512ceSopenharmony_cinamespace HiPerf {
2648f512ceSopenharmony_ciclass RegisterTest : public testing::Test {
2748f512ceSopenharmony_cipublic:
2848f512ceSopenharmony_ci    static void SetUpTestCase(void);
2948f512ceSopenharmony_ci    static void TearDownTestCase(void);
3048f512ceSopenharmony_ci    void SetUp();
3148f512ceSopenharmony_ci    void TearDown();
3248f512ceSopenharmony_ci};
3348f512ceSopenharmony_ci
3448f512ceSopenharmony_civoid RegisterTest::SetUpTestCase() {}
3548f512ceSopenharmony_ci
3648f512ceSopenharmony_civoid RegisterTest::TearDownTestCase() {}
3748f512ceSopenharmony_ci
3848f512ceSopenharmony_civoid RegisterTest::SetUp() {}
3948f512ceSopenharmony_ci
4048f512ceSopenharmony_civoid RegisterTest::TearDown() {}
4148f512ceSopenharmony_ci
4248f512ceSopenharmony_ci
4348f512ceSopenharmony_ci/**
4448f512ceSopenharmony_ci * @tc.name: GetSupportedRegMask
4548f512ceSopenharmony_ci * @tc.desc:
4648f512ceSopenharmony_ci * @tc.type: FUNC
4748f512ceSopenharmony_ci */
4848f512ceSopenharmony_ciHWTEST_F(RegisterTest, GetSupportedRegMask, TestSize.Level1)
4948f512ceSopenharmony_ci{
5048f512ceSopenharmony_ci    EXPECT_NE(GetSupportedRegMask(ArchType::ARCH_X86), GetSupportedRegMask(ArchType::ARCH_X86_64));
5148f512ceSopenharmony_ci    EXPECT_NE(GetSupportedRegMask(ArchType::ARCH_ARM), GetSupportedRegMask(ArchType::ARCH_ARM64));
5248f512ceSopenharmony_ci    EXPECT_EQ(GetSupportedRegMask(static_cast<ArchType>(100)),
5348f512ceSopenharmony_ci              std::numeric_limits<uint64_t>::max());
5448f512ceSopenharmony_ci    EXPECT_EQ(GetSupportedRegMask(static_cast<ArchType>(-1)), std::numeric_limits<uint64_t>::max());
5548f512ceSopenharmony_ci
5648f512ceSopenharmony_ci    std::bitset<64> regMasker;
5748f512ceSopenharmony_ci    regMasker = GetSupportedRegMask(ArchType::ARCH_X86);
5848f512ceSopenharmony_ci    EXPECT_EQ(regMasker.count(), PERF_REG_X86_32_MAX);
5948f512ceSopenharmony_ci
6048f512ceSopenharmony_ci    regMasker = GetSupportedRegMask(ArchType::ARCH_X86_64);
6148f512ceSopenharmony_ci    // dont support PERF_REG_X86_DS,PERF_REG_X86_ES,PERF_REG_X86_FS,PERF_REG_X86_GS
6248f512ceSopenharmony_ci    EXPECT_EQ(regMasker.count(), PERF_REG_X86_64_MAX - 4u);
6348f512ceSopenharmony_ci
6448f512ceSopenharmony_ci    regMasker = GetSupportedRegMask(ArchType::ARCH_ARM);
6548f512ceSopenharmony_ci    EXPECT_EQ(regMasker.count(), PERF_REG_ARM_MAX);
6648f512ceSopenharmony_ci
6748f512ceSopenharmony_ci    regMasker = GetSupportedRegMask(ArchType::ARCH_ARM64);
6848f512ceSopenharmony_ci    EXPECT_EQ(regMasker.count(), PERF_REG_ARM64_MAX);
6948f512ceSopenharmony_ci}
7048f512ceSopenharmony_ci
7148f512ceSopenharmony_ci/**
7248f512ceSopenharmony_ci * @tc.name: RegisterGetIP
7348f512ceSopenharmony_ci * @tc.desc:
7448f512ceSopenharmony_ci * @tc.type: FUNC
7548f512ceSopenharmony_ci */
7648f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetIP, TestSize.Level1)
7748f512ceSopenharmony_ci{
7848f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetIP(ArchType::ARCH_X86), PERF_REG_X86_IP);
7948f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetIP(ArchType::ARCH_X86_64), PERF_REG_X86_IP);
8048f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetIP(ArchType::ARCH_ARM), PERF_REG_ARM_PC);
8148f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetIP(ArchType::ARCH_ARM64), PERF_REG_ARM64_PC);
8248f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetIP(ArchType::ARCH_UNKNOWN), std::numeric_limits<size_t>::max());
8348f512ceSopenharmony_ci}
8448f512ceSopenharmony_ci
8548f512ceSopenharmony_ci/**
8648f512ceSopenharmony_ci * @tc.name: RegisterGetSP
8748f512ceSopenharmony_ci * @tc.desc:
8848f512ceSopenharmony_ci * @tc.type: FUNC
8948f512ceSopenharmony_ci */
9048f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetSP, TestSize.Level1)
9148f512ceSopenharmony_ci{
9248f512ceSopenharmony_ci#if defined(target_cpu_x86_64)
9348f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetSP(ArchType::ARCH_X86_64), PERF_REG_X86_IP);
9448f512ceSopenharmony_ci#elif defined(target_cpu_arm)
9548f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetSP(ArchType::ARCH_ARM), PERF_REG_ARM_SP);
9648f512ceSopenharmony_ci#elif defined(target_cpu_arm64)
9748f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetSP(ArchType::ARCH_ARM64), PERF_REG_ARM64_SP);
9848f512ceSopenharmony_ci#endif
9948f512ceSopenharmony_ci}
10048f512ceSopenharmony_ci
10148f512ceSopenharmony_ci/**
10248f512ceSopenharmony_ci * @tc.name: RegisterGetValue
10348f512ceSopenharmony_ci * @tc.desc:
10448f512ceSopenharmony_ci * @tc.type: FUNC
10548f512ceSopenharmony_ci */
10648f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetValue, TestSize.Level1)
10748f512ceSopenharmony_ci{
10848f512ceSopenharmony_ci    uint64_t value = 0;
10948f512ceSopenharmony_ci    const u64 registers[4] = {1, 2, 3, 4};
11048f512ceSopenharmony_ci
11148f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetValue(value, registers, 0, sizeof(registers)), true);
11248f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetValue(value, registers, sizeof(registers), sizeof(registers)), false);
11348f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetValue(value, registers, -1, sizeof(registers)), false);
11448f512ceSopenharmony_ci
11548f512ceSopenharmony_ci    for (unsigned i = 0; i < sizeof(registers); i++) {
11648f512ceSopenharmony_ci        RegisterGetValue(value, registers, i, sizeof(registers));
11748f512ceSopenharmony_ci        EXPECT_EQ(value, registers[i]);
11848f512ceSopenharmony_ci    }
11948f512ceSopenharmony_ci}
12048f512ceSopenharmony_ci
12148f512ceSopenharmony_ci/**
12248f512ceSopenharmony_ci * @tc.name: RegisterGetSPValue
12348f512ceSopenharmony_ci * @tc.desc:
12448f512ceSopenharmony_ci * @tc.type: FUNC
12548f512ceSopenharmony_ci */
12648f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetSPValue, TestSize.Level1)
12748f512ceSopenharmony_ci{
12848f512ceSopenharmony_ci    uint64_t value = 0;
12948f512ceSopenharmony_ci    uint64_t value2 = 0;
13048f512ceSopenharmony_ci    u64 registers[PERF_REG_ARM64_MAX] = {1, 2, 3, 4};
13148f512ceSopenharmony_ci    size_t sp = RegisterGetSP(BUILD_ARCH_TYPE);
13248f512ceSopenharmony_ci    registers[sp] = 0x1234;
13348f512ceSopenharmony_ci
13448f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetValue(value, registers, sp, sizeof(registers)),
13548f512ceSopenharmony_ci              RegisterGetSPValue(value2, BUILD_ARCH_TYPE, registers, sizeof(registers)));
13648f512ceSopenharmony_ci
13748f512ceSopenharmony_ci    EXPECT_EQ(value, value2);
13848f512ceSopenharmony_ci}
13948f512ceSopenharmony_ci
14048f512ceSopenharmony_ci/**
14148f512ceSopenharmony_ci * @tc.name: RegisterGetIPValue
14248f512ceSopenharmony_ci * @tc.desc:
14348f512ceSopenharmony_ci * @tc.type: FUNC
14448f512ceSopenharmony_ci */
14548f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetIPValue, TestSize.Level1)
14648f512ceSopenharmony_ci{
14748f512ceSopenharmony_ci    uint64_t value = 0;
14848f512ceSopenharmony_ci    uint64_t value2 = 0;
14948f512ceSopenharmony_ci    u64 registers[PERF_REG_ARM64_MAX] = {1, 2, 3, 4};
15048f512ceSopenharmony_ci    size_t ip = RegisterGetIP(BUILD_ARCH_TYPE);
15148f512ceSopenharmony_ci    registers[ip] = 0x1234;
15248f512ceSopenharmony_ci
15348f512ceSopenharmony_ci    EXPECT_EQ(RegisterGetValue(value, registers, ip, sizeof(registers)),
15448f512ceSopenharmony_ci              RegisterGetIPValue(value2, BUILD_ARCH_TYPE, registers, sizeof(registers)));
15548f512ceSopenharmony_ci
15648f512ceSopenharmony_ci    EXPECT_EQ(value, value2);
15748f512ceSopenharmony_ci}
15848f512ceSopenharmony_ci
15948f512ceSopenharmony_ci/**
16048f512ceSopenharmony_ci * @tc.name: RegisterGetName
16148f512ceSopenharmony_ci * @tc.desc:
16248f512ceSopenharmony_ci * @tc.type: FUNC
16348f512ceSopenharmony_ci */
16448f512ceSopenharmony_ciHWTEST_F(RegisterTest, RegisterGetName, TestSize.Level1)
16548f512ceSopenharmony_ci{
16648f512ceSopenharmony_ci    for (unsigned i = 0; i < PERF_REG_ARM64_MAX; i++) {
16748f512ceSopenharmony_ci        EXPECT_EQ(RegisterGetName(i).empty(), false);
16848f512ceSopenharmony_ci    }
16948f512ceSopenharmony_ci}
17048f512ceSopenharmony_ci
17148f512ceSopenharmony_ci/**
17248f512ceSopenharmony_ci * @tc.name: GetArchName
17348f512ceSopenharmony_ci * @tc.desc:
17448f512ceSopenharmony_ci * @tc.type: FUNC
17548f512ceSopenharmony_ci */
17648f512ceSopenharmony_ciHWTEST_F(RegisterTest, GetArchName, TestSize.Level1)
17748f512ceSopenharmony_ci{
17848f512ceSopenharmony_ci    RegisterGetSP(ArchType::ARCH_ARM);
17948f512ceSopenharmony_ci    EXPECT_STREQ(GetArchName(ArchType::ARCH_ARM).c_str(), "ARM");
18048f512ceSopenharmony_ci    RegisterGetSP(ArchType::ARCH_ARM64);
18148f512ceSopenharmony_ci    EXPECT_STREQ(GetArchName(ArchType::ARCH_ARM64).c_str(), "ARM64");
18248f512ceSopenharmony_ci    RegisterGetSP(ArchType::ARCH_X86);
18348f512ceSopenharmony_ci    EXPECT_STREQ(GetArchName(ArchType::ARCH_X86).c_str(), "X86_32");
18448f512ceSopenharmony_ci    RegisterGetSP(ArchType::ARCH_X86_64);
18548f512ceSopenharmony_ci    EXPECT_STREQ(GetArchName(ArchType::ARCH_X86_64).c_str(), "X86_64");
18648f512ceSopenharmony_ci    RegisterGetSP(ArchType::ARCH_UNKNOWN);
18748f512ceSopenharmony_ci    EXPECT_STREQ(GetArchName(ArchType::ARCH_UNKNOWN).c_str(), "Unsupport");
18848f512ceSopenharmony_ci}
18948f512ceSopenharmony_ci} // namespace HiPerf
19048f512ceSopenharmony_ci} // namespace Developtools
19148f512ceSopenharmony_ci} // namespace OHOS
192