1/*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include <gtest/gtest.h>
17#include <ctime>
18#include <securec.h>
19#include <string>
20#include <vector>
21#include "dfx_util.h"
22#include "procinfo.h"
23
24using namespace OHOS::HiviewDFX;
25using namespace testing::ext;
26using namespace std;
27
28namespace OHOS {
29namespace HiviewDFX {
30class ProcinfoTest : public testing::Test {
31public:
32    static void SetUpTestCase(void) {}
33    static void TearDownTestCase(void) {}
34    void SetUp() {}
35    void TearDown() {}
36};
37} // namespace HiviewDFX
38} // namespace OHOS
39
40/**
41 * @tc.name: ProcinfoTest001
42 * @tc.desc: test GetProcStatus
43 * @tc.type: FUNC
44 */
45HWTEST_F(ProcinfoTest, ProcinfoTest001, TestSize.Level2)
46{
47    GTEST_LOG_(INFO) << "ProcinfoTest001: start.";
48    ProcInfo procInfo;
49    ASSERT_TRUE(GetProcStatus(procInfo));
50    ASSERT_EQ(getpid(), procInfo.pid);
51    GTEST_LOG_(INFO) << "ProcinfoTest001: end.";
52}
53
54/**
55 * @tc.name: ProcinfoTest002
56 * @tc.desc: test GetTidsByPidWithFunc
57 * @tc.type: FUNC
58 */
59HWTEST_F(ProcinfoTest, ProcinfoTest002, TestSize.Level2)
60{
61    GTEST_LOG_(INFO) << "ProcinfoTest002: start.";
62    std::vector<int> tids;
63    ASSERT_TRUE(GetTidsByPidWithFunc(getpid(), tids, nullptr));
64    GTEST_LOG_(INFO) << "ProcinfoTest002: end.";
65}
66
67/**
68 * @tc.name: ProcinfoTest003
69 * @tc.desc: test GetProcStatusByPid, GetTidsByPid, IsThreadInPid
70 * @tc.type: FUNC
71 */
72HWTEST_F(ProcinfoTest, ProcinfoTest003, TestSize.Level2)
73{
74    GTEST_LOG_(INFO) << "ProcinfoTest003: start.";
75    struct ProcInfo procInfo;
76    ASSERT_TRUE(GetProcStatusByPid(getpid(), procInfo));
77    std::vector<int> tids;
78    std::vector<int> nstids;
79    ASSERT_TRUE(GetTidsByPid(getpid(), tids, nstids));
80    for (size_t i = 0; i < nstids.size(); ++i) {
81        ASSERT_TRUE(IsThreadInPid(getpid(), nstids[i]));
82        if (procInfo.ns) {
83            int nstid = tids[i];
84            TidToNstid(getpid(), tids[i], nstid);
85            ASSERT_EQ(nstid, nstids[i]);
86        }
87    }
88    GTEST_LOG_(INFO) << "ProcinfoTest003: end.";
89}
90
91/**
92 * @tc.name: ProcinfoTest004
93 * @tc.desc: test TidToNstid
94 * @tc.type: FUNC
95 */
96HWTEST_F(ProcinfoTest, ProcinfoTest004, TestSize.Level2)
97{
98    GTEST_LOG_(INFO) << "ProcinfoTest004: start.";
99    int nstid = -1;
100    ASSERT_TRUE(TidToNstid(getpid(), gettid(), nstid));
101    ASSERT_EQ(gettid(), nstid);
102    GTEST_LOG_(INFO) << "ProcinfoTest004: end.";
103}
104
105/**
106 * @tc.name: ProcinfoTest005
107 * @tc.desc: test ReadProcessStatus, ReadProcessWchan, ReadThreadWchan, ReadProcessName, ReadThreadName
108 * @tc.type: FUNC
109 */
110HWTEST_F(ProcinfoTest, ProcinfoTest005, TestSize.Level2)
111{
112    GTEST_LOG_(INFO) << "ProcinfoTest005: start.";
113    std::string result;
114    ReadProcessStatus(result, getpid());
115    GTEST_LOG_(INFO) << result;
116    ASSERT_TRUE(result.find("Name:") != std::string::npos);
117    ASSERT_TRUE(result.find("SigQ:") != std::string::npos);
118    ASSERT_TRUE(result.find("nonvoluntary_ctxt_switches") != std::string::npos);
119    ReadProcessWchan(result, getpid(), false, true);
120    GTEST_LOG_(INFO) << result;
121    ASSERT_TRUE(result.find("Process wchan:") != std::string::npos);
122    ReadThreadWchan(result, gettid(), true);
123    GTEST_LOG_(INFO) << result;
124    ASSERT_TRUE(result.find("Tid:") != std::string::npos);
125    ASSERT_TRUE(result.find("wchan:") != std::string::npos);
126    ReadProcessName(getpid(), result);
127    GTEST_LOG_(INFO) << result;
128    ASSERT_TRUE(result.find("test_procinfo") != std::string::npos);
129    ReadThreadName(getpid(), result);
130    GTEST_LOG_(INFO) << result;
131    ASSERT_TRUE(result.find("test_procinfo") != std::string::npos);
132    ReadThreadNameByPidAndTid(getpid(), gettid(), result);
133    GTEST_LOG_(INFO) << result;
134    ASSERT_TRUE(result.find("test_procinfo") != std::string::npos);
135    GTEST_LOG_(INFO) << "ProcinfoTest005: end.";
136}
137