@@ -85,10 +85,11 @@ class PerfDataHandlerTest : public ::testing::Test {
85
85
86
86
class TestPerfDataHandler : public PerfDataHandler {
87
87
public:
88
- TestPerfDataHandler (std::vector<BranchStackEntry> expected_branch_stack,
89
- std::unordered_map<std::string, std::string>
90
- expected_filename_to_build_id)
91
- : expected_branch_stack_(std::move(expected_branch_stack)),
88
+ TestPerfDataHandler (
89
+ std::vector<std::vector<BranchStackEntry>> expected_branch_stack,
90
+ std::unordered_map<std::string, std::string>
91
+ expected_filename_to_build_id)
92
+ : expected_branch_stack_sequence_(std::move(expected_branch_stack)),
92
93
expected_filename_to_build_id_ (
93
94
std::move (expected_filename_to_build_id)) {}
94
95
TestPerfDataHandler (const TestPerfDataHandler&) = delete;
@@ -106,13 +107,22 @@ class TestPerfDataHandler : public PerfDataHandler {
106
107
} else {
107
108
seen_addr_mappings_.push_back (nullptr );
108
109
}
109
- EXPECT_EQ (expected_branch_stack_.size (), sample.branch_stack .size ());
110
- for (size_t i = 0 ; i < sample.branch_stack .size (); i++) {
111
- CheckBranchEquality (expected_branch_stack_[i], sample.branch_stack [i]);
110
+
111
+ // If the expected branch stack sequence is not empty, then check it for
112
+ // each sample.
113
+ if (!expected_branch_stack_sequence_.empty ()) {
114
+ const std::vector<BranchStackEntry>& expected_branch_stack =
115
+ expected_branch_stack_sequence_[seen_sample_events_.size () - 1 ];
116
+ EXPECT_EQ (expected_branch_stack.size (), sample.branch_stack .size ());
117
+ for (size_t i = 0 ; i < sample.branch_stack .size (); i++) {
118
+ CheckBranchEquality (expected_branch_stack[i], sample.branch_stack [i]);
119
+ }
112
120
}
121
+
113
122
if (sample.spe .is_spe ) {
114
123
seen_arm_spe_records_.push_back (sample.spe .record );
115
124
}
125
+
116
126
return true ;
117
127
}
118
128
void Comm (const CommContext& comm) override {}
@@ -170,7 +180,7 @@ class TestPerfDataHandler : public PerfDataHandler {
170
180
EXPECT_EQ (expected.abort (), actual.abort );
171
181
EXPECT_EQ (expected.cycles (), actual.cycles );
172
182
}
173
- std::vector<BranchStackEntry> expected_branch_stack_ ;
183
+ std::vector<std::vector< BranchStackEntry>> expected_branch_stack_sequence_ ;
174
184
std::unordered_map<std::string, std::string> expected_filename_to_build_id_;
175
185
std::unordered_set<std::string> seen_filenames_;
176
186
std::vector<std::unique_ptr<Mapping>> seen_addr_mappings_;
@@ -257,8 +267,7 @@ TEST(PerfDataHandlerTest, KernelBuildIdWithDifferentFilename) {
257
267
expected_filename_to_build_id[" [kernel.kallsyms]" ] = " 17937e648e" ;
258
268
expected_filename_to_build_id[" chrome" ] = " cac4b36db4d0" ;
259
269
260
- TestPerfDataHandler handler (std::vector<BranchStackEntry>(),
261
- expected_filename_to_build_id);
270
+ TestPerfDataHandler handler ({}, expected_filename_to_build_id);
262
271
PerfDataHandler::Process (proto, &handler);
263
272
handler.CheckSeenFilenames ();
264
273
}
@@ -301,7 +310,7 @@ TEST(PerfDataHandlerTest, SampleBranchStackMatches) {
301
310
entry->set_cycles (5 );
302
311
branch_stack.push_back (*entry);
303
312
304
- TestPerfDataHandler handler (branch_stack,
313
+ TestPerfDataHandler handler ({ branch_stack} ,
305
314
std::unordered_map<std::string, std::string>());
306
315
PerfDataHandler::Process (proto, &handler);
307
316
}
@@ -350,7 +359,7 @@ TEST(PerfDataHandlerTest, AddressMappingIsSet) {
350
359
sample_event->set_period (1 );
351
360
sample_event->set_id (file_attr_id);
352
361
353
- TestPerfDataHandler handler (std::vector<BranchStackEntry> {},
362
+ TestPerfDataHandler handler ({},
354
363
std::unordered_map<std::string, std::string>{});
355
364
PerfDataHandler::Process (proto, &handler);
356
365
auto & addr_mappings = handler.SeenAddrMappings ();
@@ -406,7 +415,7 @@ TEST(PerfDataHandlerTest, MappingBuildIdAndSourceAreSet) {
406
415
sample_event->set_tid (100 );
407
416
sample_event->set_addr (0x3010 );
408
417
409
- TestPerfDataHandler handler (std::vector<BranchStackEntry> {},
418
+ TestPerfDataHandler handler ({},
410
419
std::unordered_map<std::string, std::string>{});
411
420
PerfDataHandler::Process (proto, &handler);
412
421
auto & mappings = handler.SeenAddrMappings ();
@@ -458,7 +467,7 @@ TEST(PerfDataHandlerTest, LostSampleEventsAreHandledInNewerPerf) {
458
467
lost_samples_event2->mutable_sample_info ()->set_tid (100 );
459
468
lost_samples_event2->set_num_lost (3 );
460
469
461
- TestPerfDataHandler handler (std::vector<BranchStackEntry> {},
470
+ TestPerfDataHandler handler ({},
462
471
std::unordered_map<std::string, std::string>{});
463
472
PerfDataHandler::Process (proto, &handler);
464
473
@@ -497,7 +506,7 @@ TEST(PerfDataHandlerTest, LostEventsAreHandledInOlderPerf) {
497
506
lost_event->mutable_sample_info ()->set_tid (100 );
498
507
lost_event->set_lost (10 );
499
508
500
- TestPerfDataHandler handler (std::vector<BranchStackEntry> {},
509
+ TestPerfDataHandler handler ({},
501
510
std::unordered_map<std::string, std::string>{});
502
511
PerfDataHandler::Process (proto, &handler);
503
512
@@ -557,7 +566,15 @@ TEST(PerfDataHandlerTest, SpeAuxtraceIntoSamples) {
557
566
});
558
567
auxtrace_event->set_trace_data (trace_data);
559
568
560
- TestPerfDataHandler handler (std::vector<BranchStackEntry>{},
569
+ // There record 1 sample is a branch sample, so expecting one branch stack
570
+ // entry.
571
+ std::vector<BranchStackEntry> expected_br_entries;
572
+ BranchStackEntry br;
573
+ br.set_from_ip (0xffffba66edefb0e0 );
574
+ br.set_to_ip (0xffffba66edefb0e4 );
575
+ expected_br_entries.push_back (br);
576
+
577
+ TestPerfDataHandler handler ({{}, expected_br_entries},
561
578
std::unordered_map<std::string, std::string>{});
562
579
PerfDataHandler::Process (proto, &handler);
563
580
@@ -595,8 +612,7 @@ TEST(PerfDataHandlerTest, KsymbolIntoMappings) {
595
612
596
613
std::unordered_map<std::string, std::string> expected_filename_to_build_id;
597
614
expected_filename_to_build_id[mock_filename] = " " ;
598
- TestPerfDataHandler handler (std::vector<BranchStackEntry>{},
599
- expected_filename_to_build_id);
615
+ TestPerfDataHandler handler ({}, expected_filename_to_build_id);
600
616
PerfDataHandler::Process (proto, &handler);
601
617
handler.CheckSeenFilenames ();
602
618
}
0 commit comments