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
24 using namespace OHOS::HiviewDFX;
25 using namespace testing::ext;
26 using namespace std;
27
28 namespace OHOS {
29 namespace HiviewDFX {
30 class ProcinfoTest : public testing::Test {
31 public:
SetUpTestCase(void)32 static void SetUpTestCase(void) {}
TearDownTestCase(void)33 static void TearDownTestCase(void) {}
SetUp()34 void SetUp() {}
TearDown()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 */
HWTEST_F(ProcinfoTest, ProcinfoTest001, TestSize.Level2)45 HWTEST_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 */
HWTEST_F(ProcinfoTest, ProcinfoTest002, TestSize.Level2)59 HWTEST_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 */
HWTEST_F(ProcinfoTest, ProcinfoTest003, TestSize.Level2)72 HWTEST_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 */
HWTEST_F(ProcinfoTest, ProcinfoTest004, TestSize.Level2)96 HWTEST_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 */
HWTEST_F(ProcinfoTest, ProcinfoTest005, TestSize.Level2)110 HWTEST_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