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 <gtest/gtest.h>
17484543d1Sopenharmony_ci#include <thread>
18484543d1Sopenharmony_ci#include <sched/workgroup_internal.h>
19484543d1Sopenharmony_ci#include <cstdio>
20484543d1Sopenharmony_ci#include <cstdlib>
21484543d1Sopenharmony_ci#include <cstring>
22484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
23484543d1Sopenharmony_ci#include "rtg_interface.h"
24484543d1Sopenharmony_ci#include "concurrent_task_client.h"
25484543d1Sopenharmony_ci#endif
26484543d1Sopenharmony_ci#include "dfx/log/ffrt_log_api.h"
27484543d1Sopenharmony_ci#include "common.h"
28484543d1Sopenharmony_ci
29484543d1Sopenharmony_ci#define GET_TID() syscall(SYS_gettid)
30484543d1Sopenharmony_ci
31484543d1Sopenharmony_ciusing namespace testing;
32484543d1Sopenharmony_ci#ifdef HWTEST_TESTING_EXT_ENABLE
33484543d1Sopenharmony_ciusing namespace testing::ext;
34484543d1Sopenharmony_ci#endif
35484543d1Sopenharmony_ciusing namespace ffrt;
36484543d1Sopenharmony_ci
37484543d1Sopenharmony_ciclass WorkgroupInternalTest : public testing::Test {
38484543d1Sopenharmony_ciprotected:
39484543d1Sopenharmony_ci    static void SetUpTestCase()
40484543d1Sopenharmony_ci    {
41484543d1Sopenharmony_ci    }
42484543d1Sopenharmony_ci
43484543d1Sopenharmony_ci    static void TearDownTestCase()
44484543d1Sopenharmony_ci    {
45484543d1Sopenharmony_ci    }
46484543d1Sopenharmony_ci
47484543d1Sopenharmony_ci    virtual void SetUp()
48484543d1Sopenharmony_ci    {
49484543d1Sopenharmony_ci    }
50484543d1Sopenharmony_ci
51484543d1Sopenharmony_ci    virtual void TearDown()
52484543d1Sopenharmony_ci    {
53484543d1Sopenharmony_ci    }
54484543d1Sopenharmony_ci};
55484543d1Sopenharmony_ci
56484543d1Sopenharmony_civoid StartApp(int uid)
57484543d1Sopenharmony_ci{
58484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
59484543d1Sopenharmony_ci    std::unordered_map<std::string, std::string> payload;
60484543d1Sopenharmony_ci    payload["uid"] = std::to_string(uid);
61484543d1Sopenharmony_ci    payload["type"] = "appStart";
62484543d1Sopenharmony_ci    OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().ReportData(0,
63484543d1Sopenharmony_ci        uid, payload);
64484543d1Sopenharmony_ci#endif
65484543d1Sopenharmony_ci}
66484543d1Sopenharmony_ci
67484543d1Sopenharmony_civoid SwapToFront(int uid)
68484543d1Sopenharmony_ci{
69484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
70484543d1Sopenharmony_ci    std::unordered_map<std::string, std::string> payload;
71484543d1Sopenharmony_ci    payload["uid"] = std::to_string(uid);
72484543d1Sopenharmony_ci    payload["type"] = "foreground";
73484543d1Sopenharmony_ci    OHOS::ConcurrentTask::ConcurrentTaskClient::GetInstance().ReportData(0,
74484543d1Sopenharmony_ci        uid, payload);
75484543d1Sopenharmony_ci#endif
76484543d1Sopenharmony_ci}
77484543d1Sopenharmony_ci
78484543d1Sopenharmony_ci/**
79484543d1Sopenharmony_ci * @tc.name: JoinWGTest
80484543d1Sopenharmony_ci * @tc.desc: Test whether the JoinWG interface are normal.
81484543d1Sopenharmony_ci * @tc.type: FUNC
82484543d1Sopenharmony_ci */
83484543d1Sopenharmony_ciHWTEST_F(WorkgroupInternalTest, JoinWGTest, TestSize.Level1)
84484543d1Sopenharmony_ci{
85484543d1Sopenharmony_ci    int tid = GET_TID();
86484543d1Sopenharmony_ci    bool ret = JoinWG(tid);
87484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
88484543d1Sopenharmony_ci    EXPECT_FALSE(ret);
89484543d1Sopenharmony_ci#else
90484543d1Sopenharmony_ci    EXPECT_TRUE(ret);
91484543d1Sopenharmony_ci#endif
92484543d1Sopenharmony_ci}
93484543d1Sopenharmony_ci
94484543d1Sopenharmony_ci/**
95484543d1Sopenharmony_ci * @tc.name: WorkgroupCreateTest
96484543d1Sopenharmony_ci * @tc.desc: Test whether the WorkgroupCreate interface are normal.
97484543d1Sopenharmony_ci * @tc.type: FUNC
98484543d1Sopenharmony_ci */
99484543d1Sopenharmony_ciHWTEST_F(WorkgroupInternalTest, WorkgroupCreateTest, TestSize.Level1)
100484543d1Sopenharmony_ci{
101484543d1Sopenharmony_ci    long interval = 10000;
102484543d1Sopenharmony_ci    (void)setuid(1000);
103484543d1Sopenharmony_ci    struct WorkGroup *ret = WorkgroupCreate(interval);
104484543d1Sopenharmony_ci    EXPECT_NE(ret, nullptr);
105484543d1Sopenharmony_ci
106484543d1Sopenharmony_ci    (void)setuid(3039);
107484543d1Sopenharmony_ci    struct WorkGroup *ret1 = WorkgroupCreate(interval);
108484543d1Sopenharmony_ci    EXPECT_NE(ret1, nullptr);
109484543d1Sopenharmony_ci
110484543d1Sopenharmony_ci    (void)setuid(0);
111484543d1Sopenharmony_ci    struct WorkGroup *ret2 = WorkgroupCreate(interval);
112484543d1Sopenharmony_ci    EXPECT_NE(ret2, nullptr);
113484543d1Sopenharmony_ci}
114484543d1Sopenharmony_ci
115484543d1Sopenharmony_ci/**
116484543d1Sopenharmony_ci * @tc.name: WorkgroupStartIntervalTest
117484543d1Sopenharmony_ci * @tc.desc: Test whether the WorkgroupStartInterval interface are normal.
118484543d1Sopenharmony_ci * @tc.type: FUNC
119484543d1Sopenharmony_ci */
120484543d1Sopenharmony_ciHWTEST_F(WorkgroupInternalTest, WorkgroupStartIntervalTest, TestSize.Level1)
121484543d1Sopenharmony_ci{
122484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
123484543d1Sopenharmony_ci    struct WorkGroup* wg = nullptr;
124484543d1Sopenharmony_ci    struct WorkGroup wg1 = {true, 0, {0}, 0, WgType(0)};
125484543d1Sopenharmony_ci    WorkgroupStartInterval(wg);
126484543d1Sopenharmony_ci
127484543d1Sopenharmony_ci    struct WorkGroup* p = &wg1;
128484543d1Sopenharmony_ci    p->started = true;
129484543d1Sopenharmony_ci    WorkgroupStartInterval(p);
130484543d1Sopenharmony_ci
131484543d1Sopenharmony_ci    int SYS_UID = 1000;
132484543d1Sopenharmony_ci    int TEST_UID = 10087;
133484543d1Sopenharmony_ci
134484543d1Sopenharmony_ci    (void)setuid(SYS_UID);
135484543d1Sopenharmony_ci    StartApp(TEST_UID);
136484543d1Sopenharmony_ci    SwapToFront(TEST_UID);
137484543d1Sopenharmony_ci    p->started = false;
138484543d1Sopenharmony_ci    p->rtgId = 10;
139484543d1Sopenharmony_ci    WorkgroupStartInterval(p);
140484543d1Sopenharmony_ci    EXPECT_TRUE(p->started);
141484543d1Sopenharmony_ci#endif
142484543d1Sopenharmony_ci}
143484543d1Sopenharmony_ci
144484543d1Sopenharmony_ci/**
145484543d1Sopenharmony_ci * @tc.name: WorkgroupStopIntervalTest
146484543d1Sopenharmony_ci * @tc.desc: Test whether the WorkgroupStopInterval interface are normal.
147484543d1Sopenharmony_ci * @tc.type: FUNC
148484543d1Sopenharmony_ci */
149484543d1Sopenharmony_ciHWTEST_F(WorkgroupInternalTest, WorkgroupStopIntervalTest, TestSize.Level1)
150484543d1Sopenharmony_ci{
151484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
152484543d1Sopenharmony_ci    struct WorkGroup* wg = nullptr;
153484543d1Sopenharmony_ci    struct WorkGroup wg1 = {true, 0, {0}, 0, WgType(0)};
154484543d1Sopenharmony_ci    WorkgroupStopInterval(wg);
155484543d1Sopenharmony_ci
156484543d1Sopenharmony_ci    struct WorkGroup* p = &wg1;
157484543d1Sopenharmony_ci    p->started = false;
158484543d1Sopenharmony_ci    WorkgroupStopInterval(p);
159484543d1Sopenharmony_ci
160484543d1Sopenharmony_ci    int SYS_UID = 1000;
161484543d1Sopenharmony_ci    int TEST_UID = 10087;
162484543d1Sopenharmony_ci
163484543d1Sopenharmony_ci    (void)setuid(SYS_UID);
164484543d1Sopenharmony_ci    StartApp(TEST_UID);
165484543d1Sopenharmony_ci    SwapToFront(TEST_UID);
166484543d1Sopenharmony_ci    p->started = true;
167484543d1Sopenharmony_ci    p->rtgId = 10;
168484543d1Sopenharmony_ci    WorkgroupStopInterval(p);
169484543d1Sopenharmony_ci    EXPECT_FALSE(p->started);
170484543d1Sopenharmony_ci#endif
171484543d1Sopenharmony_ci}
172484543d1Sopenharmony_ci
173484543d1Sopenharmony_ci/**
174484543d1Sopenharmony_ci * @tc.name: WorkgroupJoinTest
175484543d1Sopenharmony_ci * @tc.desc: Test whether the WorkgroupJoin interface are normal.
176484543d1Sopenharmony_ci * @tc.type: FUNC
177484543d1Sopenharmony_ci */
178484543d1Sopenharmony_ciHWTEST_F(WorkgroupInternalTest, WorkgroupJoinTest, TestSize.Level1)
179484543d1Sopenharmony_ci{
180484543d1Sopenharmony_ci    long tid = 10086;
181484543d1Sopenharmony_ci    struct WorkGroup wg1 = {true, 0, {0}, 0, WgType(0)};
182484543d1Sopenharmony_ci    struct WorkGroup* wg = nullptr;
183484543d1Sopenharmony_ci
184484543d1Sopenharmony_ci    WorkgroupJoin(wg, tid);
185484543d1Sopenharmony_ci    struct WorkGroup* p = &wg1;
186484543d1Sopenharmony_ci    p->rtgId = 10;
187484543d1Sopenharmony_ci    WorkgroupJoin(p, tid);
188484543d1Sopenharmony_ci}
189484543d1Sopenharmony_ci
190484543d1Sopenharmony_ci/**
191484543d1Sopenharmony_ci * @tc.name: WorkgroupClearTest
192484543d1Sopenharmony_ci * @tc.desc: Test whether the WorkgroupClear interface are normal.
193484543d1Sopenharmony_ci * @tc.type: FUNC
194484543d1Sopenharmony_ci */
195484543d1Sopenharmony_ciHWTEST_F(WorkgroupInternalTest, WorkgroupClearTest, TestSize.Level1)
196484543d1Sopenharmony_ci{
197484543d1Sopenharmony_ci    struct WorkGroup* wg = nullptr;
198484543d1Sopenharmony_ci
199484543d1Sopenharmony_ci    int ret = WorkgroupClear(wg);
200484543d1Sopenharmony_ci    EXPECT_EQ(0, ret);
201484543d1Sopenharmony_ci
202484543d1Sopenharmony_ci    long interval = 10000;
203484543d1Sopenharmony_ci    (void)setuid(1000);
204484543d1Sopenharmony_ci    struct WorkGroup *wg2 = WorkgroupCreate(interval);
205484543d1Sopenharmony_ci    int ret2 = WorkgroupClear(wg2);
206484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
207484543d1Sopenharmony_ci    EXPECT_EQ(-1, ret2);
208484543d1Sopenharmony_ci#else
209484543d1Sopenharmony_ci    EXPECT_EQ(0, ret2);
210484543d1Sopenharmony_ci#endif
211484543d1Sopenharmony_ci
212484543d1Sopenharmony_ci    (void)setuid(3039);
213484543d1Sopenharmony_ci    struct WorkGroup *wg3 = WorkgroupCreate(interval);
214484543d1Sopenharmony_ci    int ret3 = WorkgroupClear(wg3);
215484543d1Sopenharmony_ci#if defined(QOS_FRAME_RTG)
216484543d1Sopenharmony_ci    EXPECT_EQ(-1, ret3);
217484543d1Sopenharmony_ci#else
218484543d1Sopenharmony_ci    EXPECT_EQ(0, ret3);
219484543d1Sopenharmony_ci#endif
220484543d1Sopenharmony_ci
221484543d1Sopenharmony_ci    (void)setuid(0);
222484543d1Sopenharmony_ci    struct WorkGroup *wg4 = WorkgroupCreate(interval);
223484543d1Sopenharmony_ci    int ret4 = WorkgroupClear(wg4);
224484543d1Sopenharmony_ci    EXPECT_EQ(0, ret4);
225484543d1Sopenharmony_ci}
226