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