diff --git a/pwrapic/gtest/CMakeLists.txt b/pwrapic/gtest/CMakeLists.txt index bb7c99582d8893165c5e0a90bbf5490b3978e238..866e787e35693753238a52f490c2182fd8eb806d 100644 --- a/pwrapic/gtest/CMakeLists.txt +++ b/pwrapic/gtest/CMakeLists.txt @@ -5,9 +5,11 @@ set ( CMAKE_INCLUDE_CURRENT_DIR ON) execute_process(COMMAND sh ${PROJECT_SOURCE_DIR}/get_gtest.sh) set(TEST_FILE + Common.cpp GtestLog.cpp GtestBase.cpp - RegisterOkTest.cpp + RegisterOkCommonTest.cpp + RegisterOkCpuTest.cpp ) add_executable(gtest_test diff --git a/pwrapic/gtest/Common.cpp b/pwrapic/gtest/Common.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b8932c830dd95af012156680420f2c4cd3869b45 --- /dev/null +++ b/pwrapic/gtest/Common.cpp @@ -0,0 +1,84 @@ +/* ***************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022 All rights reserved. + * PowerAPI licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Author: jimmy-jiang-junior + * Create: 2022-11-24 + * Description: Common functions for powerAPI gtest + * **************************************************************************** */ +#include +#include +#include +#include +#include "Common.h" + +int StartService(void) +{ + char dir[4096] = {0}; + int ret = readlink("/proc/self/exe", dir, 4096); + if (ret < 0) { + printf("readlink ret:%d\n", ret); + return -1; + } + + std::string gtestDir = dir; + std::string pwrapisDir; + // 10: length for "gtest_test", 只保留文件的路径 + gtestDir = gtestDir.substr(0, gtestDir.length() - 10); + pwrapisDir = gtestDir + "../pwrapis/pwrapis &"; + ret = system(pwrapisDir.c_str()); + if (ret != 0) { + printf("StartService failed ret:%d\n", ret); + return -1; + } + sleep(1); + + return 0; +} + + +int StopService(void) +{ + int ret = system("ps -elf | grep pwrapis | grep -v grep | awk '{print $4}' | xargs kill"); + if (ret != 0) { + printf("StopSerive failed ret:%d\n", ret); + return -1; + } + sleep(1); + + return 0; +} + +void MetaDataCallback(const PWR_COM_CallbackData *callbackData) +{ + PWR_CPU_PerfData *perfData = NULL; + PWR_CPU_Usage *usage = NULL; + switch (callbackData->dataType) { + case PWR_COM_DATATYPE_CPU_PERF: + perfData = (PWR_CPU_PerfData *)(callbackData->data); + printf("[TASK]Get PERF data. ipc: %f miss: %f, ctime:%s\n", perfData->ipc, perfData->llcMiss, + callbackData->ctime); + break; + case PWR_COM_DATATYPE_CPU_USAGE: + usage = (PWR_CPU_Usage *)(callbackData->data); + printf("[TASK]Get Cpu Usage. avgUsage: %f, coreNum:%d, ctime:%s\n", usage->avgUsage, usage->coreNum, + callbackData->ctime); + EXPECT_TRUE(!(usage->avgUsage < 0) && !(usage->avgUsage > 1)); + for (int i = 0; i < usage->coreNum; i++) { + if (i > 0) { + EXPECT_NE(usage->coreUsage[i].coreNo, usage->coreUsage[i - 1].coreNo); + } + EXPECT_TRUE(!(usage->coreUsage[i].usage < 0) && !(usage->coreUsage[i].usage > 1)); + } + break; + default: + printf("[TASK]Get INVALIDE data.\n"); + break; + } +} diff --git a/pwrapic/gtest/GtestBase.cpp b/pwrapic/gtest/GtestBase.cpp index 7f85fc267c4432d0d354d7c0bf0dedd5976168a4..75139b020675117ea328080c9cea3279d7f4beca 100644 --- a/pwrapic/gtest/GtestBase.cpp +++ b/pwrapic/gtest/GtestBase.cpp @@ -15,11 +15,7 @@ #include #include "GtestLog.h" #include "powerapi.h" - -TEST(GTEST_BASE, case_001) -{ - printf("This the Gtest Base\n"); -} +#include "Common.h" TEST(GTEST_BASE, PWR_SetLogCallback_Test_001) { @@ -30,3 +26,67 @@ TEST(GTEST_BASE, PWR_SetLogCallback_Test_002) { EXPECT_NE(SUCCESS, PWR_SetLogCallback(NULL)); } + +/* + * 功能描述: 先拉起Service, 然后调用PWR_Register应该返回成功 + */ +TEST(GTEST_BASE, PWR_Register_Test_001) +{ + EXPECT_EQ(0, StartService()); + EXPECT_EQ(SUCCESS, PWR_Register()); + EXPECT_EQ(SUCCESS, PWR_UnRegister()); + EXPECT_EQ(0, StopService()); +} + +/* + * 功能描述: 不拉起Serive, 然后调用PWR_Register应该返回失败 + */ +TEST(GTEST_BASE, PWR_Register_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_Register()); +} + +/* + * 功能描述: 不调用Register, 直接调用UnRegister应该成功 + */ +TEST(GTEST_BASE, PWR_UnRegister_Test_001) +{ + EXPECT_EQ(SUCCESS, PWR_UnRegister()); +} + +/* + * 功能描述: 先Stop Service, 然后执行UnRegister, 返回成功 + */ +TEST(GTEST_BASE, PWR_UnRegister_Test_002) +{ + EXPECT_EQ(0, StartService()); + EXPECT_EQ(SUCCESS, PWR_Register()); + EXPECT_EQ(0, StopService()); + EXPECT_EQ(SUCCESS, PWR_UnRegister()); +} + +/* + * 连续Register和UnRegister, 应该返回成功 + */ +TEST(GTEST_BASE, PWR_UnRegister_Test_003) +{ + EXPECT_EQ(0, StartService()); + for (int i = 0; i < 10; i++) { + EXPECT_EQ(SUCCESS, PWR_Register()); + EXPECT_EQ(SUCCESS, PWR_UnRegister()); + } + EXPECT_EQ(0, StopService()); +} + +/* + * 功能描述: 连续Register, 应该返回成功 + */ +TEST(GTEST_BASE, PWR_UnRegister_Test_004) +{ + EXPECT_EQ(0, StartService()); + EXPECT_EQ(SUCCESS, PWR_Register()); + EXPECT_EQ(SUCCESS, PWR_Register()); + EXPECT_EQ(SUCCESS, PWR_UnRegister()); + EXPECT_EQ(0, StopService()); +} + diff --git a/pwrapic/gtest/RegisterOkCommonTest.cpp b/pwrapic/gtest/RegisterOkCommonTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bb0224d1a3fbe24f2405dcb293f48fed08120d1f --- /dev/null +++ b/pwrapic/gtest/RegisterOkCommonTest.cpp @@ -0,0 +1,158 @@ +/* ***************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022 All rights reserved. + * PowerAPI licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Author: jimmy-jiang-junior + * Create: 2022-11-04 + * Description: PowerAPI testcase. All the cases in This file are based on testsuit RegisterOkTestCommon + * **************************************************************************** */ +#include +#include "GtestLog.h" +#include "powerapi.h" +#include "Common.h" + +#define TEST_CORE_NUM 128 +#define AVG_LEN_PER_CORE 5 +#define TASK_INTERNAL 1000 + +class RegisterOkTestCommon : public ::testing::Test { + protected: + // 第一个个用例执行前被调用 + static void SetUpTestCase() {} + // 最后一个用例执行完后调用 + static void TearDownTestCase() {} + + // 每个用例执行前调用 + virtual void SetUp() + { + EXPECT_EQ(0, StartService()); + EXPECT_EQ(0, PWR_SetLogCallback(LogCallback)); + EXPECT_EQ(0, PWR_Register()); + } + // 每个用例执行后调用 + virtual void TearDown() + { + EXPECT_EQ(0, PWR_UnRegister()); + EXPECT_EQ(0, StopService()); + } +}; + +/* + * 功能描述: 没有调用PWR_SetMetaDataCallbak注册回调函数, 直接创建回调一个任务, 返回失败 + */ +TEST_F(RegisterOkTestCommon, PWR_CreateDcTask_Test_001) +{ + PWR_COM_BasicDcTaskInfo task = {}; + task.dataType = PWR_COM_DATATYPE_CPU_PERF; + task.interval = TASK_INTERNAL; + EXPECT_NE(SUCCESS, PWR_CreateDcTask(&task)); +} + +/* + * 功能描述: 注册两个回调任务, 校验注册函数和删除函数工作正常 + */ +TEST_F(RegisterOkTestCommon, PWR_SetMetaDataCallback_Test_001) +{ + int ret = SUCCESS; + EXPECT_EQ(SUCCESS, PWR_SetMetaDataCallback(MetaDataCallback)); + + PWR_COM_BasicDcTaskInfo task = {}; + task.dataType = PWR_COM_DATATYPE_CPU_PERF; + task.interval = TASK_INTERNAL; + EXPECT_EQ(SUCCESS, PWR_CreateDcTask(&task)); + printf("PWR_CreateDcTask. dataType:%d ret: %d\n", task.dataType, ret); + task.dataType = PWR_COM_DATATYPE_CPU_USAGE; + EXPECT_EQ(SUCCESS, PWR_CreateDcTask(&task)); + printf("PWR_CreateDcTask. dataType:%d ret: %d\n", task.dataType, ret); + + sleep(3); + EXPECT_EQ(SUCCESS, PWR_DeleteDcTask(PWR_COM_DATATYPE_CPU_PERF)); + printf("PWR_DeleteDcTask. dataType:%d ret: %d\n", PWR_COM_DATATYPE_CPU_PERF, ret); + EXPECT_EQ(SUCCESS, PWR_DeleteDcTask(PWR_COM_DATATYPE_CPU_USAGE)); + printf("PWR_DeleteDcTask. dataType:%d ret: %d\n", PWR_COM_DATATYPE_CPU_USAGE, ret); +} + +/* + * 功能描述: PWR_SetMetaDataCallbak任务入参为NULL, 返回失败 + */ +TEST_F(RegisterOkTestCommon, PWR_SetMetaDataCallback_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_SetMetaDataCallback(NULL)); +} + +/* + * 功能描述: 通过lamda函数创建回调函数, 注册回调任务获取ipc和llcMiss + * 在回调函数中对ipc和llcMiss做大于0的校验 + */ +TEST_F(RegisterOkTestCommon, PWR_SetMetaDataCallback_Test_003) +{ + EXPECT_EQ(SUCCESS, + PWR_SetMetaDataCallback([](const PWR_COM_CallbackData *callbackData) { + EXPECT_EQ(PWR_COM_DATATYPE_CPU_PERF, callbackData->dataType); + PWR_CPU_PerfData *perfData = (PWR_CPU_PerfData *)(callbackData->data); + EXPECT_LT(0, perfData->ipc); + EXPECT_LT(0, perfData->llcMiss); + std::string str = callbackData->ctime; + EXPECT_NE(std::string::npos, str.find("2022")); + printf("[TASK]Get PERF data. ipc: %f miss: %f, ctime:%s\n", perfData->ipc, perfData->llcMiss, + callbackData->ctime); + })); + + PWR_COM_BasicDcTaskInfo task = {}; + task.dataType = PWR_COM_DATATYPE_CPU_PERF; + task.interval = TASK_INTERNAL; + EXPECT_EQ(SUCCESS, PWR_CreateDcTask(&task)); + sleep(3); + EXPECT_EQ(SUCCESS, PWR_DeleteDcTask(PWR_COM_DATATYPE_CPU_PERF)); +} + +/* + * 功能描述: PWR_RequestControlAuth()接口校验 + * 获取权限后调用Set类接口成功, 释放接口后调用Set类接口失败 + */ +TEST_F(RegisterOkTestCommon, PWR_RequestControlAuth_Test_001) +{ + char governor[] = "performance"; + EXPECT_EQ(SUCCESS, PWR_RequestControlAuth()); + EXPECT_EQ(SUCCESS, PWR_RequestControlAuth()); + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreqGovernor(governor)); + EXPECT_EQ(SUCCESS, PWR_ReleaseControlAuth()); + EXPECT_NE(SUCCESS, PWR_CPU_SetFreqGovernor(governor)); +} + +/* + * 功能描述: 由于没有权限, 所有的SET操作都会失败, 所有的Get操作都可以成功 + */ +TEST_F(RegisterOkTestCommon, PWR_RequestControlAuth_Test_002) +{ + PWR_CPU_Info cpuInfo; + EXPECT_EQ(SUCCESS, PWR_CPU_GetInfo(&cpuInfo)); + + int buffSize = sizeof(PWR_CPU_Usage) + TEST_CORE_NUM * sizeof(PWR_CPU_CoreUsage); + PWR_CPU_Usage *u = (PWR_CPU_Usage *)malloc(buffSize); + EXPECT_FALSE(u == NULL); + EXPECT_EQ(SUCCESS, PWR_CPU_GetUsage(u, buffSize)); + free(u); + + PWR_CPU_PerfData perfData; + EXPECT_EQ(SUCCESS, PWR_CPU_GetPerfData(&perfData)); + + char gov[MAX_ELEMENT_NAME_LEN] = {0}; + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqGovernor(gov, MAX_ELEMENT_NAME_LEN)); + + uint32_t len = TEST_CORE_NUM; + PWR_CPU_CurFreq curFreq[len]; + int spec = 0; + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreq(curFreq, &len, spec)); + + EXPECT_NE(SUCCESS, PWR_SYS_SetPowerState(1)); + + char governor[] = "performance"; + EXPECT_NE(SUCCESS, PWR_CPU_SetFreqGovernor(governor)); +} \ No newline at end of file diff --git a/pwrapic/gtest/RegisterOkCpuTest.cpp b/pwrapic/gtest/RegisterOkCpuTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..524c38f29c2c6dded2abb2fefd0bb73b402690fa --- /dev/null +++ b/pwrapic/gtest/RegisterOkCpuTest.cpp @@ -0,0 +1,165 @@ +/* ***************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022 All rights reserved. + * PowerAPI licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Author: jimmy-jiang-junior + * Create: 2022-11-04 + * Description: PowerAPI testcase. All the cases in This file are based on testsuit RegisterOkCpuTest + * **************************************************************************** */ +#include +#include "GtestLog.h" +#include "powerapi.h" +#include "Common.h" + +#define TEST_CORE_NUM 128 + +class RegisterOkCpuTest : public ::testing::Test { + protected: + // 第一个个用例执行前被调用 + static void SetUpTestCase() {} + // 最后一个用例执行完后调用 + static void TearDownTestCase() {} + + // 每个用例执行前调用 + virtual void SetUp() + { + EXPECT_EQ(0, StartService()); + EXPECT_EQ(SUCCESS, PWR_SetLogCallback(LogCallback)); + EXPECT_EQ(SUCCESS, PWR_Register()); + EXPECT_EQ(SUCCESS, PWR_RequestControlAuth()); + } + // 每个用例执行后调用 + virtual void TearDown() + { + EXPECT_EQ(SUCCESS, PWR_ReleaseControlAuth()); + EXPECT_EQ(SUCCESS, PWR_UnRegister()); + EXPECT_EQ(0, StopService()); + } +}; + +/* + * 功能描述: PWR_CPU_GetInfo函数校验, 调动函数接口正常, 对函数的返回值做基本校验 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetInfo_Test_001) +{ + PWR_CPU_Info cpuInfo; + EXPECT_EQ(SUCCESS, PWR_CPU_GetInfo(&cpuInfo)); + PWR_CPU_Info *info = &cpuInfo; + printf("PWR_CPU_GetInfo arch:%s\n coreNum: %d\n maxFreq:%f\n minFreq:%f\n modelName: %s\n numaNum: %d\n " + "threadsPerCore:%d\n", info->arch, info->coreNum, info->maxFreq, info->minFreq, info->modelName, + info->numaNum, info->threadsPerCore); + for (int i = 0; i < info->numaNum; i++) { + printf("numa node %d cpuList: %s\n", info->numa[i].nodeNo, info->numa[i].cpuList); + } + EXPECT_LT(0, info->coreNum); + EXPECT_LT(10, info->minFreq); + EXPECT_GT(20000, info->maxFreq); + EXPECT_LT(info->minFreq, info->maxFreq); + int modelNameLen = strlen(info->modelName); + EXPECT_LT(2, modelNameLen); + EXPECT_LT(0, info->numaNum); + EXPECT_GT(info->coreNum + 1, info->numaNum); + EXPECT_LT(0, info->threadsPerCore); + for (int i = 0; i < info->numaNum; i++) { + EXPECT_GT(info->numaNum, info->numa[i].nodeNo); + int cpuListLen = strlen(info->numa[i].cpuList); + EXPECT_LT(0, cpuListLen); + } +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_GetInfo_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_GetInfo(NULL)); +} + +// 遗留问题, 需要写一段代码来添加负载, 然后检测CPU利用率 +TEST_F(RegisterOkCpuTest, PWR_CPU_GetUsage_Test_001) +{ + int buffSize = sizeof(PWR_CPU_Usage) + TEST_CORE_NUM * sizeof(PWR_CPU_CoreUsage); + PWR_CPU_Usage *usage = (PWR_CPU_Usage *)malloc(buffSize); + EXPECT_FALSE(usage == NULL); + EXPECT_EQ(SUCCESS, PWR_CPU_GetUsage(usage, buffSize)); + printf("PWR_CPU_GetUsage, CPU avgUsage:%f, coreNum: %d \n", usage->avgUsage, usage->coreNum); + EXPECT_EQ(sysconf(_SC_NPROCESSORS_CONF), usage->coreNum); + EXPECT_TRUE(!(usage->avgUsage < 0) && !(usage->avgUsage > 1)); + for (int i = 0; i < usage->coreNum; i++) { + if (i > 0) { + EXPECT_NE(usage->coreUsage[i].coreNo, usage->coreUsage[i - 1].coreNo); + } + EXPECT_TRUE(!(usage->coreUsage[i].usage < 0) && !(usage->coreUsage[i].usage > 1)); + } + free(usage); +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_GetUsage_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_GetUsage(NULL, 1)); +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_GetPerfData_Test_001) +{ + PWR_CPU_PerfData perfData; + EXPECT_EQ(SUCCESS, PWR_CPU_GetPerfData(&perfData)); +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_GetPerfData_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_GetPerfData(NULL)); +} + +/* + * 功能描述: 调用PWR_CPU_SetFreqGovernor函数设置governor + * 调用PWR_CPU_GetFreqGovernor函数校验设置是否成功 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreqGovernor_Test_001) +{ + char governor[] = "schedutil"; + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreqGovernor(governor)); + char gov[MAX_ELEMENT_NAME_LEN] = {0}; + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqGovernor(gov, MAX_ELEMENT_NAME_LEN)); + EXPECT_STREQ(governor, gov); + + char govPerformance[] = "performance"; + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreqGovernor(govPerformance)); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqGovernor(gov, MAX_ELEMENT_NAME_LEN)); + EXPECT_STREQ(govPerformance, gov); +} + +/* + * 功能描述: PWR_CPU_SetFreqGovernor函数的入参为NULL或者是错误的字符串, 应该返回错误 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreqGovernor_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_SetFreqGovernor(NULL)); + char gov[] = "fake"; + EXPECT_NE(SUCCESS, PWR_CPU_SetFreqGovernor(gov)); +} + +/* + * 功能描述: PWR_CPU_GetFreqGovernor函数入参的存储空间大小不符合要求,应该返回错误 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreqGovernor_Test_001) +{ + char gov[3] = {0}; + EXPECT_NE(SUCCESS, PWR_CPU_GetFreqGovernor(gov, 3)); +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreq_Test_001) +{ + int coreNum = sysconf(_SC_NPROCESSORS_CONF); + + unsigned int len = coreNum; + PWR_CPU_CurFreq *curFreq = (PWR_CPU_CurFreq *)malloc(coreNum * sizeof(PWR_CPU_CurFreq)); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreq(curFreq, &len, 0)); + EXPECT_EQ(coreNum, (int)len); + for (unsigned int i = 0; i < len; i++) { + EXPECT_LT(10, (unsigned int)curFreq[i].curFreq); + printf("policyId:%d, freq:%lf\n", curFreq[i].policyId, curFreq[i].curFreq); + } +} diff --git a/pwrapic/gtest/RegisterOkTest.cpp b/pwrapic/gtest/RegisterOkTest.cpp deleted file mode 100644 index e8ada83ce6d762a0459106e2684d2e3b8f9a9f94..0000000000000000000000000000000000000000 --- a/pwrapic/gtest/RegisterOkTest.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* ***************************************************************************** - * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022 All rights reserved. - * PowerAPI licensed under the Mulan PSL v2. - * You can use this software according to the terms and conditions of the Mulan PSL v2. - * You may obtain a copy of Mulan PSL v2 at: - * http://license.coscl.org.cn/MulanPSL2 - * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR - * PURPOSE. - * See the Mulan PSL v2 for more details. - * Author: jimmy-jiang-junior - * Create: 2022-11-04 - * Description: PowerAPI testcase. All the cases in This file are based on testsuit RegisterOkTest - * **************************************************************************** */ -#include -#include "GtestLog.h" -#include "powerapi.h" - -#define MAIN_LOOP_INTERVAL 5 -#define TEST_CORE_NUM 128 - -class RegisterOkTest : public ::testing::Test { - protected: - // 第一个个用例执行前被调用 - static void SetUpTestCase() {} - // 最后一个用例执行完后调用 - static void TearDownTestCase() {} - - // 每个用例执行前调用 - virtual void SetUp() - { - PWR_SetLogCallback(LogCallback); - while (PWR_Register() != SUCCESS) { - sleep(MAIN_LOOP_INTERVAL); - printf("main registed failed!\n"); - continue; - } - printf("main regist succeed.\n"); - } - // 每个用例执行后调用 - virtual void TearDown() - { - PWR_UnRegister(); - } -}; - -TEST_F(RegisterOkTest, PWR_CPU_GetInfo_Test_001) -{ - int ret; - PWR_CPU_Info *info = (PWR_CPU_Info *)malloc(sizeof(PWR_CPU_Info)); - if (!info) { - return; - } - bzero(info, sizeof(PWR_CPU_Info)); - ret = PWR_CPU_GetInfo(info); - printf("PWR_CPU_GetInfo ret: %d\n arch:%s\n coreNum: %d\n maxFreq:%f\n minFreq:%f\n modelName: %s\n numaNum: %d\n " - "threadsPerCore:%d\n", - ret, info->arch, info->coreNum, info->maxFreq, info->minFreq, info->modelName, info->numaNum, - info->threadsPerCore); - for (int i = 0; i < info->numaNum; i++) { - printf("numa node %d cpuList: %s\n", info->numa[i].nodeNo, info->numa[i].cpuList); - } - free(info); -} - -TEST_F(RegisterOkTest, PWR_CPU_GetUsage_Test_001) -{ - int ret; - int buffSize = sizeof(PWR_CPU_Usage) + TEST_CORE_NUM * sizeof(PWR_CPU_CoreUsage); - PWR_CPU_Usage *u = (PWR_CPU_Usage *)malloc(buffSize); - if (!u) { - return; - } - bzero(u, buffSize); - ret = PWR_CPU_GetUsage(u, buffSize); - printf("PWR_CPU_GetUsage ret: %d, CPU avgUsage:%f, coreNum: %d \n", ret, u->avgUsage, u->coreNum); - for (int i = 0; i < u->coreNum; i++) { - printf("core%d usage: %f\n", u->coreUsage[i].coreNo, u->coreUsage[i].usage); - } - free(u); -} - diff --git a/pwrapic/gtest/include/Common.h b/pwrapic/gtest/include/Common.h new file mode 100644 index 0000000000000000000000000000000000000000..56fef5c060c720d2d092be24eb0127c40843be8e --- /dev/null +++ b/pwrapic/gtest/include/Common.h @@ -0,0 +1,23 @@ +/* ***************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022 All rights reserved. + * PowerAPI licensed under the Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * http://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR + * PURPOSE. + * See the Mulan PSL v2 for more details. + * Author: jimmy-jiang-junior + * Create: 2022-11-24 + * Description: Headers for Common.cpp + * **************************************************************************** */ +#ifndef COMMON_H__ +#define COMMON_H__ +#include "powerapi.h" + +int StartService(void); +int StopService(void); +void MetaDataCallback(const PWR_COM_CallbackData *callbackData); + +#endif /* COMMON_H__ */ diff --git a/pwrapic/gtest/lcov.sh b/pwrapic/gtest/lcov.sh new file mode 100755 index 0000000000000000000000000000000000000000..281f4a3aaca4279872e16d73fb82816b214c13f1 --- /dev/null +++ b/pwrapic/gtest/lcov.sh @@ -0,0 +1,8 @@ +rm -rf report +mkdir report + +lcov --rc lcov_branch_coverage=1 -c -o ./report/demotest.info -d . + +lcov --rc lcov_branch_coverage=1 -e ./report/demotest.info "*.c" -o ./report/demotest_extract.info + +genhtml --rc lcov_branch_coverage=1 ./report/demotest_extract.info -o ./report/gen_html diff --git a/pwrapic/src/CMakeLists.txt b/pwrapic/src/CMakeLists.txt index 5fc20317fea9d17645cc05258ab9684567cc0dc5..7888c87455c24b1b1cb6a00a25a264c3cae760f1 100644 --- a/pwrapic/src/CMakeLists.txt +++ b/pwrapic/src/CMakeLists.txt @@ -17,6 +17,10 @@ add_library(${PG_NAME} SHARED ${PWRAPIC_SRC}) set_target_properties(${PG_NAME} PROPERTIES LINKER_LANGUAGE C) set (CMAKE_EXPORT_COMPILE_COMMANDS ON) +if(BUILD_LLT) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") +endif(BUILD_LLT) + # set installation path set ( CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "Install path prefix" FORCE) #install (TARGETS ${PG_NAME} DESTINATION sbin)