1 /*
2 * Copyright (C) 2020 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 "perfetto/ext/trace_processor/importers/memory_tracker/raw_process_memory_node.h"
18
19 #include <stddef.h>
20
21 #include "perfetto/base/build_config.h"
22 #include "test/gtest_and_gmock.h"
23
24 namespace perfetto {
25 namespace trace_processor {
26
27 namespace {
28
29 const LevelOfDetail kLevelOfDetail = LevelOfDetail::kDetailed;
30
31 } // namespace
32
TEST(RawProcessMemoryNodeTest,MoveConstructor)33 TEST(RawProcessMemoryNodeTest, MoveConstructor) {
34 const auto source = MemoryAllocatorNodeId(42);
35 const auto target = MemoryAllocatorNodeId(4242);
36
37 std::unique_ptr<RawMemoryGraphNode> mad1(
38 new RawMemoryGraphNode("mad1", kLevelOfDetail, source));
39 std::unique_ptr<RawMemoryGraphNode> mad2(
40 new RawMemoryGraphNode("mad2", kLevelOfDetail, target));
41
42 RawProcessMemoryNode::MemoryNodesMap nodesMap;
43 nodesMap.emplace(mad1->absolute_name(), std::move(mad1));
44 nodesMap.emplace(mad2->absolute_name(), std::move(mad2));
45
46 std::unique_ptr<MemoryGraphEdge> edge(
47 new MemoryGraphEdge(source, target, 10, false));
48
49 RawProcessMemoryNode::AllocatorNodeEdgesMap edgesMap;
50 edgesMap.emplace(edge->source, std::move(edge));
51
52 RawProcessMemoryNode pmd1(kLevelOfDetail, std::move(edgesMap),
53 std::move(nodesMap));
54
55 RawProcessMemoryNode pmd2(std::move(pmd1));
56
57 EXPECT_EQ(1u, pmd2.allocator_nodes().count("mad1"));
58 EXPECT_EQ(1u, pmd2.allocator_nodes().count("mad2"));
59 EXPECT_EQ(LevelOfDetail::kDetailed, pmd2.level_of_detail());
60 EXPECT_EQ(1u, pmd2.allocator_nodes_edges().size());
61 }
62
TEST(RawProcessMemoryNodeTest,MoveAssignment)63 TEST(RawProcessMemoryNodeTest, MoveAssignment) {
64 const auto source = MemoryAllocatorNodeId(42);
65 const auto target = MemoryAllocatorNodeId(4242);
66
67 std::unique_ptr<RawMemoryGraphNode> mad1(
68 new RawMemoryGraphNode("mad1", kLevelOfDetail, source));
69 std::unique_ptr<RawMemoryGraphNode> mad2(
70 new RawMemoryGraphNode("mad2", kLevelOfDetail, target));
71
72 RawProcessMemoryNode::MemoryNodesMap nodesMap;
73 nodesMap.emplace(mad1->absolute_name(), std::move(mad1));
74 nodesMap.emplace(mad2->absolute_name(), std::move(mad2));
75
76 std::unique_ptr<MemoryGraphEdge> edge(
77 new MemoryGraphEdge(source, target, 10, false));
78
79 RawProcessMemoryNode::AllocatorNodeEdgesMap edgesMap;
80 edgesMap.emplace(edge->source, std::move(edge));
81
82 RawProcessMemoryNode pmd1(kLevelOfDetail, std::move(edgesMap),
83 std::move(nodesMap));
84
85 RawProcessMemoryNode pmd2(LevelOfDetail::kBackground);
86
87 pmd2 = std::move(pmd1);
88 EXPECT_EQ(1u, pmd2.allocator_nodes().count("mad1"));
89 EXPECT_EQ(1u, pmd2.allocator_nodes().count("mad2"));
90 EXPECT_EQ(0u, pmd2.allocator_nodes().count("mad3"));
91 EXPECT_EQ(LevelOfDetail::kDetailed, pmd2.level_of_detail());
92 EXPECT_EQ(1u, pmd2.allocator_nodes_edges().size());
93 }
94
95 } // namespace trace_processor
96 } // namespace perfetto
97