129 lines · cpp
1//===-- HostTest.cpp ------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/Host/Host.h"10#include "lldb/Host/FileSystem.h"11#include "lldb/Host/HostInfo.h"12#include "lldb/Utility/ProcessInfo.h"13#include "gtest/gtest.h"14 15#include <cerrno>16#include <sys/resource.h>17 18using namespace lldb_private;19 20namespace {21class HostTest : public testing::Test {22public:23 static void SetUpTestCase() {24 FileSystem::Initialize();25 HostInfo::Initialize();26 }27 static void TearDownTestCase() {28 HostInfo::Terminate();29 FileSystem::Terminate();30 }31};32} // namespace33 34TEST_F(HostTest, GetProcessInfo) {35 ProcessInstanceInfo Info;36 37 ASSERT_FALSE(Host::GetProcessInfo(LLDB_INVALID_PROCESS_ID, Info));38 39 ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));40 41 EXPECT_TRUE(Info.ProcessIDIsValid());42 EXPECT_EQ(lldb::pid_t(getpid()), Info.GetProcessID());43 44 EXPECT_TRUE(Info.ParentProcessIDIsValid());45 EXPECT_EQ(lldb::pid_t(getppid()), Info.GetParentProcessID());46 47 // Not currently set on apple systems.48#ifndef __APPLE__49 EXPECT_TRUE(Info.ProcessGroupIDIsValid());50 EXPECT_EQ(lldb::pid_t(getpgrp()), Info.GetProcessGroupID());51 52 EXPECT_TRUE(Info.ProcessSessionIDIsValid());53 EXPECT_EQ(lldb::pid_t(getsid(getpid())), Info.GetProcessSessionID());54#endif55 56 EXPECT_TRUE(Info.EffectiveUserIDIsValid());57 EXPECT_EQ(geteuid(), Info.GetEffectiveUserID());58 59 EXPECT_TRUE(Info.EffectiveGroupIDIsValid());60 EXPECT_EQ(getegid(), Info.GetEffectiveGroupID());61 62 EXPECT_TRUE(Info.UserIDIsValid());63 EXPECT_EQ(geteuid(), Info.GetUserID());64 65 EXPECT_TRUE(Info.GroupIDIsValid());66 EXPECT_EQ(getegid(), Info.GetGroupID());67 68 // Unexpected value on Apple x86_6469#ifndef __APPLE__70 EXPECT_TRUE(Info.GetArchitecture().IsValid());71 EXPECT_EQ(HostInfo::GetArchitecture(HostInfo::eArchKindDefault),72 Info.GetArchitecture());73#endif74 75 // Test timings76 // In some sense this is a pretty trivial test. What it is trying to77 // accomplish is just to validate that these values are never decreasing78 // which would be unambiguously wrong. We can not reliably show them79 // to be always increasing because the microsecond granularity means that,80 // with hardware variations the number of loop iterations need to always81 // be increasing for faster and faster machines.82 ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));83 ProcessInstanceInfo::timespec user_time = Info.GetUserTime();84 static volatile unsigned u = 0;85 for (unsigned i = 0; i < 10'000'000; i++) {86 u += i;87 }88 ASSERT_TRUE(u > 0);89 ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));90 ProcessInstanceInfo::timespec next_user_time = Info.GetUserTime();91 ASSERT_TRUE(user_time.tv_sec <= next_user_time.tv_sec ||92 user_time.tv_usec <= next_user_time.tv_usec);93}94 95// Only linux currently sets these.96#ifdef __linux__97TEST_F(HostTest, GetProcessInfoSetsPriority) {98 ProcessInstanceInfo Info;99 struct rlimit rlim;100 EXPECT_EQ(getrlimit(RLIMIT_NICE, &rlim), 0);101 // getpriority can return -1 so we zero errno first102 errno = 0;103 int prio = getpriority(PRIO_PROCESS, 0);104 ASSERT_TRUE((prio < 0 && errno == 0) || prio >= 0);105 ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));106 ASSERT_EQ(Info.GetPriorityValue(), prio);107 // If we can't raise our nice level then this test can't be performed.108 int max_incr = PRIO_MAX - rlim.rlim_cur;109 if (max_incr < prio) {110 EXPECT_EQ(setpriority(PRIO_PROCESS, PRIO_PROCESS, prio - 1), 0);111 ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));112 ASSERT_TRUE(Info.GetPriorityValue().has_value());113 ASSERT_EQ(Info.GetPriorityValue().value(), prio - 1);114 EXPECT_EQ(setpriority(PRIO_PROCESS, PRIO_PROCESS, prio), 0);115 }116 ASSERT_TRUE(Info.IsZombie().has_value());117 ASSERT_FALSE(Info.IsZombie().value());118 119 const llvm::VersionTuple host_version = HostInfo::GetOSVersion();120 ASSERT_FALSE(host_version.empty());121 if (host_version >= llvm::VersionTuple(4, 15, 0)) {122 ASSERT_TRUE(Info.IsCoreDumping().has_value());123 ASSERT_FALSE(Info.IsCoreDumping().value());124 } else {125 ASSERT_FALSE(Info.IsCoreDumping().has_value());126 }127}128#endif129