From 2f138d7944b8aef10dcb0c55d7b4e7a0db34949b Mon Sep 17 00:00:00 2001 From: Dai Li Date: Wed, 2 Mar 2022 15:45:00 +0800 Subject: [PATCH] Add testcase for rtg_interface ohos inclusion category: bugfix issue: NA CVE: NA -------------------------- Add mutiple thread test for rtg add Signed-off-by: Dai Li --- common/include/rtg_interface.h | 4 +- .../frame_aware_policy/src/rtg_msg_mgr.cpp | 2 +- .../innerkits/frameintf/rtg_interface.cpp | 46 ++++++++-------- test/unittest/phone/rtg_interface_test.cpp | 55 +++++++++++++++++++ 4 files changed, 82 insertions(+), 25 deletions(-) diff --git a/common/include/rtg_interface.h b/common/include/rtg_interface.h index 2a38b35..f409dc7 100644 --- a/common/include/rtg_interface.h +++ b/common/include/rtg_interface.h @@ -89,8 +89,8 @@ extern "C"{ int EnableRtg(bool flag); //-----for frame rtg-----// int CreateNewRtgGrp(int prioType = 0, int rtNum = 0); // Return GrpId if success - int AddThreadToRtg(int tid, int grpId); - int AddThreadsToRtg(vector tids, int grpId); + int AddThreadToRtg(int tid, int grpId, int prioType = 0); + int AddThreadsToRtg(vector tids, int grpId, int prioType = 0); int RemoveRtgThread(int tid); int ClearRtgGrp(int grpId); int DestroyRtgGrp(int grpId); diff --git a/frameworks/core/frame_aware_policy/src/rtg_msg_mgr.cpp b/frameworks/core/frame_aware_policy/src/rtg_msg_mgr.cpp index 212889a..1adb32d 100644 --- a/frameworks/core/frame_aware_policy/src/rtg_msg_mgr.cpp +++ b/frameworks/core/frame_aware_policy/src/rtg_msg_mgr.cpp @@ -40,7 +40,7 @@ int RtgMsgMgr::OnForeground(const std::string appName, const int pid) RME_LOGE("[OnForeground]: createNewRtgGroup failed! rtGrp:%{public}d, pid: %{public}d", rtGrp, pid); return rtGrp; } - int ret = AddThreadToRtg(pid, rtGrp); // add ui thread + int ret = AddThreadToRtg(pid, rtGrp, 2); // add main thread, 2 means NORMAL_TASK if (ret != 0) { RME_LOGE("[OnFore]:add thread fail! pid:%{public}d,rtg:%{public}d!ret:%{publid}d", pid, rtGrp, ret); } diff --git a/interfaces/innerkits/frameintf/rtg_interface.cpp b/interfaces/innerkits/frameintf/rtg_interface.cpp index 90ce408..6652c2f 100644 --- a/interfaces/innerkits/frameintf/rtg_interface.cpp +++ b/interfaces/innerkits/frameintf/rtg_interface.cpp @@ -113,7 +113,7 @@ int CreateNewRtgGrp(int prioType, int rtNum) } grp_data.rtg_cmd = CMD_CREATE_RTG_GRP; ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("create rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("create rtg grp success, get rtg id %{public}d.", ret); @@ -122,7 +122,7 @@ int CreateNewRtgGrp(int prioType, int rtNum) return ret; } -int AddThreadToRtg(int tid, int grpId) +int AddThreadToRtg(int tid, int grpId, int prioType) { struct rtg_grp_data grp_data; int ret; @@ -136,17 +136,18 @@ int AddThreadToRtg(int tid, int grpId) grp_data.tids[0] = tid; grp_data.grp_id = grpId; grp_data.rtg_cmd = CMD_ADD_RTG_THREAD; + grp_data.prio_type = prioType; ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); if (ret == 0) { RME_LOGI("add rtg grp success"); } else { - RME_LOGE("add tid %d to grp %d fail with ret %d", tid, grpId, ret); + RME_LOGE("add tid %{public}d to grp %{public}d fail with ret %{public}d", tid, grpId, ret); } close(fd); return ret; } -int AddThreadsToRtg(vector tids, int grpId) +int AddThreadsToRtg(vector tids, int grpId, int prioType) { struct rtg_grp_data grp_data; int ret; @@ -162,6 +163,7 @@ int AddThreadsToRtg(vector tids, int grpId) grp_data.tid_num = num; grp_data.grp_id = grpId; grp_data.rtg_cmd = CMD_ADD_RTG_THREAD; + grp_data.prio_type = prioType; for (int i = 0; i < num; i++) { if (tids[i] < 0) { return -1; @@ -170,7 +172,7 @@ int AddThreadsToRtg(vector tids, int grpId) } ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("add rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else if (ret == 0) { RME_LOGI("add rtg grp success"); @@ -194,7 +196,7 @@ int RemoveRtgThread(int tid) grp_data.tids[0] = tid; grp_data.rtg_cmd = CMD_REMOVE_RTG_THREAD; ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("remove grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("remove grp success, get rtg id %{public}d.", ret); @@ -215,7 +217,7 @@ int ClearRtgGrp(int GrpId) grp_data.rtg_cmd = CMD_CLEAR_RTG_GRP; grp_data.grp_id = GrpId; ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("clear rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("clear rtg grp success, get rtg id %{public}d.", ret); @@ -236,10 +238,10 @@ int DestroyRtgGrp(int GrpId) grp_data.rtg_cmd = CMD_DESTROY_RTG_GRP; grp_data.grp_id = GrpId; ret = ioctl(fd, CMD_ID_SET_RTG, &grp_data); - if ( ret < 0) { - RME_LOGE("create rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); + if (ret < 0) { + RME_LOGE("destroy rtg grp failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { - RME_LOGI("create rtg grp success, get rtg id %{public}d.", ret); + RME_LOGI("destroy rtg grp success, get rtg id %{public}d.", ret); } close(fd); return ret; @@ -250,7 +252,7 @@ int SetMaxVipRtgs(int rtframe) { int ret = 0; char str_data[MAX_STR_LEN] = {}; - snprintf(str_data, MAX_STR_LEN, "rtframe:%d", rtframe); + (void)sprintf_s(str_data, sizeof(str_data), "rtframe:%d", rtframe); struct rtg_str_data strData; strData.len = strlen(str_data); strData.data = str_data; @@ -260,7 +262,7 @@ int SetMaxVipRtgs(int rtframe) return fd; } ret = ioctl(fd, CMD_ID_SET_CONFIG, &strData); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set single config failed, ret = %{public}d", ret); } else { RME_LOGI("set single config success, get rtg id %{public}d.", ret); @@ -283,7 +285,7 @@ int SetFrameRateAndPrioType(int rtgId, int rate, int rtgType) return fd; } ret = ioctl(fd, CMD_ID_SET_RTG_ATTR, &strData); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set rtg attr failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set rtg attr success, get rtg id %{public}d.", ret); @@ -297,14 +299,14 @@ int BeginFrameFreq(int grpId, int stateParam) int ret = 0; struct proc_state_data state_data; state_data.grp_id = grpId; - state_data.state_param = stateParam; + state_data.state_param = stateParam; int fd = BasicOpenRtgNode(); if (fd < 0) { return fd; } ret = ioctl(fd, CMD_ID_BEGIN_FRAME_FREQ, &state_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set BeginFrameFreq failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set BeginFrameFreq success, get ret %{public}d.", ret); @@ -325,7 +327,7 @@ int EndFrameFreq(int grpId) return fd; } ret = ioctl(fd, CMD_ID_END_FRAME_FREQ, &state_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set EndFrameFreq failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set EndFrameFreq success, get ret %{public}d.", ret); @@ -346,7 +348,7 @@ int EndScene(int grpId) return fd; } ret = ioctl(fd, CMD_ID_END_SCENE, &state_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set EndScene failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set EndScene success, get ret %{public}d.", ret); @@ -368,7 +370,7 @@ int SetMinUtil(int grpId, int stateParam) return fd; } ret = ioctl(fd, CMD_ID_SET_MIN_UTIL, &state_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set min util failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set min util success, get ret %{public}d.", ret); @@ -390,7 +392,7 @@ int SetMargin(int grpId, int stateParam) return fd; } ret = ioctl(fd, CMD_ID_SET_MARGIN, &state_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("set margin failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("set margin success, get ret %{public}d.", ret); @@ -413,7 +415,7 @@ int ListRtgGroup(vector *rs) } memset_s(&rtg_info, sizeof(struct rtg_info), 0, sizeof(struct rtg_info)); ret = ioctl(fd, CMD_ID_LIST_RTG, &rtg_info); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("list rtg group failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("list rtg group success with num %{public}d", rtg_info.rtg_num); @@ -440,7 +442,7 @@ int ListRtgThread(int grpId, vector *rs) memset_s(&grp_data, sizeof(struct rtg_grp_data), 0, sizeof(struct rtg_grp_data)); grp_data.grp_id = grpId; ret = ioctl(fd, CMD_ID_LIST_RTG_THREAD, &grp_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("list rtg thread failed, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("list rtg thread success with tid num %{public}d", grp_data.tid_num); @@ -468,7 +470,7 @@ int SearchRtgForTid(int tid) memset_s(&search_data, sizeof(struct proc_state_data), 0, sizeof(struct proc_state_data)); search_data.state_param = tid; ret = ioctl(fd, CMD_ID_SEARCH_RTG, &search_data); - if ( ret < 0) { + if (ret < 0) { RME_LOGE("Search tid fail, errno = %{public}d (%{public}s)", errno, strerror(errno)); } else { RME_LOGI("Search tid %{public}d success with rtg_grp %{public}d", tid, ret); diff --git a/test/unittest/phone/rtg_interface_test.cpp b/test/unittest/phone/rtg_interface_test.cpp index 268d1ba..9e48d98 100644 --- a/test/unittest/phone/rtg_interface_test.cpp +++ b/test/unittest/phone/rtg_interface_test.cpp @@ -480,5 +480,60 @@ HWTEST_F(RtgInterfaceTest, RtgInterfaceSetLargeMaxVips, TestSize.Level1) EXPECT_NE(ret, 0); } +/** + * @tc.name: RtgInterfaceAddMultipleThreads + * @tc.desc: Verify rtg multiple add function. + * @tc.type: FUNC + */ +HWTEST_F(RtgInterfaceTest, RtgInterfaceAddMultipleThreads, TestSize.Level1) +{ + int ret = 0; + int pid[3]; + vector threads; + int grpId; + for (int i = 0; i < 3; i++) { + pid[i] = fork(); + ASSERT_TRUE(pid[i] >= 0) << "> parent: fork errno = " << errno; + if (pid[i] == 0) { + usleep(3000); + _Exit(0); + } + threads.push_back(pid[i]); + } + grpId = CreateNewRtgGrp(NORMAL_TASK, 0); + EXPECT_GT(grpId, 0); + ret = AddThreadsToRtg(threads, grpId); + EXPECT_EQ(ret, 0); + ret = DestroyRtgGrp(grpId); + EXPECT_EQ(ret, 0); +} + +/** + * @tc.name: RtgInterfaceAddMultipleThreadsOutOfLimit + * @tc.desc: Verify rtg multiple add function with out of limit threads. + * @tc.type: FUNC + */ +HWTEST_F(RtgInterfaceTest, RtgInterfaceAddMultipleThreadsOutOfLimit, TestSize.Level1) +{ + int ret = 0; + int pid[8]; + vector threads; + int grpId; + for (int i = 0; i < 8; i++) { + pid[i] = fork(); + ASSERT_TRUE(pid[i] >= 0) << "> parent: fork errno = " << errno; + if (pid[i] == 0) { + usleep(3000); + _Exit(0); + } + threads.push_back(pid[i]); + } + grpId = CreateNewRtgGrp(NORMAL_TASK, 0); + EXPECT_GT(grpId, 0); + ret = AddThreadsToRtg(threads, grpId); + EXPECT_NE(ret, 0); + ret = DestroyRtgGrp(grpId); + EXPECT_EQ(ret, 0); +} } // namespace RME } // namespace OHOS -- Gitee