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 |