1484543d1Sopenharmony_ci/* 2484543d1Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License. 5484543d1Sopenharmony_ci * You may obtain a copy of the License at 6484543d1Sopenharmony_ci * 7484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8484543d1Sopenharmony_ci * 9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and 13484543d1Sopenharmony_ci * limitations under the License. 14484543d1Sopenharmony_ci */ 15484543d1Sopenharmony_ci 16484543d1Sopenharmony_ci#include <cstdlib> 17484543d1Sopenharmony_ci#include <cstring> 18484543d1Sopenharmony_ci#include <fcntl.h> 19484543d1Sopenharmony_ci#include <gtest/gtest.h> 20484543d1Sopenharmony_ci#include <iostream> 21484543d1Sopenharmony_ci#include <sys/ioctl.h> 22484543d1Sopenharmony_ci#include <sys/utsname.h> 23484543d1Sopenharmony_ci#include <unistd.h> 24484543d1Sopenharmony_ci#include "cpp/qos_convert.h" 25484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG) 26484543d1Sopenharmony_ci#include "concurrent_task_client.h" 27484543d1Sopenharmony_ci#endif 28484543d1Sopenharmony_ci#include "eu/qos_interface.h" 29484543d1Sopenharmony_ci#include "common.h" 30484543d1Sopenharmony_ci 31484543d1Sopenharmony_cinamespace OHOS { 32484543d1Sopenharmony_cinamespace FFRT_TEST { 33484543d1Sopenharmony_ciusing namespace testing; 34484543d1Sopenharmony_ci#ifdef HWTEST_TESTING_EXT_ENABLE 35484543d1Sopenharmony_ciusing namespace testing::ext; 36484543d1Sopenharmony_ci#endif 37484543d1Sopenharmony_ciusing namespace OHOS::FFRT_TEST; 38484543d1Sopenharmony_ciusing namespace ffrt; 39484543d1Sopenharmony_ciusing namespace std; 40484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG) 41484543d1Sopenharmony_ciusing namespace OHOS::ConcurrentTask; 42484543d1Sopenharmony_ci#endif 43484543d1Sopenharmony_ci 44484543d1Sopenharmony_ci#define QOS_CTRL_SET_QOS_THREAD _IOWR('q', 2, struct TaskConfig) 45484543d1Sopenharmony_ci 46484543d1Sopenharmony_cistruct TaskConfig { 47484543d1Sopenharmony_ci int32_t pid; 48484543d1Sopenharmony_ci int32_t value; 49484543d1Sopenharmony_ci}; 50484543d1Sopenharmony_ci 51484543d1Sopenharmony_ciconst string QOS_CTRL_FILE_PATH = "/dev/qos_sched_ctrl"; 52484543d1Sopenharmony_ciconst int NR_QOS_LEVEL = 9; 53484543d1Sopenharmony_ciconstexpr int ERROR_NUM = -1; 54484543d1Sopenharmony_ci 55484543d1Sopenharmony_ciclass QosConvertTest : public testing::Test { 56484543d1Sopenharmony_cipublic: 57484543d1Sopenharmony_ci bool IsLinuxOs() 58484543d1Sopenharmony_ci { 59484543d1Sopenharmony_ci struct utsname nameData; 60484543d1Sopenharmony_ci uname(&nameData); 61484543d1Sopenharmony_ci int cmpNum = 5; 62484543d1Sopenharmony_ci return strncmp(nameData.sysname, "Linux", cmpNum) == 0 ? true : false; 63484543d1Sopenharmony_ci } 64484543d1Sopenharmony_ci 65484543d1Sopenharmony_ciprotected: 66484543d1Sopenharmony_ci static void SetUpTestCase() 67484543d1Sopenharmony_ci { 68484543d1Sopenharmony_ci } 69484543d1Sopenharmony_ci 70484543d1Sopenharmony_ci static void TearDownTestCase() 71484543d1Sopenharmony_ci { 72484543d1Sopenharmony_ci } 73484543d1Sopenharmony_ci 74484543d1Sopenharmony_ci virtual void SetUp() 75484543d1Sopenharmony_ci { 76484543d1Sopenharmony_ci } 77484543d1Sopenharmony_ci 78484543d1Sopenharmony_ci virtual void TearDown() 79484543d1Sopenharmony_ci { 80484543d1Sopenharmony_ci } 81484543d1Sopenharmony_ci}; 82484543d1Sopenharmony_ci 83484543d1Sopenharmony_cistatic int SetRssQos(int level) 84484543d1Sopenharmony_ci{ 85484543d1Sopenharmony_ci int tid = gettid(); 86484543d1Sopenharmony_ci if (level < -1 || level > 9) { 87484543d1Sopenharmony_ci return ERROR_NUM; 88484543d1Sopenharmony_ci } 89484543d1Sopenharmony_ci int32_t handle = open(QOS_CTRL_FILE_PATH.c_str(), (O_RDWR | O_CLOEXEC)); 90484543d1Sopenharmony_ci if (handle <= 0) { 91484543d1Sopenharmony_ci printf("invalid handle %d\n", static_cast<int>(handle)); 92484543d1Sopenharmony_ci return ERROR_NUM; 93484543d1Sopenharmony_ci } 94484543d1Sopenharmony_ci 95484543d1Sopenharmony_ci struct TaskConfig threadData = {tid, level}; 96484543d1Sopenharmony_ci int ret = ioctl(handle, QOS_CTRL_SET_QOS_THREAD, &threadData); 97484543d1Sopenharmony_ci if (ret != 0) { 98484543d1Sopenharmony_ci printf("ioctl setQos failed\n"); 99484543d1Sopenharmony_ci return ERROR_NUM; 100484543d1Sopenharmony_ci } 101484543d1Sopenharmony_ci 102484543d1Sopenharmony_ci return ret; 103484543d1Sopenharmony_ci} 104484543d1Sopenharmony_ci 105484543d1Sopenharmony_cistatic int QosTransfer(int qos) 106484543d1Sopenharmony_ci{ 107484543d1Sopenharmony_ci switch (qos) { 108484543d1Sopenharmony_ci case 9: 109484543d1Sopenharmony_ci case 8: 110484543d1Sopenharmony_ci case 7: return 5; 111484543d1Sopenharmony_ci case 6: return 4; 112484543d1Sopenharmony_ci case 5: 113484543d1Sopenharmony_ci case 4: return 3; 114484543d1Sopenharmony_ci case 3: return 2; 115484543d1Sopenharmony_ci case 2: return 1; 116484543d1Sopenharmony_ci case 1: return 0; 117484543d1Sopenharmony_ci default: 118484543d1Sopenharmony_ci return -1; 119484543d1Sopenharmony_ci } 120484543d1Sopenharmony_ci} 121484543d1Sopenharmony_ci 122484543d1Sopenharmony_ci#ifndef FFRT_GITEE 123484543d1Sopenharmony_ciHWTEST_F(QosConvertTest, GetStaticQos1, TestSize.Level1) 124484543d1Sopenharmony_ci{ 125484543d1Sopenharmony_ci for (int i = 1; i <= NR_QOS_LEVEL; i++) { 126484543d1Sopenharmony_ci qos tmpQos = qos_default; 127484543d1Sopenharmony_ci SetRssQos(i); 128484543d1Sopenharmony_ci int ret = GetStaticQos(tmpQos); 129484543d1Sopenharmony_ci if (!IsLinuxOs()) { 130484543d1Sopenharmony_ci return; 131484543d1Sopenharmony_ci } 132484543d1Sopenharmony_ci EXPECT_EQ(ret, 0); 133484543d1Sopenharmony_ci EXPECT_EQ(tmpQos, QosTransfer(i)); 134484543d1Sopenharmony_ci } 135484543d1Sopenharmony_ci} 136484543d1Sopenharmony_ci#endif 137484543d1Sopenharmony_ci 138484543d1Sopenharmony_ciHWTEST_F(QosConvertTest, GetStaticQos2, TestSize.Level1) 139484543d1Sopenharmony_ci{ 140484543d1Sopenharmony_ci qos tmpQos = qos_default; 141484543d1Sopenharmony_ci SetRssQos(-1); 142484543d1Sopenharmony_ci int ret = GetStaticQos(tmpQos); 143484543d1Sopenharmony_ci EXPECT_EQ(tmpQos, qos_default); 144484543d1Sopenharmony_ci EXPECT_EQ(ret, -1); 145484543d1Sopenharmony_ci 146484543d1Sopenharmony_ci SetRssQos(0); 147484543d1Sopenharmony_ci ret = GetStaticQos(tmpQos); 148484543d1Sopenharmony_ci EXPECT_EQ(tmpQos, qos_default); 149484543d1Sopenharmony_ci EXPECT_EQ(ret, -1); 150484543d1Sopenharmony_ci 151484543d1Sopenharmony_ci SetRssQos(10); 152484543d1Sopenharmony_ci ret = GetStaticQos(tmpQos); 153484543d1Sopenharmony_ci EXPECT_EQ(tmpQos, qos_default); 154484543d1Sopenharmony_ci EXPECT_EQ(ret, -1); 155484543d1Sopenharmony_ci 156484543d1Sopenharmony_ci SetRssQos(-2); 157484543d1Sopenharmony_ci ret = GetStaticQos(tmpQos); 158484543d1Sopenharmony_ci EXPECT_EQ(tmpQos, qos_default); 159484543d1Sopenharmony_ci EXPECT_EQ(ret, -1); 160484543d1Sopenharmony_ci} 161484543d1Sopenharmony_ci 162484543d1Sopenharmony_ciHWTEST_F(QosConvertTest, GetDynamicQos, TestSize.Level1) 163484543d1Sopenharmony_ci{ 164484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG) 165484543d1Sopenharmony_ci SetRssQos(8); 166484543d1Sopenharmony_ci qos tmpQos = qos_default; 167484543d1Sopenharmony_ci int ret = GetDynamicQos(tmpQos); 168484543d1Sopenharmony_ci IntervalReply rs; 169484543d1Sopenharmony_ci ConcurrentTaskClient::GetInstance().QueryInterval(QUERY_RENDER_SERVICE, rs); 170484543d1Sopenharmony_ci EXPECT_EQ(tmpQos, qos_default); 171484543d1Sopenharmony_ci#endif 172484543d1Sopenharmony_ci} 173484543d1Sopenharmony_ci 174484543d1Sopenharmony_ci#ifndef FFRT_GITEE 175484543d1Sopenharmony_ciHWTEST_F(QosConvertTest, FFRTQosGetInterface, TestSize.Level1) 176484543d1Sopenharmony_ci{ 177484543d1Sopenharmony_ci SetRssQos(8); 178484543d1Sopenharmony_ci struct QosCtrlData data; 179484543d1Sopenharmony_ci int ret = FFRTQosGet(data); 180484543d1Sopenharmony_ci if (!IsLinuxOs()) { 181484543d1Sopenharmony_ci return; 182484543d1Sopenharmony_ci } 183484543d1Sopenharmony_ci EXPECT_EQ(data.staticQos, 5); 184484543d1Sopenharmony_ci EXPECT_EQ(ret, 0); 185484543d1Sopenharmony_ci} 186484543d1Sopenharmony_ci 187484543d1Sopenharmony_ciHWTEST_F(QosConvertTest, FFRTQosGetForOtherInterface, TestSize.Level1) 188484543d1Sopenharmony_ci{ 189484543d1Sopenharmony_ci SetRssQos(8); 190484543d1Sopenharmony_ci struct QosCtrlData data; 191484543d1Sopenharmony_ci int ret = FFRTQosGetForOther(gettid(), data); 192484543d1Sopenharmony_ci if (!IsLinuxOs()) { 193484543d1Sopenharmony_ci return; 194484543d1Sopenharmony_ci } 195484543d1Sopenharmony_ci EXPECT_EQ(data.staticQos, 5); 196484543d1Sopenharmony_ci EXPECT_EQ(ret, 0); 197484543d1Sopenharmony_ci} 198484543d1Sopenharmony_ci#endif 199484543d1Sopenharmony_ci} 200484543d1Sopenharmony_ci}