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}