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