137a09cd7Sopenharmony_ci/*
237a09cd7Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
337a09cd7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
437a09cd7Sopenharmony_ci * you may not use this file except in compliance with the License.
537a09cd7Sopenharmony_ci * You may obtain a copy of the License at
637a09cd7Sopenharmony_ci *
737a09cd7Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
837a09cd7Sopenharmony_ci *
937a09cd7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
1037a09cd7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
1137a09cd7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1237a09cd7Sopenharmony_ci * See the License for the specific language governing permissions and
1337a09cd7Sopenharmony_ci * limitations under the License.
1437a09cd7Sopenharmony_ci */
1537a09cd7Sopenharmony_ci
1637a09cd7Sopenharmony_ci#include "thermal_test.h"
1737a09cd7Sopenharmony_ci
1837a09cd7Sopenharmony_ci#include <cstdio>
1937a09cd7Sopenharmony_ci#include <cstdlib>
2037a09cd7Sopenharmony_ci#include <dirent.h>
2137a09cd7Sopenharmony_ci#include <fcntl.h>
2237a09cd7Sopenharmony_ci#include <fstream>
2337a09cd7Sopenharmony_ci#include <securec.h>
2437a09cd7Sopenharmony_ci#include <sys/stat.h>
2537a09cd7Sopenharmony_ci
2637a09cd7Sopenharmony_ci#include "errors.h"
2737a09cd7Sopenharmony_ci#include "string_ex.h"
2837a09cd7Sopenharmony_ci#include "thermal_log.h"
2937a09cd7Sopenharmony_ci
3037a09cd7Sopenharmony_ciusing namespace testing::ext;
3137a09cd7Sopenharmony_ciusing namespace OHOS;
3237a09cd7Sopenharmony_ciusing namespace std;
3337a09cd7Sopenharmony_ci
3437a09cd7Sopenharmony_cinamespace OHOS {
3537a09cd7Sopenharmony_cinamespace PowerMgr {
3637a09cd7Sopenharmony_ciint32_t ThermalTest::WriteFile(std::string path, std::string buf)
3737a09cd7Sopenharmony_ci{
3837a09cd7Sopenharmony_ci    FILE *fp = fopen(path.c_str(), "w+");
3937a09cd7Sopenharmony_ci    if (fp == nullptr) {
4037a09cd7Sopenharmony_ci        return ERR_INVALID_VALUE;
4137a09cd7Sopenharmony_ci    }
4237a09cd7Sopenharmony_ci    size_t num = fwrite(buf.c_str(), sizeof(char), buf.length(), fp);
4337a09cd7Sopenharmony_ci    if (num != buf.length()) {
4437a09cd7Sopenharmony_ci        THERMAL_HILOGD(COMP_SVC, "Failed to fwrite %{public}s, num=%{public}zu", path.c_str(), num);
4537a09cd7Sopenharmony_ci        fclose(fp);
4637a09cd7Sopenharmony_ci        return ERR_INVALID_OPERATION;
4737a09cd7Sopenharmony_ci    }
4837a09cd7Sopenharmony_ci    fclose(fp);
4937a09cd7Sopenharmony_ci    return ERR_OK;
5037a09cd7Sopenharmony_ci}
5137a09cd7Sopenharmony_ci
5237a09cd7Sopenharmony_ciint32_t ThermalTest::ReadFile(std::string path, std::string& buf)
5337a09cd7Sopenharmony_ci{
5437a09cd7Sopenharmony_ci    std::ifstream input(path);
5537a09cd7Sopenharmony_ci    if (!input.is_open()) {
5637a09cd7Sopenharmony_ci        return ERR_INVALID_VALUE;
5737a09cd7Sopenharmony_ci    }
5837a09cd7Sopenharmony_ci    getline(input, buf);
5937a09cd7Sopenharmony_ci    input.close();
6037a09cd7Sopenharmony_ci    return ERR_OK;
6137a09cd7Sopenharmony_ci}
6237a09cd7Sopenharmony_ci
6337a09cd7Sopenharmony_ciint32_t ThermalTest::ConvertInt(const std::string& value)
6437a09cd7Sopenharmony_ci{
6537a09cd7Sopenharmony_ci    int32_t result = -1;
6637a09cd7Sopenharmony_ci    StrToInt(value, result);
6737a09cd7Sopenharmony_ci    return result;
6837a09cd7Sopenharmony_ci}
6937a09cd7Sopenharmony_ci
7037a09cd7Sopenharmony_ciint32_t ThermalTest::InitNode()
7137a09cd7Sopenharmony_ci{
7237a09cd7Sopenharmony_ci    char bufTemp[MAX_PATH] = {0};
7337a09cd7Sopenharmony_ci    int32_t ret = -1;
7437a09cd7Sopenharmony_ci    std::map<std::string, int32_t> sensor;
7537a09cd7Sopenharmony_ci    sensor["battery"] = 0;
7637a09cd7Sopenharmony_ci    sensor["charger"] = 0;
7737a09cd7Sopenharmony_ci    sensor["pa"] = 0;
7837a09cd7Sopenharmony_ci    sensor["ap"] = 0;
7937a09cd7Sopenharmony_ci    sensor["ambient"] = 0;
8037a09cd7Sopenharmony_ci    sensor["cpu"] = 0;
8137a09cd7Sopenharmony_ci    sensor["soc"] = 0;
8237a09cd7Sopenharmony_ci    sensor["shell"] = 0;
8337a09cd7Sopenharmony_ci    for (auto iter : sensor) {
8437a09cd7Sopenharmony_ci        ret = snprintf_s(bufTemp, MAX_PATH, sizeof(bufTemp) - 1, SIMULATION_TEMP_DIR, iter.first.c_str());
8537a09cd7Sopenharmony_ci        if (ret < EOK) {
8637a09cd7Sopenharmony_ci            return ret;
8737a09cd7Sopenharmony_ci        }
8837a09cd7Sopenharmony_ci        std::string temp = std::to_string(iter.second);
8937a09cd7Sopenharmony_ci        WriteFile(bufTemp, temp);
9037a09cd7Sopenharmony_ci    }
9137a09cd7Sopenharmony_ci    return ERR_OK;
9237a09cd7Sopenharmony_ci}
9337a09cd7Sopenharmony_ci
9437a09cd7Sopenharmony_cibool ThermalTest::IsMock(const std::string& path)
9537a09cd7Sopenharmony_ci{
9637a09cd7Sopenharmony_ci    struct stat pathStat;
9737a09cd7Sopenharmony_ci    int32_t ret = stat(path.c_str(), &pathStat);
9837a09cd7Sopenharmony_ci    if (ret != 0) {
9937a09cd7Sopenharmony_ci        return false;
10037a09cd7Sopenharmony_ci    }
10137a09cd7Sopenharmony_ci    if (S_ISREG(pathStat.st_mode)) {
10237a09cd7Sopenharmony_ci        return true;
10337a09cd7Sopenharmony_ci    }
10437a09cd7Sopenharmony_ci    if (!S_ISDIR(pathStat.st_mode)) {
10537a09cd7Sopenharmony_ci        return false;
10637a09cd7Sopenharmony_ci    }
10737a09cd7Sopenharmony_ci    DIR* dir = opendir(path.c_str());
10837a09cd7Sopenharmony_ci    if (dir == nullptr) {
10937a09cd7Sopenharmony_ci        return false;
11037a09cd7Sopenharmony_ci    }
11137a09cd7Sopenharmony_ci    struct dirent* ptr = nullptr;
11237a09cd7Sopenharmony_ci    while ((ptr = readdir(dir)) != nullptr) {
11337a09cd7Sopenharmony_ci        if (strcmp(".", ptr->d_name) != 0 && strcmp("..", ptr->d_name) != 0) {
11437a09cd7Sopenharmony_ci            closedir(dir);
11537a09cd7Sopenharmony_ci            return true;
11637a09cd7Sopenharmony_ci        }
11737a09cd7Sopenharmony_ci    }
11837a09cd7Sopenharmony_ci    closedir(dir);
11937a09cd7Sopenharmony_ci    return false;
12037a09cd7Sopenharmony_ci}
12137a09cd7Sopenharmony_ci
12237a09cd7Sopenharmony_cibool ThermalTest::IsVendor()
12337a09cd7Sopenharmony_ci{
12437a09cd7Sopenharmony_ci    if (access(VENDOR_CONFIG.c_str(), 0) != 0) {
12537a09cd7Sopenharmony_ci        return false;
12637a09cd7Sopenharmony_ci    }
12737a09cd7Sopenharmony_ci    return true;
12837a09cd7Sopenharmony_ci}
12937a09cd7Sopenharmony_ci
13037a09cd7Sopenharmony_cistd::string ThermalTest::GetNodeValue(const std::string& path)
13137a09cd7Sopenharmony_ci{
13237a09cd7Sopenharmony_ci    std::string value {};
13337a09cd7Sopenharmony_ci    int32_t ret = ThermalTest::ReadFile(path, value);
13437a09cd7Sopenharmony_ci    EXPECT_EQ(true, ret == ERR_OK);
13537a09cd7Sopenharmony_ci    return value;
13637a09cd7Sopenharmony_ci}
13737a09cd7Sopenharmony_ci
13837a09cd7Sopenharmony_ciint32_t ThermalTest::SetNodeValue(int32_t value, const std::string& path)
13937a09cd7Sopenharmony_ci{
14037a09cd7Sopenharmony_ci    std::string sValue = to_string(value);
14137a09cd7Sopenharmony_ci    int32_t ret = ThermalTest::WriteFile(path, sValue);
14237a09cd7Sopenharmony_ci    EXPECT_EQ(true, ret == ERR_OK);
14337a09cd7Sopenharmony_ci    return ret;
14437a09cd7Sopenharmony_ci}
14537a09cd7Sopenharmony_ci
14637a09cd7Sopenharmony_ciint32_t ThermalTest::SetNodeString(std::string str, const std::string& path)
14737a09cd7Sopenharmony_ci{
14837a09cd7Sopenharmony_ci    int32_t ret = ThermalTest::WriteFile(path, str);
14937a09cd7Sopenharmony_ci    EXPECT_EQ(true, ret == ERR_OK);
15037a09cd7Sopenharmony_ci    return ret;
15137a09cd7Sopenharmony_ci}
15237a09cd7Sopenharmony_ci} // namespace PowerMgr
15337a09cd7Sopenharmony_ci} // namespace OHOS
154