xref: /llvm-project/lldb/unittests/Host/linux/HostTest.cpp (revision 8f74725731bf431fb97929e1dd962e9a0db20865)
180814287SRaphael Isemann //===-- HostTest.cpp ------------------------------------------------------===//
27e437f8fSPavel Labath //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67e437f8fSPavel Labath //
77e437f8fSPavel Labath //===----------------------------------------------------------------------===//
87e437f8fSPavel Labath 
97e437f8fSPavel Labath #include "lldb/Host/Host.h"
108f3be7a3SJonas Devlieghere #include "lldb/Host/FileSystem.h"
117e437f8fSPavel Labath #include "lldb/Host/HostInfo.h"
12bc9b106aSPavel Labath #include "lldb/Utility/ProcessInfo.h"
137e437f8fSPavel Labath #include "gtest/gtest.h"
147e437f8fSPavel Labath 
15*8f747257SFred Grim #include <cerrno>
16*8f747257SFred Grim #include <sys/resource.h>
17*8f747257SFred Grim 
187e437f8fSPavel Labath using namespace lldb_private;
197e437f8fSPavel Labath 
207e437f8fSPavel Labath namespace {
217e437f8fSPavel Labath class HostTest : public testing::Test {
227e437f8fSPavel Labath public:
SetUpTestCase()238f3be7a3SJonas Devlieghere   static void SetUpTestCase() {
248f3be7a3SJonas Devlieghere     FileSystem::Initialize();
258f3be7a3SJonas Devlieghere     HostInfo::Initialize();
268f3be7a3SJonas Devlieghere   }
TearDownTestCase()278f3be7a3SJonas Devlieghere   static void TearDownTestCase() {
288f3be7a3SJonas Devlieghere     HostInfo::Terminate();
298f3be7a3SJonas Devlieghere     FileSystem::Terminate();
308f3be7a3SJonas Devlieghere   }
317e437f8fSPavel Labath };
327e437f8fSPavel Labath } // namespace
337e437f8fSPavel Labath 
TEST_F(HostTest,GetProcessInfo)347e437f8fSPavel Labath TEST_F(HostTest, GetProcessInfo) {
3546810790SFred Grim   llvm::Triple triple = HostInfo::GetTargetTriple();
3646810790SFred Grim 
3746810790SFred Grim   ASSERT_TRUE(
3846810790SFred Grim       (triple.getOS() == llvm::Triple::OSType::Linux) ||
3946810790SFred Grim       (triple.hasEnvironment() &&
4046810790SFred Grim        triple.getEnvironment() == llvm::Triple::EnvironmentType::Android));
4146810790SFred Grim 
427e437f8fSPavel Labath   ProcessInstanceInfo Info;
437e437f8fSPavel Labath   ASSERT_FALSE(Host::GetProcessInfo(0, Info));
447e437f8fSPavel Labath 
457e437f8fSPavel Labath   ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));
467e437f8fSPavel Labath 
477e437f8fSPavel Labath   ASSERT_TRUE(Info.ProcessIDIsValid());
487e437f8fSPavel Labath   EXPECT_EQ(lldb::pid_t(getpid()), Info.GetProcessID());
497e437f8fSPavel Labath 
507e437f8fSPavel Labath   ASSERT_TRUE(Info.ParentProcessIDIsValid());
517e437f8fSPavel Labath   EXPECT_EQ(lldb::pid_t(getppid()), Info.GetParentProcessID());
527e437f8fSPavel Labath 
5346810790SFred Grim   ASSERT_TRUE(Info.ProcessGroupIDIsValid());
5446810790SFred Grim   EXPECT_EQ(lldb::pid_t(getpgrp()), Info.GetProcessGroupID());
5546810790SFred Grim 
5646810790SFred Grim   ASSERT_TRUE(Info.ProcessSessionIDIsValid());
5746810790SFred Grim   EXPECT_EQ(lldb::pid_t(getsid(getpid())), Info.GetProcessSessionID());
5846810790SFred Grim 
597e437f8fSPavel Labath   ASSERT_TRUE(Info.EffectiveUserIDIsValid());
607e437f8fSPavel Labath   EXPECT_EQ(geteuid(), Info.GetEffectiveUserID());
617e437f8fSPavel Labath 
627e437f8fSPavel Labath   ASSERT_TRUE(Info.EffectiveGroupIDIsValid());
637e437f8fSPavel Labath   EXPECT_EQ(getegid(), Info.GetEffectiveGroupID());
647e437f8fSPavel Labath 
657e437f8fSPavel Labath   ASSERT_TRUE(Info.UserIDIsValid());
667e437f8fSPavel Labath   EXPECT_EQ(geteuid(), Info.GetUserID());
677e437f8fSPavel Labath 
687e437f8fSPavel Labath   ASSERT_TRUE(Info.GroupIDIsValid());
697e437f8fSPavel Labath   EXPECT_EQ(getegid(), Info.GetGroupID());
7036e82208SPavel Labath 
7136e82208SPavel Labath   EXPECT_TRUE(Info.GetArchitecture().IsValid());
7236e82208SPavel Labath   EXPECT_EQ(HostInfo::GetArchitecture(HostInfo::eArchKindDefault),
7336e82208SPavel Labath             Info.GetArchitecture());
7446810790SFred Grim   // Test timings
75a5c4f969SFred Grim   // In some sense this is a pretty trivial test. What it is trying to
76a5c4f969SFred Grim   // accomplish is just to validate that these values are never decreasing
77a5c4f969SFred Grim   // which would be unambiguously wrong. We can not reliably show them
78a5c4f969SFred Grim   // to be always increasing because the microsecond granularity means that,
79a5c4f969SFred Grim   // with hardware variations the number of loop iterations need to always
80a5c4f969SFred Grim   // be increasing for faster and faster machines.
8146810790SFred Grim   ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));
8246810790SFred Grim   ProcessInstanceInfo::timespec user_time = Info.GetUserTime();
8398427264SFred Grim   static volatile unsigned u = 0;
8446810790SFred Grim   for (unsigned i = 0; i < 10'000'000; i++) {
85a5c4f969SFred Grim     u += i;
8646810790SFred Grim   }
87a5c4f969SFred Grim   ASSERT_TRUE(u > 0);
8846810790SFred Grim   ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));
8946810790SFred Grim   ProcessInstanceInfo::timespec next_user_time = Info.GetUserTime();
90a5c4f969SFred Grim   ASSERT_TRUE(user_time.tv_sec <= next_user_time.tv_sec ||
91a5c4f969SFred Grim               user_time.tv_usec <= next_user_time.tv_usec);
92*8f747257SFred Grim 
93*8f747257SFred Grim   struct rlimit rlim;
94*8f747257SFred Grim   EXPECT_EQ(getrlimit(RLIMIT_NICE, &rlim), 0);
95*8f747257SFred Grim   // getpriority can return -1 so we zero errno first
96*8f747257SFred Grim   errno = 0;
97*8f747257SFred Grim   int prio = getpriority(PRIO_PROCESS, PRIO_PROCESS);
98*8f747257SFred Grim   ASSERT_TRUE((prio < 0 && errno == 0) || prio >= 0);
99*8f747257SFred Grim   ASSERT_EQ(Info.GetPriorityValue(), prio);
100*8f747257SFred Grim   // If we can't raise our nice level then this test can't be performed.
101*8f747257SFred Grim   int max_incr = PRIO_MAX - rlim.rlim_cur;
102*8f747257SFred Grim   if (max_incr < prio) {
103*8f747257SFred Grim     EXPECT_EQ(setpriority(PRIO_PROCESS, PRIO_PROCESS, prio - 1), 0);
104*8f747257SFred Grim     ASSERT_TRUE(Host::GetProcessInfo(getpid(), Info));
105*8f747257SFred Grim     ASSERT_TRUE(Info.GetPriorityValue().has_value());
106*8f747257SFred Grim     ASSERT_EQ(Info.GetPriorityValue().value(), prio - 1);
107*8f747257SFred Grim     EXPECT_EQ(setpriority(PRIO_PROCESS, PRIO_PROCESS, prio), 0);
108*8f747257SFred Grim   }
109*8f747257SFred Grim   ASSERT_TRUE(Info.IsZombie().has_value());
110*8f747257SFred Grim   ASSERT_FALSE(Info.IsZombie().value());
1117e437f8fSPavel Labath }
112