blob: cae8956d6c618e052b0c49977db1300ab40fda24 [file] [log] [blame]
Sandeep Patila60a7762018-08-29 17:10:47 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Christopher Ferris1952d362019-07-12 14:25:48 -070017#include <sys/mman.h>
Sandeep Patila60a7762018-08-29 17:10:47 -070018#include <sys/types.h>
19#include <sys/wait.h>
20#include <unistd.h>
21
22#include <gtest/gtest.h>
23
Hridya Valsaraju7d1343d2021-02-09 21:48:24 -080024#include <filesystem>
Sandeep Patila60a7762018-08-29 17:10:47 -070025#include <string>
26#include <vector>
27
28#include <meminfo/pageacct.h>
29#include <meminfo/procmeminfo.h>
30#include <meminfo/sysmeminfo.h>
Suren Baghdasaryancf0afe02021-02-02 09:26:38 -080031#include <vintf/VintfObject.h>
Sandeep Patila60a7762018-08-29 17:10:47 -070032
33#include <android-base/file.h>
34#include <android-base/logging.h>
Suren Baghdasaryancf0afe02021-02-02 09:26:38 -080035#include <android-base/properties.h>
Sandeep Patil76a34f02018-12-29 14:34:20 -080036#include <android-base/stringprintf.h>
Christopher Ferris4922fea2019-09-18 10:30:33 -070037#include <android-base/strings.h>
Sandeep Patila60a7762018-08-29 17:10:47 -070038
39using namespace std;
40using namespace android::meminfo;
Suren Baghdasaryancf0afe02021-02-02 09:26:38 -080041using android::vintf::KernelVersion;
42using android::vintf::RuntimeInfo;
43using android::vintf::VintfObject;
Sandeep Patila60a7762018-08-29 17:10:47 -070044
Hridya Valsaraju7d1343d2021-02-09 21:48:24 -080045namespace fs = std::filesystem;
46
Sandeep Patila60a7762018-08-29 17:10:47 -070047pid_t pid = -1;
48
Sandeep Patil65914302019-01-28 15:05:27 -080049TEST(ProcMemInfo, TestWorkingTestReset) {
Sandeep Patila60a7762018-08-29 17:10:47 -070050 // Expect reset to succeed
Sandeep Patile3015042018-11-19 15:25:18 -080051 EXPECT_TRUE(ProcMemInfo::ResetWorkingSet(pid));
Sandeep Patila60a7762018-08-29 17:10:47 -070052}
53
Sandeep Patil65914302019-01-28 15:05:27 -080054TEST(ProcMemInfo, UsageEmpty) {
Sandeep Patil82409b12018-11-20 09:31:36 -080055 // If we created the object for getting working set,
56 // the usage must be empty
57 ProcMemInfo proc_mem(pid, true);
58 const MemUsage& usage = proc_mem.Usage();
59 EXPECT_EQ(usage.rss, 0);
60 EXPECT_EQ(usage.vss, 0);
61 EXPECT_EQ(usage.pss, 0);
62 EXPECT_EQ(usage.uss, 0);
63 EXPECT_EQ(usage.swap, 0);
64}
65
Sandeep Patil65914302019-01-28 15:05:27 -080066TEST(ProcMemInfo, MapsNotEmpty) {
67 // Make sure the process maps are never empty
68 ProcMemInfo proc_mem(pid);
69 const std::vector<Vma>& maps = proc_mem.Maps();
70 EXPECT_FALSE(maps.empty());
71}
72
Christopher Ferris1952d362019-07-12 14:25:48 -070073TEST(ProcMemInfo, MapsUsageNotEmpty) {
74 ProcMemInfo proc_mem(pid);
75 const std::vector<Vma>& maps = proc_mem.Maps();
76 EXPECT_FALSE(maps.empty());
77 uint64_t total_pss = 0;
78 uint64_t total_rss = 0;
79 uint64_t total_uss = 0;
80 for (auto& map : maps) {
81 ASSERT_NE(0, map.usage.vss);
82 total_rss += map.usage.rss;
83 total_pss += map.usage.pss;
84 total_uss += map.usage.uss;
85 }
86
87 // Crude check that stats are actually being read.
88 EXPECT_NE(0, total_rss) << "RSS zero for all maps, that is not possible.";
89 EXPECT_NE(0, total_pss) << "PSS zero for all maps, that is not possible.";
90 EXPECT_NE(0, total_uss) << "USS zero for all maps, that is not possible.";
91}
92
93TEST(ProcMemInfo, MapsUsageEmpty) {
94 ProcMemInfo proc_mem(pid);
95 const std::vector<Vma>& maps = proc_mem.MapsWithoutUsageStats();
96 EXPECT_FALSE(maps.empty());
97 // Verify that all usage stats are zero in every map.
98 for (auto& map : maps) {
99 ASSERT_EQ(0, map.usage.vss);
100 ASSERT_EQ(0, map.usage.rss);
101 ASSERT_EQ(0, map.usage.pss);
102 ASSERT_EQ(0, map.usage.uss);
103 ASSERT_EQ(0, map.usage.swap);
104 ASSERT_EQ(0, map.usage.swap_pss);
105 ASSERT_EQ(0, map.usage.private_clean);
106 ASSERT_EQ(0, map.usage.private_dirty);
107 ASSERT_EQ(0, map.usage.shared_clean);
108 ASSERT_EQ(0, map.usage.shared_dirty);
109 }
110}
111
Christopher Ferrisd9897c52019-10-10 13:25:00 -0700112TEST(ProcMemInfo, MapsUsageFillInLater) {
113 ProcMemInfo proc_mem(pid);
114 const std::vector<Vma>& maps = proc_mem.MapsWithoutUsageStats();
115 EXPECT_FALSE(maps.empty());
116 for (auto& map : maps) {
117 Vma update_map(map);
118 ASSERT_EQ(map.start, update_map.start);
119 ASSERT_EQ(map.end, update_map.end);
120 ASSERT_EQ(map.offset, update_map.offset);
121 ASSERT_EQ(map.flags, update_map.flags);
122 ASSERT_EQ(map.name, update_map.name);
123 ASSERT_EQ(0, update_map.usage.vss);
124 ASSERT_EQ(0, update_map.usage.rss);
125 ASSERT_EQ(0, update_map.usage.pss);
126 ASSERT_EQ(0, update_map.usage.uss);
127 ASSERT_EQ(0, update_map.usage.swap);
128 ASSERT_EQ(0, update_map.usage.swap_pss);
129 ASSERT_EQ(0, update_map.usage.private_clean);
130 ASSERT_EQ(0, update_map.usage.private_dirty);
131 ASSERT_EQ(0, update_map.usage.shared_clean);
132 ASSERT_EQ(0, update_map.usage.shared_dirty);
133 ASSERT_TRUE(proc_mem.FillInVmaStats(update_map));
134 // Check that at least one usage stat was updated.
135 ASSERT_NE(0, update_map.usage.vss);
136 }
137}
138
Kevin Jeon0aba2eb2022-06-09 17:43:14 +0000139TEST(ProcMemInfo, MapsUsageFillInAll) {
140 ProcMemInfo proc_mem(pid);
141 const std::vector<Vma>& maps = proc_mem.MapsWithoutUsageStats();
142 EXPECT_FALSE(maps.empty());
143 for (auto& map : maps) {
144 ASSERT_EQ(0, map.usage.vss);
145 ASSERT_EQ(0, map.usage.rss);
146 ASSERT_EQ(0, map.usage.pss);
147 ASSERT_EQ(0, map.usage.uss);
148 ASSERT_EQ(0, map.usage.swap);
149 ASSERT_EQ(0, map.usage.swap_pss);
150 ASSERT_EQ(0, map.usage.private_clean);
151 ASSERT_EQ(0, map.usage.private_dirty);
152 ASSERT_EQ(0, map.usage.shared_clean);
153 ASSERT_EQ(0, map.usage.shared_dirty);
154 }
155 // GetUsageStats' non-default parameter get_wss is false by default in
156 // ProcMemInfo's constructor.
157 ASSERT_TRUE(proc_mem.GetUsageStats(false));
158 for (auto& map : maps) {
159 // Check that at least one usage stat was updated.
160 ASSERT_NE(0, map.usage.vss);
161 }
162}
163
Christopher Ferris1952d362019-07-12 14:25:48 -0700164TEST(ProcMemInfo, PageMapPresent) {
165 static constexpr size_t kNumPages = 20;
166 size_t pagesize = getpagesize();
167 void* ptr = mmap(nullptr, pagesize * (kNumPages + 2), PROT_READ | PROT_WRITE,
168 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
169 ASSERT_NE(MAP_FAILED, ptr);
170
171 // Unmap the first page and the last page so that we guarantee this
172 // map is in a map by itself.
173 ASSERT_EQ(0, munmap(ptr, pagesize));
174 uintptr_t addr = reinterpret_cast<uintptr_t>(ptr) + pagesize;
175 ASSERT_EQ(0, munmap(reinterpret_cast<void*>(addr + kNumPages * pagesize), pagesize));
176
177 ProcMemInfo proc_mem(getpid());
178 const std::vector<Vma>& maps = proc_mem.MapsWithoutUsageStats();
179 ASSERT_FALSE(maps.empty());
180
181 // Find the vma associated with our previously created map.
182 const Vma* test_vma = nullptr;
183 for (const Vma& vma : maps) {
184 if (vma.start == addr) {
185 test_vma = &vma;
186 break;
187 }
188 }
189 ASSERT_TRUE(test_vma != nullptr) << "Cannot find test map.";
190
191 // Verify that none of the pages are listed as present.
192 std::vector<uint64_t> pagemap;
193 ASSERT_TRUE(proc_mem.PageMap(*test_vma, &pagemap));
194 ASSERT_EQ(kNumPages, pagemap.size());
195 for (size_t i = 0; i < pagemap.size(); i++) {
196 EXPECT_FALSE(android::meminfo::page_present(pagemap[i]))
197 << "Page " << i << " is present and it should not be.";
198 }
199
200 // Make some of the pages present and verify that we see them
201 // as present.
202 uint8_t* data = reinterpret_cast<uint8_t*>(addr);
203 data[0] = 1;
204 data[pagesize * 5] = 1;
205 data[pagesize * 11] = 1;
206
207 ASSERT_TRUE(proc_mem.PageMap(*test_vma, &pagemap));
208 ASSERT_EQ(kNumPages, pagemap.size());
209 for (size_t i = 0; i < pagemap.size(); i++) {
210 if (i == 0 || i == 5 || i == 11) {
211 EXPECT_TRUE(android::meminfo::page_present(pagemap[i]))
212 << "Page " << i << " is not present and it should be.";
213 } else {
214 EXPECT_FALSE(android::meminfo::page_present(pagemap[i]))
215 << "Page " << i << " is present and it should not be.";
216 }
217 }
218
219 ASSERT_EQ(0, munmap(reinterpret_cast<void*>(addr), kNumPages * pagesize));
220}
221
Sandeep Patil65914302019-01-28 15:05:27 -0800222TEST(ProcMemInfo, WssEmpty) {
Sandeep Patil82409b12018-11-20 09:31:36 -0800223 // If we created the object for getting usage,
224 // the working set must be empty
225 ProcMemInfo proc_mem(pid, false);
226 const MemUsage& wss = proc_mem.Wss();
227 EXPECT_EQ(wss.rss, 0);
228 EXPECT_EQ(wss.vss, 0);
229 EXPECT_EQ(wss.pss, 0);
230 EXPECT_EQ(wss.uss, 0);
231 EXPECT_EQ(wss.swap, 0);
232}
233
Sandeep Patil65914302019-01-28 15:05:27 -0800234TEST(ProcMemInfo, SwapOffsetsEmpty) {
Sandeep Patil82409b12018-11-20 09:31:36 -0800235 // If we created the object for getting working set,
236 // the swap offsets must be empty
237 ProcMemInfo proc_mem(pid, true);
Vic Yang100426f2020-01-06 21:52:50 -0800238 const std::vector<uint64_t>& swap_offsets = proc_mem.SwapOffsets();
Sandeep Patil82409b12018-11-20 09:31:36 -0800239 EXPECT_EQ(swap_offsets.size(), 0);
240}
241
Sandeep Patil65914302019-01-28 15:05:27 -0800242TEST(ProcMemInfo, IsSmapsSupportedTest) {
Tim Murray422e9a22021-02-24 14:54:34 -0800243 // Check if /proc/self/smaps_rollup exists using the API.
244 bool supported = IsSmapsRollupSupported();
245 EXPECT_EQ(!access("/proc/self/smaps_rollup", F_OK | R_OK), supported);
Sandeep Patil8ab02fa2019-01-13 17:39:08 -0800246}
247
Sandeep Patil65914302019-01-28 15:05:27 -0800248TEST(ProcMemInfo, SmapsOrRollupTest) {
249 // Make sure we can parse 'smaps_rollup' correctly
Sandeep Patila5e9d6b2018-12-29 21:05:38 -0800250 std::string rollup =
251 R"rollup(12c00000-7fe859e000 ---p 00000000 00:00 0 [rollup]
252Rss: 331908 kB
253Pss: 202052 kB
254Shared_Clean: 158492 kB
255Shared_Dirty: 18928 kB
256Private_Clean: 90472 kB
257Private_Dirty: 64016 kB
258Referenced: 318700 kB
259Anonymous: 81984 kB
260AnonHugePages: 0 kB
261Shared_Hugetlb: 0 kB
262Private_Hugetlb: 0 kB
263Swap: 5344 kB
264SwapPss: 442 kB
265Locked: 1523537 kB)rollup";
266
267 TemporaryFile tf;
268 ASSERT_TRUE(tf.fd != -1);
269 ASSERT_TRUE(::android::base::WriteStringToFd(rollup, tf.fd));
270
271 MemUsage stats;
272 ASSERT_EQ(SmapsOrRollupFromFile(tf.path, &stats), true);
273 EXPECT_EQ(stats.rss, 331908);
274 EXPECT_EQ(stats.pss, 202052);
275 EXPECT_EQ(stats.uss, 154488);
276 EXPECT_EQ(stats.private_clean, 90472);
277 EXPECT_EQ(stats.private_dirty, 64016);
278 EXPECT_EQ(stats.swap_pss, 442);
279}
280
Sandeep Patil65914302019-01-28 15:05:27 -0800281TEST(ProcMemInfo, SmapsOrRollupSmapsTest) {
282 // Make sure /proc/<pid>/smaps is parsed correctly
Sandeep Patila5e9d6b2018-12-29 21:05:38 -0800283 std::string smaps =
284 R"smaps(12c00000-13440000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)]
285Name: [anon:dalvik-main space (region space)]
286Size: 8448 kB
287KernelPageSize: 4 kB
288MMUPageSize: 4 kB
289Rss: 2652 kB
290Pss: 2652 kB
291Shared_Clean: 840 kB
292Shared_Dirty: 40 kB
293Private_Clean: 84 kB
294Private_Dirty: 2652 kB
295Referenced: 2652 kB
296Anonymous: 2652 kB
297AnonHugePages: 0 kB
298ShmemPmdMapped: 0 kB
299Shared_Hugetlb: 0 kB
300Private_Hugetlb: 0 kB
301Swap: 102 kB
302SwapPss: 70 kB
303Locked: 2652 kB
304VmFlags: rd wr mr mw me ac
305)smaps";
306
307 TemporaryFile tf;
308 ASSERT_TRUE(tf.fd != -1);
309 ASSERT_TRUE(::android::base::WriteStringToFd(smaps, tf.fd));
310
311 MemUsage stats;
312 ASSERT_EQ(SmapsOrRollupFromFile(tf.path, &stats), true);
313 EXPECT_EQ(stats.rss, 2652);
314 EXPECT_EQ(stats.pss, 2652);
315 EXPECT_EQ(stats.uss, 2736);
316 EXPECT_EQ(stats.private_clean, 84);
317 EXPECT_EQ(stats.private_dirty, 2652);
318 EXPECT_EQ(stats.swap_pss, 70);
319}
320
Sandeep Patil65914302019-01-28 15:05:27 -0800321TEST(ProcMemInfo, SmapsOrRollupPssRollupTest) {
322 // Make sure /proc/<pid>/smaps is parsed correctly
323 // to get the PSS
Sandeep Patil33ecfae2019-01-13 16:47:20 -0800324 std::string smaps =
325 R"smaps(12c00000-13440000 rw-p 00000000 00:00 0 [anon:dalvik-main space (region space)]
326Name: [anon:dalvik-main space (region space)]
327Size: 8448 kB
328KernelPageSize: 4 kB
329MMUPageSize: 4 kB
330Rss: 2652 kB
331Pss: 2652 kB
332Shared_Clean: 840 kB
333Shared_Dirty: 40 kB
334Private_Clean: 84 kB
335Private_Dirty: 2652 kB
336Referenced: 2652 kB
337Anonymous: 2652 kB
338AnonHugePages: 0 kB
339ShmemPmdMapped: 0 kB
340Shared_Hugetlb: 0 kB
341Private_Hugetlb: 0 kB
342Swap: 102 kB
343SwapPss: 70 kB
344Locked: 2652 kB
345VmFlags: rd wr mr mw me ac
346)smaps";
347
348 TemporaryFile tf;
349 ASSERT_TRUE(tf.fd != -1);
350 ASSERT_TRUE(::android::base::WriteStringToFd(smaps, tf.fd));
351
352 uint64_t pss;
353 ASSERT_EQ(SmapsOrRollupPssFromFile(tf.path, &pss), true);
354 EXPECT_EQ(pss, 2652);
355}
356
Sandeep Patil65914302019-01-28 15:05:27 -0800357TEST(ProcMemInfo, SmapsOrRollupPssSmapsTest) {
358 // Correctly parse smaps file to gather pss
Sandeep Patil33ecfae2019-01-13 16:47:20 -0800359 std::string exec_dir = ::android::base::GetExecutableDirectory();
360 std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str());
361
362 uint64_t pss;
363 ASSERT_EQ(SmapsOrRollupPssFromFile(path, &pss), true);
364 EXPECT_EQ(pss, 19119);
365}
366
Kevin Jeon0f208eb2023-08-25 15:26:02 -0400367TEST(ProcMemInfo, StatusVmRSSTest) {
368 std::string exec_dir = ::android::base::GetExecutableDirectory();
369 std::string path = ::android::base::StringPrintf("%s/testdata1/status", exec_dir.c_str());
370
371 uint64_t rss;
372 ASSERT_EQ(StatusVmRSSFromFile(path, &rss), true);
373 EXPECT_EQ(rss, 730764);
374}
375
376TEST(ProcMemInfo, StatusVmRSSBogusFileTest) {
377 std::string exec_dir = ::android::base::GetExecutableDirectory();
378 std::string path = ::android::base::StringPrintf("%s/testdata1/smaps", exec_dir.c_str());
379
380 uint64_t rss;
381 ASSERT_EQ(StatusVmRSSFromFile(path, &rss), false);
382}
383
Kevin Jeondfc18042022-06-30 17:31:44 +0000384TEST(ProcMemInfo, ForEachExistingVmaTest) {
385 std::string exec_dir = ::android::base::GetExecutableDirectory();
386 std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str());
387 ProcMemInfo proc_mem(pid);
388 // Populate maps_.
389 proc_mem.Smaps(path);
390 std::vector<Vma> vmas;
391 auto collect_vmas = [&](const Vma& v) { vmas.push_back(v); };
392 EXPECT_TRUE(proc_mem.ForEachExistingVma(collect_vmas));
393
394 // The size of vmas is not checked because Smaps() will return 5 vmas on x86
395 // and 6 vmas otherwise, as [vsyscall] is not processed on x86.
396
397 // Expect values to be equal to what we have in testdata1/smaps_short
398 // Check for names
399 EXPECT_EQ(vmas[0].name, "[anon:dalvik-zygote-jit-code-cache]");
400 EXPECT_EQ(vmas[1].name, "/system/framework/x86_64/boot-framework.art");
401 EXPECT_TRUE(vmas[2].name == "[anon:libc_malloc]" ||
402 android::base::StartsWith(vmas[2].name, "[anon:scudo:"))
403 << "Unknown map name " << vmas[2].name;
404 EXPECT_EQ(vmas[3].name, "/system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex");
405 EXPECT_EQ(vmas[4].name, "/system/lib64/libhwui.so");
406
407 // Check start address
408 EXPECT_EQ(vmas[0].start, 0x54c00000);
409 EXPECT_EQ(vmas[1].start, 0x701ea000);
410 EXPECT_EQ(vmas[2].start, 0x70074dd8d000);
411 EXPECT_EQ(vmas[3].start, 0x700755a2d000);
412 EXPECT_EQ(vmas[4].start, 0x7007f85b0000);
413
414 // Check end address
415 EXPECT_EQ(vmas[0].end, 0x56c00000);
416 EXPECT_EQ(vmas[1].end, 0x70cdb000);
417 EXPECT_EQ(vmas[2].end, 0x70074ee0d000);
418 EXPECT_EQ(vmas[3].end, 0x700755a6e000);
419 EXPECT_EQ(vmas[4].end, 0x7007f8b9b000);
420
421 // Check Flags
422 EXPECT_EQ(vmas[0].flags, PROT_READ | PROT_EXEC);
423 EXPECT_EQ(vmas[1].flags, PROT_READ | PROT_WRITE);
424 EXPECT_EQ(vmas[2].flags, PROT_READ | PROT_WRITE);
425 EXPECT_EQ(vmas[3].flags, PROT_READ | PROT_EXEC);
426 EXPECT_EQ(vmas[4].flags, PROT_READ | PROT_EXEC);
427
428 // Check Shared
429 EXPECT_FALSE(vmas[0].is_shared);
430 EXPECT_FALSE(vmas[1].is_shared);
431 EXPECT_FALSE(vmas[2].is_shared);
432 EXPECT_FALSE(vmas[3].is_shared);
433 EXPECT_FALSE(vmas[4].is_shared);
434
435 // Check Offset
436 EXPECT_EQ(vmas[0].offset, 0x0);
437 EXPECT_EQ(vmas[1].offset, 0x0);
438 EXPECT_EQ(vmas[2].offset, 0x0);
439 EXPECT_EQ(vmas[3].offset, 0x00016000);
440 EXPECT_EQ(vmas[4].offset, 0x001ee000);
441
442 // Check Inode
443 EXPECT_EQ(vmas[0].inode, 0);
444 EXPECT_EQ(vmas[1].inode, 3165);
445 EXPECT_EQ(vmas[2].inode, 0);
446 EXPECT_EQ(vmas[3].inode, 1947);
447 EXPECT_EQ(vmas[4].inode, 1537);
448
449 // Check smaps specific fields
450 ASSERT_EQ(vmas[0].usage.vss, 32768);
451 EXPECT_EQ(vmas[1].usage.vss, 11204);
452 EXPECT_EQ(vmas[2].usage.vss, 16896);
453 EXPECT_EQ(vmas[3].usage.vss, 260);
454 EXPECT_EQ(vmas[4].usage.vss, 6060);
455
456 EXPECT_EQ(vmas[0].usage.rss, 2048);
457 EXPECT_EQ(vmas[1].usage.rss, 11188);
458 EXPECT_EQ(vmas[2].usage.rss, 15272);
459 EXPECT_EQ(vmas[3].usage.rss, 260);
460 EXPECT_EQ(vmas[4].usage.rss, 4132);
461
462 EXPECT_EQ(vmas[0].usage.pss, 113);
463 EXPECT_EQ(vmas[1].usage.pss, 2200);
464 EXPECT_EQ(vmas[2].usage.pss, 15272);
465 EXPECT_EQ(vmas[3].usage.pss, 260);
466 EXPECT_EQ(vmas[4].usage.pss, 1274);
467
468 EXPECT_EQ(vmas[0].usage.uss, 0);
469 EXPECT_EQ(vmas[1].usage.uss, 1660);
470 EXPECT_EQ(vmas[2].usage.uss, 15272);
471 EXPECT_EQ(vmas[3].usage.uss, 260);
472 EXPECT_EQ(vmas[4].usage.uss, 0);
473
474 EXPECT_EQ(vmas[0].usage.private_clean, 0);
475 EXPECT_EQ(vmas[1].usage.private_clean, 0);
476 EXPECT_EQ(vmas[2].usage.private_clean, 0);
477 EXPECT_EQ(vmas[3].usage.private_clean, 260);
478 EXPECT_EQ(vmas[4].usage.private_clean, 0);
479
480 EXPECT_EQ(vmas[0].usage.private_dirty, 0);
481 EXPECT_EQ(vmas[1].usage.private_dirty, 1660);
482 EXPECT_EQ(vmas[2].usage.private_dirty, 15272);
483 EXPECT_EQ(vmas[3].usage.private_dirty, 0);
484 EXPECT_EQ(vmas[4].usage.private_dirty, 0);
485
486 EXPECT_EQ(vmas[0].usage.shared_clean, 0);
487 EXPECT_EQ(vmas[1].usage.shared_clean, 80);
488 EXPECT_EQ(vmas[2].usage.shared_clean, 0);
489 EXPECT_EQ(vmas[3].usage.shared_clean, 0);
490 EXPECT_EQ(vmas[4].usage.shared_clean, 4132);
491
492 EXPECT_EQ(vmas[0].usage.shared_dirty, 2048);
493 EXPECT_EQ(vmas[1].usage.shared_dirty, 9448);
494 EXPECT_EQ(vmas[2].usage.shared_dirty, 0);
495 EXPECT_EQ(vmas[3].usage.shared_dirty, 0);
496 EXPECT_EQ(vmas[4].usage.shared_dirty, 0);
497
498 EXPECT_EQ(vmas[0].usage.swap, 0);
499 EXPECT_EQ(vmas[1].usage.swap, 0);
500 EXPECT_EQ(vmas[2].usage.swap, 0);
501 EXPECT_EQ(vmas[3].usage.swap, 0);
502 EXPECT_EQ(vmas[4].usage.swap, 0);
503
504 EXPECT_EQ(vmas[0].usage.swap_pss, 0);
505 EXPECT_EQ(vmas[1].usage.swap_pss, 0);
506 EXPECT_EQ(vmas[2].usage.swap_pss, 0);
507 EXPECT_EQ(vmas[3].usage.swap_pss, 0);
508 EXPECT_EQ(vmas[4].usage.swap_pss, 0);
509
510#ifndef __x86_64__
511 // vmas[5] will not exist on x86, as [vsyscall] would not be processed.
512 EXPECT_EQ(vmas[5].name, "[vsyscall]");
513 EXPECT_EQ(vmas[5].start, 0xffffffffff600000);
514 EXPECT_EQ(vmas[5].end, 0xffffffffff601000);
515 EXPECT_EQ(vmas[5].flags, PROT_READ | PROT_EXEC);
516 EXPECT_FALSE(vmas[5].is_shared);
517 EXPECT_EQ(vmas[5].offset, 0x0);
518 EXPECT_EQ(vmas[5].inode, 0);
519 EXPECT_EQ(vmas[5].usage.vss, 4);
520 EXPECT_EQ(vmas[5].usage.rss, 0);
521 EXPECT_EQ(vmas[5].usage.pss, 0);
522 EXPECT_EQ(vmas[5].usage.uss, 0);
523 EXPECT_EQ(vmas[5].usage.private_clean, 0);
524 EXPECT_EQ(vmas[5].usage.private_dirty, 0);
525 EXPECT_EQ(vmas[5].usage.shared_clean, 0);
526 EXPECT_EQ(vmas[5].usage.shared_dirty, 0);
527 EXPECT_EQ(vmas[5].usage.swap, 0);
528 EXPECT_EQ(vmas[5].usage.swap_pss, 0);
529#endif
530}
531
Kalesh Singhf83245c2021-02-25 08:54:10 -0500532TEST(ProcMemInfo, ForEachVmaFromFile_SmapsTest) {
Sandeep Patil65914302019-01-28 15:05:27 -0800533 // Parse smaps file correctly to make callbacks for each virtual memory area (vma)
Sandeep Patilb9c94702019-01-01 16:04:04 -0800534 std::string exec_dir = ::android::base::GetExecutableDirectory();
535 std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str());
536 ProcMemInfo proc_mem(pid);
537
538 std::vector<Vma> vmas;
539 auto collect_vmas = [&](const Vma& v) { vmas.push_back(v); };
540 ASSERT_TRUE(ForEachVmaFromFile(path, collect_vmas));
541
Sandeep Patil6a65b462019-01-13 19:39:46 -0800542 // We should get a total of 6 vmas
543 ASSERT_EQ(vmas.size(), 6);
544
Sandeep Patilb9c94702019-01-01 16:04:04 -0800545 // Expect values to be equal to what we have in testdata1/smaps_short
Sandeep Patilb9c94702019-01-01 16:04:04 -0800546 // Check for names
547 EXPECT_EQ(vmas[0].name, "[anon:dalvik-zygote-jit-code-cache]");
548 EXPECT_EQ(vmas[1].name, "/system/framework/x86_64/boot-framework.art");
Christopher Ferris4922fea2019-09-18 10:30:33 -0700549 EXPECT_TRUE(vmas[2].name == "[anon:libc_malloc]" ||
550 android::base::StartsWith(vmas[2].name, "[anon:scudo:"))
551 << "Unknown map name " << vmas[2].name;
Sandeep Patilb9c94702019-01-01 16:04:04 -0800552 EXPECT_EQ(vmas[3].name, "/system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex");
553 EXPECT_EQ(vmas[4].name, "/system/lib64/libhwui.so");
554 EXPECT_EQ(vmas[5].name, "[vsyscall]");
555
Kalesh Singhf83245c2021-02-25 08:54:10 -0500556 // Check start address
557 EXPECT_EQ(vmas[0].start, 0x54c00000);
558 EXPECT_EQ(vmas[1].start, 0x701ea000);
559 EXPECT_EQ(vmas[2].start, 0x70074dd8d000);
560 EXPECT_EQ(vmas[3].start, 0x700755a2d000);
561 EXPECT_EQ(vmas[4].start, 0x7007f85b0000);
562 EXPECT_EQ(vmas[5].start, 0xffffffffff600000);
563
564 // Check end address
565 EXPECT_EQ(vmas[0].end, 0x56c00000);
566 EXPECT_EQ(vmas[1].end, 0x70cdb000);
567 EXPECT_EQ(vmas[2].end, 0x70074ee0d000);
568 EXPECT_EQ(vmas[3].end, 0x700755a6e000);
569 EXPECT_EQ(vmas[4].end, 0x7007f8b9b000);
570 EXPECT_EQ(vmas[5].end, 0xffffffffff601000);
571
572 // Check Flags
573 EXPECT_EQ(vmas[0].flags, PROT_READ | PROT_EXEC);
574 EXPECT_EQ(vmas[1].flags, PROT_READ | PROT_WRITE);
575 EXPECT_EQ(vmas[2].flags, PROT_READ | PROT_WRITE);
576 EXPECT_EQ(vmas[3].flags, PROT_READ | PROT_EXEC);
577 EXPECT_EQ(vmas[4].flags, PROT_READ | PROT_EXEC);
578 EXPECT_EQ(vmas[5].flags, PROT_READ | PROT_EXEC);
579
580 // Check Shared
581 EXPECT_FALSE(vmas[0].is_shared);
582 EXPECT_FALSE(vmas[1].is_shared);
583 EXPECT_FALSE(vmas[2].is_shared);
584 EXPECT_FALSE(vmas[3].is_shared);
585 EXPECT_FALSE(vmas[4].is_shared);
586 EXPECT_FALSE(vmas[5].is_shared);
587
588 // Check Offset
589 EXPECT_EQ(vmas[0].offset, 0x0);
590 EXPECT_EQ(vmas[1].offset, 0x0);
591 EXPECT_EQ(vmas[2].offset, 0x0);
592 EXPECT_EQ(vmas[3].offset, 0x00016000);
593 EXPECT_EQ(vmas[4].offset, 0x001ee000);
594 EXPECT_EQ(vmas[5].offset, 0x0);
595
596 // Check Inode
597 EXPECT_EQ(vmas[0].inode, 0);
598 EXPECT_EQ(vmas[1].inode, 3165);
599 EXPECT_EQ(vmas[2].inode, 0);
600 EXPECT_EQ(vmas[3].inode, 1947);
601 EXPECT_EQ(vmas[4].inode, 1537);
602 EXPECT_EQ(vmas[5].inode, 0);
603
604 // Check smaps specific fields
605 ASSERT_EQ(vmas[0].usage.vss, 32768);
606 EXPECT_EQ(vmas[1].usage.vss, 11204);
607 EXPECT_EQ(vmas[2].usage.vss, 16896);
608 EXPECT_EQ(vmas[3].usage.vss, 260);
609 EXPECT_EQ(vmas[4].usage.vss, 6060);
610 EXPECT_EQ(vmas[5].usage.vss, 4);
611
Sandeep Patilb9c94702019-01-01 16:04:04 -0800612 EXPECT_EQ(vmas[0].usage.rss, 2048);
613 EXPECT_EQ(vmas[1].usage.rss, 11188);
614 EXPECT_EQ(vmas[2].usage.rss, 15272);
615 EXPECT_EQ(vmas[3].usage.rss, 260);
616 EXPECT_EQ(vmas[4].usage.rss, 4132);
617 EXPECT_EQ(vmas[5].usage.rss, 0);
618
619 EXPECT_EQ(vmas[0].usage.pss, 113);
620 EXPECT_EQ(vmas[1].usage.pss, 2200);
621 EXPECT_EQ(vmas[2].usage.pss, 15272);
622 EXPECT_EQ(vmas[3].usage.pss, 260);
623 EXPECT_EQ(vmas[4].usage.pss, 1274);
624 EXPECT_EQ(vmas[5].usage.pss, 0);
625
626 EXPECT_EQ(vmas[0].usage.uss, 0);
627 EXPECT_EQ(vmas[1].usage.uss, 1660);
628 EXPECT_EQ(vmas[2].usage.uss, 15272);
629 EXPECT_EQ(vmas[3].usage.uss, 260);
630 EXPECT_EQ(vmas[4].usage.uss, 0);
631 EXPECT_EQ(vmas[5].usage.uss, 0);
632
633 EXPECT_EQ(vmas[0].usage.private_clean, 0);
634 EXPECT_EQ(vmas[1].usage.private_clean, 0);
635 EXPECT_EQ(vmas[2].usage.private_clean, 0);
636 EXPECT_EQ(vmas[3].usage.private_clean, 260);
637 EXPECT_EQ(vmas[4].usage.private_clean, 0);
638 EXPECT_EQ(vmas[5].usage.private_clean, 0);
639
640 EXPECT_EQ(vmas[0].usage.private_dirty, 0);
641 EXPECT_EQ(vmas[1].usage.private_dirty, 1660);
642 EXPECT_EQ(vmas[2].usage.private_dirty, 15272);
643 EXPECT_EQ(vmas[3].usage.private_dirty, 0);
644 EXPECT_EQ(vmas[4].usage.private_dirty, 0);
645 EXPECT_EQ(vmas[5].usage.private_dirty, 0);
646
647 EXPECT_EQ(vmas[0].usage.shared_clean, 0);
648 EXPECT_EQ(vmas[1].usage.shared_clean, 80);
649 EXPECT_EQ(vmas[2].usage.shared_clean, 0);
650 EXPECT_EQ(vmas[3].usage.shared_clean, 0);
651 EXPECT_EQ(vmas[4].usage.shared_clean, 4132);
652 EXPECT_EQ(vmas[5].usage.shared_clean, 0);
653
654 EXPECT_EQ(vmas[0].usage.shared_dirty, 2048);
655 EXPECT_EQ(vmas[1].usage.shared_dirty, 9448);
656 EXPECT_EQ(vmas[2].usage.shared_dirty, 0);
657 EXPECT_EQ(vmas[3].usage.shared_dirty, 0);
658 EXPECT_EQ(vmas[4].usage.shared_dirty, 0);
659 EXPECT_EQ(vmas[5].usage.shared_dirty, 0);
660
661 EXPECT_EQ(vmas[0].usage.swap, 0);
662 EXPECT_EQ(vmas[1].usage.swap, 0);
663 EXPECT_EQ(vmas[2].usage.swap, 0);
664 EXPECT_EQ(vmas[3].usage.swap, 0);
665 EXPECT_EQ(vmas[4].usage.swap, 0);
666 EXPECT_EQ(vmas[5].usage.swap, 0);
667
668 EXPECT_EQ(vmas[0].usage.swap_pss, 0);
669 EXPECT_EQ(vmas[1].usage.swap_pss, 0);
670 EXPECT_EQ(vmas[2].usage.swap_pss, 0);
671 EXPECT_EQ(vmas[3].usage.swap_pss, 0);
672 EXPECT_EQ(vmas[4].usage.swap_pss, 0);
673 EXPECT_EQ(vmas[5].usage.swap_pss, 0);
674}
675
Kalesh Singhf83245c2021-02-25 08:54:10 -0500676TEST(ProcMemInfo, ForEachVmaFromFile_MapsTest) {
677 // Parse maps file correctly to make callbacks for each virtual memory area (vma)
678 std::string exec_dir = ::android::base::GetExecutableDirectory();
679 std::string path = ::android::base::StringPrintf("%s/testdata1/maps_short", exec_dir.c_str());
680 ProcMemInfo proc_mem(pid);
681
682 std::vector<Vma> vmas;
683 auto collect_vmas = [&](const Vma& v) { vmas.push_back(v); };
684 ASSERT_TRUE(ForEachVmaFromFile(path, collect_vmas, false));
685
686 // We should get a total of 6 vmas
687 ASSERT_EQ(vmas.size(), 6);
688
689 // Expect values to be equal to what we have in testdata1/maps_short
690 // Check for names
691 EXPECT_EQ(vmas[0].name, "[anon:dalvik-zygote-jit-code-cache]");
692 EXPECT_EQ(vmas[1].name, "/system/framework/x86_64/boot-framework.art");
693 EXPECT_TRUE(vmas[2].name == "[anon:libc_malloc]" ||
694 android::base::StartsWith(vmas[2].name, "[anon:scudo:"))
695 << "Unknown map name " << vmas[2].name;
696 EXPECT_EQ(vmas[3].name, "/system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex");
697 EXPECT_EQ(vmas[4].name, "/system/lib64/libhwui.so");
698 EXPECT_EQ(vmas[5].name, "[vsyscall]");
699
700 // Check start address
701 EXPECT_EQ(vmas[0].start, 0x54c00000);
702 EXPECT_EQ(vmas[1].start, 0x701ea000);
703 EXPECT_EQ(vmas[2].start, 0x70074dd8d000);
704 EXPECT_EQ(vmas[3].start, 0x700755a2d000);
705 EXPECT_EQ(vmas[4].start, 0x7007f85b0000);
706 EXPECT_EQ(vmas[5].start, 0xffffffffff600000);
707
708 // Check end address
709 EXPECT_EQ(vmas[0].end, 0x56c00000);
710 EXPECT_EQ(vmas[1].end, 0x70cdb000);
711 EXPECT_EQ(vmas[2].end, 0x70074ee0d000);
712 EXPECT_EQ(vmas[3].end, 0x700755a6e000);
713 EXPECT_EQ(vmas[4].end, 0x7007f8b9b000);
714 EXPECT_EQ(vmas[5].end, 0xffffffffff601000);
715
716 // Check Flags
717 EXPECT_EQ(vmas[0].flags, PROT_READ | PROT_EXEC);
718 EXPECT_EQ(vmas[1].flags, PROT_READ | PROT_WRITE);
719 EXPECT_EQ(vmas[2].flags, PROT_READ | PROT_WRITE);
720 EXPECT_EQ(vmas[3].flags, PROT_READ | PROT_EXEC);
721 EXPECT_EQ(vmas[4].flags, PROT_READ | PROT_EXEC);
722 EXPECT_EQ(vmas[5].flags, PROT_READ | PROT_EXEC);
723
724 // Check Shared
725 EXPECT_FALSE(vmas[0].is_shared);
726 EXPECT_FALSE(vmas[1].is_shared);
727 EXPECT_FALSE(vmas[2].is_shared);
728 EXPECT_FALSE(vmas[3].is_shared);
729 EXPECT_FALSE(vmas[4].is_shared);
730 EXPECT_FALSE(vmas[5].is_shared);
731
732 // Check Offset
733 EXPECT_EQ(vmas[0].offset, 0x0);
734 EXPECT_EQ(vmas[1].offset, 0x0);
735 EXPECT_EQ(vmas[2].offset, 0x0);
736 EXPECT_EQ(vmas[3].offset, 0x00016000);
737 EXPECT_EQ(vmas[4].offset, 0x001ee000);
738 EXPECT_EQ(vmas[5].offset, 0x0);
739
740 // Check Inode
741 EXPECT_EQ(vmas[0].inode, 0);
742 EXPECT_EQ(vmas[1].inode, 3165);
743 EXPECT_EQ(vmas[2].inode, 0);
744 EXPECT_EQ(vmas[3].inode, 1947);
745 EXPECT_EQ(vmas[4].inode, 1537);
746 EXPECT_EQ(vmas[5].inode, 0);
747}
748
Sandeep Patil65914302019-01-28 15:05:27 -0800749TEST(ProcMemInfo, SmapsReturnTest) {
750 // Make sure Smaps() is never empty for any process
Sandeep Patilb9c94702019-01-01 16:04:04 -0800751 ProcMemInfo proc_mem(pid);
752 auto vmas = proc_mem.Smaps();
753 EXPECT_FALSE(vmas.empty());
754}
755
Sandeep Patil65914302019-01-28 15:05:27 -0800756TEST(ProcMemInfo, SmapsTest) {
Sandeep Patilb9c94702019-01-01 16:04:04 -0800757 std::string exec_dir = ::android::base::GetExecutableDirectory();
758 std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str());
759 ProcMemInfo proc_mem(pid);
760 auto vmas = proc_mem.Smaps(path);
761
762 ASSERT_FALSE(vmas.empty());
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700763#ifndef __x86_64__
Sandeep Patil6a65b462019-01-13 19:39:46 -0800764 // We should get a total of 6 vmas
765 ASSERT_EQ(vmas.size(), 6);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700766#else
767 // We should get a total of 5 vmas ([vsyscall] is excluded)
768 ASSERT_EQ(vmas.size(), 5);
769#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800770
771 // Expect values to be equal to what we have in testdata1/smaps_short
772 // Check for sizes first
773 ASSERT_EQ(vmas[0].usage.vss, 32768);
774 EXPECT_EQ(vmas[1].usage.vss, 11204);
775 EXPECT_EQ(vmas[2].usage.vss, 16896);
776 EXPECT_EQ(vmas[3].usage.vss, 260);
777 EXPECT_EQ(vmas[4].usage.vss, 6060);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700778#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800779 EXPECT_EQ(vmas[5].usage.vss, 4);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700780#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800781
782 // Check for names
783 EXPECT_EQ(vmas[0].name, "[anon:dalvik-zygote-jit-code-cache]");
784 EXPECT_EQ(vmas[1].name, "/system/framework/x86_64/boot-framework.art");
Christopher Ferris4922fea2019-09-18 10:30:33 -0700785 EXPECT_TRUE(vmas[2].name == "[anon:libc_malloc]" ||
786 android::base::StartsWith(vmas[2].name, "[anon:scudo:"))
787 << "Unknown map name " << vmas[2].name;
Sandeep Patilb9c94702019-01-01 16:04:04 -0800788 EXPECT_EQ(vmas[3].name, "/system/priv-app/SettingsProvider/oat/x86_64/SettingsProvider.odex");
789 EXPECT_EQ(vmas[4].name, "/system/lib64/libhwui.so");
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700790#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800791 EXPECT_EQ(vmas[5].name, "[vsyscall]");
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700792#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800793
794 EXPECT_EQ(vmas[0].usage.rss, 2048);
795 EXPECT_EQ(vmas[1].usage.rss, 11188);
796 EXPECT_EQ(vmas[2].usage.rss, 15272);
797 EXPECT_EQ(vmas[3].usage.rss, 260);
798 EXPECT_EQ(vmas[4].usage.rss, 4132);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700799#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800800 EXPECT_EQ(vmas[5].usage.rss, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700801#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800802
803 EXPECT_EQ(vmas[0].usage.pss, 113);
804 EXPECT_EQ(vmas[1].usage.pss, 2200);
805 EXPECT_EQ(vmas[2].usage.pss, 15272);
806 EXPECT_EQ(vmas[3].usage.pss, 260);
807 EXPECT_EQ(vmas[4].usage.pss, 1274);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700808#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800809 EXPECT_EQ(vmas[5].usage.pss, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700810#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800811
812 EXPECT_EQ(vmas[0].usage.uss, 0);
813 EXPECT_EQ(vmas[1].usage.uss, 1660);
814 EXPECT_EQ(vmas[2].usage.uss, 15272);
815 EXPECT_EQ(vmas[3].usage.uss, 260);
816 EXPECT_EQ(vmas[4].usage.uss, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700817#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800818 EXPECT_EQ(vmas[5].usage.uss, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700819#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800820
821 EXPECT_EQ(vmas[0].usage.private_clean, 0);
822 EXPECT_EQ(vmas[1].usage.private_clean, 0);
823 EXPECT_EQ(vmas[2].usage.private_clean, 0);
824 EXPECT_EQ(vmas[3].usage.private_clean, 260);
825 EXPECT_EQ(vmas[4].usage.private_clean, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700826#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800827 EXPECT_EQ(vmas[5].usage.private_clean, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700828#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800829
830 EXPECT_EQ(vmas[0].usage.private_dirty, 0);
831 EXPECT_EQ(vmas[1].usage.private_dirty, 1660);
832 EXPECT_EQ(vmas[2].usage.private_dirty, 15272);
833 EXPECT_EQ(vmas[3].usage.private_dirty, 0);
834 EXPECT_EQ(vmas[4].usage.private_dirty, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700835#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800836 EXPECT_EQ(vmas[5].usage.private_dirty, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700837#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800838
839 EXPECT_EQ(vmas[0].usage.shared_clean, 0);
840 EXPECT_EQ(vmas[1].usage.shared_clean, 80);
841 EXPECT_EQ(vmas[2].usage.shared_clean, 0);
842 EXPECT_EQ(vmas[3].usage.shared_clean, 0);
843 EXPECT_EQ(vmas[4].usage.shared_clean, 4132);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700844#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800845 EXPECT_EQ(vmas[5].usage.shared_clean, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700846#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800847
848 EXPECT_EQ(vmas[0].usage.shared_dirty, 2048);
849 EXPECT_EQ(vmas[1].usage.shared_dirty, 9448);
850 EXPECT_EQ(vmas[2].usage.shared_dirty, 0);
851 EXPECT_EQ(vmas[3].usage.shared_dirty, 0);
852 EXPECT_EQ(vmas[4].usage.shared_dirty, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700853#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800854 EXPECT_EQ(vmas[5].usage.shared_dirty, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700855#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800856
857 EXPECT_EQ(vmas[0].usage.swap, 0);
858 EXPECT_EQ(vmas[1].usage.swap, 0);
859 EXPECT_EQ(vmas[2].usage.swap, 0);
860 EXPECT_EQ(vmas[3].usage.swap, 0);
861 EXPECT_EQ(vmas[4].usage.swap, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700862#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800863 EXPECT_EQ(vmas[5].usage.swap, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700864#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800865
866 EXPECT_EQ(vmas[0].usage.swap_pss, 0);
867 EXPECT_EQ(vmas[1].usage.swap_pss, 0);
868 EXPECT_EQ(vmas[2].usage.swap_pss, 0);
869 EXPECT_EQ(vmas[3].usage.swap_pss, 0);
870 EXPECT_EQ(vmas[4].usage.swap_pss, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700871#ifndef __x86_64__
Sandeep Patilb9c94702019-01-01 16:04:04 -0800872 EXPECT_EQ(vmas[5].usage.swap_pss, 0);
Suren Baghdasaryanbef95402020-09-25 19:57:18 -0700873#endif
Sandeep Patilb9c94702019-01-01 16:04:04 -0800874}
875
Kevin Jeon7ba447c2022-07-01 20:23:16 +0000876TEST(ProcMemInfo, SmapsPopulatesUsageTest) {
877 std::string exec_dir = ::android::base::GetExecutableDirectory();
878 std::string path = ::android::base::StringPrintf("%s/testdata1/smaps_short", exec_dir.c_str());
879 ProcMemInfo proc_mem(pid);
880 auto vmas = proc_mem.Smaps(path, true);
881
882 // Expect values to be equal to sums of usage in testdata1/smaps_short. For
883 // this data, only vss differs on x86.
884#ifndef __x86_64__
885 EXPECT_EQ(proc_mem.Usage().vss, 67192);
886#else
887 EXPECT_EQ(proc_mem.Usage().vss, 67188);
888#endif
889 EXPECT_EQ(proc_mem.Usage().rss, 32900);
890 EXPECT_EQ(proc_mem.Usage().pss, 19119);
891 EXPECT_EQ(proc_mem.Usage().uss, 17192);
892 EXPECT_EQ(proc_mem.Usage().private_clean, 260);
893 EXPECT_EQ(proc_mem.Usage().private_dirty, 16932);
894 EXPECT_EQ(proc_mem.Usage().shared_clean, 4212);
895 EXPECT_EQ(proc_mem.Usage().shared_dirty, 11496);
896 EXPECT_EQ(proc_mem.Usage().swap, 0);
897 EXPECT_EQ(proc_mem.Usage().swap_pss, 0);
898}
899
Sandeep Patil65914302019-01-28 15:05:27 -0800900TEST(SysMemInfo, TestSysMemInfoFile) {
Sandeep Patila60a7762018-08-29 17:10:47 -0700901 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
902MemFree: 1809728 kB
903MemAvailable: 2546560 kB
904Buffers: 54736 kB
905Cached: 776052 kB
906SwapCached: 0 kB
907Active: 445856 kB
908Inactive: 459092 kB
909Active(anon): 78492 kB
910Inactive(anon): 2240 kB
911Active(file): 367364 kB
912Inactive(file): 456852 kB
913Unevictable: 3096 kB
914Mlocked: 3096 kB
Sandeep Patile473d7e2018-12-11 09:28:38 -0800915SwapTotal: 32768 kB
916SwapFree: 4096 kB
Sandeep Patila60a7762018-08-29 17:10:47 -0700917Dirty: 32 kB
918Writeback: 0 kB
919AnonPages: 74988 kB
920Mapped: 62624 kB
921Shmem: 4020 kB
Suren Baghdasaryand8f484b2019-11-25 19:02:23 -0800922KReclaimable: 87324 kB
Sandeep Patila60a7762018-08-29 17:10:47 -0700923Slab: 86464 kB
924SReclaimable: 44432 kB
925SUnreclaim: 42032 kB
926KernelStack: 4880 kB
927PageTables: 2900 kB
928NFS_Unstable: 0 kB
929Bounce: 0 kB
930WritebackTmp: 0 kB
931CommitLimit: 1509868 kB
932Committed_AS: 80296 kB
933VmallocTotal: 263061440 kB
Sandeep Patile473d7e2018-12-11 09:28:38 -0800934VmallocUsed: 65536 kB
Sandeep Patila60a7762018-08-29 17:10:47 -0700935VmallocChunk: 0 kB
936AnonHugePages: 6144 kB
937ShmemHugePages: 0 kB
938ShmemPmdMapped: 0 kB
939CmaTotal: 131072 kB
940CmaFree: 130380 kB
941HugePages_Total: 0
942HugePages_Free: 0
943HugePages_Rsvd: 0
944HugePages_Surp: 0
945Hugepagesize: 2048 kB)meminfo";
946
947 TemporaryFile tf;
948 ASSERT_TRUE(tf.fd != -1);
949 ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd));
950
951 SysMemInfo mi;
952 ASSERT_TRUE(mi.ReadMemInfo(tf.path));
953 EXPECT_EQ(mi.mem_total_kb(), 3019740);
Sandeep Patile473d7e2018-12-11 09:28:38 -0800954 EXPECT_EQ(mi.mem_free_kb(), 1809728);
955 EXPECT_EQ(mi.mem_buffers_kb(), 54736);
956 EXPECT_EQ(mi.mem_cached_kb(), 776052);
957 EXPECT_EQ(mi.mem_shmem_kb(), 4020);
958 EXPECT_EQ(mi.mem_slab_kb(), 86464);
959 EXPECT_EQ(mi.mem_slab_reclaimable_kb(), 44432);
960 EXPECT_EQ(mi.mem_slab_unreclaimable_kb(), 42032);
961 EXPECT_EQ(mi.mem_swap_kb(), 32768);
962 EXPECT_EQ(mi.mem_swap_free_kb(), 4096);
963 EXPECT_EQ(mi.mem_mapped_kb(), 62624);
964 EXPECT_EQ(mi.mem_vmalloc_used_kb(), 65536);
Sandeep Patila60a7762018-08-29 17:10:47 -0700965 EXPECT_EQ(mi.mem_page_tables_kb(), 2900);
Sandeep Patile473d7e2018-12-11 09:28:38 -0800966 EXPECT_EQ(mi.mem_kernel_stack_kb(), 4880);
Suren Baghdasaryand8f484b2019-11-25 19:02:23 -0800967 EXPECT_EQ(mi.mem_kreclaimable_kb(), 87324);
Ioannis Ilkos6840cc72020-11-30 22:38:49 +0000968 EXPECT_EQ(mi.mem_active_kb(), 445856);
969 EXPECT_EQ(mi.mem_inactive_kb(), 459092);
970 EXPECT_EQ(mi.mem_unevictable_kb(), 3096);
Kevin Jeon59418d32022-11-23 20:46:08 +0000971 EXPECT_EQ(mi.mem_available_kb(), 2546560);
972 EXPECT_EQ(mi.mem_active_anon_kb(), 78492);
973 EXPECT_EQ(mi.mem_inactive_anon_kb(), 2240);
974 EXPECT_EQ(mi.mem_active_file_kb(), 367364);
975 EXPECT_EQ(mi.mem_inactive_file_kb(), 456852);
976 EXPECT_EQ(mi.mem_cma_total_kb(), 131072);
977 EXPECT_EQ(mi.mem_cma_free_kb(), 130380);
Sandeep Patila60a7762018-08-29 17:10:47 -0700978}
979
Sandeep Patil65914302019-01-28 15:05:27 -0800980TEST(SysMemInfo, TestEmptyFile) {
Sandeep Patila60a7762018-08-29 17:10:47 -0700981 TemporaryFile tf;
982 std::string empty_string = "";
983 ASSERT_TRUE(tf.fd != -1);
984 ASSERT_TRUE(::android::base::WriteStringToFd(empty_string, tf.fd));
985
986 SysMemInfo mi;
987 EXPECT_TRUE(mi.ReadMemInfo(tf.path));
988 EXPECT_EQ(mi.mem_total_kb(), 0);
989}
990
Sandeep Patil65914302019-01-28 15:05:27 -0800991TEST(SysMemInfo, TestZramTotal) {
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800992 std::string exec_dir = ::android::base::GetExecutableDirectory();
993
994 SysMemInfo mi;
995 std::string zram_mmstat_dir = exec_dir + "/testdata1/";
Daniel Colascioned64b5c92019-09-03 18:17:19 -0700996 EXPECT_EQ(mi.mem_zram_kb(zram_mmstat_dir.c_str()), 30504);
Sandeep Patil9f4028d2018-11-09 19:18:29 -0800997
998 std::string zram_memused_dir = exec_dir + "/testdata2/";
Daniel Colascioned64b5c92019-09-03 18:17:19 -0700999 EXPECT_EQ(mi.mem_zram_kb(zram_memused_dir.c_str()), 30504);
Sandeep Patil9f4028d2018-11-09 19:18:29 -08001000}
1001
Sandeep Patile473d7e2018-12-11 09:28:38 -08001002enum {
1003 MEMINFO_TOTAL,
1004 MEMINFO_FREE,
1005 MEMINFO_BUFFERS,
1006 MEMINFO_CACHED,
1007 MEMINFO_SHMEM,
1008 MEMINFO_SLAB,
1009 MEMINFO_SLAB_RECLAIMABLE,
1010 MEMINFO_SLAB_UNRECLAIMABLE,
1011 MEMINFO_SWAP_TOTAL,
1012 MEMINFO_SWAP_FREE,
1013 MEMINFO_ZRAM_TOTAL,
1014 MEMINFO_MAPPED,
1015 MEMINFO_VMALLOC_USED,
1016 MEMINFO_PAGE_TABLES,
1017 MEMINFO_KERNEL_STACK,
Suren Baghdasaryand8f484b2019-11-25 19:02:23 -08001018 MEMINFO_KRECLAIMABLE,
Ioannis Ilkos6840cc72020-11-30 22:38:49 +00001019 MEMINFO_ACTIVE,
1020 MEMINFO_INACTIVE,
1021 MEMINFO_UNEVICTABLE,
Kevin Jeon59418d32022-11-23 20:46:08 +00001022 MEMINFO_AVAILABLE,
1023 MEMINFO_ACTIVE_ANON,
1024 MEMINFO_INACTIVE_ANON,
1025 MEMINFO_ACTIVE_FILE,
1026 MEMINFO_INACTIVE_FILE,
1027 MEMINFO_CMA_TOTAL,
1028 MEMINFO_CMA_FREE,
Sandeep Patile473d7e2018-12-11 09:28:38 -08001029 MEMINFO_COUNT
1030};
1031
Sandeep Patil65914302019-01-28 15:05:27 -08001032TEST(SysMemInfo, TestZramWithTags) {
Sandeep Patile473d7e2018-12-11 09:28:38 -08001033 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
1034MemFree: 1809728 kB
1035MemAvailable: 2546560 kB
1036Buffers: 54736 kB
1037Cached: 776052 kB
1038SwapCached: 0 kB
1039Active: 445856 kB
1040Inactive: 459092 kB
1041Active(anon): 78492 kB
1042Inactive(anon): 2240 kB
1043Active(file): 367364 kB
1044Inactive(file): 456852 kB
1045Unevictable: 3096 kB
1046Mlocked: 3096 kB
1047SwapTotal: 32768 kB
1048SwapFree: 4096 kB
1049Dirty: 32 kB
1050Writeback: 0 kB
1051AnonPages: 74988 kB
1052Mapped: 62624 kB
1053Shmem: 4020 kB
Suren Baghdasaryand8f484b2019-11-25 19:02:23 -08001054KReclaimable: 87324 kB
Sandeep Patile473d7e2018-12-11 09:28:38 -08001055Slab: 86464 kB
1056SReclaimable: 44432 kB
1057SUnreclaim: 42032 kB
1058KernelStack: 4880 kB
1059PageTables: 2900 kB
1060NFS_Unstable: 0 kB
1061Bounce: 0 kB
1062WritebackTmp: 0 kB
1063CommitLimit: 1509868 kB
1064Committed_AS: 80296 kB
1065VmallocTotal: 263061440 kB
1066VmallocUsed: 65536 kB
1067VmallocChunk: 0 kB
1068AnonHugePages: 6144 kB
1069ShmemHugePages: 0 kB
1070ShmemPmdMapped: 0 kB
1071CmaTotal: 131072 kB
1072CmaFree: 130380 kB
1073HugePages_Total: 0
1074HugePages_Free: 0
1075HugePages_Rsvd: 0
1076HugePages_Surp: 0
1077Hugepagesize: 2048 kB)meminfo";
1078
1079 TemporaryFile tf;
1080 ASSERT_TRUE(tf.fd != -1);
1081 ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd));
1082 std::string file = std::string(tf.path);
Daniel Colascioned64b5c92019-09-03 18:17:19 -07001083 std::vector<uint64_t> mem;
1084 std::vector<std::string_view> tags(SysMemInfo::kDefaultSysMemInfoTags.begin(),
1085 SysMemInfo::kDefaultSysMemInfoTags.end());
Sandeep Patile473d7e2018-12-11 09:28:38 -08001086 auto it = tags.begin();
1087 tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:");
1088 SysMemInfo mi;
1089
1090 // Read system memory info
Daniel Colascioned64b5c92019-09-03 18:17:19 -07001091 mem.resize(tags.size());
1092 EXPECT_TRUE(mi.ReadMemInfo(tags.size(), tags.data(), mem.data(), file.c_str()));
Sandeep Patile473d7e2018-12-11 09:28:38 -08001093 EXPECT_EQ(mem[MEMINFO_TOTAL], 3019740);
1094 EXPECT_EQ(mem[MEMINFO_FREE], 1809728);
1095 EXPECT_EQ(mem[MEMINFO_BUFFERS], 54736);
1096 EXPECT_EQ(mem[MEMINFO_CACHED], 776052);
1097 EXPECT_EQ(mem[MEMINFO_SHMEM], 4020);
1098 EXPECT_EQ(mem[MEMINFO_SLAB], 86464);
1099 EXPECT_EQ(mem[MEMINFO_SLAB_RECLAIMABLE], 44432);
1100 EXPECT_EQ(mem[MEMINFO_SLAB_UNRECLAIMABLE], 42032);
1101 EXPECT_EQ(mem[MEMINFO_SWAP_TOTAL], 32768);
1102 EXPECT_EQ(mem[MEMINFO_SWAP_FREE], 4096);
1103 EXPECT_EQ(mem[MEMINFO_MAPPED], 62624);
1104 EXPECT_EQ(mem[MEMINFO_VMALLOC_USED], 65536);
1105 EXPECT_EQ(mem[MEMINFO_PAGE_TABLES], 2900);
1106 EXPECT_EQ(mem[MEMINFO_KERNEL_STACK], 4880);
Suren Baghdasaryand8f484b2019-11-25 19:02:23 -08001107 EXPECT_EQ(mem[MEMINFO_KRECLAIMABLE], 87324);
Ioannis Ilkos6840cc72020-11-30 22:38:49 +00001108 EXPECT_EQ(mem[MEMINFO_ACTIVE], 445856);
1109 EXPECT_EQ(mem[MEMINFO_INACTIVE], 459092);
1110 EXPECT_EQ(mem[MEMINFO_UNEVICTABLE], 3096);
Kevin Jeon59418d32022-11-23 20:46:08 +00001111 EXPECT_EQ(mem[MEMINFO_AVAILABLE], 2546560);
1112 EXPECT_EQ(mem[MEMINFO_ACTIVE_ANON], 78492);
1113 EXPECT_EQ(mem[MEMINFO_INACTIVE_ANON], 2240);
1114 EXPECT_EQ(mem[MEMINFO_ACTIVE_FILE], 367364);
1115 EXPECT_EQ(mem[MEMINFO_INACTIVE_FILE], 456852);
1116 EXPECT_EQ(mem[MEMINFO_CMA_TOTAL], 131072);
1117 EXPECT_EQ(mem[MEMINFO_CMA_FREE], 130380);
Sandeep Patile473d7e2018-12-11 09:28:38 -08001118}
1119
Sandeep Patil65914302019-01-28 15:05:27 -08001120TEST(SysMemInfo, TestVmallocInfoNoMemory) {
Sandeep Patil76a34f02018-12-29 14:34:20 -08001121 std::string vmallocinfo =
1122 R"vmallocinfo(0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap
11230x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap
11240x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap
11250x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap)vmallocinfo";
1126
1127 TemporaryFile tf;
1128 ASSERT_TRUE(tf.fd != -1);
1129 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
1130 std::string file = std::string(tf.path);
1131
Daniel Colascioned64b5c92019-09-03 18:17:19 -07001132 EXPECT_EQ(ReadVmallocInfo(file.c_str()), 0);
Sandeep Patil76a34f02018-12-29 14:34:20 -08001133}
1134
Sandeep Patil65914302019-01-28 15:05:27 -08001135TEST(SysMemInfo, TestVmallocInfoKernel) {
Sandeep Patil76a34f02018-12-29 14:34:20 -08001136 std::string vmallocinfo =
1137 R"vmallocinfo(0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc)vmallocinfo";
1138
1139 TemporaryFile tf;
1140 ASSERT_TRUE(tf.fd != -1);
1141 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
1142 std::string file = std::string(tf.path);
1143
Daniel Colascioned64b5c92019-09-03 18:17:19 -07001144 EXPECT_EQ(ReadVmallocInfo(file.c_str()), getpagesize());
Sandeep Patil76a34f02018-12-29 14:34:20 -08001145}
1146
Sandeep Patil65914302019-01-28 15:05:27 -08001147TEST(SysMemInfo, TestVmallocInfoModule) {
Sandeep Patil76a34f02018-12-29 14:34:20 -08001148 std::string vmallocinfo =
1149 R"vmallocinfo(0x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo";
1150
1151 TemporaryFile tf;
1152 ASSERT_TRUE(tf.fd != -1);
1153 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
1154 std::string file = std::string(tf.path);
1155
Daniel Colascioned64b5c92019-09-03 18:17:19 -07001156 EXPECT_EQ(ReadVmallocInfo(file.c_str()), 6 * getpagesize());
Sandeep Patil76a34f02018-12-29 14:34:20 -08001157}
1158
Sandeep Patil65914302019-01-28 15:05:27 -08001159TEST(SysMemInfo, TestVmallocInfoAll) {
Sandeep Patil76a34f02018-12-29 14:34:20 -08001160 std::string vmallocinfo =
1161 R"vmallocinfo(0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap
11620x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap
11630x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap
11640x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap
11650x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc
11660x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo";
1167
1168 TemporaryFile tf;
1169 ASSERT_TRUE(tf.fd != -1);
1170 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
1171 std::string file = std::string(tf.path);
1172
Daniel Colascioned64b5c92019-09-03 18:17:19 -07001173 EXPECT_EQ(ReadVmallocInfo(file.c_str()), 7 * getpagesize());
Sandeep Patil76a34f02018-12-29 14:34:20 -08001174}
1175
Suren Baghdasaryanc94063b2019-11-25 19:05:45 -08001176TEST(SysMemInfo, TestReadIonHeapsSizeKb) {
1177 std::string total_heaps_kb = R"total_heaps_kb(98480)total_heaps_kb";
1178 uint64_t size;
1179
1180 TemporaryFile tf;
1181 ASSERT_TRUE(tf.fd != -1);
1182 ASSERT_TRUE(::android::base::WriteStringToFd(total_heaps_kb, tf.fd));
1183 std::string file = std::string(tf.path);
1184
1185 ASSERT_TRUE(ReadIonHeapsSizeKb(&size, file));
1186 EXPECT_EQ(size, 98480);
1187}
1188
1189TEST(SysMemInfo, TestReadIonPoolsSizeKb) {
1190 std::string total_pools_kb = R"total_pools_kb(416)total_pools_kb";
1191 uint64_t size;
1192
1193 TemporaryFile tf;
1194 ASSERT_TRUE(tf.fd != -1);
1195 ASSERT_TRUE(::android::base::WriteStringToFd(total_pools_kb, tf.fd));
1196 std::string file = std::string(tf.path);
1197
1198 ASSERT_TRUE(ReadIonPoolsSizeKb(&size, file));
1199 EXPECT_EQ(size, 416);
1200}
1201
Suren Baghdasaryana6998b12021-01-07 14:10:00 -08001202TEST(SysMemInfo, TestReadGpuTotalUsageKb) {
1203 uint64_t size;
1204
Suren Baghdasaryan26a159d2021-11-01 11:57:21 -07001205 if (android::base::GetIntProperty("ro.vendor.api_level", 0) < __ANDROID_API_S__) {
Suren Baghdasaryancf0afe02021-02-02 09:26:38 -08001206 GTEST_SKIP();
1207 }
1208
1209 KernelVersion min_kernel_version = KernelVersion(5, 4, 0);
1210 KernelVersion kernel_version = VintfObject::GetInstance()
1211 ->getRuntimeInfo(RuntimeInfo::FetchFlag::CPU_VERSION)
1212 ->kernelVersion();
1213 if (kernel_version < min_kernel_version) {
1214 GTEST_SKIP();
1215 }
1216
Suren Baghdasaryana6998b12021-01-07 14:10:00 -08001217 ASSERT_TRUE(ReadGpuTotalUsageKb(&size));
1218 EXPECT_TRUE(size >= 0);
1219}
1220
Hridya Valsaraju7d1343d2021-02-09 21:48:24 -08001221class DmabufHeapStats : public ::testing::Test {
1222 public:
1223 virtual void SetUp() {
1224 fs::current_path(fs::temp_directory_path());
1225 buffer_stats_path = fs::current_path() / "buffers";
1226 ASSERT_TRUE(fs::create_directory(buffer_stats_path));
1227 heap_root_path = fs::current_path() / "dma_heap";
1228 ASSERT_TRUE(fs::create_directory(heap_root_path));
1229 }
1230 virtual void TearDown() {
1231 fs::remove_all(buffer_stats_path);
1232 fs::remove_all(heap_root_path);
1233 }
1234
1235 fs::path buffer_stats_path;
1236 fs::path heap_root_path;
1237};
1238
1239TEST_F(DmabufHeapStats, TestDmabufHeapTotalExportedKb) {
1240 using android::base::StringPrintf;
1241 uint64_t size;
1242
1243 auto system_heap_path = heap_root_path / "system";
1244 ASSERT_TRUE(android::base::WriteStringToFile("test", system_heap_path));
1245
1246 for (unsigned int inode_number = 74831; inode_number < 74841; inode_number++) {
Hridya Valsaraju7d1343d2021-02-09 21:48:24 -08001247 auto buffer_path = buffer_stats_path / StringPrintf("%u", inode_number);
Kalesh Singh327300f2021-07-08 23:39:43 +00001248 ASSERT_TRUE(fs::create_directories(buffer_path));
Hridya Valsaraju7d1343d2021-02-09 21:48:24 -08001249
1250 auto buffer_size_path = buffer_path / "size";
1251 const std::string buffer_size = "4096";
1252 ASSERT_TRUE(android::base::WriteStringToFile(buffer_size, buffer_size_path));
1253
1254 auto exp_name_path = buffer_path / "exporter_name";
1255 const std::string exp_name = inode_number % 2 ? "system" : "other";
1256 ASSERT_TRUE(android::base::WriteStringToFile(exp_name, exp_name_path));
1257 }
1258
1259 ASSERT_TRUE(ReadDmabufHeapTotalExportedKb(&size, heap_root_path, buffer_stats_path));
1260 ASSERT_EQ(size, 20);
1261}
1262
Hridya Valsarajubc029162021-02-02 11:07:04 -08001263TEST(SysMemInfo, TestReadDmaBufHeapPoolsSizeKb) {
1264 std::string total_pools_kb = R"total_pools_kb(416)total_pools_kb";
1265 uint64_t size;
1266
1267 TemporaryFile tf;
1268 ASSERT_TRUE(tf.fd != -1);
1269 ASSERT_TRUE(::android::base::WriteStringToFd(total_pools_kb, tf.fd));
1270 std::string file = std::string(tf.path);
1271
1272 ASSERT_TRUE(ReadDmabufHeapPoolsSizeKb(&size, file));
1273 EXPECT_EQ(size, 416);
1274}
1275
Sandeep Patila60a7762018-08-29 17:10:47 -07001276int main(int argc, char** argv) {
1277 ::testing::InitGoogleTest(&argc, argv);
Sandeep Patila60a7762018-08-29 17:10:47 -07001278 ::android::base::InitLogging(argv, android::base::StderrLogger);
Sandeep Patil65914302019-01-28 15:05:27 -08001279 pid = getpid();
Sandeep Patila60a7762018-08-29 17:10:47 -07001280 return RUN_ALL_TESTS();
1281}