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

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: . Created 9 years, 2 months 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
20 std::string trace_string_;
21 };
22
23 void TraceEventAnalyzerTest::ManualSetUp() {
24 base::debug::TraceLog::Resurrect();
25 base::debug::TraceLog* tracelog = base::debug::TraceLog::GetInstance();
26 ASSERT_TRUE(tracelog);
27 tracelog->SetOutputCallback(
28 base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected,
29 base::Unretained(this)));
30 }
31
32 void TraceEventAnalyzerTest::OnTraceDataCollected(
33 scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str) {
34 trace_string_ = json_events_str->data;
35 }
36
37 } // namespace
38
39 // Test that the TraceAnalyzer works.
40 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerBasic) {
41 using namespace trace_analyzer;
42 ManualSetUp();
43
44 base::debug::TraceLog::GetInstance()->SetEnabled(true);
45 {
46 TRACE_EVENT_END0("cat3", "name7");
47 TRACE_EVENT2("cat1", "name1", "arg1", 1111, "arg2", "string1");
48 {
49 TRACE_EVENT2("cat2", "name2", "arg1", 2222, "arg2", "string2");
50 TRACE_EVENT_INSTANT1("cat1", "name3", "arg1", 3333);
51 base::PlatformThread::Sleep(200);
52 TRACE_EVENT0("cat2", "name6");
53 }
54 TRACE_EVENT_INSTANT1("cat2", "name4", "arg1", 4444);
55 TRACE_EVENT_INSTANT1("cat2", "name5", "arg1", 1111);
56 TRACE_EVENT_BEGIN0("cat3", "name7");
57 TRACE_EVENT_INSTANT2("cat4", "math1", "a", 10, "b", 5);
58 TRACE_EVENT_INSTANT2("cat4", "math2", "a", 10, "b", 10);
59 }
60 base::debug::TraceLog::GetInstance()->SetEnabled(false);
61
62 const TraceEvent* event = NULL;
63 TraceAnalyzer* analyzer = TraceAnalyzer::Create(trace_string_);
64 ASSERT_TRUE(!!analyzer);
65 analyzer->AssociateBeginEndEvents();
66
67 TraceAnalyzer::TraceEventVector found;
68
69 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1", &found);
70 EXPECT_EQ(3u, found.size());
71
72 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1" &&
73 Query(EVENT_ARG, "arg1") == 1111, &found);
74 ASSERT_EQ(1u, found.size());
75 EXPECT_STREQ("name1", found.front()->name.c_str());
76
77 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == 1111 ||
78 Query(EVENT_ARG, "arg1") == 2222, &found);
79 EXPECT_EQ(3u, found.size());
80
81 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == 1111 &&
82 Query(EVENT_NAME) != "name1", &found);
83 ASSERT_EQ(1u, found.size());
84 EXPECT_STREQ("name5", found.front()->name.c_str());
85
86 analyzer->FindEvents(Query(EVENT_ARG, "arg1") == 1111 &&
87 !(Query(EVENT_NAME) != "name1"), &found);
88 ASSERT_EQ(1u, found.size());
89 EXPECT_STREQ("name1", found.front()->name.c_str());
90
91 analyzer->FindEvents(Query::MatchBeginWithEnd() &&
92 Query(EVENT_DURATION) > 180000 &&
93 (Query(EVENT_CATEGORY) == "cat1" ||
94 Query(EVENT_CATEGORY) == "cat2" ||
95 Query(EVENT_CATEGORY) == "cat3"), &found);
96 EXPECT_EQ(2u, found.size());
97
98 analyzer->FindEvents(Query(EVENT_ARG, "arg1") <= 3333, &found);
99 EXPECT_EQ(4u, found.size());
100
101 analyzer->FindEvents(Query(EVENT_ARG, "arg1") >= 3333, &found);
102 EXPECT_EQ(2u, found.size());
103
104 analyzer->FindEvents(Query(EVENT_HAS_ARG, "arg1"), &found);
105 EXPECT_EQ(5u, found.size());
106
107 analyzer->FindEvents(Query(EVENT_ARG, "arg2") == "string1", &found);
108 ASSERT_EQ(1u, found.size());
109 EXPECT_STREQ("name1", found.front()->name.c_str());
110
111 analyzer->FindEvents(Query(EVENT_ARG, "arg2") == Query::Pattern("string?"),
112 &found);
113 EXPECT_EQ(2u, found.size());
114
115 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::Pattern("cat?") &&
116 Query(EVENT_NAME) != Query::Pattern("*"),
117 &found);
118 EXPECT_EQ(0u, found.size());
119
120 analyzer->FindEvents(!Query(EVENT_HAS_OTHER) &&
121 Query(EVENT_CATEGORY) == "cat2", &found);
122 EXPECT_EQ(2u, found.size());
123
124 event = analyzer->FindOneEvent(Query(OTHER_ARG, "arg1") == 1111);
125 ASSERT_TRUE(event);
126 EXPECT_STREQ("name1", event->name.c_str());
127
128 // Verify that matching END..BEGIN does not get associated.
129 ASSERT_TRUE(!analyzer->FindOneEvent(Query::MatchBeginName("name7")));
130
131 ASSERT_TRUE(!analyzer->FindOneEvent(Query(EVENT_ARG, "arg1") < 1111));
132
133 // Verify that arithmetic operators function:
134
135 analyzer->FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") == 20,
136 &found);
137 EXPECT_EQ(1u, found.size());
138 EXPECT_STREQ("math2", found.front()->name.c_str());
139
140 analyzer->FindEvents(Query(EVENT_ARG, "a") - Query(EVENT_ARG, "b") == 5,
141 &found);
142 EXPECT_EQ(1u, found.size());
143 EXPECT_STREQ("math1", found.front()->name.c_str());
144
145 analyzer->FindEvents(Query(EVENT_ARG, "a") * Query(EVENT_ARG, "b") == 50,
146 &found);
147 EXPECT_EQ(1u, found.size());
148 EXPECT_STREQ("math1", found.front()->name.c_str());
149
150 analyzer->FindEvents(Query(EVENT_ARG, "a") / Query(EVENT_ARG, "b") == 2,
151 &found);
152 EXPECT_EQ(1u, found.size());
153 EXPECT_STREQ("math1", found.front()->name.c_str());
154
155 analyzer->FindEvents(Query(EVENT_ARG, "a") % Query(EVENT_ARG, "b") == 0,
156 &found);
157 EXPECT_EQ(2u, found.size());
158
159 analyzer->FindEvents(-Query(EVENT_ARG, "b") == -10, &found);
160 EXPECT_EQ(1u, found.size());
161 EXPECT_STREQ("math2", found.front()->name.c_str());
162 }
163
164 // Test that the TraceAnalyzer custom associations work.
165 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerAssociations) {
166 using namespace trace_analyzer;
167 ManualSetUp();
168
169 base::debug::TraceLog::GetInstance()->SetEnabled(true);
170 {
171 TRACE_EVENT_INSTANT1("cat1", "end", "id", 1);
172 TRACE_EVENT_INSTANT1("cat2", "begin", "id", 2);
173 TRACE_EVENT_INSTANT1("cat3", "begin", "id", 3);
174 TRACE_EVENT_INSTANT1("cat4", "end", "id", 2);
175 TRACE_EVENT_INSTANT1("cat5", "end", "id", 3);
176 TRACE_EVENT_INSTANT1("cat6", "begin", "id", 1);
177 }
178 base::debug::TraceLog::GetInstance()->SetEnabled(false);
179
180 TraceAnalyzer* analyzer = TraceAnalyzer::Create(trace_string_);
181 ASSERT_TRUE(!!analyzer);
182
183 Query begin(Query(EVENT_NAME) == "begin");
184 Query end(Query(EVENT_NAME) == "end");
185 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id"));
186 analyzer->AssociateEvents(begin, end, match);
187
188 TraceAnalyzer::TraceEventVector found;
189 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1" &&
190 Query(EVENT_HAS_OTHER), &found);
191 EXPECT_EQ(0u, found.size());
192
193 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat1" &&
194 !Query(EVENT_HAS_OTHER), &found);
195 EXPECT_EQ(1u, found.size());
196
197 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat6" &&
198 !Query(EVENT_HAS_OTHER), &found);
199 EXPECT_EQ(1u, found.size());
200
201 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat2" &&
202 Query(OTHER_CATEGORY) == "cat4", &found);
203 EXPECT_EQ(1u, found.size());
204
205 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat4" &&
206 Query(OTHER_CATEGORY) == "cat2", &found);
207 EXPECT_EQ(1u, found.size());
208
209 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat3" &&
210 Query(OTHER_CATEGORY) == "cat5", &found);
211 EXPECT_EQ(1u, found.size());
212
213 analyzer->FindEvents(Query(EVENT_CATEGORY) == "cat5" &&
214 Query(OTHER_CATEGORY) == "cat3", &found);
215 EXPECT_EQ(1u, found.size());
216
217 // Verify that literals and types are properly casted.
218
219 // Since these queries don't refer to the event data, the dummy event below
220 // will never be accessed.
221 TraceEvent dummy;
222 char char_num = 5;
223 short short_num = -5;
224 EXPECT_TRUE((Query(5.0) == char_num).Evaluate(dummy));
225 EXPECT_TRUE((Query(-5.0) == short_num).Evaluate(dummy));
226 EXPECT_TRUE((Query(1.0) == 1u).Evaluate(dummy));
227 EXPECT_TRUE((Query(1.0) == 1).Evaluate(dummy));
228 EXPECT_TRUE((Query(-1.0) == -1).Evaluate(dummy));
229 EXPECT_TRUE((Query(1.0) == 1.0f).Evaluate(dummy));
230 EXPECT_TRUE((Query(true) == 1).Evaluate(dummy));
231 EXPECT_TRUE((Query(false) == 0).Evaluate(dummy));
232 EXPECT_TRUE((Query(true) == 1.0f).Evaluate(dummy));
233 EXPECT_TRUE((Query(false) == 0.0f).Evaluate(dummy));
234 }
235
236
237 } // namespace trace_analyzer
238
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