OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/memory/ref_counted_memory.h" | 9 #include "base/memory/ref_counted_memory.h" |
10 #include "base/synchronization/waitable_event.h" | 10 #include "base/synchronization/waitable_event.h" |
11 #include "base/test/trace_event_analyzer.h" | 11 #include "base/test/trace_event_analyzer.h" |
12 #include "base/threading/platform_thread.h" | 12 #include "base/threading/platform_thread.h" |
13 #include "base/trace_event/trace_buffer.h" | 13 #include "base/trace_event/trace_buffer.h" |
| 14 #include "base/trace_event/trace_event_argument.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 | 17 |
17 namespace trace_analyzer { | 18 namespace trace_analyzer { |
18 | 19 |
19 namespace { | 20 namespace { |
20 | 21 |
21 class TraceEventAnalyzerTest : public testing::Test { | 22 class TraceEventAnalyzerTest : public testing::Test { |
22 public: | 23 public: |
23 void ManualSetUp(); | 24 void ManualSetUp(); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 int int_num = 2; | 92 int int_num = 2; |
92 double double_num = 3.5; | 93 double double_num = 3.5; |
93 const char str[] = "the string"; | 94 const char str[] = "the string"; |
94 | 95 |
95 TraceEvent event; | 96 TraceEvent event; |
96 event.arg_numbers["false"] = 0.0; | 97 event.arg_numbers["false"] = 0.0; |
97 event.arg_numbers["true"] = 1.0; | 98 event.arg_numbers["true"] = 1.0; |
98 event.arg_numbers["int"] = static_cast<double>(int_num); | 99 event.arg_numbers["int"] = static_cast<double>(int_num); |
99 event.arg_numbers["double"] = double_num; | 100 event.arg_numbers["double"] = double_num; |
100 event.arg_strings["string"] = str; | 101 event.arg_strings["string"] = str; |
| 102 event.arg_values["dict"] = make_scoped_ptr(new base::DictionaryValue()); |
101 | 103 |
102 ASSERT_TRUE(event.HasNumberArg("false")); | 104 ASSERT_TRUE(event.HasNumberArg("false")); |
103 ASSERT_TRUE(event.HasNumberArg("true")); | 105 ASSERT_TRUE(event.HasNumberArg("true")); |
104 ASSERT_TRUE(event.HasNumberArg("int")); | 106 ASSERT_TRUE(event.HasNumberArg("int")); |
105 ASSERT_TRUE(event.HasNumberArg("double")); | 107 ASSERT_TRUE(event.HasNumberArg("double")); |
106 ASSERT_TRUE(event.HasStringArg("string")); | 108 ASSERT_TRUE(event.HasStringArg("string")); |
107 ASSERT_FALSE(event.HasNumberArg("notfound")); | 109 ASSERT_FALSE(event.HasNumberArg("notfound")); |
108 ASSERT_FALSE(event.HasStringArg("notfound")); | 110 ASSERT_FALSE(event.HasStringArg("notfound")); |
| 111 ASSERT_TRUE(event.HasArg("dict")); |
| 112 ASSERT_FALSE(event.HasArg("notfound")); |
109 | 113 |
110 EXPECT_FALSE(event.GetKnownArgAsBool("false")); | 114 EXPECT_FALSE(event.GetKnownArgAsBool("false")); |
111 EXPECT_TRUE(event.GetKnownArgAsBool("true")); | 115 EXPECT_TRUE(event.GetKnownArgAsBool("true")); |
112 EXPECT_EQ(int_num, event.GetKnownArgAsInt("int")); | 116 EXPECT_EQ(int_num, event.GetKnownArgAsInt("int")); |
113 EXPECT_EQ(double_num, event.GetKnownArgAsDouble("double")); | 117 EXPECT_EQ(double_num, event.GetKnownArgAsDouble("double")); |
114 EXPECT_STREQ(str, event.GetKnownArgAsString("string").c_str()); | 118 EXPECT_STREQ(str, event.GetKnownArgAsString("string").c_str()); |
| 119 |
| 120 scoped_ptr<base::Value> arg; |
| 121 EXPECT_TRUE(event.GetArgAsValue("dict", &arg)); |
| 122 EXPECT_EQ(base::Value::TYPE_DICTIONARY, arg->GetType()); |
115 } | 123 } |
116 | 124 |
117 TEST_F(TraceEventAnalyzerTest, QueryEventMember) { | 125 TEST_F(TraceEventAnalyzerTest, QueryEventMember) { |
118 ManualSetUp(); | 126 ManualSetUp(); |
119 | 127 |
120 TraceEvent event; | 128 TraceEvent event; |
121 event.thread.process_id = 3; | 129 event.thread.process_id = 3; |
122 event.thread.thread_id = 4; | 130 event.thread.thread_id = 4; |
123 event.timestamp = 1.5; | 131 event.timestamp = 1.5; |
124 event.phase = TRACE_EVENT_PHASE_BEGIN; | 132 event.phase = TRACE_EVENT_PHASE_BEGIN; |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy)); | 713 EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy)); |
706 EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy)); | 714 EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy)); |
707 EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy)); | 715 EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy)); |
708 } | 716 } |
709 | 717 |
710 // Test GetRateStats. | 718 // Test GetRateStats. |
711 TEST_F(TraceEventAnalyzerTest, RateStats) { | 719 TEST_F(TraceEventAnalyzerTest, RateStats) { |
712 std::vector<TraceEvent> events; | 720 std::vector<TraceEvent> events; |
713 events.reserve(100); | 721 events.reserve(100); |
714 TraceEventVector event_ptrs; | 722 TraceEventVector event_ptrs; |
715 TraceEvent event; | 723 double timestamp = 0.0; |
716 event.timestamp = 0.0; | |
717 double little_delta = 1.0; | 724 double little_delta = 1.0; |
718 double big_delta = 10.0; | 725 double big_delta = 10.0; |
719 double tiny_delta = 0.1; | 726 double tiny_delta = 0.1; |
720 RateStats stats; | 727 RateStats stats; |
721 RateStatsOptions options; | 728 RateStatsOptions options; |
722 | 729 |
723 // Insert 10 events, each apart by little_delta. | 730 // Insert 10 events, each apart by little_delta. |
724 for (int i = 0; i < 10; ++i) { | 731 for (int i = 0; i < 10; ++i) { |
725 event.timestamp += little_delta; | 732 timestamp += little_delta; |
726 events.push_back(event); | 733 TraceEvent event; |
| 734 event.timestamp = timestamp; |
| 735 events.push_back(std::move(event)); |
727 event_ptrs.push_back(&events.back()); | 736 event_ptrs.push_back(&events.back()); |
728 } | 737 } |
729 | 738 |
730 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL)); | 739 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL)); |
731 EXPECT_EQ(little_delta, stats.mean_us); | 740 EXPECT_EQ(little_delta, stats.mean_us); |
732 EXPECT_EQ(little_delta, stats.min_us); | 741 EXPECT_EQ(little_delta, stats.min_us); |
733 EXPECT_EQ(little_delta, stats.max_us); | 742 EXPECT_EQ(little_delta, stats.max_us); |
734 EXPECT_EQ(0.0, stats.standard_deviation_us); | 743 EXPECT_EQ(0.0, stats.standard_deviation_us); |
735 | 744 |
736 // Add an event apart by big_delta. | 745 // Add an event apart by big_delta. |
737 event.timestamp += big_delta; | 746 { |
738 events.push_back(event); | 747 timestamp += big_delta; |
739 event_ptrs.push_back(&events.back()); | 748 TraceEvent event; |
| 749 event.timestamp = timestamp; |
| 750 events.push_back(std::move(event)); |
| 751 event_ptrs.push_back(&events.back()); |
| 752 } |
740 | 753 |
741 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL)); | 754 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, NULL)); |
742 EXPECT_LT(little_delta, stats.mean_us); | 755 EXPECT_LT(little_delta, stats.mean_us); |
743 EXPECT_EQ(little_delta, stats.min_us); | 756 EXPECT_EQ(little_delta, stats.min_us); |
744 EXPECT_EQ(big_delta, stats.max_us); | 757 EXPECT_EQ(big_delta, stats.max_us); |
745 EXPECT_LT(0.0, stats.standard_deviation_us); | 758 EXPECT_LT(0.0, stats.standard_deviation_us); |
746 | 759 |
747 // Trim off the biggest delta and verify stats. | 760 // Trim off the biggest delta and verify stats. |
748 options.trim_min = 0; | 761 options.trim_min = 0; |
749 options.trim_max = 1; | 762 options.trim_max = 1; |
750 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options)); | 763 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options)); |
751 EXPECT_EQ(little_delta, stats.mean_us); | 764 EXPECT_EQ(little_delta, stats.mean_us); |
752 EXPECT_EQ(little_delta, stats.min_us); | 765 EXPECT_EQ(little_delta, stats.min_us); |
753 EXPECT_EQ(little_delta, stats.max_us); | 766 EXPECT_EQ(little_delta, stats.max_us); |
754 EXPECT_EQ(0.0, stats.standard_deviation_us); | 767 EXPECT_EQ(0.0, stats.standard_deviation_us); |
755 | 768 |
756 // Add an event apart by tiny_delta. | 769 // Add an event apart by tiny_delta. |
757 event.timestamp += tiny_delta; | 770 { |
758 events.push_back(event); | 771 timestamp += tiny_delta; |
759 event_ptrs.push_back(&events.back()); | 772 TraceEvent event; |
| 773 event.timestamp = timestamp; |
| 774 events.push_back(std::move(event)); |
| 775 event_ptrs.push_back(&events.back()); |
| 776 } |
760 | 777 |
761 // Trim off both the biggest and tiniest delta and verify stats. | 778 // Trim off both the biggest and tiniest delta and verify stats. |
762 options.trim_min = 1; | 779 options.trim_min = 1; |
763 options.trim_max = 1; | 780 options.trim_max = 1; |
764 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options)); | 781 ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options)); |
765 EXPECT_EQ(little_delta, stats.mean_us); | 782 EXPECT_EQ(little_delta, stats.mean_us); |
766 EXPECT_EQ(little_delta, stats.min_us); | 783 EXPECT_EQ(little_delta, stats.min_us); |
767 EXPECT_EQ(little_delta, stats.max_us); | 784 EXPECT_EQ(little_delta, stats.max_us); |
768 EXPECT_EQ(0.0, stats.standard_deviation_us); | 785 EXPECT_EQ(0.0, stats.standard_deviation_us); |
769 | 786 |
770 // Verify smallest allowed number of events. | 787 // Verify smallest allowed number of events. |
771 TraceEventVector few_event_ptrs; | 788 { |
772 few_event_ptrs.push_back(&event); | 789 TraceEvent event; |
773 few_event_ptrs.push_back(&event); | 790 TraceEventVector few_event_ptrs; |
774 ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, NULL)); | 791 few_event_ptrs.push_back(&event); |
775 few_event_ptrs.push_back(&event); | 792 few_event_ptrs.push_back(&event); |
776 ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats, NULL)); | 793 ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, NULL)); |
| 794 few_event_ptrs.push_back(&event); |
| 795 ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats, NULL)); |
777 | 796 |
778 // Trim off more than allowed and verify failure. | 797 // Trim off more than allowed and verify failure. |
779 options.trim_min = 0; | 798 options.trim_min = 0; |
780 options.trim_max = 1; | 799 options.trim_max = 1; |
781 ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, &options)); | 800 ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, &options)); |
| 801 } |
782 } | 802 } |
783 | 803 |
784 // Test FindFirstOf and FindLastOf. | 804 // Test FindFirstOf and FindLastOf. |
785 TEST_F(TraceEventAnalyzerTest, FindOf) { | 805 TEST_F(TraceEventAnalyzerTest, FindOf) { |
786 size_t num_events = 100; | 806 size_t num_events = 100; |
787 size_t index = 0; | 807 size_t index = 0; |
788 TraceEventVector event_ptrs; | 808 TraceEventVector event_ptrs; |
789 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index)); | 809 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index)); |
790 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 10, &index)); | 810 EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 10, &index)); |
791 EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 0, &index)); | 811 EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 0, &index)); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 | 908 |
889 EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(false))); | 909 EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(false))); |
890 EXPECT_EQ(num_events, CountMatches(event_ptrs, Query::Bool(true))); | 910 EXPECT_EQ(num_events, CountMatches(event_ptrs, Query::Bool(true))); |
891 EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, Query::Bool(true), | 911 EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, Query::Bool(true), |
892 1, num_events)); | 912 1, num_events)); |
893 EXPECT_EQ(1u, CountMatches(event_ptrs, query_one)); | 913 EXPECT_EQ(1u, CountMatches(event_ptrs, query_one)); |
894 EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, !query_one)); | 914 EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, !query_one)); |
895 EXPECT_EQ(num_named, CountMatches(event_ptrs, query_named)); | 915 EXPECT_EQ(num_named, CountMatches(event_ptrs, query_named)); |
896 } | 916 } |
897 | 917 |
| 918 TEST_F(TraceEventAnalyzerTest, ComplexArgument) { |
| 919 ManualSetUp(); |
| 920 |
| 921 BeginTracing(); |
| 922 { |
| 923 scoped_ptr<base::trace_event::TracedValue> value( |
| 924 new base::trace_event::TracedValue); |
| 925 value->SetString("property", "value"); |
| 926 TRACE_EVENT1("cat", "name", "arg", std::move(value)); |
| 927 } |
| 928 EndTracing(); |
| 929 |
| 930 scoped_ptr<TraceAnalyzer> analyzer( |
| 931 TraceAnalyzer::Create(output_.json_output)); |
| 932 ASSERT_TRUE(analyzer.get()); |
| 933 |
| 934 TraceEventVector events; |
| 935 analyzer->FindEvents(Query::EventName() == Query::String("name"), &events); |
| 936 |
| 937 EXPECT_EQ(1u, events.size()); |
| 938 EXPECT_EQ("cat", events[0]->category); |
| 939 EXPECT_EQ("name", events[0]->name); |
| 940 EXPECT_TRUE(events[0]->HasArg("arg")); |
| 941 |
| 942 scoped_ptr<base::Value> arg; |
| 943 events[0]->GetArgAsValue("arg", &arg); |
| 944 base::DictionaryValue* arg_dict; |
| 945 EXPECT_TRUE(arg->GetAsDictionary(&arg_dict)); |
| 946 std::string property; |
| 947 EXPECT_TRUE(arg_dict->GetString("property", &property)); |
| 948 EXPECT_EQ("value", property); |
| 949 } |
898 | 950 |
899 } // namespace trace_analyzer | 951 } // namespace trace_analyzer |
OLD | NEW |