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