1d9f0492fSopenharmony_ci/*
2d9f0492fSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3d9f0492fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4d9f0492fSopenharmony_ci * you may not use this file except in compliance with the License.
5d9f0492fSopenharmony_ci * You may obtain a copy of the License at
6d9f0492fSopenharmony_ci *
7d9f0492fSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8d9f0492fSopenharmony_ci *
9d9f0492fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10d9f0492fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11d9f0492fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d9f0492fSopenharmony_ci * See the License for the specific language governing permissions and
13d9f0492fSopenharmony_ci * limitations under the License.
14d9f0492fSopenharmony_ci */
15d9f0492fSopenharmony_ci
16d9f0492fSopenharmony_ci#include "test_utils.h"
17d9f0492fSopenharmony_ci
18d9f0492fSopenharmony_ci#include <iostream>
19d9f0492fSopenharmony_ci#include <map>
20d9f0492fSopenharmony_ci#include <string>
21d9f0492fSopenharmony_ci#include <vector>
22d9f0492fSopenharmony_ci#include <list>
23d9f0492fSopenharmony_ci#include <thread>
24d9f0492fSopenharmony_ci#include <memory>
25d9f0492fSopenharmony_ci#include <fcntl.h>
26d9f0492fSopenharmony_ci#include <cerrno>
27d9f0492fSopenharmony_ci#include <sys/stat.h>
28d9f0492fSopenharmony_ci
29d9f0492fSopenharmony_ci#include "parameters.h"
30d9f0492fSopenharmony_ci#include "service_control.h"
31d9f0492fSopenharmony_ci
32d9f0492fSopenharmony_cinamespace initModuleTest {
33d9f0492fSopenharmony_cinamespace {
34d9f0492fSopenharmony_ciconstexpr size_t MAX_BUFFER_SIZE = 4096;
35d9f0492fSopenharmony_ci}
36d9f0492fSopenharmony_ci
37d9f0492fSopenharmony_ci// File operator
38d9f0492fSopenharmony_ciint ReadFileContent(const std::string &fileName, std::string &content)
39d9f0492fSopenharmony_ci{
40d9f0492fSopenharmony_ci    content.clear();
41d9f0492fSopenharmony_ci    auto fp = std::unique_ptr<FILE, decltype(&fclose)>(fopen(fileName.c_str(), "r"), fclose);
42d9f0492fSopenharmony_ci    if (fp == nullptr) {
43d9f0492fSopenharmony_ci        std::cout << "Cannot open file " << fileName << std::endl;
44d9f0492fSopenharmony_ci        return -1;
45d9f0492fSopenharmony_ci    }
46d9f0492fSopenharmony_ci
47d9f0492fSopenharmony_ci    struct stat st {};
48d9f0492fSopenharmony_ci    if (stat(fileName.c_str(), &st) < 0) {
49d9f0492fSopenharmony_ci        std::cout <<  "Cannot get " << fileName << " stat\n";
50d9f0492fSopenharmony_ci        return -1;
51d9f0492fSopenharmony_ci    }
52d9f0492fSopenharmony_ci
53d9f0492fSopenharmony_ci    ssize_t n = 0;
54d9f0492fSopenharmony_ci    char buffer[MAX_BUFFER_SIZE] = {};
55d9f0492fSopenharmony_ci    while ((n = fread(buffer, 1, MAX_BUFFER_SIZE, fp.get())) > 0) {
56d9f0492fSopenharmony_ci            content.append(buffer, n);
57d9f0492fSopenharmony_ci    }
58d9f0492fSopenharmony_ci    return feof(fp.get()) ? 0 : -1;
59d9f0492fSopenharmony_ci}
60d9f0492fSopenharmony_ci
61d9f0492fSopenharmony_cibool StartsWith(const std::string &str, const std::string &prefix)
62d9f0492fSopenharmony_ci{
63d9f0492fSopenharmony_ci    return ((str.size() > prefix.size()) && (str.substr(0, prefix.size()) == prefix));
64d9f0492fSopenharmony_ci}
65d9f0492fSopenharmony_ci
66d9f0492fSopenharmony_cibool EndsWith(const std::string &str, const std::string &suffix)
67d9f0492fSopenharmony_ci{
68d9f0492fSopenharmony_ci    return ((str.size() > suffix.size()) && (str.substr(str.size() - suffix.size(), suffix.size()) == suffix));
69d9f0492fSopenharmony_ci}
70d9f0492fSopenharmony_ci
71d9f0492fSopenharmony_cistd::string Trim(const std::string &str)
72d9f0492fSopenharmony_ci{
73d9f0492fSopenharmony_ci    size_t start = 0;
74d9f0492fSopenharmony_ci    size_t end = str.size() - 1;
75d9f0492fSopenharmony_ci
76d9f0492fSopenharmony_ci    while (start < str.size()) {
77d9f0492fSopenharmony_ci        if (!isspace(str[start])) {
78d9f0492fSopenharmony_ci            break;
79d9f0492fSopenharmony_ci        }
80d9f0492fSopenharmony_ci        start++;
81d9f0492fSopenharmony_ci    }
82d9f0492fSopenharmony_ci
83d9f0492fSopenharmony_ci    while (start < end) {
84d9f0492fSopenharmony_ci        if (!isspace(str[end])) {
85d9f0492fSopenharmony_ci            break;
86d9f0492fSopenharmony_ci        }
87d9f0492fSopenharmony_ci        end--;
88d9f0492fSopenharmony_ci    }
89d9f0492fSopenharmony_ci
90d9f0492fSopenharmony_ci    if (end < start) {
91d9f0492fSopenharmony_ci        return "";
92d9f0492fSopenharmony_ci    }
93d9f0492fSopenharmony_ci
94d9f0492fSopenharmony_ci    return str.substr(start, end - start + 1);
95d9f0492fSopenharmony_ci}
96d9f0492fSopenharmony_ci
97d9f0492fSopenharmony_cistd::vector<std::string> Split(const std::string &str, const std::string &pattern)
98d9f0492fSopenharmony_ci{
99d9f0492fSopenharmony_ci    std::vector<std::string> result {};
100d9f0492fSopenharmony_ci    size_t pos = std::string::npos;
101d9f0492fSopenharmony_ci    size_t start = 0;
102d9f0492fSopenharmony_ci    while (true) {
103d9f0492fSopenharmony_ci        pos = str.find_first_of(pattern, start);
104d9f0492fSopenharmony_ci        result.push_back(str.substr(start, pos - start));
105d9f0492fSopenharmony_ci        if (pos == std::string::npos) {
106d9f0492fSopenharmony_ci            break;
107d9f0492fSopenharmony_ci        }
108d9f0492fSopenharmony_ci        start = pos + 1;
109d9f0492fSopenharmony_ci    }
110d9f0492fSopenharmony_ci    return result;
111d9f0492fSopenharmony_ci}
112d9f0492fSopenharmony_ci
113d9f0492fSopenharmony_cistatic std::map<ServiceStatus, std::string> g_serviceStatusMap = {
114d9f0492fSopenharmony_ci    { SERVICE_IDLE, "idle"},
115d9f0492fSopenharmony_ci    { SERVICE_STARTING, "starting"},
116d9f0492fSopenharmony_ci    { SERVICE_STARTED, "running"},
117d9f0492fSopenharmony_ci    { SERVICE_READY, "ready"},
118d9f0492fSopenharmony_ci    { SERVICE_STOPPING, "stopping"},
119d9f0492fSopenharmony_ci    { SERVICE_STOPPED, "stopped"},
120d9f0492fSopenharmony_ci    { SERVICE_ERROR, "error" },
121d9f0492fSopenharmony_ci    { SERVICE_SUSPENDED, "suspended" },
122d9f0492fSopenharmony_ci    { SERVICE_FREEZED, "freezed" },
123d9f0492fSopenharmony_ci    { SERVICE_DISABLED, "disabled" },
124d9f0492fSopenharmony_ci    { SERVICE_CRITICAL, "critical" },
125d9f0492fSopenharmony_ci};
126d9f0492fSopenharmony_ci
127d9f0492fSopenharmony_cistatic inline bool ValidStatus(ServiceStatus status)
128d9f0492fSopenharmony_ci{
129d9f0492fSopenharmony_ci    return status >= SERVICE_IDLE && status <= SERVICE_CRITICAL;
130d9f0492fSopenharmony_ci}
131d9f0492fSopenharmony_ci
132d9f0492fSopenharmony_cistd::string GetServiceStatus(const std::string &serviceName)
133d9f0492fSopenharmony_ci{
134d9f0492fSopenharmony_ci    if (serviceName.empty()) {
135d9f0492fSopenharmony_ci        return "";
136d9f0492fSopenharmony_ci    }
137d9f0492fSopenharmony_ci    const std::string serviceCtlPrefix = "startup.service.ctl.";
138d9f0492fSopenharmony_ci    const std::string serviceCtlName = serviceCtlPrefix + serviceName;
139d9f0492fSopenharmony_ci    uint32_t ret = OHOS::system::GetUintParameter<uint32_t>(serviceCtlName, 0);
140d9f0492fSopenharmony_ci    ServiceStatus status = static_cast<ServiceStatus>(ret);
141d9f0492fSopenharmony_ci    if (!ValidStatus(status)) {
142d9f0492fSopenharmony_ci        return "";
143d9f0492fSopenharmony_ci    }
144d9f0492fSopenharmony_ci    return g_serviceStatusMap[status];
145d9f0492fSopenharmony_ci}
146d9f0492fSopenharmony_ci
147d9f0492fSopenharmony_ci} // initModuleTest
148