Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "base/bind.h" | |
| 6 #include "base/test/trace_event_analyzer.h" | |
| 7 #include "testing/gmock/include/gmock/gmock.h" | |
| 8 #include "testing/gtest/include/gtest/gtest.h" | |
| 9 | |
| 10 namespace trace_analyzer { | |
| 11 | |
| 12 namespace { | |
| 13 | |
| 14 class TraceEventAnalyzerTest : public testing::Test { | |
| 15 public: | |
| 16 void ManualSetUp(); | |
| 17 void OnTraceDataCollected( | |
| 18 scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str); | |
| 19 void BeginTracing(); | |
| 20 void EndTracing(); | |
| 21 | |
| 22 base::debug::TraceResultBuffer::SimpleOutput output_; | |
| 23 base::debug::TraceResultBuffer buffer_; | |
| 24 }; | |
| 25 | |
| 26 void TraceEventAnalyzerTest::ManualSetUp() { | |
| 27 base::debug::TraceLog::Resurrect(); | |
| 28 base::debug::TraceLog* tracelog = base::debug::TraceLog::GetInstance(); | |
| 29 ASSERT_TRUE(tracelog); | |
| 30 tracelog->SetOutputCallback( | |
| 31 base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected, | |
| 32 base::Unretained(this))); | |
| 33 buffer_.SetOutputCallback(output_.GetCallback()); | |
| 34 } | |
| 35 | |
| 36 void TraceEventAnalyzerTest::OnTraceDataCollected( | |
| 37 scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str) { | |
| 38 buffer_.AddFragment(json_events_str->data); | |
| 39 } | |
| 40 | |
| 41 void TraceEventAnalyzerTest::BeginTracing() { | |
| 42 output_.json_output.clear(); | |
| 43 buffer_.Start(); | |
| 44 base::debug::TraceLog::GetInstance()->SetEnabled(true); | |
| 45 } | |
| 46 | |
| 47 void TraceEventAnalyzerTest::EndTracing() { | |
| 48 base::debug::TraceLog::GetInstance()->SetEnabled(false); | |
| 49 buffer_.Finish(); | |
| 50 } | |
| 51 | |
| 52 } // namespace | |
| 53 | |
| 54 // Test that the TraceAnalyzer works. | |
|
jar (doing other things)
2011/10/26 19:35:20
It is much nicer to test components, and verify th
jbates
2011/10/26 21:51:54
In hindsight, I agree that would be easier to main
jbates
2011/10/27 20:36:35
Done.
| |
| 55 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerBasic) { | |
| 56 using namespace trace_analyzer; | |
| 57 ManualSetUp(); | |
| 58 | |
| 59 BeginTracing(); | |
| 60 { | |
| 61 TRACE_EVENT_END0("cat3", "name7"); | |
|
jar (doing other things)
2011/10/26 19:35:20
nit: for readability, it is much nicer to use name
jbates
2011/10/26 21:51:54
I agree that would be clearer. These trace events
| |
| 62 TRACE_EVENT2("cat1", "name1", "arg1", 1111, "arg2", "string1"); | |
| 63 { | |
| 64 TRACE_EVENT2("cat2", "name2", "arg1", 2222, "arg2", "string2"); | |
| 65 TRACE_EVENT_INSTANT1("cat1", "name3", "arg1", 3333); | |
| 66 base::PlatformThread::Sleep(200); | |
| 67 TRACE_EVENT0("cat2", "name6"); | |
| 68 } | |
| 69 TRACE_EVENT_INSTANT1("cat2", "name4", "arg1", 4444); | |
| 70 TRACE_EVENT_INSTANT1("cat2", "name5", "arg1", 1111); | |
| 71 TRACE_EVENT_BEGIN0("cat3", "name7"); | |
| 72 TRACE_EVENT_INSTANT2("cat4", "math1", "a", 10, "b", 5); | |
| 73 TRACE_EVENT_INSTANT2("cat4", "math2", "a", 10, "b", 10); | |
| 74 } | |
| 75 EndTracing(); | |
| 76 | |
| 77 const TraceEvent* event = NULL; | |
| 78 scoped_ptr<TraceAnalyzer> | |
| 79 analyzer(TraceAnalyzer::Create(output_.json_output)); | |
| 80 ASSERT_TRUE(!!analyzer.get()); | |
| 81 analyzer->AssociateBeginEndEvents(); | |
| 82 | |
| 83 TraceAnalyzer::TraceEventVector found; | |
| 84 | |
| 85 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1"), &found); | |
| 86 EXPECT_EQ(3u, found.size()); | |
| 87 | |
| 88 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && | |
| 89 Query(EVENT_ARG, "arg1") == Query::Int(1111), &found); | |
| 90 ASSERT_EQ(1u, found.size()); | |
| 91 EXPECT_STREQ("name1", found.front()->name.c_str()); | |
| 92 | |
| 93 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == Query::Int(1111) || | |
| 94 Query(EVENT_ARG, "arg1") == Query::Int(2222), &found); | |
| 95 EXPECT_EQ(3u, found.size()); | |
| 96 | |
| 97 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == Query::Int(1111) && | |
| 98 Query(EVENT_NAME) != Query::String("name1"), &found); | |
| 99 ASSERT_EQ(1u, found.size()); | |
| 100 EXPECT_STREQ("name5", found.front()->name.c_str()); | |
| 101 | |
| 102 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == Query::Int(1111) && | |
| 103 !(Query(EVENT_NAME) != Query::String("name1")), &found); | |
| 104 ASSERT_EQ(1u, found.size()); | |
| 105 EXPECT_STREQ("name1", found.front()->name.c_str()); | |
| 106 | |
| 107 analyzer->FindEvents(Query::MatchBeginWithEnd() && | |
| 108 Query(EVENT_DURATION) > Query::Int(180000) && | |
| 109 (Query(EVENT_CATEGORY) == Query::String("cat1") || | |
| 110 Query(EVENT_CATEGORY) == Query::String("cat2") || | |
| 111 Query(EVENT_CATEGORY) == Query::String("cat3")), &found); | |
| 112 EXPECT_EQ(2u, found.size()); | |
| 113 | |
| 114 analyzer->FindEvents(Query(EVENT_ARG, "arg1") <= Query::Int(3333), &found); | |
| 115 EXPECT_EQ(4u, found.size()); | |
| 116 | |
| 117 analyzer->FindEvents(Query(EVENT_ARG, "arg1") >= Query::Int(3333), &found); | |
| 118 EXPECT_EQ(2u, found.size()); | |
| 119 | |
| 120 analyzer->FindEvents(Query(EVENT_HAS_ARG, "arg1"), &found); | |
| 121 EXPECT_EQ(5u, found.size()); | |
| 122 | |
| 123 analyzer->FindEvents(Query(EVENT_ARG, "arg2") == Query::String("string1"), | |
| 124 &found); | |
| 125 ASSERT_EQ(1u, found.size()); | |
| 126 EXPECT_STREQ("name1", found.front()->name.c_str()); | |
| 127 | |
| 128 analyzer->FindEvents(Query(EVENT_ARG, "arg2") == Query::Pattern("string?"), | |
| 129 &found); | |
| 130 EXPECT_EQ(2u, found.size()); | |
| 131 | |
| 132 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::Pattern("cat?") && | |
| 133 Query(EVENT_NAME) != Query::Pattern("*"), | |
| 134 &found); | |
| 135 EXPECT_EQ(0u, found.size()); | |
| 136 | |
| 137 analyzer->FindEvents(!Query(EVENT_HAS_OTHER) && | |
| 138 Query(EVENT_CATEGORY) == Query::String("cat2"), &found); | |
| 139 EXPECT_EQ(2u, found.size()); | |
| 140 | |
| 141 event = analyzer->FindOneEvent(Query(OTHER_ARG, "arg1") == Query::Int(1111)); | |
| 142 ASSERT_TRUE(event); | |
| 143 EXPECT_STREQ("name1", event->name.c_str()); | |
| 144 | |
| 145 // Verify that matching END..BEGIN does not get associated. | |
| 146 ASSERT_TRUE(!analyzer->FindOneEvent(Query::MatchBeginName("name7"))); | |
| 147 | |
| 148 ASSERT_TRUE(!analyzer->FindOneEvent(Query(EVENT_ARG, "arg1") < | |
| 149 Query::Int(1111))); | |
| 150 | |
| 151 // Verify that arithmetic operators function: | |
| 152 | |
| 153 analyzer->FindEvents(Query(EVENT_ARG, "a") + | |
| 154 Query(EVENT_ARG, "b") == Query::Int(20), &found); | |
| 155 EXPECT_EQ(1u, found.size()); | |
| 156 EXPECT_STREQ("math2", found.front()->name.c_str()); | |
| 157 | |
| 158 analyzer->FindEvents(Query(EVENT_ARG, "a") - Query(EVENT_ARG, "b") == | |
| 159 Query::Int(5), &found); | |
| 160 EXPECT_EQ(1u, found.size()); | |
| 161 EXPECT_STREQ("math1", found.front()->name.c_str()); | |
| 162 | |
| 163 analyzer->FindEvents(Query(EVENT_ARG, "a") * Query(EVENT_ARG, "b") == | |
| 164 Query::Int(50), &found); | |
| 165 EXPECT_EQ(1u, found.size()); | |
| 166 EXPECT_STREQ("math1", found.front()->name.c_str()); | |
| 167 | |
| 168 analyzer->FindEvents(Query(EVENT_ARG, "a") / Query(EVENT_ARG, "b") == | |
| 169 Query::Int(2), &found); | |
| 170 EXPECT_EQ(1u, found.size()); | |
| 171 EXPECT_STREQ("math1", found.front()->name.c_str()); | |
| 172 | |
| 173 analyzer->FindEvents(Query(EVENT_ARG, "a") % Query(EVENT_ARG, "b") == | |
| 174 Query::Int(0), &found); | |
| 175 EXPECT_EQ(2u, found.size()); | |
| 176 | |
| 177 analyzer->FindEvents(-Query(EVENT_ARG, "b") == Query::Int(-10), &found); | |
| 178 EXPECT_EQ(1u, found.size()); | |
| 179 EXPECT_STREQ("math2", found.front()->name.c_str()); | |
| 180 } | |
| 181 | |
| 182 // Test that the TraceAnalyzer custom associations work. | |
| 183 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerAssociations) { | |
| 184 using namespace trace_analyzer; | |
| 185 ManualSetUp(); | |
| 186 | |
| 187 BeginTracing(); | |
| 188 { | |
| 189 TRACE_EVENT_INSTANT1("cat1", "end", "id", 1); | |
| 190 TRACE_EVENT_INSTANT1("cat2", "begin", "id", 2); | |
| 191 TRACE_EVENT_INSTANT1("cat3", "begin", "id", 3); | |
| 192 TRACE_EVENT_INSTANT1("cat4", "end", "id", 2); | |
| 193 TRACE_EVENT_INSTANT1("cat5", "end", "id", 3); | |
| 194 TRACE_EVENT_INSTANT1("cat6", "begin", "id", 1); | |
| 195 } | |
| 196 EndTracing(); | |
| 197 | |
| 198 scoped_ptr<TraceAnalyzer> | |
| 199 analyzer(TraceAnalyzer::Create(output_.json_output)); | |
| 200 ASSERT_TRUE(!!analyzer.get()); | |
| 201 | |
| 202 Query begin(Query(EVENT_NAME) == Query::String("begin")); | |
| 203 Query end(Query(EVENT_NAME) == Query::String("end")); | |
| 204 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id")); | |
| 205 analyzer->AssociateEvents(begin, end, match); | |
| 206 | |
| 207 TraceAnalyzer::TraceEventVector found; | |
| 208 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && | |
| 209 Query(EVENT_HAS_OTHER), &found); | |
| 210 EXPECT_EQ(0u, found.size()); | |
| 211 | |
| 212 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") && | |
| 213 !Query(EVENT_HAS_OTHER), &found); | |
| 214 EXPECT_EQ(1u, found.size()); | |
| 215 | |
| 216 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat6") && | |
| 217 !Query(EVENT_HAS_OTHER), &found); | |
| 218 EXPECT_EQ(1u, found.size()); | |
| 219 | |
| 220 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat2") && | |
| 221 Query(OTHER_CATEGORY) == Query::String("cat4"), &found); | |
| 222 EXPECT_EQ(1u, found.size()); | |
| 223 | |
| 224 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat4") && | |
| 225 Query(OTHER_CATEGORY) == Query::String("cat2"), &found); | |
| 226 EXPECT_EQ(1u, found.size()); | |
| 227 | |
| 228 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat3") && | |
| 229 Query(OTHER_CATEGORY) == Query::String("cat5"), &found); | |
| 230 EXPECT_EQ(1u, found.size()); | |
| 231 | |
| 232 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat5") && | |
| 233 Query(OTHER_CATEGORY) == Query::String("cat3"), &found); | |
| 234 EXPECT_EQ(1u, found.size()); | |
| 235 | |
| 236 // Verify that literals and types are properly casted. | |
| 237 | |
| 238 // Since these queries don't refer to the event data, the dummy event below | |
| 239 // will never be accessed. | |
| 240 TraceEvent dummy; | |
| 241 char char_num = 5; | |
| 242 short short_num = -5; | |
| 243 EXPECT_TRUE((Query::Double(5.0) == Query::Int(char_num)).Evaluate(dummy)); | |
| 244 EXPECT_TRUE((Query::Double(-5.0) == Query::Int(short_num)).Evaluate(dummy)); | |
| 245 EXPECT_TRUE((Query::Double(1.0) == Query::Uint(1u)).Evaluate(dummy)); | |
| 246 EXPECT_TRUE((Query::Double(1.0) == Query::Int(1)).Evaluate(dummy)); | |
| 247 EXPECT_TRUE((Query::Double(-1.0) == Query::Int(-1)).Evaluate(dummy)); | |
| 248 EXPECT_TRUE((Query::Double(1.0) == Query::Double(1.0f)).Evaluate(dummy)); | |
| 249 EXPECT_TRUE((Query::Bool(true) == Query::Int(1)).Evaluate(dummy)); | |
| 250 EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy)); | |
| 251 EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy)); | |
| 252 EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy)); | |
| 253 } | |
| 254 | |
| 255 | |
| 256 } // namespace trace_analyzer | |
| 257 | |
| OLD | NEW |