Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1823)

Side by Side Diff: base/test/trace_event_analyzer_unittest.cc

Issue 7981004: add classes trace_analyzer::Query and TraceAnalyzer to make it easy to search through trace data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments updated Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW
« base/test/trace_event_analyzer.cc ('K') | « base/test/trace_event_analyzer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698