1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "services/resource_coordinator/memory_instrumentation/memory_dump_map_converter.h"
6
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace memory_instrumentation {
10
11 using base::trace_event::MemoryAllocatorDump;
12 using base::trace_event::MemoryAllocatorDumpGuid;
13 using base::trace_event::MemoryDumpArgs;
14 using base::trace_event::MemoryDumpLevelOfDetail;
15 using base::trace_event::ProcessMemoryDump;
16
TEST(MemoryDumpMapConverter,Convert)17 TEST(MemoryDumpMapConverter, Convert) {
18 MemoryDumpMapConverter::MemoryDumpMap process_dumps;
19
20 MemoryDumpArgs dump_args1 = {MemoryDumpLevelOfDetail::DETAILED};
21 ProcessMemoryDump pmd1(dump_args1);
22
23 auto* source1 = pmd1.CreateAllocatorDump("test1/test2/test3");
24 source1->AddScalar(MemoryAllocatorDump::kNameSize,
25 MemoryAllocatorDump::kUnitsBytes, 10);
26
27 auto* target1 = pmd1.CreateAllocatorDump("target1");
28 pmd1.AddOwnershipEdge(source1->guid(), target1->guid(), 10);
29
30 pmd1.CreateWeakSharedGlobalAllocatorDump(MemoryAllocatorDumpGuid(1));
31
32 process_dumps.emplace(1, &pmd1);
33
34 MemoryDumpArgs dump_args2 = {MemoryDumpLevelOfDetail::LIGHT};
35 ProcessMemoryDump pmd2(dump_args2);
36
37 auto* source2 = pmd2.CreateAllocatorDump("test1/test4/test5");
38 source2->AddScalar(MemoryAllocatorDump::kNameSize,
39 MemoryAllocatorDump::kUnitsObjects, 1);
40
41 process_dumps.emplace(2, &pmd2);
42
43 MemoryDumpMapConverter converter;
44 auto output_dump_map = converter.Convert(process_dumps);
45
46 ASSERT_EQ(output_dump_map.size(), 2uL);
47 ASSERT_NE(output_dump_map.find(1), output_dump_map.end());
48 ASSERT_EQ(output_dump_map[1]->allocator_nodes().size(), 3uL);
49 ASSERT_NE(output_dump_map[1]->allocator_nodes().find("test1/test2/test3"),
50 output_dump_map[1]->allocator_nodes().end());
51 {
52 const auto& dump =
53 *output_dump_map[1]->allocator_nodes().at("test1/test2/test3");
54
55 ASSERT_EQ(dump.entries().size(), 1uL);
56 const auto& entry = dump.entries()[0];
57 ASSERT_EQ(entry.entry_type, perfetto::trace_processor::RawMemoryGraphNode::
58 MemoryNodeEntry::kUint64);
59 ASSERT_EQ(entry.units, "bytes");
60 ASSERT_EQ(entry.value_uint64, 10uL);
61 }
62
63 ASSERT_NE(output_dump_map[1]->allocator_nodes().find("target1"),
64 output_dump_map[1]->allocator_nodes().end());
65 ASSERT_NE(output_dump_map[1]->allocator_nodes().find("global/1"),
66 output_dump_map[1]->allocator_nodes().end());
67
68 ASSERT_NE(output_dump_map.find(2), output_dump_map.end());
69 ASSERT_EQ(output_dump_map[2]->allocator_nodes().size(), 1uL);
70 ASSERT_NE(output_dump_map[2]->allocator_nodes().find("test1/test4/test5"),
71 output_dump_map[2]->allocator_nodes().end());
72
73 {
74 const auto& dump =
75 *output_dump_map[2]->allocator_nodes().at("test1/test4/test5");
76
77 ASSERT_EQ(dump.entries().size(), 1uL);
78 const auto& entry = dump.entries()[0];
79 ASSERT_EQ(entry.entry_type, perfetto::trace_processor::RawMemoryGraphNode::
80 MemoryNodeEntry::kUint64);
81 ASSERT_EQ(entry.units, "objects");
82 ASSERT_EQ(entry.value_uint64, 1uL);
83 }
84 }
85
86 } // namespace memory_instrumentation
87