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

Side by Side Diff: base/debug/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/debug/trace_event_analyzer.h"
6
7 #include "base/bind.h"
8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace base {
12 namespace debug {
13
14 namespace {
15
16 class TraceEventAnalyzerTest : public testing::Test {
17 public:
18 void ManualSetUp();
19 void OnTraceDataCollected(
20 scoped_refptr<TraceLog::RefCountedString> json_events_str);
21
22 std::string trace_string_;
23 };
24
25 void TraceEventAnalyzerTest::ManualSetUp() {
26 TraceLog::Resurrect();
27 TraceLog* tracelog = TraceLog::GetInstance();
28 ASSERT_TRUE(tracelog);
29 tracelog->SetOutputCallback(
30 base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected,
31 base::Unretained(this)));
32 }
33
34 void TraceEventAnalyzerTest::OnTraceDataCollected(
35 scoped_refptr<TraceLog::RefCountedString> json_events_str) {
36 trace_string_ = json_events_str->data;
37 }
38
39 } // namespace
40
41 // Test that the TraceAnalyzer works.
42 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerBasic) {
43 using namespace base::debug::trace;
44 ManualSetUp();
45
46 TraceLog::GetInstance()->SetEnabled(true);
47 {
48 TRACE_EVENT_END0("cat3", "name7");
49 TRACE_EVENT2("cat1", "name1", "arg1", 1111, "arg2", "string1");
50 {
51 TRACE_EVENT2("cat2", "name2", "arg1", 2222, "arg2", "string2");
52 TRACE_EVENT_INSTANT1("cat1", "name3", "arg1", 3333);
53 base::PlatformThread::Sleep(200);
54 TRACE_EVENT0("cat2", "name6");
55 }
56 TRACE_EVENT_INSTANT1("cat2", "name4", "arg1", 4444);
57 TRACE_EVENT_INSTANT1("cat2", "name5", "arg1", 1111);
58 TRACE_EVENT_BEGIN0("cat3", "name7");
59 TRACE_EVENT_INSTANT2("cat4", "math1", "a", 10, "b", 5);
60 TRACE_EVENT_INSTANT2("cat4", "math2", "a", 10, "b", 10);
61 }
62 TraceLog::GetInstance()->SetEnabled(false);
63
64 const TestTraceEvent* event = NULL;
65 TraceAnalyzer analyzer;
66 analyzer.SetEvents(trace_string_);
67
68 TraceAnalyzer::ConstEventPtrVector found;
69
70 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat1", &found);
71 EXPECT_EQ(3u, found.size());
72
73 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat1" &&
74 Query(EVENT_ARG, "arg1") == 1111, &found);
75 ASSERT_EQ(1u, found.size());
76 EXPECT_STREQ("name1", found.front()->name.c_str());
77
78 analyzer.FindEvents(Query(EVENT_ARG, "arg1") == 1111 ||
79 Query(EVENT_ARG, "arg1") == 2222, &found);
80 EXPECT_EQ(3u, found.size());
81
82 analyzer.FindEvents(Query(EVENT_ARG, "arg1") == 1111 &&
83 Query(EVENT_NAME) != "name1", &found);
84 ASSERT_EQ(1u, found.size());
85 EXPECT_STREQ("name5", found.front()->name.c_str());
86
87 analyzer.FindEvents(Query(EVENT_ARG, "arg1") == 1111 &&
88 !(Query(EVENT_NAME) != "name1"), &found);
89 ASSERT_EQ(1u, found.size());
90 EXPECT_STREQ("name1", found.front()->name.c_str());
91
92 analyzer.FindEvents(Query::MatchBeginWithEnd() &&
93 Query(EVENT_DURATION) > 180000 &&
94 (Query(EVENT_CATEGORY) == "cat1" ||
95 Query(EVENT_CATEGORY) == "cat2" ||
96 Query(EVENT_CATEGORY) == "cat3"), &found);
97 EXPECT_EQ(2u, found.size());
98
99 analyzer.FindEvents(Query(EVENT_ARG, "arg1") <= 3333, &found);
100 EXPECT_EQ(4u, found.size());
101
102 analyzer.FindEvents(Query(EVENT_ARG, "arg1") >= 3333, &found);
103 EXPECT_EQ(2u, found.size());
104
105 analyzer.FindEvents(Query(EVENT_HAS_ARG, "arg1"), &found);
106 EXPECT_EQ(5u, found.size());
107
108 analyzer.FindEvents(Query(EVENT_ARG, "arg2") == "string1", &found);
109 ASSERT_EQ(1u, found.size());
110 EXPECT_STREQ("name1", found.front()->name.c_str());
111
112 analyzer.FindEvents(Query(EVENT_ARG, "arg2") == Query::Pattern("string?"),
113 &found);
114 EXPECT_EQ(2u, found.size());
115
116 analyzer.FindEvents(Query(EVENT_CATEGORY) == Query::Pattern("cat?") &&
117 Query(EVENT_NAME) != Query::Pattern("*"),
118 &found);
119 EXPECT_EQ(0u, found.size());
120
121 analyzer.FindEvents(!Query(EVENT_HAS_OTHER) &&
122 Query(EVENT_CATEGORY) == "cat2", &found);
123 EXPECT_EQ(2u, found.size());
124
125 event = analyzer.FindOneEvent(Query(OTHER_ARG, "arg1") == 1111);
126 ASSERT_TRUE(event);
127 EXPECT_STREQ("name1", event->name.c_str());
128
129 // Verify that matching END..BEGIN does not get associated.
130 ASSERT_TRUE(!analyzer.FindOneEvent(Query::MatchBeginName("name7")));
131
132 ASSERT_TRUE(!analyzer.FindOneEvent(Query(EVENT_ARG, "arg1") < 1111));
133
134 // Verify that arithmetic operators function:
135
136 analyzer.FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") == 20,
137 &found);
138 EXPECT_EQ(1u, found.size());
139 EXPECT_STREQ("math2", found.front()->name.c_str());
140
141 analyzer.FindEvents(Query(EVENT_ARG, "a") - Query(EVENT_ARG, "b") == 5,
142 &found);
143 EXPECT_EQ(1u, found.size());
144 EXPECT_STREQ("math1", found.front()->name.c_str());
145
146 analyzer.FindEvents(Query(EVENT_ARG, "a") * Query(EVENT_ARG, "b") == 50,
147 &found);
148 EXPECT_EQ(1u, found.size());
149 EXPECT_STREQ("math1", found.front()->name.c_str());
150
151 analyzer.FindEvents(Query(EVENT_ARG, "a") / Query(EVENT_ARG, "b") == 2,
152 &found);
153 EXPECT_EQ(1u, found.size());
154 EXPECT_STREQ("math1", found.front()->name.c_str());
155
156 analyzer.FindEvents(Query(EVENT_ARG, "a") % Query(EVENT_ARG, "b") == 0,
157 &found);
158 EXPECT_EQ(2u, found.size());
159
160 analyzer.FindEvents(-Query(EVENT_ARG, "b") == -10, &found);
161 EXPECT_EQ(1u, found.size());
162 EXPECT_STREQ("math2", found.front()->name.c_str());
163 }
164
165 // Test that the TraceAnalyzer custom associations work.
166 TEST_F(TraceEventAnalyzerTest, TraceAnalyzerAssociations) {
167 using namespace base::debug::trace;
168 ManualSetUp();
169
170 TraceLog::GetInstance()->SetEnabled(true);
171 {
172 TRACE_EVENT_INSTANT1("cat1", "end", "id", 1);
173 TRACE_EVENT_INSTANT1("cat2", "begin", "id", 2);
174 TRACE_EVENT_INSTANT1("cat3", "begin", "id", 3);
175 TRACE_EVENT_INSTANT1("cat4", "end", "id", 2);
176 TRACE_EVENT_INSTANT1("cat5", "end", "id", 3);
177 TRACE_EVENT_INSTANT1("cat6", "begin", "id", 1);
178 }
179 TraceLog::GetInstance()->SetEnabled(false);
180
181 TraceAnalyzer analyzer;
182 analyzer.SetEvents(trace_string_);
183 analyzer.ClearAssociations();
184
185 Query begin(Query(EVENT_NAME) == "begin");
186 Query end(Query(EVENT_NAME) == "end");
187 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id"));
188 analyzer.AssociateEvents(begin, end, match);
189
190 TraceAnalyzer::ConstEventPtrVector found;
191 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat1" &&
192 Query(EVENT_HAS_OTHER), &found);
193 EXPECT_EQ(0u, found.size());
194
195 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat1" &&
196 !Query(EVENT_HAS_OTHER), &found);
197 EXPECT_EQ(1u, found.size());
198
199 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat6" &&
200 !Query(EVENT_HAS_OTHER), &found);
201 EXPECT_EQ(1u, found.size());
202
203 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat2" &&
204 Query(OTHER_CATEGORY) == "cat4", &found);
205 EXPECT_EQ(1u, found.size());
206
207 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat4" &&
208 Query(OTHER_CATEGORY) == "cat2", &found);
209 EXPECT_EQ(1u, found.size());
210
211 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat3" &&
212 Query(OTHER_CATEGORY) == "cat5", &found);
213 EXPECT_EQ(1u, found.size());
214
215 analyzer.FindEvents(Query(EVENT_CATEGORY) == "cat5" &&
216 Query(OTHER_CATEGORY) == "cat3", &found);
217 EXPECT_EQ(1u, found.size());
218 }
219
220
221 } // namespace debug
222 } // namespace base
223
OLDNEW
« base/debug/trace_event_analyzer.h ('K') | « base/debug/trace_event_analyzer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698