chrome_graph_processor_unittest.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. #include "services/resource_coordinator/memory_instrumentation/chrome_graph_processor.h"
  5. #include <iostream>
  6. #include "base/memory/shared_memory_tracker.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. #include "third_party/perfetto/include/perfetto/ext/trace_processor/importers/memory_tracker/raw_memory_graph_node.h"
  9. namespace memory_instrumentation {
  10. TEST(ChromeGraphProcessorTest, CreateMemoryGraphWithNoneOperation) {
  11. ChromeGraphProcessor::MemoryDumpMap process_dumps;
  12. base::trace_event::MemoryDumpArgs dump_args = {
  13. .level_of_detail = base::trace_event::MemoryDumpLevelOfDetail::DETAILED};
  14. base::trace_event::ProcessMemoryDump pmd(dump_args);
  15. auto* source = pmd.CreateAllocatorDump("test1/test2/test3");
  16. source->AddScalar(perfetto::trace_processor::RawMemoryGraphNode::kNameSize,
  17. perfetto::trace_processor::RawMemoryGraphNode::kUnitsBytes,
  18. 10);
  19. auto* target = pmd.CreateAllocatorDump("target");
  20. pmd.AddOwnershipEdge(source->guid(), target->guid(), 10);
  21. auto* weak = pmd.CreateWeakSharedGlobalAllocatorDump(
  22. base::trace_event::MemoryAllocatorDumpGuid(1));
  23. process_dumps.emplace(1, &pmd);
  24. auto global_node = ChromeGraphProcessor::CreateMemoryGraph(
  25. process_dumps, ChromeGraphProcessor::Operations::kNoneOperation);
  26. ASSERT_EQ(1u, global_node->process_node_graphs().size());
  27. auto id_to_dump_it = global_node->process_node_graphs().find(1);
  28. auto* first_child = id_to_dump_it->second->FindNode("test1");
  29. ASSERT_NE(first_child, nullptr);
  30. ASSERT_EQ(first_child->parent(), id_to_dump_it->second->root());
  31. auto* second_child = first_child->GetChild("test2");
  32. ASSERT_NE(second_child, nullptr);
  33. ASSERT_EQ(second_child->parent(), first_child);
  34. auto* third_child = second_child->GetChild("test3");
  35. ASSERT_NE(third_child, nullptr);
  36. ASSERT_EQ(third_child->parent(), second_child);
  37. auto* direct = id_to_dump_it->second->FindNode("test1/test2/test3");
  38. ASSERT_EQ(third_child, direct);
  39. ASSERT_EQ(third_child->entries()->size(), 1ul);
  40. auto size = third_child->entries()->find(
  41. perfetto::trace_processor::RawMemoryGraphNode::kNameSize);
  42. ASSERT_EQ(10ul, size->second.value_uint64);
  43. ASSERT_TRUE(weak->flags() &
  44. perfetto::trace_processor::RawMemoryGraphNode::Flags::kWeak);
  45. auto& edges = global_node->edges();
  46. auto edge_it = edges.begin();
  47. ASSERT_EQ(std::distance(edges.begin(), edges.end()), 1l);
  48. ASSERT_EQ(edge_it->source(), direct);
  49. ASSERT_EQ(edge_it->target(), id_to_dump_it->second->FindNode("target"));
  50. ASSERT_EQ(edge_it->priority(), 10);
  51. }
  52. TEST(ChromeGraphProcessorTest, CreateMemoryGraphWithAllOperations) {
  53. ChromeGraphProcessor::MemoryDumpMap process_dumps;
  54. base::trace_event::MemoryDumpArgs dump_args = {
  55. .level_of_detail = base::trace_event::MemoryDumpLevelOfDetail::DETAILED};
  56. base::trace_event::ProcessMemoryDump pmd(dump_args);
  57. auto* source = pmd.CreateAllocatorDump("test1/test2/test3");
  58. source->AddScalar(perfetto::trace_processor::RawMemoryGraphNode::kNameSize,
  59. perfetto::trace_processor::RawMemoryGraphNode::kUnitsBytes,
  60. 10);
  61. auto* target = pmd.CreateAllocatorDump("target");
  62. pmd.AddOwnershipEdge(source->guid(), target->guid(), 10);
  63. auto* weak = pmd.CreateWeakSharedGlobalAllocatorDump(
  64. base::trace_event::MemoryAllocatorDumpGuid(1));
  65. process_dumps.emplace(1, &pmd);
  66. std::map<base::ProcessId, uint64_t> shared_footprints;
  67. auto global_node = ChromeGraphProcessor::CreateMemoryGraph(
  68. process_dumps, ChromeGraphProcessor::Operations::kAllOperations,
  69. &shared_footprints);
  70. ASSERT_EQ(1u, global_node->process_node_graphs().size());
  71. auto id_to_dump_it = global_node->process_node_graphs().find(1);
  72. auto* first_child = id_to_dump_it->second->FindNode("test1");
  73. ASSERT_NE(first_child, nullptr);
  74. ASSERT_EQ(first_child->parent(), id_to_dump_it->second->root());
  75. auto* second_child = first_child->GetChild("test2");
  76. ASSERT_NE(second_child, nullptr);
  77. ASSERT_EQ(second_child->parent(), first_child);
  78. auto* third_child = second_child->GetChild("test3");
  79. ASSERT_NE(third_child, nullptr);
  80. ASSERT_EQ(third_child->parent(), second_child);
  81. auto* direct = id_to_dump_it->second->FindNode("test1/test2/test3");
  82. ASSERT_EQ(third_child, direct);
  83. ASSERT_EQ(third_child->entries()->size(), 2ul);
  84. auto size = third_child->entries()->find(
  85. perfetto::trace_processor::RawMemoryGraphNode::kNameSize);
  86. ASSERT_EQ(10ul, size->second.value_uint64);
  87. ASSERT_TRUE(weak->flags() &
  88. perfetto::trace_processor::RawMemoryGraphNode::Flags::kWeak);
  89. auto& edges = global_node->edges();
  90. auto edge_it = edges.begin();
  91. ASSERT_EQ(std::distance(edges.begin(), edges.end()), 1l);
  92. ASSERT_EQ(edge_it->source(), direct);
  93. ASSERT_EQ(edge_it->target(), id_to_dump_it->second->FindNode("target"));
  94. ASSERT_EQ(edge_it->priority(), 10);
  95. }
  96. } // namespace memory_instrumentation