14dfc7d99Sopenharmony_ci/*
24dfc7d99Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
34dfc7d99Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44dfc7d99Sopenharmony_ci * you may not use this file except in compliance with the License.
54dfc7d99Sopenharmony_ci * You may obtain a copy of the License at
64dfc7d99Sopenharmony_ci *
74dfc7d99Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84dfc7d99Sopenharmony_ci *
94dfc7d99Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104dfc7d99Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114dfc7d99Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124dfc7d99Sopenharmony_ci * See the License for the specific language governing permissions and
134dfc7d99Sopenharmony_ci * limitations under the License.
144dfc7d99Sopenharmony_ci */
154dfc7d99Sopenharmony_ci#include <cstdint>
164dfc7d99Sopenharmony_ci#include <cstring>
174dfc7d99Sopenharmony_ci#include <iostream>
184dfc7d99Sopenharmony_ci#include <unordered_map>
194dfc7d99Sopenharmony_ci#include <unistd.h>
204dfc7d99Sopenharmony_ci#include "accesstoken_kit.h"
214dfc7d99Sopenharmony_ci#include "ipc_skeleton.h"
224dfc7d99Sopenharmony_ci#include "nativetoken_kit.h"
234dfc7d99Sopenharmony_ci#include "res_sched_client.h"
244dfc7d99Sopenharmony_ci#include "token_setproc.h"
254dfc7d99Sopenharmony_ci
264dfc7d99Sopenharmony_ciconst static int32_t PARAMETERS_NUM_MIN                      = 2;
274dfc7d99Sopenharmony_ciconst static int32_t PARAMETERS_NUM_MIN_KILL_PROCESS         = 4;
284dfc7d99Sopenharmony_ciconst static int32_t PARAMETERS_NUM_KILL_PROCESS_PROCESSNAME = 5;
294dfc7d99Sopenharmony_ciconst static int32_t PARAMETERS_NUM_REPORT_DATA = 6;
304dfc7d99Sopenharmony_ciconst static int32_t PARAMETERS_NUM_REQUEST_TEST = 5;
314dfc7d99Sopenharmony_ciconst static int32_t PID_INDEX = 3;
324dfc7d99Sopenharmony_ciconst static int32_t RES_TYPE_INDEX = 4;
334dfc7d99Sopenharmony_ciconst static int32_t UID_INDEX = 2;
344dfc7d99Sopenharmony_ciconst static int32_t VALUE_INDEX = 5;
354dfc7d99Sopenharmony_ciconst static int32_t REQUEST_COUNT_INDEX = 2;
364dfc7d99Sopenharmony_ciconst static int32_t REQUEST_TIME_INDEX = 3;
374dfc7d99Sopenharmony_ciconst static int32_t REQUEST_UID_INDEX = 4;
384dfc7d99Sopenharmony_ciconst static int32_t DEFAULT_TYPE = 1;
394dfc7d99Sopenharmony_ciconst static int32_t DEFAULT_VALUE = 1;
404dfc7d99Sopenharmony_ci
414dfc7d99Sopenharmony_cistatic void MockProcess(int32_t uid)
424dfc7d99Sopenharmony_ci{
434dfc7d99Sopenharmony_ci    static const char *perms[] = {
444dfc7d99Sopenharmony_ci        "ohos.permission.DISTRIBUTED_DATASYNC",
454dfc7d99Sopenharmony_ci        "ohos.permission.REPORT_RESOURCE_SCHEDULE_EVENT"
464dfc7d99Sopenharmony_ci    };
474dfc7d99Sopenharmony_ci    uint64_t tokenId;
484dfc7d99Sopenharmony_ci    NativeTokenInfoParams infoInstance = {
494dfc7d99Sopenharmony_ci        .dcapsNum = 0,
504dfc7d99Sopenharmony_ci        .permsNum = sizeof(perms) / sizeof(perms[0]),
514dfc7d99Sopenharmony_ci        .aclsNum = 0,
524dfc7d99Sopenharmony_ci        .dcaps = nullptr,
534dfc7d99Sopenharmony_ci        .perms = perms,
544dfc7d99Sopenharmony_ci        .acls = nullptr,
554dfc7d99Sopenharmony_ci        .processName = "samgr",
564dfc7d99Sopenharmony_ci        .aplStr = "system_core",
574dfc7d99Sopenharmony_ci    };
584dfc7d99Sopenharmony_ci    tokenId = GetAccessTokenId(&infoInstance);
594dfc7d99Sopenharmony_ci    SetSelfTokenID(tokenId);
604dfc7d99Sopenharmony_ci    setuid(uid);
614dfc7d99Sopenharmony_ci    OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
624dfc7d99Sopenharmony_ci}
634dfc7d99Sopenharmony_ci
644dfc7d99Sopenharmony_cistatic int64_t GetNowTime()
654dfc7d99Sopenharmony_ci{
664dfc7d99Sopenharmony_ci    time_t now;
674dfc7d99Sopenharmony_ci    (void)time(&now);
684dfc7d99Sopenharmony_ci    if (static_cast<int64_t>(now) < 0) {
694dfc7d99Sopenharmony_ci        std::cout << "Get now time error " << std::endl;
704dfc7d99Sopenharmony_ci        return 0;
714dfc7d99Sopenharmony_ci    }
724dfc7d99Sopenharmony_ci    auto tarEndTimePoint = std::chrono::system_clock::from_time_t(now);
734dfc7d99Sopenharmony_ci    auto tarDuration = std::chrono::duration_cast<std::chrono::microseconds>(tarEndTimePoint.time_since_epoch());
744dfc7d99Sopenharmony_ci    int64_t tarDate = tarDuration.count();
754dfc7d99Sopenharmony_ci    if (tarDate < 0) {
764dfc7d99Sopenharmony_ci        std::cout << "tarDuration is less than 0 " << std::endl;
774dfc7d99Sopenharmony_ci        return -1;
784dfc7d99Sopenharmony_ci    }
794dfc7d99Sopenharmony_ci    return static_cast<int64_t>(tarDate);
804dfc7d99Sopenharmony_ci}
814dfc7d99Sopenharmony_ci
824dfc7d99Sopenharmony_cistatic void KillProcess(int32_t argc, char *argv[])
834dfc7d99Sopenharmony_ci{
844dfc7d99Sopenharmony_ci    if (argc < PARAMETERS_NUM_MIN_KILL_PROCESS) {
854dfc7d99Sopenharmony_ci        return;
864dfc7d99Sopenharmony_ci    }
874dfc7d99Sopenharmony_ci    int32_t uid = atoi(argv[PARAMETERS_NUM_MIN]);
884dfc7d99Sopenharmony_ci    MockProcess(uid);
894dfc7d99Sopenharmony_ci    std::unordered_map<std::string, std::string> mapPayload;
904dfc7d99Sopenharmony_ci    mapPayload["pid"] = argv[PARAMETERS_NUM_MIN_KILL_PROCESS - 1];
914dfc7d99Sopenharmony_ci    if (argc >= PARAMETERS_NUM_KILL_PROCESS_PROCESSNAME) {
924dfc7d99Sopenharmony_ci        mapPayload["processName"] = argv[PARAMETERS_NUM_KILL_PROCESS_PROCESSNAME - 1];
934dfc7d99Sopenharmony_ci    }
944dfc7d99Sopenharmony_ci    int32_t res = OHOS::ResourceSchedule::ResSchedClient::GetInstance().KillProcess(mapPayload);
954dfc7d99Sopenharmony_ci    std::cout << "kill result:" << res << std::endl;
964dfc7d99Sopenharmony_ci}
974dfc7d99Sopenharmony_ci
984dfc7d99Sopenharmony_cistatic void ReportData(int32_t argc, char *argv[])
994dfc7d99Sopenharmony_ci{
1004dfc7d99Sopenharmony_ci    if (argc != PARAMETERS_NUM_REPORT_DATA) {
1014dfc7d99Sopenharmony_ci        return;
1024dfc7d99Sopenharmony_ci    }
1034dfc7d99Sopenharmony_ci    int32_t uid = atoi(argv[UID_INDEX]);
1044dfc7d99Sopenharmony_ci    MockProcess(uid);
1054dfc7d99Sopenharmony_ci    int32_t pid = atoi(argv[PID_INDEX]);
1064dfc7d99Sopenharmony_ci    int32_t resType = atoi(argv[RES_TYPE_INDEX]);
1074dfc7d99Sopenharmony_ci    int32_t value = atoi(argv[VALUE_INDEX]);
1084dfc7d99Sopenharmony_ci    std::unordered_map<std::string, std::string> mapPayload;
1094dfc7d99Sopenharmony_ci    mapPayload["uid"] = uid;
1104dfc7d99Sopenharmony_ci    mapPayload["pid"] = pid;
1114dfc7d99Sopenharmony_ci    OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(resType, value, mapPayload);
1124dfc7d99Sopenharmony_ci    std::cout << "success passing on pid = " << pid << std::endl;
1134dfc7d99Sopenharmony_ci}
1144dfc7d99Sopenharmony_ci
1154dfc7d99Sopenharmony_cistatic void RequestTest(int32_t argc, char *argv[])
1164dfc7d99Sopenharmony_ci{
1174dfc7d99Sopenharmony_ci    if (argc != PARAMETERS_NUM_REQUEST_TEST) {
1184dfc7d99Sopenharmony_ci        return;
1194dfc7d99Sopenharmony_ci    }
1204dfc7d99Sopenharmony_ci    int32_t requestCount = atoi(argv[REQUEST_COUNT_INDEX]);
1214dfc7d99Sopenharmony_ci    int32_t requestTime = atoi(argv[REQUEST_TIME_INDEX]);
1224dfc7d99Sopenharmony_ci    int32_t uid = atoi(argv[REQUEST_UID_INDEX]);
1234dfc7d99Sopenharmony_ci    MockProcess(uid);
1244dfc7d99Sopenharmony_ci    std::unordered_map<std::string, std::string> mapPayload;
1254dfc7d99Sopenharmony_ci    int64_t startTime = GetNowTime();
1264dfc7d99Sopenharmony_ci    int32_t count = 0;
1274dfc7d99Sopenharmony_ci    while (count < requestCount && GetNowTime() -startTime < requestTime) {
1284dfc7d99Sopenharmony_ci        count++;
1294dfc7d99Sopenharmony_ci        OHOS::ResourceSchedule::ResSchedClient::GetInstance().ReportData(DEFAULT_TYPE, DEFAULT_VALUE, mapPayload);
1304dfc7d99Sopenharmony_ci    }
1314dfc7d99Sopenharmony_ci    std::cout << "success RequestTest " << uid << std::endl;
1324dfc7d99Sopenharmony_ci}
1334dfc7d99Sopenharmony_ci
1344dfc7d99Sopenharmony_ciint32_t main(int32_t argc, char *argv[])
1354dfc7d99Sopenharmony_ci{
1364dfc7d99Sopenharmony_ci    if (!(argc >= PARAMETERS_NUM_MIN && argv)) {
1374dfc7d99Sopenharmony_ci        std::cout << "error parameters";
1384dfc7d99Sopenharmony_ci        return 0;
1394dfc7d99Sopenharmony_ci    }
1404dfc7d99Sopenharmony_ci    char* function = argv[1];
1414dfc7d99Sopenharmony_ci    if (strcmp(function, "KillProcess") == 0) {
1424dfc7d99Sopenharmony_ci        KillProcess(argc, argv);
1434dfc7d99Sopenharmony_ci    } else if (strcmp(function, "ReportData") == 0) {
1444dfc7d99Sopenharmony_ci        ReportData(argc, argv);
1454dfc7d99Sopenharmony_ci    } else if (strcmp(function, "RequestTest") == 0) {
1464dfc7d99Sopenharmony_ci        RequestTest(argc, argv);
1474dfc7d99Sopenharmony_ci    } else {
1484dfc7d99Sopenharmony_ci        std::cout << "error parameters";
1494dfc7d99Sopenharmony_ci    }
1504dfc7d99Sopenharmony_ci    return 0;
1514dfc7d99Sopenharmony_ci}