OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/bind.h" | 5 #include "base/bind.h" |
6 #include "base/test/trace_event_analyzer.h" | 6 #include "base/test/trace_event_analyzer.h" |
7 #include "testing/gmock/include/gmock/gmock.h" | 7 #include "testing/gmock/include/gmock/gmock.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace trace_analyzer { | 10 namespace trace_analyzer { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 | 58 |
59 // Create an empty JSON event string: | 59 // Create an empty JSON event string: |
60 buffer_.Start(); | 60 buffer_.Start(); |
61 buffer_.Finish(); | 61 buffer_.Finish(); |
62 | 62 |
63 scoped_ptr<TraceAnalyzer> | 63 scoped_ptr<TraceAnalyzer> |
64 analyzer(TraceAnalyzer::Create(output_.json_output)); | 64 analyzer(TraceAnalyzer::Create(output_.json_output)); |
65 ASSERT_TRUE(analyzer.get()); | 65 ASSERT_TRUE(analyzer.get()); |
66 | 66 |
67 // Search for all events and verify that nothing is returned. | 67 // Search for all events and verify that nothing is returned. |
68 TraceAnalyzer::TraceEventVector found; | 68 TraceEventVector found; |
69 analyzer->FindEvents(Query::Bool(true), &found); | 69 analyzer->FindEvents(Query::Bool(true), &found); |
70 EXPECT_EQ(0u, found.size()); | 70 EXPECT_EQ(0u, found.size()); |
71 } | 71 } |
72 | 72 |
73 TEST_F(TraceEventAnalyzerTest, TraceEvent) { | 73 TEST_F(TraceEventAnalyzerTest, TraceEvent) { |
74 using namespace trace_analyzer; | 74 using namespace trace_analyzer; |
75 ManualSetUp(); | 75 ManualSetUp(); |
76 | 76 |
77 int int_num = 2; | 77 int int_num = 2; |
78 double double_num = 3.5; | 78 double double_num = 3.5; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 TRACE_EVENT_INSTANT1("cat1", "name2", "num", 2); | 214 TRACE_EVENT_INSTANT1("cat1", "name2", "num", 2); |
215 TRACE_EVENT_INSTANT1("cat2", "name3", "num", 3); | 215 TRACE_EVENT_INSTANT1("cat2", "name3", "num", 3); |
216 TRACE_EVENT_INSTANT1("cat2", "name4", "num", 4); | 216 TRACE_EVENT_INSTANT1("cat2", "name4", "num", 4); |
217 } | 217 } |
218 EndTracing(); | 218 EndTracing(); |
219 | 219 |
220 scoped_ptr<TraceAnalyzer> | 220 scoped_ptr<TraceAnalyzer> |
221 analyzer(TraceAnalyzer::Create(output_.json_output)); | 221 analyzer(TraceAnalyzer::Create(output_.json_output)); |
222 ASSERT_TRUE(!!analyzer.get()); | 222 ASSERT_TRUE(!!analyzer.get()); |
223 | 223 |
224 TraceAnalyzer::TraceEventVector found; | 224 TraceEventVector found; |
225 | 225 |
226 // == | 226 // == |
227 | 227 |
228 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1"), &found); | 228 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1"), &found); |
229 ASSERT_EQ(2u, found.size()); | 229 ASSERT_EQ(2u, found.size()); |
230 EXPECT_STREQ("name1", found[0]->name.c_str()); | 230 EXPECT_STREQ("name1", found[0]->name.c_str()); |
231 EXPECT_STREQ("name2", found[1]->name.c_str()); | 231 EXPECT_STREQ("name2", found[1]->name.c_str()); |
232 | 232 |
233 analyzer->FindEvents(Query(EVENT_ARG, "num") == Query::Int(2), &found); | 233 analyzer->FindEvents(Query(EVENT_ARG, "num") == Query::Int(2), &found); |
234 ASSERT_EQ(1u, found.size()); | 234 ASSERT_EQ(1u, found.size()); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 // Extra events that never match, for noise: | 301 // Extra events that never match, for noise: |
302 TRACE_EVENT_INSTANT2("noise", "math3", "a", 1, "b", 3); | 302 TRACE_EVENT_INSTANT2("noise", "math3", "a", 1, "b", 3); |
303 TRACE_EVENT_INSTANT2("noise", "math4", "c", 10, "d", 5); | 303 TRACE_EVENT_INSTANT2("noise", "math4", "c", 10, "d", 5); |
304 } | 304 } |
305 EndTracing(); | 305 EndTracing(); |
306 | 306 |
307 scoped_ptr<TraceAnalyzer> | 307 scoped_ptr<TraceAnalyzer> |
308 analyzer(TraceAnalyzer::Create(output_.json_output)); | 308 analyzer(TraceAnalyzer::Create(output_.json_output)); |
309 ASSERT_TRUE(analyzer.get()); | 309 ASSERT_TRUE(analyzer.get()); |
310 | 310 |
311 TraceAnalyzer::TraceEventVector found; | 311 TraceEventVector found; |
312 | 312 |
313 // Verify that arithmetic operators function: | 313 // Verify that arithmetic operators function: |
314 | 314 |
315 // + | 315 // + |
316 analyzer->FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") == | 316 analyzer->FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") == |
317 Query::Int(20), &found); | 317 Query::Int(20), &found); |
318 EXPECT_EQ(1u, found.size()); | 318 EXPECT_EQ(1u, found.size()); |
319 EXPECT_STREQ("math2", found.front()->name.c_str()); | 319 EXPECT_STREQ("math2", found.front()->name.c_str()); |
320 | 320 |
321 // - | 321 // - |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 TRACE_EVENT_INSTANT0("cat1", "name2"); | 357 TRACE_EVENT_INSTANT0("cat1", "name2"); |
358 TRACE_EVENT_INSTANT0("cat1", "no match"); | 358 TRACE_EVENT_INSTANT0("cat1", "no match"); |
359 TRACE_EVENT_INSTANT0("cat1", "name3x"); | 359 TRACE_EVENT_INSTANT0("cat1", "name3x"); |
360 } | 360 } |
361 EndTracing(); | 361 EndTracing(); |
362 | 362 |
363 scoped_ptr<TraceAnalyzer> | 363 scoped_ptr<TraceAnalyzer> |
364 analyzer(TraceAnalyzer::Create(output_.json_output)); | 364 analyzer(TraceAnalyzer::Create(output_.json_output)); |
365 ASSERT_TRUE(analyzer.get()); | 365 ASSERT_TRUE(analyzer.get()); |
366 | 366 |
367 TraceAnalyzer::TraceEventVector found; | 367 TraceEventVector found; |
368 | 368 |
369 analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name?"), &found); | 369 analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name?"), &found); |
370 ASSERT_EQ(2u, found.size()); | 370 ASSERT_EQ(2u, found.size()); |
371 EXPECT_STREQ("name1", found[0]->name.c_str()); | 371 EXPECT_STREQ("name1", found[0]->name.c_str()); |
372 EXPECT_STREQ("name2", found[1]->name.c_str()); | 372 EXPECT_STREQ("name2", found[1]->name.c_str()); |
373 | 373 |
374 analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name*"), &found); | 374 analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name*"), &found); |
375 ASSERT_EQ(3u, found.size()); | 375 ASSERT_EQ(3u, found.size()); |
376 EXPECT_STREQ("name1", found[0]->name.c_str()); | 376 EXPECT_STREQ("name1", found[0]->name.c_str()); |
377 EXPECT_STREQ("name2", found[1]->name.c_str()); | 377 EXPECT_STREQ("name2", found[1]->name.c_str()); |
(...skipping 25 matching lines...) Expand all Loading... |
403 TRACE_EVENT0("cat2", "name5"); // not found (duration too short) | 403 TRACE_EVENT0("cat2", "name5"); // not found (duration too short) |
404 } | 404 } |
405 } | 405 } |
406 EndTracing(); | 406 EndTracing(); |
407 | 407 |
408 scoped_ptr<TraceAnalyzer> | 408 scoped_ptr<TraceAnalyzer> |
409 analyzer(TraceAnalyzer::Create(output_.json_output)); | 409 analyzer(TraceAnalyzer::Create(output_.json_output)); |
410 ASSERT_TRUE(analyzer.get()); | 410 ASSERT_TRUE(analyzer.get()); |
411 analyzer->AssociateBeginEndEvents(); | 411 analyzer->AssociateBeginEndEvents(); |
412 | 412 |
413 TraceAnalyzer::TraceEventVector found; | 413 TraceEventVector found; |
414 analyzer->FindEvents(Query::MatchBeginWithEnd() && | 414 analyzer->FindEvents(Query::MatchBeginWithEnd() && |
415 Query(EVENT_DURATION) > Query::Int(duration_cutoff_us) && | 415 Query(EVENT_DURATION) > Query::Int(duration_cutoff_us) && |
416 (Query(EVENT_CATEGORY) == Query::String("cat1") || | 416 (Query(EVENT_CATEGORY) == Query::String("cat1") || |
417 Query(EVENT_CATEGORY) == Query::String("cat2") || | 417 Query(EVENT_CATEGORY) == Query::String("cat2") || |
418 Query(EVENT_CATEGORY) == Query::String("cat3")), &found); | 418 Query(EVENT_CATEGORY) == Query::String("cat3")), &found); |
419 ASSERT_EQ(2u, found.size()); | 419 ASSERT_EQ(2u, found.size()); |
420 EXPECT_STREQ("name1", found[0]->name.c_str()); | 420 EXPECT_STREQ("name1", found[0]->name.c_str()); |
421 EXPECT_STREQ("name3", found[1]->name.c_str()); | 421 EXPECT_STREQ("name3", found[1]->name.c_str()); |
422 } | 422 } |
423 | 423 |
424 // Test AssociateBeginEndEvents | 424 // Test AssociateBeginEndEvents |
425 TEST_F(TraceEventAnalyzerTest, BeginEndAssocations) { | 425 TEST_F(TraceEventAnalyzerTest, BeginEndAssocations) { |
426 using namespace trace_analyzer; | 426 using namespace trace_analyzer; |
427 ManualSetUp(); | 427 ManualSetUp(); |
428 | 428 |
429 BeginTracing(); | 429 BeginTracing(); |
430 { | 430 { |
431 TRACE_EVENT_END0("cat1", "name1"); // does not match out of order begin | 431 TRACE_EVENT_END0("cat1", "name1"); // does not match out of order begin |
432 TRACE_EVENT0("cat1", "name2"); | 432 TRACE_EVENT0("cat1", "name2"); |
433 TRACE_EVENT_INSTANT0("cat1", "name3"); | 433 TRACE_EVENT_INSTANT0("cat1", "name3"); |
434 TRACE_EVENT_BEGIN0("cat1", "name1"); | 434 TRACE_EVENT_BEGIN0("cat1", "name1"); |
435 } | 435 } |
436 EndTracing(); | 436 EndTracing(); |
437 | 437 |
438 scoped_ptr<TraceAnalyzer> | 438 scoped_ptr<TraceAnalyzer> |
439 analyzer(TraceAnalyzer::Create(output_.json_output)); | 439 analyzer(TraceAnalyzer::Create(output_.json_output)); |
440 ASSERT_TRUE(analyzer.get()); | 440 ASSERT_TRUE(analyzer.get()); |
441 analyzer->AssociateBeginEndEvents(); | 441 analyzer->AssociateBeginEndEvents(); |
442 | 442 |
443 TraceAnalyzer::TraceEventVector found; | 443 TraceEventVector found; |
444 analyzer->FindEvents(Query::MatchBeginWithEnd(), &found); | 444 analyzer->FindEvents(Query::MatchBeginWithEnd(), &found); |
445 ASSERT_EQ(1u, found.size()); | 445 ASSERT_EQ(1u, found.size()); |
446 EXPECT_STREQ("name2", found[0]->name.c_str()); | 446 EXPECT_STREQ("name2", found[0]->name.c_str()); |
447 } | 447 } |
448 | 448 |
| 449 // Test MergeAssociatedEventArgs |
| 450 TEST_F(TraceEventAnalyzerTest, MergeAssociatedEventArgs) { |
| 451 using namespace trace_analyzer; |
| 452 ManualSetUp(); |
| 453 |
| 454 const char* arg_string = "arg_string"; |
| 455 BeginTracing(); |
| 456 { |
| 457 TRACE_EVENT1("cat1", "name1", "arg", arg_string); |
| 458 } |
| 459 EndTracing(); |
| 460 |
| 461 scoped_ptr<TraceAnalyzer> |
| 462 analyzer(TraceAnalyzer::Create(output_.json_output)); |
| 463 ASSERT_TRUE(analyzer.get()); |
| 464 analyzer->AssociateBeginEndEvents(); |
| 465 |
| 466 TraceEventVector found; |
| 467 analyzer->FindEvents(Query(EVENT_NAME) == Query::String("name1") && |
| 468 Query(EVENT_PHASE) == Query::Phase(TRACE_EVENT_PHASE_END), &found); |
| 469 ASSERT_EQ(1u, found.size()); |
| 470 std::string arg_actual; |
| 471 EXPECT_FALSE(found[0]->GetArgAsString("arg", &arg_actual)); |
| 472 |
| 473 analyzer->MergeAssociatedEventArgs(); |
| 474 EXPECT_TRUE(found[0]->GetArgAsString("arg", &arg_actual)); |
| 475 EXPECT_STREQ(arg_string, arg_actual.c_str()); |
| 476 } |
| 477 |
449 // Test AssociateStartFinishEvents | 478 // Test AssociateStartFinishEvents |
450 TEST_F(TraceEventAnalyzerTest, StartFinishAssocations) { | 479 TEST_F(TraceEventAnalyzerTest, StartFinishAssocations) { |
451 using namespace trace_analyzer; | 480 using namespace trace_analyzer; |
452 ManualSetUp(); | 481 ManualSetUp(); |
453 | 482 |
454 BeginTracing(); | 483 BeginTracing(); |
455 { | 484 { |
456 TRACE_EVENT_FINISH0("cat1", "name1", 0xA); // does not match / out of order | 485 TRACE_EVENT_FINISH0("cat1", "name1", 0xA); // does not match / out of order |
457 TRACE_EVENT_START0("cat1", "name1", 0xB); | 486 TRACE_EVENT_START0("cat1", "name1", 0xB); |
458 TRACE_EVENT_START0("cat1", "name1", 0xC); | 487 TRACE_EVENT_START0("cat1", "name1", 0xC); |
459 TRACE_EVENT_INSTANT0("cat1", "name1"); // noise | 488 TRACE_EVENT_INSTANT0("cat1", "name1"); // noise |
460 TRACE_EVENT0("cat1", "name1"); // noise | 489 TRACE_EVENT0("cat1", "name1"); // noise |
461 TRACE_EVENT_FINISH0("cat1", "name1", 0xB); | 490 TRACE_EVENT_FINISH0("cat1", "name1", 0xB); |
462 TRACE_EVENT_FINISH0("cat1", "name1", 0xC); | 491 TRACE_EVENT_FINISH0("cat1", "name1", 0xC); |
463 TRACE_EVENT_START0("cat1", "name1", 0xA); // does not match / out of order | 492 TRACE_EVENT_START0("cat1", "name1", 0xA); // does not match / out of order |
464 } | 493 } |
465 EndTracing(); | 494 EndTracing(); |
466 | 495 |
467 scoped_ptr<TraceAnalyzer> | 496 scoped_ptr<TraceAnalyzer> |
468 analyzer(TraceAnalyzer::Create(output_.json_output)); | 497 analyzer(TraceAnalyzer::Create(output_.json_output)); |
469 ASSERT_TRUE(analyzer.get()); | 498 ASSERT_TRUE(analyzer.get()); |
470 analyzer->AssociateStartFinishEvents(); | 499 analyzer->AssociateStartFinishEvents(); |
471 | 500 |
472 TraceAnalyzer::TraceEventVector found; | 501 TraceEventVector found; |
473 analyzer->FindEvents(Query::MatchStartWithFinish(), &found); | 502 analyzer->FindEvents(Query::MatchStartWithFinish(), &found); |
474 ASSERT_EQ(2u, found.size()); | 503 ASSERT_EQ(2u, found.size()); |
475 EXPECT_STRCASEEQ("B", found[0]->id.c_str()); | 504 EXPECT_STRCASEEQ("B", found[0]->id.c_str()); |
476 EXPECT_STRCASEEQ("C", found[1]->id.c_str()); | 505 EXPECT_STRCASEEQ("C", found[1]->id.c_str()); |
477 } | 506 } |
478 | 507 |
479 // Test that the TraceAnalyzer custom associations work. | 508 // Test that the TraceAnalyzer custom associations work. |
480 TEST_F(TraceEventAnalyzerTest, CustomAssociations) { | 509 TEST_F(TraceEventAnalyzerTest, CustomAssociations) { |
481 using namespace trace_analyzer; | 510 using namespace trace_analyzer; |
482 ManualSetUp(); | 511 ManualSetUp(); |
(...skipping 14 matching lines...) Expand all Loading... |
497 scoped_ptr<TraceAnalyzer> | 526 scoped_ptr<TraceAnalyzer> |
498 analyzer(TraceAnalyzer::Create(output_.json_output)); | 527 analyzer(TraceAnalyzer::Create(output_.json_output)); |
499 ASSERT_TRUE(analyzer.get()); | 528 ASSERT_TRUE(analyzer.get()); |
500 | 529 |
501 // begin, end, and match queries to find proper begin/end pairs. | 530 // begin, end, and match queries to find proper begin/end pairs. |
502 Query begin(Query(EVENT_NAME) == Query::String("begin")); | 531 Query begin(Query(EVENT_NAME) == Query::String("begin")); |
503 Query end(Query(EVENT_NAME) == Query::String("end")); | 532 Query end(Query(EVENT_NAME) == Query::String("end")); |
504 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id")); | 533 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id")); |
505 analyzer->AssociateEvents(begin, end, match); | 534 analyzer->AssociateEvents(begin, end, match); |
506 | 535 |
507 TraceAnalyzer::TraceEventVector found; | 536 TraceEventVector found; |
508 | 537 |
509 // cat1 has no other_event. | 538 // cat1 has no other_event. |
510 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && | 539 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && |
511 Query(EVENT_HAS_OTHER), &found); | 540 Query(EVENT_HAS_OTHER), &found); |
512 EXPECT_EQ(0u, found.size()); | 541 EXPECT_EQ(0u, found.size()); |
513 | 542 |
514 // cat1 has no other_event. | 543 // cat1 has no other_event. |
515 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && | 544 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && |
516 !Query(EVENT_HAS_OTHER), &found); | 545 !Query(EVENT_HAS_OTHER), &found); |
517 EXPECT_EQ(1u, found.size()); | 546 EXPECT_EQ(1u, found.size()); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy)); | 592 EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy)); |
564 EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy)); | 593 EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy)); |
565 } | 594 } |
566 | 595 |
567 // Test GetRateStats. | 596 // Test GetRateStats. |
568 TEST_F(TraceEventAnalyzerTest, RateStats) { | 597 TEST_F(TraceEventAnalyzerTest, RateStats) { |
569 using namespace trace_analyzer; | 598 using namespace trace_analyzer; |
570 | 599 |
571 std::vector<TraceEvent> events; | 600 std::vector<TraceEvent> events; |
572 events.reserve(100); | 601 events.reserve(100); |
573 TraceAnalyzer::TraceEventVector event_ptrs; | 602 TraceEventVector event_ptrs; |
574 TraceEvent event; | 603 TraceEvent event; |
575 event.timestamp = 0.0; | 604 event.timestamp = 0.0; |
576 double little_delta = 1.0; | 605 double little_delta = 1.0; |
577 double big_delta = 10.0; | 606 double big_delta = 10.0; |
578 TraceAnalyzer::Stats stats; | 607 RateStats stats; |
579 | 608 |
580 for (int i = 0; i < 10; ++i) { | 609 for (int i = 0; i < 10; ++i) { |
581 event.timestamp += little_delta; | 610 event.timestamp += little_delta; |
582 events.push_back(event); | 611 events.push_back(event); |
583 event_ptrs.push_back(&events.back()); | 612 event_ptrs.push_back(&events.back()); |
584 } | 613 } |
585 | 614 |
586 ASSERT_TRUE(TraceAnalyzer::GetRateStats(event_ptrs, &stats)); | 615 ASSERT_TRUE(GetRateStats(event_ptrs, &stats)); |
587 EXPECT_EQ(little_delta, stats.mean_us); | 616 EXPECT_EQ(little_delta, stats.mean_us); |
588 EXPECT_EQ(little_delta, stats.min_us); | 617 EXPECT_EQ(little_delta, stats.min_us); |
589 EXPECT_EQ(little_delta, stats.max_us); | 618 EXPECT_EQ(little_delta, stats.max_us); |
590 EXPECT_EQ(0.0, stats.standard_deviation_us); | 619 EXPECT_EQ(0.0, stats.standard_deviation_us); |
591 | 620 |
592 event.timestamp += big_delta; | 621 event.timestamp += big_delta; |
593 events.push_back(event); | 622 events.push_back(event); |
594 event_ptrs.push_back(&events.back()); | 623 event_ptrs.push_back(&events.back()); |
595 | 624 |
596 ASSERT_TRUE(TraceAnalyzer::GetRateStats(event_ptrs, &stats)); | 625 ASSERT_TRUE(GetRateStats(event_ptrs, &stats)); |
597 EXPECT_LT(little_delta, stats.mean_us); | 626 EXPECT_LT(little_delta, stats.mean_us); |
598 EXPECT_EQ(little_delta, stats.min_us); | 627 EXPECT_EQ(little_delta, stats.min_us); |
599 EXPECT_EQ(big_delta, stats.max_us); | 628 EXPECT_EQ(big_delta, stats.max_us); |
600 EXPECT_LT(0.0, stats.standard_deviation_us); | 629 EXPECT_LT(0.0, stats.standard_deviation_us); |
601 | 630 |
602 TraceAnalyzer::TraceEventVector few_event_ptrs; | 631 TraceEventVector few_event_ptrs; |
603 few_event_ptrs.push_back(&event); | 632 few_event_ptrs.push_back(&event); |
604 few_event_ptrs.push_back(&event); | 633 few_event_ptrs.push_back(&event); |
605 ASSERT_FALSE(TraceAnalyzer::GetRateStats(few_event_ptrs, &stats)); | 634 ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats)); |
606 few_event_ptrs.push_back(&event); | 635 few_event_ptrs.push_back(&event); |
607 ASSERT_TRUE(TraceAnalyzer::GetRateStats(few_event_ptrs, &stats)); | 636 ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats)); |
| 637 } |
| 638 |
| 639 // Test FindFirstOf and FindLastOf. |
| 640 TEST_F(TraceEventAnalyzerTest, FindOf) { |
| 641 using namespace trace_analyzer; |
| 642 |
| 643 size_t num_events = 100; |
| 644 size_t index = 0; |
| 645 TraceEventVector event_ptrs; |
| 646 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index)); |
| 647 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 10, &index)); |
| 648 EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 0, &index)); |
| 649 EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 10, &index)); |
| 650 |
| 651 std::vector<TraceEvent> events; |
| 652 events.resize(num_events); |
| 653 for (size_t i = 0; i < events.size(); ++i) |
| 654 event_ptrs.push_back(&events[i]); |
| 655 size_t bam_index = num_events/2; |
| 656 events[bam_index].name = "bam"; |
| 657 Query query_bam = Query(EVENT_NAME) == Query::String(events[bam_index].name); |
| 658 |
| 659 // FindFirstOf |
| 660 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(false), 0, &index)); |
| 661 EXPECT_TRUE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index)); |
| 662 EXPECT_EQ(0u, index); |
| 663 EXPECT_TRUE(FindFirstOf(event_ptrs, Query::Bool(true), 5, &index)); |
| 664 EXPECT_EQ(5u, index); |
| 665 |
| 666 EXPECT_FALSE(FindFirstOf(event_ptrs, query_bam, bam_index + 1, &index)); |
| 667 EXPECT_TRUE(FindFirstOf(event_ptrs, query_bam, 0, &index)); |
| 668 EXPECT_EQ(bam_index, index); |
| 669 EXPECT_TRUE(FindFirstOf(event_ptrs, query_bam, bam_index, &index)); |
| 670 EXPECT_EQ(bam_index, index); |
| 671 |
| 672 // FindLastOf |
| 673 EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(false), 1000, &index)); |
| 674 EXPECT_TRUE(FindLastOf(event_ptrs, Query::Bool(true), 1000, &index)); |
| 675 EXPECT_EQ(num_events - 1, index); |
| 676 EXPECT_TRUE(FindLastOf(event_ptrs, Query::Bool(true), num_events - 5, |
| 677 &index)); |
| 678 EXPECT_EQ(num_events - 5, index); |
| 679 |
| 680 EXPECT_FALSE(FindLastOf(event_ptrs, query_bam, bam_index - 1, &index)); |
| 681 EXPECT_TRUE(FindLastOf(event_ptrs, query_bam, num_events, &index)); |
| 682 EXPECT_EQ(bam_index, index); |
| 683 EXPECT_TRUE(FindLastOf(event_ptrs, query_bam, bam_index, &index)); |
| 684 EXPECT_EQ(bam_index, index); |
| 685 } |
| 686 |
| 687 // Test FindClosest. |
| 688 TEST_F(TraceEventAnalyzerTest, FindClosest) { |
| 689 using namespace trace_analyzer; |
| 690 |
| 691 size_t index_1 = 0; |
| 692 size_t index_2 = 0; |
| 693 TraceEventVector event_ptrs; |
| 694 EXPECT_FALSE(FindClosest(event_ptrs, Query::Bool(true), 0, |
| 695 &index_1, &index_2)); |
| 696 |
| 697 size_t num_events = 5; |
| 698 std::vector<TraceEvent> events; |
| 699 events.resize(num_events); |
| 700 for (size_t i = 0; i < events.size(); ++i) { |
| 701 // timestamps go up exponentially so the lower index is always closer in |
| 702 // time than the higher index. |
| 703 events[i].timestamp = static_cast<double>(i) * static_cast<double>(i); |
| 704 event_ptrs.push_back(&events[i]); |
| 705 } |
| 706 events[0].name = "one"; |
| 707 events[2].name = "two"; |
| 708 events[4].name = "three"; |
| 709 Query query_named = Query(EVENT_NAME) != Query::String(""); |
| 710 Query query_one = Query(EVENT_NAME) == Query::String("one"); |
| 711 |
| 712 // Only one event matches query_one, so two closest can't be found. |
| 713 EXPECT_FALSE(FindClosest(event_ptrs, query_one, 0, &index_1, &index_2)); |
| 714 |
| 715 EXPECT_TRUE(FindClosest(event_ptrs, query_one, 3, &index_1, NULL)); |
| 716 EXPECT_EQ(0u, index_1); |
| 717 |
| 718 EXPECT_TRUE(FindClosest(event_ptrs, query_named, 1, &index_1, &index_2)); |
| 719 EXPECT_EQ(0u, index_1); |
| 720 EXPECT_EQ(2u, index_2); |
| 721 |
| 722 EXPECT_TRUE(FindClosest(event_ptrs, query_named, 4, &index_1, &index_2)); |
| 723 EXPECT_EQ(4u, index_1); |
| 724 EXPECT_EQ(2u, index_2); |
| 725 |
| 726 EXPECT_TRUE(FindClosest(event_ptrs, query_named, 3, &index_1, &index_2)); |
| 727 EXPECT_EQ(2u, index_1); |
| 728 EXPECT_EQ(0u, index_2); |
| 729 } |
| 730 |
| 731 // Test CountMatches. |
| 732 TEST_F(TraceEventAnalyzerTest, CountMatches) { |
| 733 using namespace trace_analyzer; |
| 734 |
| 735 TraceEventVector event_ptrs; |
| 736 EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(true), 0, 10)); |
| 737 |
| 738 size_t num_events = 5; |
| 739 size_t num_named = 3; |
| 740 std::vector<TraceEvent> events; |
| 741 events.resize(num_events); |
| 742 for (size_t i = 0; i < events.size(); ++i) |
| 743 event_ptrs.push_back(&events[i]); |
| 744 events[0].name = "one"; |
| 745 events[2].name = "two"; |
| 746 events[4].name = "three"; |
| 747 Query query_named = Query(EVENT_NAME) != Query::String(""); |
| 748 Query query_one = Query(EVENT_NAME) == Query::String("one"); |
| 749 |
| 750 EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(false))); |
| 751 EXPECT_EQ(num_events, CountMatches(event_ptrs, Query::Bool(true))); |
| 752 EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, Query::Bool(true), |
| 753 1, num_events)); |
| 754 EXPECT_EQ(1u, CountMatches(event_ptrs, query_one)); |
| 755 EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, !query_one)); |
| 756 EXPECT_EQ(num_named, CountMatches(event_ptrs, query_named)); |
608 } | 757 } |
609 | 758 |
610 | 759 |
611 } // namespace trace_analyzer | 760 } // namespace trace_analyzer |
612 | 761 |
OLD | NEW |