aboutsummaryrefslogtreecommitdiff
path: root/lldb/unittests/Process/Linux/ProcfsTests.cpp
blob: 534e3e132ec6263736f27b1fdc9f406e23dc7b16 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//===-- ProcfsTests.cpp ---------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "Procfs.h"

#include "lldb/Host/linux/Support.h"
#include "lldb/Host/posix/Support.h"

#include "gmock/gmock.h"
#include "gtest/gtest.h"

using namespace lldb_private;
using namespace process_linux;
using namespace llvm;

TEST(Perf, HardcodedLogicalCoreIDs) {
  Expected<std::vector<lldb::cpu_id_t>> cpu_ids =
      GetAvailableLogicalCoreIDs(R"(processor       : 13
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
stepping        : 4
microcode       : 0x2000065
cpu MHz         : 2886.370
cache size      : 28160 KB
physical id     : 1
siblings        : 40
core id         : 19
cpu cores       : 20
apicid          : 103
initial apicid  : 103
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
power management:

processor       : 24
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
stepping        : 4
microcode       : 0x2000065
cpu MHz         : 2768.494
cache size      : 28160 KB
physical id     : 1
siblings        : 40
core id         : 20
cpu cores       : 20
apicid          : 105
power management:

processor       : 35
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
stepping        : 4
microcode       : 0x2000065
cpu MHz         : 2884.703
cache size      : 28160 KB
physical id     : 1
siblings        : 40
core id         : 24
cpu cores       : 20
apicid          : 113

processor       : 79
vendor_id       : GenuineIntel
cpu family      : 6
model           : 85
model name      : Intel(R) Xeon(R) Gold 6138 CPU @ 2.00GHz
stepping        : 4
microcode       : 0x2000065
cpu MHz         : 3073.955
cache size      : 28160 KB
physical id     : 1
siblings        : 40
core id         : 28
cpu cores       : 20
apicid          : 121
power management:
)");

  ASSERT_TRUE((bool)cpu_ids);
  ASSERT_THAT(*cpu_ids, ::testing::ElementsAre(13, 24, 35, 79));
}

TEST(Perf, RealLogicalCoreIDs) {
  // We first check we can read /proc/cpuinfo
  auto buffer_or_error = errorOrToExpected(getProcFile("cpuinfo"));
  if (!buffer_or_error)
    GTEST_SKIP() << toString(buffer_or_error.takeError());

  // At this point we shouldn't fail parsing the core ids
  Expected<ArrayRef<lldb::cpu_id_t>> cpu_ids = GetAvailableLogicalCoreIDs();
  ASSERT_TRUE((bool)cpu_ids);
  ASSERT_GT((int)cpu_ids->size(), 0) << "We must see at least one core";
}

TEST(Perf, RealPtraceScopeWhenExist) {
  // We first check we can read /proc/sys/kernel/yama/ptrace_scope
  auto buffer_or_error =
      errorOrToExpected(getProcFile("sys/kernel/yama/ptrace_scope"));
  if (!buffer_or_error)
    GTEST_SKIP() << toString(buffer_or_error.takeError());

  // At this point we shouldn't fail parsing the ptrace_scope value.
  Expected<int> ptrace_scope = GetPtraceScope();
  ASSERT_TRUE((bool)ptrace_scope) << ptrace_scope.takeError();
  ASSERT_GE(*ptrace_scope, 0)
      << "Sensible values of ptrace_scope are between 0 and 3";
  ASSERT_LE(*ptrace_scope, 3)
      << "Sensible values of ptrace_scope are between 0 and 3";
}

TEST(Perf, RealPtraceScopeWhenNotExist) {
  // We first check we can NOT read /proc/sys/kernel/yama/ptrace_scope
  auto buffer_or_error =
      errorOrToExpected(getProcFile("sys/kernel/yama/ptrace_scope"));
  if (buffer_or_error)
    GTEST_SKIP() << "In order for this test to run, "
                    "/proc/sys/kernel/yama/ptrace_scope should not exist";
  consumeError(buffer_or_error.takeError());

  // At this point we should fail parsing the ptrace_scope value.
  Expected<int> ptrace_scope = GetPtraceScope();
  ASSERT_FALSE((bool)ptrace_scope);
  consumeError(ptrace_scope.takeError());
}

#ifdef LLVM_ENABLE_THREADING
TEST(Support, getProcFile_Tid) {
  auto BufferOrError = getProcFile(getpid(), llvm::get_threadid(), "comm");
  ASSERT_TRUE(BufferOrError);
  ASSERT_TRUE(*BufferOrError);
}
#endif /*ifdef LLVM_ENABLE_THREADING */