brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 7135f26 Raw
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