1/* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <cstdlib> 17#include <cstring> 18#include <fcntl.h> 19#include <gtest/gtest.h> 20#include <iostream> 21#include <sys/ioctl.h> 22#include <sys/utsname.h> 23#include <unistd.h> 24#include "cpp/qos_convert.h" 25#if defined(QOS_FRAME_RTG) 26#include "concurrent_task_client.h" 27#endif 28#include "eu/qos_interface.h" 29#include "common.h" 30 31namespace OHOS { 32namespace FFRT_TEST { 33using namespace testing; 34#ifdef HWTEST_TESTING_EXT_ENABLE 35using namespace testing::ext; 36#endif 37using namespace OHOS::FFRT_TEST; 38using namespace ffrt; 39using namespace std; 40#if defined(QOS_FRAME_RTG) 41using namespace OHOS::ConcurrentTask; 42#endif 43 44#define QOS_CTRL_SET_QOS_THREAD _IOWR('q', 2, struct TaskConfig) 45 46struct TaskConfig { 47 int32_t pid; 48 int32_t value; 49}; 50 51const string QOS_CTRL_FILE_PATH = "/dev/qos_sched_ctrl"; 52const int NR_QOS_LEVEL = 9; 53constexpr int ERROR_NUM = -1; 54 55class QosConvertTest : public testing::Test { 56public: 57 bool IsLinuxOs() 58 { 59 struct utsname nameData; 60 uname(&nameData); 61 int cmpNum = 5; 62 return strncmp(nameData.sysname, "Linux", cmpNum) == 0 ? true : false; 63 } 64 65protected: 66 static void SetUpTestCase() 67 { 68 } 69 70 static void TearDownTestCase() 71 { 72 } 73 74 virtual void SetUp() 75 { 76 } 77 78 virtual void TearDown() 79 { 80 } 81}; 82 83static int SetRssQos(int level) 84{ 85 int tid = gettid(); 86 if (level < -1 || level > 9) { 87 return ERROR_NUM; 88 } 89 int32_t handle = open(QOS_CTRL_FILE_PATH.c_str(), (O_RDWR | O_CLOEXEC)); 90 if (handle <= 0) { 91 printf("invalid handle %d\n", static_cast<int>(handle)); 92 return ERROR_NUM; 93 } 94 95 struct TaskConfig threadData = {tid, level}; 96 int ret = ioctl(handle, QOS_CTRL_SET_QOS_THREAD, &threadData); 97 if (ret != 0) { 98 printf("ioctl setQos failed\n"); 99 return ERROR_NUM; 100 } 101 102 return ret; 103} 104 105static int QosTransfer(int qos) 106{ 107 switch (qos) { 108 case 9: 109 case 8: 110 case 7: return 5; 111 case 6: return 4; 112 case 5: 113 case 4: return 3; 114 case 3: return 2; 115 case 2: return 1; 116 case 1: return 0; 117 default: 118 return -1; 119 } 120} 121 122#ifndef FFRT_GITEE 123HWTEST_F(QosConvertTest, GetStaticQos1, TestSize.Level1) 124{ 125 for (int i = 1; i <= NR_QOS_LEVEL; i++) { 126 qos tmpQos = qos_default; 127 SetRssQos(i); 128 int ret = GetStaticQos(tmpQos); 129 if (!IsLinuxOs()) { 130 return; 131 } 132 EXPECT_EQ(ret, 0); 133 EXPECT_EQ(tmpQos, QosTransfer(i)); 134 } 135} 136#endif 137 138HWTEST_F(QosConvertTest, GetStaticQos2, TestSize.Level1) 139{ 140 qos tmpQos = qos_default; 141 SetRssQos(-1); 142 int ret = GetStaticQos(tmpQos); 143 EXPECT_EQ(tmpQos, qos_default); 144 EXPECT_EQ(ret, -1); 145 146 SetRssQos(0); 147 ret = GetStaticQos(tmpQos); 148 EXPECT_EQ(tmpQos, qos_default); 149 EXPECT_EQ(ret, -1); 150 151 SetRssQos(10); 152 ret = GetStaticQos(tmpQos); 153 EXPECT_EQ(tmpQos, qos_default); 154 EXPECT_EQ(ret, -1); 155 156 SetRssQos(-2); 157 ret = GetStaticQos(tmpQos); 158 EXPECT_EQ(tmpQos, qos_default); 159 EXPECT_EQ(ret, -1); 160} 161 162HWTEST_F(QosConvertTest, GetDynamicQos, TestSize.Level1) 163{ 164#if defined(QOS_FRAME_RTG) 165 SetRssQos(8); 166 qos tmpQos = qos_default; 167 int ret = GetDynamicQos(tmpQos); 168 IntervalReply rs; 169 ConcurrentTaskClient::GetInstance().QueryInterval(QUERY_RENDER_SERVICE, rs); 170 EXPECT_EQ(tmpQos, qos_default); 171#endif 172} 173 174#ifndef FFRT_GITEE 175HWTEST_F(QosConvertTest, FFRTQosGetInterface, TestSize.Level1) 176{ 177 SetRssQos(8); 178 struct QosCtrlData data; 179 int ret = FFRTQosGet(data); 180 if (!IsLinuxOs()) { 181 return; 182 } 183 EXPECT_EQ(data.staticQos, 5); 184 EXPECT_EQ(ret, 0); 185} 186 187HWTEST_F(QosConvertTest, FFRTQosGetForOtherInterface, TestSize.Level1) 188{ 189 SetRssQos(8); 190 struct QosCtrlData data; 191 int ret = FFRTQosGetForOther(gettid(), data); 192 if (!IsLinuxOs()) { 193 return; 194 } 195 EXPECT_EQ(data.staticQos, 5); 196 EXPECT_EQ(ret, 0); 197} 198#endif 199} 200}