xref: /aosp_15_r20/system/extras/simpleperf/CallChainJoiner_test.cpp (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
1*288bf522SAndroid Build Coastguard Worker /*
2*288bf522SAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*288bf522SAndroid Build Coastguard Worker  *
4*288bf522SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*288bf522SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*288bf522SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*288bf522SAndroid Build Coastguard Worker  *
8*288bf522SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*288bf522SAndroid Build Coastguard Worker  *
10*288bf522SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*288bf522SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*288bf522SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*288bf522SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*288bf522SAndroid Build Coastguard Worker  * limitations under the License.
15*288bf522SAndroid Build Coastguard Worker  */
16*288bf522SAndroid Build Coastguard Worker 
17*288bf522SAndroid Build Coastguard Worker #include "CallChainJoiner.h"
18*288bf522SAndroid Build Coastguard Worker 
19*288bf522SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*288bf522SAndroid Build Coastguard Worker 
21*288bf522SAndroid Build Coastguard Worker #include <environment.h>
22*288bf522SAndroid Build Coastguard Worker 
23*288bf522SAndroid Build Coastguard Worker using namespace simpleperf;
24*288bf522SAndroid Build Coastguard Worker using namespace simpleperf::call_chain_joiner_impl;
25*288bf522SAndroid Build Coastguard Worker 
JoinCallChain(LRUCache & cache,uint32_t tid,const std::vector<uint64_t> & input_ip,const std::vector<uint64_t> & input_sp,const std::vector<uint64_t> & expected_output_ip,const std::vector<uint64_t> & expected_output_sp)26*288bf522SAndroid Build Coastguard Worker static bool JoinCallChain(LRUCache& cache, uint32_t tid, const std::vector<uint64_t>& input_ip,
27*288bf522SAndroid Build Coastguard Worker                           const std::vector<uint64_t>& input_sp,
28*288bf522SAndroid Build Coastguard Worker                           const std::vector<uint64_t>& expected_output_ip,
29*288bf522SAndroid Build Coastguard Worker                           const std::vector<uint64_t>& expected_output_sp) {
30*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> tmp_ip = input_ip;
31*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> tmp_sp = input_sp;
32*288bf522SAndroid Build Coastguard Worker   cache.AddCallChain(tid, tmp_ip, tmp_sp);
33*288bf522SAndroid Build Coastguard Worker   return tmp_ip == expected_output_ip && tmp_sp == expected_output_sp;
34*288bf522SAndroid Build Coastguard Worker }
35*288bf522SAndroid Build Coastguard Worker 
36*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(LRUCache,different_nodes)37*288bf522SAndroid Build Coastguard Worker TEST(LRUCache, different_nodes) {
38*288bf522SAndroid Build Coastguard Worker   LRUCache cache(sizeof(CacheNode) * 2, 1);
39*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().max_node_count, 2u);
40*288bf522SAndroid Build Coastguard Worker   // different tids
41*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ip = {0x1};
42*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sp = {0x1};
43*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
44*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 1, ip, sp, ip, sp));
45*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 2u);
46*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 0u);
47*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(cache.FindNode(0, ip[0], sp[0]), nullptr);
48*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(cache.FindNode(1, ip[0], sp[0]), nullptr);
49*288bf522SAndroid Build Coastguard Worker 
50*288bf522SAndroid Build Coastguard Worker   // different ips
51*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ip2 = {0x2};
52*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip2, sp, ip2, sp));
53*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 2u);
54*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 1u);
55*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.FindNode(0, ip[0], sp[0]), nullptr);
56*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(cache.FindNode(0, ip2[0], sp[0]), nullptr);
57*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(cache.FindNode(1, ip[0], sp[0]), nullptr);
58*288bf522SAndroid Build Coastguard Worker 
59*288bf522SAndroid Build Coastguard Worker   // different sps
60*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sp2 = {0x2};
61*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 1, ip, sp2, ip, sp2));
62*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 2u);
63*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 2u);
64*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.FindNode(1, ip[0], sp[0]), nullptr);
65*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(cache.FindNode(0, ip2[0], sp[0]), nullptr);
66*288bf522SAndroid Build Coastguard Worker   ASSERT_NE(cache.FindNode(1, ip[0], sp2[0]), nullptr);
67*288bf522SAndroid Build Coastguard Worker }
68*288bf522SAndroid Build Coastguard Worker 
69*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(LRUCache,extend_chains)70*288bf522SAndroid Build Coastguard Worker TEST(LRUCache, extend_chains) {
71*288bf522SAndroid Build Coastguard Worker   // matched_node_count_to_extend_callchain = 1
72*288bf522SAndroid Build Coastguard Worker   // c -> b
73*288bf522SAndroid Build Coastguard Worker   // b -> a  =>  c -> b -> a
74*288bf522SAndroid Build Coastguard Worker   LRUCache cache1(sizeof(CacheNode) * 4, 1);
75*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache1, 0, {0xb, 0xc}, {0xb, 0xc}, {0xb, 0xc}, {0xb, 0xc}));
76*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache1, 0, {0xa, 0xb}, {0xa, 0xb}, {0xa, 0xb, 0xc}, {0xa, 0xb, 0xc}));
77*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache1.Stat().used_node_count, 3u);
78*288bf522SAndroid Build Coastguard Worker 
79*288bf522SAndroid Build Coastguard Worker   // matched_node_count_to_extend_callchain = 2
80*288bf522SAndroid Build Coastguard Worker   // c -> b
81*288bf522SAndroid Build Coastguard Worker   // b -> a
82*288bf522SAndroid Build Coastguard Worker   LRUCache cache2(sizeof(CacheNode) * 4, 2);
83*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache2, 0, {0xb, 0xc}, {0xb, 0xc}, {0xb, 0xc}, {0xb, 0xc}));
84*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache2, 0, {0xa, 0xb}, {0xa, 0xb}, {0xa, 0xb}, {0xa, 0xb}));
85*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache2.Stat().used_node_count, 3u);
86*288bf522SAndroid Build Coastguard Worker 
87*288bf522SAndroid Build Coastguard Worker   // matched_node_count_to_extend_callchain = 2
88*288bf522SAndroid Build Coastguard Worker   // d -> c -> b
89*288bf522SAndroid Build Coastguard Worker   // c -> b -> a  =>  d -> c -> b -> a
90*288bf522SAndroid Build Coastguard Worker   LRUCache cache3(sizeof(CacheNode) * 4, 2);
91*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(
92*288bf522SAndroid Build Coastguard Worker       JoinCallChain(cache3, 0, {0xb, 0xc, 0xd}, {0xb, 0xc, 0xd}, {0xb, 0xc, 0xd}, {0xb, 0xc, 0xd}));
93*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache3, 0, {0xa, 0xb, 0xc}, {0xa, 0xb, 0xc}, {0xa, 0xb, 0xc, 0xd},
94*288bf522SAndroid Build Coastguard Worker                             {0xa, 0xb, 0xc, 0xd}));
95*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache3.Stat().used_node_count, 4u);
96*288bf522SAndroid Build Coastguard Worker }
97*288bf522SAndroid Build Coastguard Worker 
98*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(LRUCache,avoid_ip_sp_loop)99*288bf522SAndroid Build Coastguard Worker TEST(LRUCache, avoid_ip_sp_loop) {
100*288bf522SAndroid Build Coastguard Worker   LRUCache cache(sizeof(CacheNode) * 2, 1);
101*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ip = {0xa, 0xb};
102*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sp = {1, 1};
103*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
104*288bf522SAndroid Build Coastguard Worker   ip = {0xb, 0xa};
105*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
106*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 2u);
107*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 0u);
108*288bf522SAndroid Build Coastguard Worker }
109*288bf522SAndroid Build Coastguard Worker 
110*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(LRUCache,one_chain)111*288bf522SAndroid Build Coastguard Worker TEST(LRUCache, one_chain) {
112*288bf522SAndroid Build Coastguard Worker   LRUCache cache(sizeof(CacheNode) * 4, 1);
113*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().max_node_count, 4u);
114*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ip;
115*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sp;
116*288bf522SAndroid Build Coastguard Worker   for (size_t i = 1u; i <= 4u; ++i) {
117*288bf522SAndroid Build Coastguard Worker     ip.push_back(i);
118*288bf522SAndroid Build Coastguard Worker     sp.push_back(i);
119*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
120*288bf522SAndroid Build Coastguard Worker   }
121*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> origin_ip = ip;
122*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> origin_sp = sp;
123*288bf522SAndroid Build Coastguard Worker   for (size_t i = ip.size(); i > 1; --i) {
124*288bf522SAndroid Build Coastguard Worker     ip.pop_back();
125*288bf522SAndroid Build Coastguard Worker     sp.pop_back();
126*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, origin_ip, origin_sp));
127*288bf522SAndroid Build Coastguard Worker   }
128*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 4u);
129*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 0u);
130*288bf522SAndroid Build Coastguard Worker }
131*288bf522SAndroid Build Coastguard Worker 
132*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST(LRUCache,many_chains)133*288bf522SAndroid Build Coastguard Worker TEST(LRUCache, many_chains) {
134*288bf522SAndroid Build Coastguard Worker   LRUCache cache(sizeof(CacheNode) * 12, 1);
135*288bf522SAndroid Build Coastguard Worker   // 4 -> 3 -> 2 -> 1
136*288bf522SAndroid Build Coastguard Worker   // 8 -> 7 -> 6 -> 5
137*288bf522SAndroid Build Coastguard Worker   // d -> c -> b -> a
138*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ip = {1, 2, 3, 4};
139*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sp = {1, 2, 3, 4};
140*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
141*288bf522SAndroid Build Coastguard Worker   ip = {5, 6, 7, 8};
142*288bf522SAndroid Build Coastguard Worker   sp = {5, 6, 7, 8};
143*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
144*288bf522SAndroid Build Coastguard Worker   ip = {0xa, 0xb, 0xc, 0xd};
145*288bf522SAndroid Build Coastguard Worker   sp = {0xa, 0xb, 0xc, 0xd};
146*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, ip, sp, ip, sp));
147*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 12u);
148*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 0u);
149*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, {1}, {1}, {1, 2, 3, 4}, {1, 2, 3, 4}));
150*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, {5, 6}, {5, 6}, {5, 6, 7, 8}, {5, 6, 7, 8}));
151*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(JoinCallChain(cache, 0, {0xa}, {0xb}, {0xa}, {0xb}));
152*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().used_node_count, 12u);
153*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.Stat().recycled_node_count, 1u);
154*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(cache.FindNode(0, 0xa, 0xa), nullptr);
155*288bf522SAndroid Build Coastguard Worker }
156*288bf522SAndroid Build Coastguard Worker 
157*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
158*288bf522SAndroid Build Coastguard Worker class CallChainJoinerTest : public ::testing::Test {
159*288bf522SAndroid Build Coastguard Worker  protected:
SetUp()160*288bf522SAndroid Build Coastguard Worker   void SetUp() override {
161*288bf522SAndroid Build Coastguard Worker #if defined(__ANDROID__)
162*288bf522SAndroid Build Coastguard Worker     std::string tmpdir = "/data/local/tmp";
163*288bf522SAndroid Build Coastguard Worker #else
164*288bf522SAndroid Build Coastguard Worker     std::string tmpdir = "/tmp";
165*288bf522SAndroid Build Coastguard Worker #endif
166*288bf522SAndroid Build Coastguard Worker     scoped_temp_files_ = ScopedTempFiles::Create(tmpdir);
167*288bf522SAndroid Build Coastguard Worker   }
168*288bf522SAndroid Build Coastguard Worker 
169*288bf522SAndroid Build Coastguard Worker  private:
170*288bf522SAndroid Build Coastguard Worker   std::unique_ptr<ScopedTempFiles> scoped_temp_files_;
171*288bf522SAndroid Build Coastguard Worker };
172*288bf522SAndroid Build Coastguard Worker 
173*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST_F(CallChainJoinerTest,smoke)174*288bf522SAndroid Build Coastguard Worker TEST_F(CallChainJoinerTest, smoke) {
175*288bf522SAndroid Build Coastguard Worker   CallChainJoiner joiner(sizeof(CacheNode) * 1024, 1, true);
176*288bf522SAndroid Build Coastguard Worker   for (pid_t pid = 0; pid < 10; ++pid) {
177*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(
178*288bf522SAndroid Build Coastguard Worker         joiner.AddCallChain(pid, pid, CallChainJoiner::ORIGINAL_OFFLINE, {1, 2, 3}, {1, 2, 3}));
179*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(
180*288bf522SAndroid Build Coastguard Worker         joiner.AddCallChain(pid, pid, CallChainJoiner::ORIGINAL_REMOTE, {3, 4, 5}, {3, 4, 5}));
181*288bf522SAndroid Build Coastguard Worker     ASSERT_TRUE(joiner.AddCallChain(pid, pid, CallChainJoiner::ORIGINAL_OFFLINE, {1, 4}, {1, 4}));
182*288bf522SAndroid Build Coastguard Worker   }
183*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(joiner.JoinCallChains());
184*288bf522SAndroid Build Coastguard Worker   pid_t pid;
185*288bf522SAndroid Build Coastguard Worker   pid_t tid;
186*288bf522SAndroid Build Coastguard Worker   CallChainJoiner::ChainType type;
187*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ips;
188*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sps;
189*288bf522SAndroid Build Coastguard Worker   for (pid_t expected_pid = 0; expected_pid < 10; ++expected_pid) {
190*288bf522SAndroid Build Coastguard Worker     for (size_t i = 0; i < 2u; ++i) {
191*288bf522SAndroid Build Coastguard Worker       ASSERT_TRUE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
192*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(pid, expected_pid);
193*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(tid, expected_pid);
194*288bf522SAndroid Build Coastguard Worker       if (i == 0u) {
195*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(type, CallChainJoiner::ORIGINAL_OFFLINE);
196*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(ips, std::vector<uint64_t>({1, 2, 3}));
197*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(sps, std::vector<uint64_t>({1, 2, 3}));
198*288bf522SAndroid Build Coastguard Worker       } else {
199*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(type, CallChainJoiner::JOINED_OFFLINE);
200*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(ips, std::vector<uint64_t>({1, 2, 3, 4, 5}));
201*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(sps, std::vector<uint64_t>({1, 2, 3, 4, 5}));
202*288bf522SAndroid Build Coastguard Worker       }
203*288bf522SAndroid Build Coastguard Worker     }
204*288bf522SAndroid Build Coastguard Worker     for (size_t i = 0; i < 2u; ++i) {
205*288bf522SAndroid Build Coastguard Worker       ASSERT_TRUE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
206*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(pid, expected_pid);
207*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(tid, expected_pid);
208*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(type, i == 0u ? CallChainJoiner::ORIGINAL_REMOTE : CallChainJoiner::JOINED_REMOTE);
209*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(ips, std::vector<uint64_t>({3, 4, 5}));
210*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(sps, std::vector<uint64_t>({3, 4, 5}));
211*288bf522SAndroid Build Coastguard Worker     }
212*288bf522SAndroid Build Coastguard Worker     for (size_t i = 0; i < 2u; ++i) {
213*288bf522SAndroid Build Coastguard Worker       ASSERT_TRUE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
214*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(pid, expected_pid);
215*288bf522SAndroid Build Coastguard Worker       ASSERT_EQ(tid, expected_pid);
216*288bf522SAndroid Build Coastguard Worker       if (i == 0u) {
217*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(type, CallChainJoiner::ORIGINAL_OFFLINE);
218*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(ips, std::vector<uint64_t>({1, 4}));
219*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(sps, std::vector<uint64_t>({1, 4}));
220*288bf522SAndroid Build Coastguard Worker       } else {
221*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(type, CallChainJoiner::JOINED_OFFLINE);
222*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(ips, std::vector<uint64_t>({1, 4, 5}));
223*288bf522SAndroid Build Coastguard Worker         ASSERT_EQ(sps, std::vector<uint64_t>({1, 4, 5}));
224*288bf522SAndroid Build Coastguard Worker       }
225*288bf522SAndroid Build Coastguard Worker     }
226*288bf522SAndroid Build Coastguard Worker   }
227*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
228*288bf522SAndroid Build Coastguard Worker   joiner.DumpStat();
229*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetCacheStat().cache_size, sizeof(CacheNode) * 1024);
230*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetCacheStat().matched_node_count_to_extend_callchain, 1u);
231*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetCacheStat().max_node_count, 1024u);
232*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetCacheStat().used_node_count, 50u);
233*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetCacheStat().recycled_node_count, 0u);
234*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetStat().chain_count, 30u);
235*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetStat().before_join_node_count, 80u);
236*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetStat().after_join_node_count, 110u);
237*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(joiner.GetStat().after_join_max_chain_length, 5u);
238*288bf522SAndroid Build Coastguard Worker }
239*288bf522SAndroid Build Coastguard Worker 
240*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST_F(CallChainJoinerTest,no_original_chains)241*288bf522SAndroid Build Coastguard Worker TEST_F(CallChainJoinerTest, no_original_chains) {
242*288bf522SAndroid Build Coastguard Worker   CallChainJoiner joiner(sizeof(CacheNode) * 1024, 1, false);
243*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(joiner.AddCallChain(0, 0, CallChainJoiner::ORIGINAL_OFFLINE, {1}, {1}));
244*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(joiner.JoinCallChains());
245*288bf522SAndroid Build Coastguard Worker   pid_t pid;
246*288bf522SAndroid Build Coastguard Worker   pid_t tid;
247*288bf522SAndroid Build Coastguard Worker   CallChainJoiner::ChainType type;
248*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ips;
249*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sps;
250*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
251*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(pid, 0);
252*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(tid, 0);
253*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(type, CallChainJoiner::JOINED_OFFLINE);
254*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(ips, std::vector<uint64_t>({1}));
255*288bf522SAndroid Build Coastguard Worker   ASSERT_EQ(sps, std::vector<uint64_t>({1}));
256*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
257*288bf522SAndroid Build Coastguard Worker   joiner.DumpStat();
258*288bf522SAndroid Build Coastguard Worker }
259*288bf522SAndroid Build Coastguard Worker 
260*288bf522SAndroid Build Coastguard Worker // @CddTest = 6.1/C-0-2
TEST_F(CallChainJoinerTest,no_chains)261*288bf522SAndroid Build Coastguard Worker TEST_F(CallChainJoinerTest, no_chains) {
262*288bf522SAndroid Build Coastguard Worker   CallChainJoiner joiner(sizeof(CacheNode) * 1024, 1, false);
263*288bf522SAndroid Build Coastguard Worker   ASSERT_TRUE(joiner.JoinCallChains());
264*288bf522SAndroid Build Coastguard Worker   pid_t pid;
265*288bf522SAndroid Build Coastguard Worker   pid_t tid;
266*288bf522SAndroid Build Coastguard Worker   CallChainJoiner::ChainType type;
267*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> ips;
268*288bf522SAndroid Build Coastguard Worker   std::vector<uint64_t> sps;
269*288bf522SAndroid Build Coastguard Worker   ASSERT_FALSE(joiner.GetNextCallChain(pid, tid, type, ips, sps));
270*288bf522SAndroid Build Coastguard Worker   joiner.DumpStat();
271*288bf522SAndroid Build Coastguard Worker }
272