blob: 8c3c0fb76adc29b3a5dc3bd41fb4230d981771c0 [file] [log] [blame]
Sandeep Patil54d87212018-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
17#include <sys/types.h>
18#include <sys/wait.h>
19#include <unistd.h>
20
21#include <gtest/gtest.h>
22
23#include <string>
24#include <vector>
25
26#include <meminfo/pageacct.h>
27#include <meminfo/procmeminfo.h>
28#include <meminfo/sysmeminfo.h>
29#include <pagemap/pagemap.h>
30
31#include <android-base/file.h>
32#include <android-base/logging.h>
Sandeep Patilc24f1e32018-12-29 14:34:20 -080033#include <android-base/stringprintf.h>
Sandeep Patil54d87212018-08-29 17:10:47 -070034
35using namespace std;
36using namespace android::meminfo;
37
38pid_t pid = -1;
39
40class ValidateProcMemInfo : public ::testing::Test {
41 protected:
42 void SetUp() override {
43 ASSERT_EQ(0, pm_kernel_create(&ker));
44 ASSERT_EQ(0, pm_process_create(ker, pid, &proc));
45 proc_mem = new ProcMemInfo(pid);
46 ASSERT_NE(proc_mem, nullptr);
47 }
48
49 void TearDown() override {
50 delete proc_mem;
51 pm_process_destroy(proc);
52 pm_kernel_destroy(ker);
53 }
54
55 pm_kernel_t* ker;
56 pm_process_t* proc;
57 ProcMemInfo* proc_mem;
58};
59
60TEST_F(ValidateProcMemInfo, TestMapsSize) {
61 const std::vector<Vma>& maps = proc_mem->Maps();
62 ASSERT_FALSE(maps.empty()) << "Process " << getpid() << " maps are empty";
63}
64
65TEST_F(ValidateProcMemInfo, TestMapsEquality) {
66 const std::vector<Vma>& maps = proc_mem->Maps();
67 ASSERT_EQ(proc->num_maps, maps.size());
68
69 for (size_t i = 0; i < maps.size(); ++i) {
70 EXPECT_EQ(proc->maps[i]->start, maps[i].start);
71 EXPECT_EQ(proc->maps[i]->end, maps[i].end);
72 EXPECT_EQ(proc->maps[i]->offset, maps[i].offset);
73 EXPECT_EQ(std::string(proc->maps[i]->name), maps[i].name);
74 }
75}
76
Sandeep Patil2259fdf2018-11-09 16:42:45 -080077TEST_F(ValidateProcMemInfo, TestMaps) {
Sandeep Patil54d87212018-08-29 17:10:47 -070078 const std::vector<Vma>& maps = proc_mem->Maps();
79 ASSERT_FALSE(maps.empty());
80 ASSERT_EQ(proc->num_maps, maps.size());
81
82 pm_memusage_t map_usage, proc_usage;
83 pm_memusage_zero(&map_usage);
84 pm_memusage_zero(&proc_usage);
85 for (size_t i = 0; i < maps.size(); i++) {
86 ASSERT_EQ(0, pm_map_usage(proc->maps[i], &map_usage));
87 EXPECT_EQ(map_usage.vss, maps[i].usage.vss) << "VSS mismatch for map: " << maps[i].name;
88 EXPECT_EQ(map_usage.rss, maps[i].usage.rss) << "RSS mismatch for map: " << maps[i].name;
89 EXPECT_EQ(map_usage.pss, maps[i].usage.pss) << "PSS mismatch for map: " << maps[i].name;
90 EXPECT_EQ(map_usage.uss, maps[i].usage.uss) << "USS mismatch for map: " << maps[i].name;
91 pm_memusage_add(&proc_usage, &map_usage);
92 }
93
94 EXPECT_EQ(proc_usage.vss, proc_mem->Usage().vss);
95 EXPECT_EQ(proc_usage.rss, proc_mem->Usage().rss);
96 EXPECT_EQ(proc_usage.pss, proc_mem->Usage().pss);
97 EXPECT_EQ(proc_usage.uss, proc_mem->Usage().uss);
98}
99
Sandeep Patil2259fdf2018-11-09 16:42:45 -0800100TEST_F(ValidateProcMemInfo, TestSwapUsage) {
101 const std::vector<Vma>& maps = proc_mem->Maps();
102 ASSERT_FALSE(maps.empty());
103 ASSERT_EQ(proc->num_maps, maps.size());
104
105 pm_memusage_t map_usage, proc_usage;
106 pm_memusage_zero(&map_usage);
107 pm_memusage_zero(&proc_usage);
108 for (size_t i = 0; i < maps.size(); i++) {
109 ASSERT_EQ(0, pm_map_usage(proc->maps[i], &map_usage));
110 EXPECT_EQ(map_usage.swap, maps[i].usage.swap) << "SWAP mismatch for map: " << maps[i].name;
111 pm_memusage_add(&proc_usage, &map_usage);
112 }
113
114 EXPECT_EQ(proc_usage.swap, proc_mem->Usage().swap);
115}
116
117TEST_F(ValidateProcMemInfo, TestSwapOffsets) {
118 const MemUsage& proc_usage = proc_mem->Usage();
119 const std::vector<uint16_t>& swap_offsets = proc_mem->SwapOffsets();
120
121 EXPECT_EQ(proc_usage.swap / getpagesize(), swap_offsets.size());
122}
123
Sandeep Patil54d87212018-08-29 17:10:47 -0700124class ValidateProcMemInfoWss : public ::testing::Test {
125 protected:
126 void SetUp() override {
127 ASSERT_EQ(0, pm_kernel_create(&ker));
128 ASSERT_EQ(0, pm_process_create(ker, pid, &proc));
129 proc_mem = new ProcMemInfo(pid, true);
130 ASSERT_NE(proc_mem, nullptr);
131 }
132
133 void TearDown() override {
134 delete proc_mem;
135 pm_process_destroy(proc);
136 pm_kernel_destroy(ker);
137 }
138
139 pm_kernel_t* ker;
140 pm_process_t* proc;
141 ProcMemInfo* proc_mem;
142};
143
144TEST_F(ValidateProcMemInfoWss, TestWorkingTestReset) {
145 // Expect reset to succeed
Sandeep Patilf1291992018-11-19 15:25:18 -0800146 EXPECT_TRUE(ProcMemInfo::ResetWorkingSet(pid));
Sandeep Patil54d87212018-08-29 17:10:47 -0700147}
148
149TEST_F(ValidateProcMemInfoWss, TestWssEquality) {
150 // Read wss using libpagemap
151 pm_memusage_t wss_pagemap;
152 EXPECT_EQ(0, pm_process_workingset(proc, &wss_pagemap, 0));
153
154 // Read wss using libmeminfo
155 MemUsage wss = proc_mem->Wss();
156
157 // compare
158 EXPECT_EQ(wss_pagemap.rss, wss.rss);
159 EXPECT_EQ(wss_pagemap.pss, wss.pss);
160 EXPECT_EQ(wss_pagemap.uss, wss.uss);
161}
162
163class ValidatePageAcct : public ::testing::Test {
164 protected:
165 void SetUp() override {
166 ASSERT_EQ(0, pm_kernel_create(&ker));
167 ASSERT_EQ(0, pm_process_create(ker, pid, &proc));
168 }
169
170 void TearDown() override {
171 pm_process_destroy(proc);
172 pm_kernel_destroy(ker);
173 }
174
175 pm_kernel_t* ker;
176 pm_process_t* proc;
177};
178
179TEST_F(ValidatePageAcct, TestPageFlags) {
180 PageAcct& pi = PageAcct::Instance();
181 pi.InitPageAcct(false);
182
183 uint64_t* pagemap;
184 size_t num_pages;
185 for (size_t i = 0; i < proc->num_maps; i++) {
186 ASSERT_EQ(0, pm_map_pagemap(proc->maps[i], &pagemap, &num_pages));
187 for (size_t j = 0; j < num_pages; j++) {
188 if (!PM_PAGEMAP_PRESENT(pagemap[j])) continue;
189
190 uint64_t pfn = PM_PAGEMAP_PFN(pagemap[j]);
191 uint64_t page_flags_pagemap, page_flags_meminfo;
192
193 ASSERT_EQ(0, pm_kernel_flags(ker, pfn, &page_flags_pagemap));
194 ASSERT_TRUE(pi.PageFlags(pfn, &page_flags_meminfo));
195 // check if page flags equal
196 EXPECT_EQ(page_flags_pagemap, page_flags_meminfo);
197 }
198 free(pagemap);
199 }
200}
201
202TEST_F(ValidatePageAcct, TestPageCounts) {
203 PageAcct& pi = PageAcct::Instance();
204 pi.InitPageAcct(false);
205
206 uint64_t* pagemap;
207 size_t num_pages;
208 for (size_t i = 0; i < proc->num_maps; i++) {
209 ASSERT_EQ(0, pm_map_pagemap(proc->maps[i], &pagemap, &num_pages));
210 for (size_t j = 0; j < num_pages; j++) {
211 uint64_t pfn = PM_PAGEMAP_PFN(pagemap[j]);
212 uint64_t map_count_pagemap, map_count_meminfo;
213
214 ASSERT_EQ(0, pm_kernel_count(ker, pfn, &map_count_pagemap));
215 ASSERT_TRUE(pi.PageMapCount(pfn, &map_count_meminfo));
216 // check if map counts are equal
217 EXPECT_EQ(map_count_pagemap, map_count_meminfo);
218 }
219 free(pagemap);
220 }
221}
222
223TEST_F(ValidatePageAcct, TestPageIdle) {
224 // skip the test if idle page tracking isn't enabled
225 if (pm_kernel_init_page_idle(ker) != 0) {
226 return;
227 }
228
229 PageAcct& pi = PageAcct::Instance();
230 ASSERT_TRUE(pi.InitPageAcct(true));
231
232 uint64_t* pagemap;
233 size_t num_pages;
234 for (size_t i = 0; i < proc->num_maps; i++) {
235 ASSERT_EQ(0, pm_map_pagemap(proc->maps[i], &pagemap, &num_pages));
236 for (size_t j = 0; j < num_pages; j++) {
237 if (!PM_PAGEMAP_PRESENT(pagemap[j])) continue;
238 uint64_t pfn = PM_PAGEMAP_PFN(pagemap[j]);
239
240 ASSERT_EQ(0, pm_kernel_mark_page_idle(ker, &pfn, 1));
241 int idle_status_pagemap = pm_kernel_get_page_idle(ker, pfn);
242 int idle_status_meminfo = pi.IsPageIdle(pfn);
243 EXPECT_EQ(idle_status_pagemap, idle_status_meminfo);
244 }
245 free(pagemap);
246 }
247}
248
Sandeep Patilc6497eb2018-11-20 09:31:36 -0800249TEST(TestProcMemInfo, TestMapsEmpty) {
250 ProcMemInfo proc_mem(pid);
251 const std::vector<Vma>& maps = proc_mem.Maps();
252 EXPECT_GT(maps.size(), 0);
253}
254
255TEST(TestProcMemInfo, TestUsageEmpty) {
256 // If we created the object for getting working set,
257 // the usage must be empty
258 ProcMemInfo proc_mem(pid, true);
259 const MemUsage& usage = proc_mem.Usage();
260 EXPECT_EQ(usage.rss, 0);
261 EXPECT_EQ(usage.vss, 0);
262 EXPECT_EQ(usage.pss, 0);
263 EXPECT_EQ(usage.uss, 0);
264 EXPECT_EQ(usage.swap, 0);
265}
266
267TEST(TestProcMemInfoWssReset, TestWssEmpty) {
268 // If we created the object for getting usage,
269 // the working set must be empty
270 ProcMemInfo proc_mem(pid, false);
271 const MemUsage& wss = proc_mem.Wss();
272 EXPECT_EQ(wss.rss, 0);
273 EXPECT_EQ(wss.vss, 0);
274 EXPECT_EQ(wss.pss, 0);
275 EXPECT_EQ(wss.uss, 0);
276 EXPECT_EQ(wss.swap, 0);
277}
278
279TEST(TestProcMemInfoWssReset, TestSwapOffsetsEmpty) {
280 // If we created the object for getting working set,
281 // the swap offsets must be empty
282 ProcMemInfo proc_mem(pid, true);
283 const std::vector<uint16_t>& swap_offsets = proc_mem.SwapOffsets();
284 EXPECT_EQ(swap_offsets.size(), 0);
285}
286
Sandeep Patil549feab2018-11-19 11:38:40 -0800287TEST(ValidateProcMemInfoFlags, TestPageFlags1) {
288 // Create proc object using libpagemap
289 pm_kernel_t* ker;
290 ASSERT_EQ(0, pm_kernel_create(&ker));
291 pm_process_t* proc;
292 ASSERT_EQ(0, pm_process_create(ker, pid, &proc));
293
294 // count swapbacked pages using libpagemap
295 pm_memusage_t proc_usage;
296 pm_memusage_zero(&proc_usage);
297 ASSERT_EQ(0, pm_process_usage_flags(proc, &proc_usage, (1 << KPF_SWAPBACKED),
298 (1 << KPF_SWAPBACKED)));
299
300 // Create ProcMemInfo that counts swapbacked pages
301 ProcMemInfo proc_mem(pid, false, (1 << KPF_SWAPBACKED), (1 << KPF_SWAPBACKED));
302
303 EXPECT_EQ(proc_usage.vss, proc_mem.Usage().vss);
304 EXPECT_EQ(proc_usage.rss, proc_mem.Usage().rss);
305 EXPECT_EQ(proc_usage.pss, proc_mem.Usage().pss);
306 EXPECT_EQ(proc_usage.uss, proc_mem.Usage().uss);
307
308 pm_process_destroy(proc);
309 pm_kernel_destroy(ker);
310}
311
312TEST(ValidateProcMemInfoFlags, TestPageFlags2) {
313 // Create proc object using libpagemap
314 pm_kernel_t* ker;
315 ASSERT_EQ(0, pm_kernel_create(&ker));
316 pm_process_t* proc;
317 ASSERT_EQ(0, pm_process_create(ker, pid, &proc));
318
319 // count non-swapbacked pages using libpagemap
320 pm_memusage_t proc_usage;
321 pm_memusage_zero(&proc_usage);
322 ASSERT_EQ(0, pm_process_usage_flags(proc, &proc_usage, (1 << KPF_SWAPBACKED), 0));
323
324 // Create ProcMemInfo that counts non-swapbacked pages
325 ProcMemInfo proc_mem(pid, false, 0, (1 << KPF_SWAPBACKED));
326
327 EXPECT_EQ(proc_usage.vss, proc_mem.Usage().vss);
328 EXPECT_EQ(proc_usage.rss, proc_mem.Usage().rss);
329 EXPECT_EQ(proc_usage.pss, proc_mem.Usage().pss);
330 EXPECT_EQ(proc_usage.uss, proc_mem.Usage().uss);
331
332 pm_process_destroy(proc);
333 pm_kernel_destroy(ker);
334}
335
Sandeep Patil54d87212018-08-29 17:10:47 -0700336TEST(SysMemInfoParser, TestSysMemInfoFile) {
337 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
338MemFree: 1809728 kB
339MemAvailable: 2546560 kB
340Buffers: 54736 kB
341Cached: 776052 kB
342SwapCached: 0 kB
343Active: 445856 kB
344Inactive: 459092 kB
345Active(anon): 78492 kB
346Inactive(anon): 2240 kB
347Active(file): 367364 kB
348Inactive(file): 456852 kB
349Unevictable: 3096 kB
350Mlocked: 3096 kB
Sandeep Patil2f0b6eb2018-12-11 09:28:38 -0800351SwapTotal: 32768 kB
352SwapFree: 4096 kB
Sandeep Patil54d87212018-08-29 17:10:47 -0700353Dirty: 32 kB
354Writeback: 0 kB
355AnonPages: 74988 kB
356Mapped: 62624 kB
357Shmem: 4020 kB
358Slab: 86464 kB
359SReclaimable: 44432 kB
360SUnreclaim: 42032 kB
361KernelStack: 4880 kB
362PageTables: 2900 kB
363NFS_Unstable: 0 kB
364Bounce: 0 kB
365WritebackTmp: 0 kB
366CommitLimit: 1509868 kB
367Committed_AS: 80296 kB
368VmallocTotal: 263061440 kB
Sandeep Patil2f0b6eb2018-12-11 09:28:38 -0800369VmallocUsed: 65536 kB
Sandeep Patil54d87212018-08-29 17:10:47 -0700370VmallocChunk: 0 kB
371AnonHugePages: 6144 kB
372ShmemHugePages: 0 kB
373ShmemPmdMapped: 0 kB
374CmaTotal: 131072 kB
375CmaFree: 130380 kB
376HugePages_Total: 0
377HugePages_Free: 0
378HugePages_Rsvd: 0
379HugePages_Surp: 0
380Hugepagesize: 2048 kB)meminfo";
381
382 TemporaryFile tf;
383 ASSERT_TRUE(tf.fd != -1);
384 ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd));
385
386 SysMemInfo mi;
387 ASSERT_TRUE(mi.ReadMemInfo(tf.path));
388 EXPECT_EQ(mi.mem_total_kb(), 3019740);
Sandeep Patil2f0b6eb2018-12-11 09:28:38 -0800389 EXPECT_EQ(mi.mem_free_kb(), 1809728);
390 EXPECT_EQ(mi.mem_buffers_kb(), 54736);
391 EXPECT_EQ(mi.mem_cached_kb(), 776052);
392 EXPECT_EQ(mi.mem_shmem_kb(), 4020);
393 EXPECT_EQ(mi.mem_slab_kb(), 86464);
394 EXPECT_EQ(mi.mem_slab_reclaimable_kb(), 44432);
395 EXPECT_EQ(mi.mem_slab_unreclaimable_kb(), 42032);
396 EXPECT_EQ(mi.mem_swap_kb(), 32768);
397 EXPECT_EQ(mi.mem_swap_free_kb(), 4096);
398 EXPECT_EQ(mi.mem_mapped_kb(), 62624);
399 EXPECT_EQ(mi.mem_vmalloc_used_kb(), 65536);
Sandeep Patil54d87212018-08-29 17:10:47 -0700400 EXPECT_EQ(mi.mem_page_tables_kb(), 2900);
Sandeep Patil2f0b6eb2018-12-11 09:28:38 -0800401 EXPECT_EQ(mi.mem_kernel_stack_kb(), 4880);
Sandeep Patil54d87212018-08-29 17:10:47 -0700402}
403
404TEST(SysMemInfoParser, TestEmptyFile) {
405 TemporaryFile tf;
406 std::string empty_string = "";
407 ASSERT_TRUE(tf.fd != -1);
408 ASSERT_TRUE(::android::base::WriteStringToFd(empty_string, tf.fd));
409
410 SysMemInfo mi;
411 EXPECT_TRUE(mi.ReadMemInfo(tf.path));
412 EXPECT_EQ(mi.mem_total_kb(), 0);
413}
414
Sandeep Patil2f0b6eb2018-12-11 09:28:38 -0800415TEST(SysMemInfoParser, TestZramTotal) {
Sandeep Patil70fa72d2018-11-09 19:18:29 -0800416 std::string exec_dir = ::android::base::GetExecutableDirectory();
417
418 SysMemInfo mi;
419 std::string zram_mmstat_dir = exec_dir + "/testdata1/";
420 EXPECT_EQ(mi.mem_zram_kb(zram_mmstat_dir), 30504);
421
422 std::string zram_memused_dir = exec_dir + "/testdata2/";
423 EXPECT_EQ(mi.mem_zram_kb(zram_memused_dir), 30504);
424}
425
Sandeep Patil2f0b6eb2018-12-11 09:28:38 -0800426enum {
427 MEMINFO_TOTAL,
428 MEMINFO_FREE,
429 MEMINFO_BUFFERS,
430 MEMINFO_CACHED,
431 MEMINFO_SHMEM,
432 MEMINFO_SLAB,
433 MEMINFO_SLAB_RECLAIMABLE,
434 MEMINFO_SLAB_UNRECLAIMABLE,
435 MEMINFO_SWAP_TOTAL,
436 MEMINFO_SWAP_FREE,
437 MEMINFO_ZRAM_TOTAL,
438 MEMINFO_MAPPED,
439 MEMINFO_VMALLOC_USED,
440 MEMINFO_PAGE_TABLES,
441 MEMINFO_KERNEL_STACK,
442 MEMINFO_COUNT
443};
444
445TEST(SysMemInfoParser, TestZramWithTags) {
446 std::string meminfo = R"meminfo(MemTotal: 3019740 kB
447MemFree: 1809728 kB
448MemAvailable: 2546560 kB
449Buffers: 54736 kB
450Cached: 776052 kB
451SwapCached: 0 kB
452Active: 445856 kB
453Inactive: 459092 kB
454Active(anon): 78492 kB
455Inactive(anon): 2240 kB
456Active(file): 367364 kB
457Inactive(file): 456852 kB
458Unevictable: 3096 kB
459Mlocked: 3096 kB
460SwapTotal: 32768 kB
461SwapFree: 4096 kB
462Dirty: 32 kB
463Writeback: 0 kB
464AnonPages: 74988 kB
465Mapped: 62624 kB
466Shmem: 4020 kB
467Slab: 86464 kB
468SReclaimable: 44432 kB
469SUnreclaim: 42032 kB
470KernelStack: 4880 kB
471PageTables: 2900 kB
472NFS_Unstable: 0 kB
473Bounce: 0 kB
474WritebackTmp: 0 kB
475CommitLimit: 1509868 kB
476Committed_AS: 80296 kB
477VmallocTotal: 263061440 kB
478VmallocUsed: 65536 kB
479VmallocChunk: 0 kB
480AnonHugePages: 6144 kB
481ShmemHugePages: 0 kB
482ShmemPmdMapped: 0 kB
483CmaTotal: 131072 kB
484CmaFree: 130380 kB
485HugePages_Total: 0
486HugePages_Free: 0
487HugePages_Rsvd: 0
488HugePages_Surp: 0
489Hugepagesize: 2048 kB)meminfo";
490
491 TemporaryFile tf;
492 ASSERT_TRUE(tf.fd != -1);
493 ASSERT_TRUE(::android::base::WriteStringToFd(meminfo, tf.fd));
494 std::string file = std::string(tf.path);
495 std::vector<uint64_t> mem(MEMINFO_COUNT);
496 std::vector<std::string> tags(SysMemInfo::kDefaultSysMemInfoTags);
497 auto it = tags.begin();
498 tags.insert(it + MEMINFO_ZRAM_TOTAL, "Zram:");
499 SysMemInfo mi;
500
501 // Read system memory info
502 EXPECT_TRUE(mi.ReadMemInfo(tags, &mem, file));
503
504 EXPECT_EQ(mem[MEMINFO_TOTAL], 3019740);
505 EXPECT_EQ(mem[MEMINFO_FREE], 1809728);
506 EXPECT_EQ(mem[MEMINFO_BUFFERS], 54736);
507 EXPECT_EQ(mem[MEMINFO_CACHED], 776052);
508 EXPECT_EQ(mem[MEMINFO_SHMEM], 4020);
509 EXPECT_EQ(mem[MEMINFO_SLAB], 86464);
510 EXPECT_EQ(mem[MEMINFO_SLAB_RECLAIMABLE], 44432);
511 EXPECT_EQ(mem[MEMINFO_SLAB_UNRECLAIMABLE], 42032);
512 EXPECT_EQ(mem[MEMINFO_SWAP_TOTAL], 32768);
513 EXPECT_EQ(mem[MEMINFO_SWAP_FREE], 4096);
514 EXPECT_EQ(mem[MEMINFO_MAPPED], 62624);
515 EXPECT_EQ(mem[MEMINFO_VMALLOC_USED], 65536);
516 EXPECT_EQ(mem[MEMINFO_PAGE_TABLES], 2900);
517 EXPECT_EQ(mem[MEMINFO_KERNEL_STACK], 4880);
518}
519
Sandeep Patilc24f1e32018-12-29 14:34:20 -0800520TEST(SysMemInfoParser, TestVmallocInfoNoMemory) {
521 std::string vmallocinfo =
522 R"vmallocinfo(0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap
5230x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap
5240x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap
5250x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap)vmallocinfo";
526
527 TemporaryFile tf;
528 ASSERT_TRUE(tf.fd != -1);
529 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
530 std::string file = std::string(tf.path);
531
532 SysMemInfo smi;
533 EXPECT_EQ(smi.ReadVmallocInfo(file), 0);
534}
535
536TEST(SysMemInfoParser, TestVmallocInfoKernel) {
537 std::string vmallocinfo =
538 R"vmallocinfo(0x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc)vmallocinfo";
539
540 TemporaryFile tf;
541 ASSERT_TRUE(tf.fd != -1);
542 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
543 std::string file = std::string(tf.path);
544
545 SysMemInfo smi;
546 EXPECT_EQ(smi.ReadVmallocInfo(file), getpagesize());
547}
548
549TEST(SysMemInfoParser, TestVmallocInfoModule) {
550 std::string vmallocinfo =
551 R"vmallocinfo(0x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo";
552
553 TemporaryFile tf;
554 ASSERT_TRUE(tf.fd != -1);
555 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
556 std::string file = std::string(tf.path);
557
558 SysMemInfo smi;
559 EXPECT_EQ(smi.ReadVmallocInfo(file), 6 * getpagesize());
560}
561
562TEST(SysMemInfoParser, TestVmallocInfoAll) {
563 std::string vmallocinfo =
564 R"vmallocinfo(0x0000000000000000-0x0000000000000000 69632 of_iomap+0x78/0xb0 phys=17a00000 ioremap
5650x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=b220000 ioremap
5660x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17c90000 ioremap
5670x0000000000000000-0x0000000000000000 8192 of_iomap+0x78/0xb0 phys=17ca0000 ioremap
5680x0000000000000000-0x0000000000000000 8192 drm_property_create_blob+0x44/0xec pages=1 vmalloc
5690x0000000000000000-0x0000000000000000 28672 pktlog_alloc_buf+0xc4/0x15c [wlan] pages=6 vmalloc)vmallocinfo";
570
571 TemporaryFile tf;
572 ASSERT_TRUE(tf.fd != -1);
573 ASSERT_TRUE(::android::base::WriteStringToFd(vmallocinfo, tf.fd));
574 std::string file = std::string(tf.path);
575
576 SysMemInfo smi;
577 EXPECT_EQ(smi.ReadVmallocInfo(file), 7 * getpagesize());
578}
579
Sandeep Patil54d87212018-08-29 17:10:47 -0700580int main(int argc, char** argv) {
581 ::testing::InitGoogleTest(&argc, argv);
582 if (argc <= 1) {
583 cerr << "Pid of a permanently sleeping process must be provided." << endl;
584 exit(EXIT_FAILURE);
585 }
586 ::android::base::InitLogging(argv, android::base::StderrLogger);
587 pid = std::stoi(std::string(argv[1]));
588 return RUN_ALL_TESTS();
589}