From ecabb29e2f59d40cb21e59e3d667127c922a5031 Mon Sep 17 00:00:00 2001 From: jimmy-jiang-junior Date: Sat, 26 Nov 2022 18:23:53 +0800 Subject: [PATCH] modify for testcase get gtest headers by "yum install gtest-devel" add new testcases fix bugs, wrong malloc size in file common/src/pwrmsg.c function CreateReqMsg --- common/src/pwrmsg.c | 2 +- pwrapic/gtest/CMakeLists.txt | 1 - pwrapic/gtest/RegisterOkCpuTest.cpp | 270 +++++++++++++++++++++++++++- pwrapic/gtest/get_gtest.sh | 31 +--- pwrapis/src/cpuservice.c | 2 +- 5 files changed, 270 insertions(+), 36 deletions(-) diff --git a/common/src/pwrmsg.c b/common/src/pwrmsg.c index 41f51d0..9aca6f7 100644 --- a/common/src/pwrmsg.c +++ b/common/src/pwrmsg.c @@ -84,7 +84,7 @@ PwrMsg *ClonePwrMsg(PwrMsg *msg) c->head = msg->head; c->data = NULL; if (msg->data) { - char *data = (char *)malloc(sizeof(msg->head.dataLen)); + char *data = (char *)malloc(msg->head.dataLen); if (!data) { free(c); return NULL; diff --git a/pwrapic/gtest/CMakeLists.txt b/pwrapic/gtest/CMakeLists.txt index 866e787..7c4a40c 100644 --- a/pwrapic/gtest/CMakeLists.txt +++ b/pwrapic/gtest/CMakeLists.txt @@ -25,7 +25,6 @@ target_include_directories(gtest_test PRIVATE target_link_directories(gtest_test PRIVATE ${PROJECT_SOURCE_DIR}/../../build/pwrapic/src - ${PROJECT_SOURCE_DIR}/lib ) target_link_libraries(gtest_test PRIVATE diff --git a/pwrapic/gtest/RegisterOkCpuTest.cpp b/pwrapic/gtest/RegisterOkCpuTest.cpp index 524c38f..f560c06 100644 --- a/pwrapic/gtest/RegisterOkCpuTest.cpp +++ b/pwrapic/gtest/RegisterOkCpuTest.cpp @@ -43,6 +43,20 @@ class RegisterOkCpuTest : public ::testing::Test { } }; +TEST_F(RegisterOkCpuTest, PWR_SYS_GetRtPowerInfo_Test_001) +{ + PWR_SYS_PowerInfo powerInfo; + EXPECT_EQ(SUCCESS, PWR_SYS_GetRtPowerInfo(&powerInfo)); + printf("sysPower:%02lf, cpuPower:%02lf, memPower:%02lf\n", + powerInfo.sysPower, powerInfo.cpuPower, powerInfo.memPower); + EXPECT_LT(0, powerInfo.sysPower); +} + +TEST_F(RegisterOkCpuTest, PWR_SYS_GetRtPowerInfo_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_SYS_GetRtPowerInfo(NULL)); +} + /* * 功能描述: PWR_CPU_GetInfo函数校验, 调动函数接口正常, 对函数的返回值做基本校验 */ @@ -113,6 +127,116 @@ TEST_F(RegisterOkCpuTest, PWR_CPU_GetPerfData_Test_002) EXPECT_NE(SUCCESS, PWR_CPU_GetPerfData(NULL)); } +/* + * 功能描述:正常调用PWR_CPU_GetFreqAbility函数, 校验函数返回值 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreqAbility_Test_001) +{ + int coreNum = sysconf(_SC_NPROCESSORS_CONF); + // 5: 用字符串表示CPU编号, 每个CPU最多占用5个字节, policyId占用4个字节 + int len = sizeof(PWR_CPU_FreqAbility) + (4 * 5) * coreNum; + PWR_CPU_FreqAbility *freqAbi = (PWR_CPU_FreqAbility *)malloc(len); + EXPECT_TRUE(freqAbi != NULL); + memset(freqAbi, 0, len); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqAbility(freqAbi, len)); + printf("curDriver is %s\n", freqAbi->curDriver); + printf("available governor is: \n"); + for (int i = 0; i < MAX_GOV_NUM; i++) { + if (strlen(freqAbi->avGovList[i]) > 0) { + printf("%s\n", freqAbi->avGovList[i]); + } + } + EXPECT_TRUE((freqAbi->freqDomainNum <= coreNum) && (freqAbi->freqDomainNum > 0)); + printf("frequency domain num is: %d\n", freqAbi->freqDomainNum); + EXPECT_LT(5, freqAbi->freqDomainStep); + printf("frequency domain step is: %d\n", freqAbi->freqDomainStep); + + for (int i = 0; i < freqAbi->freqDomainNum; i++) { + char *cpuList = &freqAbi->freqDomain[i * freqAbi->freqDomainStep + sizeof(int)]; + int policyId = int(freqAbi->freqDomain[i * freqAbi->freqDomainStep]); + EXPECT_LT(0, strlen(cpuList)); // cpuList不为空 + if (coreNum == freqAbi->freqDomainNum) { + if (policyId == 0) { + EXPECT_EQ('0', cpuList[0]); + } else { + EXPECT_EQ(policyId, atoi(cpuList)); + } + } + } + for (int i = 0; i < freqAbi->freqDomainNum; i++) { + printf("domain index:%d cpulist:%s\n", int(freqAbi->freqDomain[i * freqAbi->freqDomainStep]), + &freqAbi->freqDomain[i * freqAbi->freqDomainStep + sizeof(int)]); + } + free(freqAbi); +} + +/* + * 功能描述:函数PWR_CPU_GetFreqAbility函数入参为空 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreqAbility_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_GetFreqAbility(NULL, 0)); +} + +/* + * 功能描述: 调用PWR_CPU_GetFreqRange获取CPU的频率范围, + * 最小频率要大于10MHz, 最大频率不小最小频率 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreqRange_Test_001) +{ + PWR_CPU_FreqRange freqRange; + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqRange(&freqRange)); + EXPECT_LT(10, freqRange.maxFreq); + EXPECT_TRUE(freqRange.minFreq <= freqRange.maxFreq); +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreqRange_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_GetFreqRange(NULL)); +} + +/* + * 功能描述: 调用PWR_CPU_SetFreqRange设置CPU频率 + * 调用函数PWR_CPU_GetFreqRange验证频率设置正确 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreqRange_Test_001) +{ + // governor设置为userspace + char governor[] = "userspace"; + 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); + + PWR_CPU_Info cpuInfo; + PWR_CPU_FreqRange freqRange; + EXPECT_EQ(SUCCESS, PWR_CPU_GetInfo(&cpuInfo)); + freqRange.maxFreq = (cpuInfo.maxFreq < 2000) ? cpuInfo.maxFreq : 2000; + freqRange.minFreq = (cpuInfo.minFreq > 1000) ? cpuInfo.minFreq : 1000; + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreqRange(&freqRange)); + PWR_CPU_FreqRange actualFreqRange; + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqRange(&actualFreqRange)); + EXPECT_EQ(actualFreqRange.maxFreq, freqRange.maxFreq); + EXPECT_EQ(actualFreqRange.minFreq, freqRange.minFreq); + + // 将最大频率恢复为硬件支持的最大频率 + freqRange.maxFreq = (int)cpuInfo.maxFreq; + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreqRange(&freqRange)); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqRange(&actualFreqRange)); + EXPECT_EQ(actualFreqRange.maxFreq, freqRange.maxFreq); + + // 将governor恢复为performance + 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); +} + +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreqRange_Test_002) +{ + EXPECT_NE(SUCCESS, PWR_CPU_SetFreqRange(NULL)); +} + /* * 功能描述: 调用PWR_CPU_SetFreqGovernor函数设置governor * 调用PWR_CPU_GetFreqGovernor函数校验设置是否成功 @@ -150,16 +274,152 @@ TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreqGovernor_Test_001) EXPECT_NE(SUCCESS, PWR_CPU_GetFreqGovernor(gov, 3)); } +/* + * 功能描述: 正常调用PWR_CPU_GetFreq函数, 应该返回正常, 且频率大于10MHz + * 输入参数的数组长度比实际需要的长度大1, 检查返回的实际policy数目是否正常 + */ TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreq_Test_001) { int coreNum = sysconf(_SC_NPROCESSORS_CONF); + // 5: 用字符串表示CPU编号, 每个CPU最多占用5个字节, policyId占用4个字节 + int len = sizeof(PWR_CPU_FreqAbility) + (4 * 5) * coreNum; + PWR_CPU_FreqAbility *freqAbi = (PWR_CPU_FreqAbility *)malloc(len); + EXPECT_TRUE(freqAbi != NULL); + memset(freqAbi, 0, len); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqAbility(freqAbi, len)); - 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++) { + unsigned int policyNum = (unsigned int)freqAbi->freqDomainNum + 1; + PWR_CPU_CurFreq *curFreq = (PWR_CPU_CurFreq *)calloc(policyNum, sizeof(PWR_CPU_CurFreq)); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreq(curFreq, &policyNum, 0)); + EXPECT_EQ(policyNum, freqAbi->freqDomainNum); + for (unsigned int i = 0; i < policyNum; i++) { EXPECT_LT(10, (unsigned int)curFreq[i].curFreq); printf("policyId:%d, freq:%lf\n", curFreq[i].policyId, curFreq[i].curFreq); } + free(freqAbi); + free(curFreq); } + +/* + * 功能描述: 正常调用PWR_CPU_GetFreq函数, 应该返回正常, 且频率大于10MHz + * 第三个参数设置为1 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreq_Test_002) +{ + int coreNum = sysconf(_SC_NPROCESSORS_CONF); + // 5: 用字符串表示CPU编号, 每个CPU最多占用5个字节, policyId占用4个字节 + int len = sizeof(PWR_CPU_FreqAbility) + (sizeof(int) * 5) * coreNum; + PWR_CPU_FreqAbility *freqAbi = (PWR_CPU_FreqAbility *)malloc(len); + EXPECT_TRUE(freqAbi != NULL); + memset(freqAbi, 0, len); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqAbility(freqAbi, len)); + + unsigned int policyNum = (unsigned int)freqAbi->freqDomainNum + 1; + PWR_CPU_CurFreq *curFreq = (PWR_CPU_CurFreq *)calloc(policyNum, sizeof(PWR_CPU_CurFreq)); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreq(curFreq, &policyNum, 1)); + EXPECT_EQ(policyNum, freqAbi->freqDomainNum); + for (unsigned int i = 0; i < policyNum; i++) { + // 10: 获取到的频率至少要大于10MHz + EXPECT_LT(10, (unsigned int)curFreq[i].curFreq); + printf("policyId:%d, freq:%lf\n", curFreq[i].policyId, curFreq[i].curFreq); + } + free(freqAbi); + free(curFreq); +} + +/* + * 功能描述: PWR_CPU_GetFreq函数入参为NULL, 应该返回错误 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_GetFreq_Test_003) +{ + EXPECT_NE(SUCCESS, PWR_CPU_GetFreq(NULL, 0, 0)); +} + +/* + * 功能描述: 将governor设置为userspace, 并调用PWR_CPU_SetFreq设置频率 + * 当cpufreq driver为cppc_cpufreq时, 调用PWR_CPU_GetFreq检查频率设置是否正确 + * 将governor恢复为performance + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreq_Test_001) +{ + int coreNum = sysconf(_SC_NPROCESSORS_CONF); + // 5: 用字符串表示CPU编号, 每个CPU最多占用5个字节, policyId占用4个字节 + int len = sizeof(PWR_CPU_FreqAbility) + (sizeof(int) * 5) * coreNum; + PWR_CPU_FreqAbility *freqAbi = (PWR_CPU_FreqAbility *)malloc(len); + EXPECT_TRUE(freqAbi != NULL); + memset(freqAbi, 0, len); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqAbility(freqAbi, len)); + + // governor设置为userspace + char governor[] = "userspace"; + 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); + + // 将每个policy的频率都设置为2000MHz, 并调用函数PWR_CPU_GetFreq检查设置成功 + unsigned int policyNum = (unsigned int)freqAbi->freqDomainNum; + PWR_CPU_CurFreq *curFreq = (PWR_CPU_CurFreq *)calloc(policyNum, sizeof(PWR_CPU_CurFreq)); + for (unsigned int i = 0; i < policyNum; i++) { + curFreq[i].policyId = (int)freqAbi->freqDomain[i * freqAbi->freqDomainStep]; + curFreq[i].curFreq = 2000.0; + } + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreq(curFreq, policyNum)); + if (std::string(freqAbi->curDriver) == std::string("cppc_cpufreq")) { + printf("check frequency, if cpufreq driver is cppc_cpufreq\n"); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreq(curFreq, &policyNum, 0)); + for (unsigned int i = 0; i < policyNum; i++) { + EXPECT_EQ(2000, (int)curFreq[i].curFreq); + } + } + + // governor恢复为performance + 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); + + free(curFreq); + free(freqAbi); +} + +/* + * 功能描述: 将governor设置为performance, 并调用PWR_CPU_SetFreq设置频率 + * 此时应该返回正常 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreq_Test_002) +{ + int coreNum = sysconf(_SC_NPROCESSORS_CONF); + // 5: 用字符串表示CPU编号, 每个CPU最多占用5个字节, policyId占用4个字节 + int len = sizeof(PWR_CPU_FreqAbility) + (4 * 5) * coreNum; + PWR_CPU_FreqAbility *freqAbi = (PWR_CPU_FreqAbility *)malloc(len); + EXPECT_TRUE(freqAbi != NULL); + memset(freqAbi, 0, len); + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqAbility(freqAbi, len)); + + // governor设置为performance + char govPerformance[] = "performance"; + EXPECT_EQ(SUCCESS, PWR_CPU_SetFreqGovernor(govPerformance)); + char gov[MAX_ELEMENT_NAME_LEN] = {0}; + EXPECT_EQ(SUCCESS, PWR_CPU_GetFreqGovernor(gov, MAX_ELEMENT_NAME_LEN)); + EXPECT_STREQ(govPerformance, gov); + + unsigned int policyNum = (unsigned int)freqAbi->freqDomainNum; + PWR_CPU_CurFreq *curFreq = (PWR_CPU_CurFreq *)calloc(policyNum, sizeof(PWR_CPU_CurFreq)); + for (unsigned int i = 0; i < policyNum; i++) { + curFreq[i].policyId = int(freqAbi->freqDomain[i * freqAbi->freqDomainStep]); + curFreq[i].curFreq = 2000.0; + } + EXPECT_NE(SUCCESS, PWR_CPU_SetFreq(curFreq, policyNum)); + + free(curFreq); + free(freqAbi); +} + +/* + * 功能描述: 函数PWR_CPU_SetFreq为空指针, 应该返回错误 + */ +TEST_F(RegisterOkCpuTest, PWR_CPU_SetFreq_Test_003) +{ + EXPECT_NE(SUCCESS, PWR_CPU_SetFreq(NULL, 0)); +} \ No newline at end of file diff --git a/pwrapic/gtest/get_gtest.sh b/pwrapic/gtest/get_gtest.sh index e07d20f..8886c4e 100644 --- a/pwrapic/gtest/get_gtest.sh +++ b/pwrapic/gtest/get_gtest.sh @@ -2,31 +2,6 @@ # 要在本地进行gtest用例开发,请先执行该脚本,用于拉取gtest动态库 # 创建软链接和拉取必须的头文件 - -SCRIPT_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd) - -gtest_inc="./include/gtest" -gtest_file="./lib/libgtest.so" - -cd $SCRIPT_DIR - -echo $SCRIPT_DIR - -if [ ! -L "$gtest_file" ]; then - sudo yum install gtest - rm -rf lib - mkdir lib - ln -s /lib64/`ls /lib64 | grep gtest.so | head -1` ./lib/libgtest.so - ln -s /lib64/`ls /lib64 | grep gtest_main.so | head -1` ./lib/libgtest_main.so -fi - -if [ ! -d "$gtest_inc" ]; then - rm -rf src_gtest - mkdir src_gtest - yumdownloader --source gtest --destdir=./src_gtest - rpm2cpio ./src_gtest/*.rpm | cpio -div -D ./src_gtest - tar -zxvf ./src_gtest/release*.tar.gz -C ./src_gtest - mv ./src_gtest/googletest-release*/googletest/include/gtest ./include - rm -rf src_gtest -fi -cd - +if [ ! -L "/lib64/libgtest.so" ]; then + sudo yum install gtest-devel +fi \ No newline at end of file diff --git a/pwrapis/src/cpuservice.c b/pwrapis/src/cpuservice.c index d7166be..4871d33 100644 --- a/pwrapis/src/cpuservice.c +++ b/pwrapis/src/cpuservice.c @@ -837,4 +837,4 @@ void SetCpuFreqRange(PwrMsg *req) int GetCpuCoreNumber(void) { return sysconf(_SC_NPROCESSORS_CONF); -} \ No newline at end of file +} -- Gitee