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

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: pid tid name fixed 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
« no previous file with comments | « base/test/trace_event_analyzer.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 output_.json_output.clear();
35 }
36
37 void TraceEventAnalyzerTest::OnTraceDataCollected(
38 scoped_refptr<base::debug::TraceLog::RefCountedString> json_events_str) {
39 buffer_.AddFragment(json_events_str->data);
40 }
41
42 void TraceEventAnalyzerTest::BeginTracing() {
43 output_.json_output.clear();
44 buffer_.Start();
45 base::debug::TraceLog::GetInstance()->SetEnabled(true);
46 }
47
48 void TraceEventAnalyzerTest::EndTracing() {
49 base::debug::TraceLog::GetInstance()->SetEnabled(false);
50 buffer_.Finish();
51 }
52
53 } // namespace
54
55 TEST_F(TraceEventAnalyzerTest, NoEvents) {
56 using namespace trace_analyzer;
57 ManualSetUp();
58
59 // Create an empty JSON event string:
60 buffer_.Start();
61 buffer_.Finish();
62
63 scoped_ptr<TraceAnalyzer>
64 analyzer(TraceAnalyzer::Create(output_.json_output));
65 ASSERT_TRUE(analyzer.get());
66
67 // Search for all events and verify that nothing is returned.
68 TraceAnalyzer::TraceEventVector found;
69 analyzer->FindEvents(Query::Bool(true), &found);
70 EXPECT_EQ(0u, found.size());
71 }
72
73 TEST_F(TraceEventAnalyzerTest, QueryEventMember) {
74 using namespace trace_analyzer;
75 ManualSetUp();
76
77 TraceEvent event;
78 event.thread.process_id = 3;
79 event.thread.thread_id = 4;
80 event.timestamp = 1.5;
81 event.phase = base::debug::TRACE_EVENT_PHASE_BEGIN;
82 event.category = "category";
83 event.name = "name";
84 event.arg_numbers["num"] = 7.0;
85 event.arg_strings["str"] = "the string";
86
87 // Other event with all different members:
88 TraceEvent other;
89 other.thread.process_id = 5;
90 other.thread.thread_id = 6;
91 other.timestamp = 2.5;
92 other.phase = base::debug::TRACE_EVENT_PHASE_END;
93 other.category = "category2";
94 other.name = "name2";
95 other.arg_numbers["num2"] = 8.0;
96 other.arg_strings["str2"] = "the string 2";
97
98 event.other_event = &other;
99 double duration;
100 ASSERT_TRUE(event.GetAbsTimeToOtherEvent(&duration));
101
102 Query event_pid = (Query(EVENT_PID) == Query::Int(event.thread.process_id));
103 Query event_tid = (Query(EVENT_TID) == Query::Int(event.thread.thread_id));
104 Query event_time = (Query(EVENT_TIME) == Query::Double(event.timestamp));
105 Query event_duration = (Query(EVENT_DURATION) == Query::Double(duration));
106 Query event_phase = (Query(EVENT_PHASE) == Query::Phase(event.phase));
107 Query event_category =
108 (Query(EVENT_CATEGORY) == Query::String(event.category));
109 Query event_name = (Query(EVENT_NAME) == Query::String(event.name));
110 Query event_has_arg1 = Query(EVENT_HAS_ARG, "num");
111 Query event_has_arg2 = Query(EVENT_HAS_ARG, "str");
112 Query event_arg1 =
113 (Query(EVENT_ARG, "num") == Query::Double(event.arg_numbers["num"]));
114 Query event_arg2 =
115 (Query(EVENT_ARG, "str") == Query::String(event.arg_strings["str"]));
116 Query event_has_other = Query(EVENT_HAS_OTHER);
117 Query other_pid = (Query(OTHER_PID) == Query::Int(other.thread.process_id));
118 Query other_tid = (Query(OTHER_TID) == Query::Int(other.thread.thread_id));
119 Query other_time = (Query(OTHER_TIME) == Query::Double(other.timestamp));
120 Query other_phase = (Query(OTHER_PHASE) == Query::Phase(other.phase));
121 Query other_category =
122 (Query(OTHER_CATEGORY) == Query::String(other.category));
123 Query other_name = (Query(OTHER_NAME) == Query::String(other.name));
124 Query other_has_arg1 = Query(OTHER_HAS_ARG, "num2");
125 Query other_has_arg2 = Query(OTHER_HAS_ARG, "str2");
126 Query other_arg1 =
127 (Query(OTHER_ARG, "num2") == Query::Double(other.arg_numbers["num2"]));
128 Query other_arg2 =
129 (Query(OTHER_ARG, "str2") == Query::String(other.arg_strings["str2"]));
130
131 EXPECT_TRUE(event_pid.Evaluate(event));
132 EXPECT_TRUE(event_tid.Evaluate(event));
133 EXPECT_TRUE(event_time.Evaluate(event));
134 EXPECT_TRUE(event_duration.Evaluate(event));
135 EXPECT_TRUE(event_phase.Evaluate(event));
136 EXPECT_TRUE(event_category.Evaluate(event));
137 EXPECT_TRUE(event_name.Evaluate(event));
138 EXPECT_TRUE(event_has_arg1.Evaluate(event));
139 EXPECT_TRUE(event_has_arg2.Evaluate(event));
140 EXPECT_TRUE(event_arg1.Evaluate(event));
141 EXPECT_TRUE(event_arg2.Evaluate(event));
142 EXPECT_TRUE(event_has_other.Evaluate(event));
143 EXPECT_TRUE(other_pid.Evaluate(event));
144 EXPECT_TRUE(other_tid.Evaluate(event));
145 EXPECT_TRUE(other_time.Evaluate(event));
146 EXPECT_TRUE(other_phase.Evaluate(event));
147 EXPECT_TRUE(other_category.Evaluate(event));
148 EXPECT_TRUE(other_name.Evaluate(event));
149 EXPECT_TRUE(other_has_arg1.Evaluate(event));
150 EXPECT_TRUE(other_has_arg2.Evaluate(event));
151 EXPECT_TRUE(other_arg1.Evaluate(event));
152 EXPECT_TRUE(other_arg2.Evaluate(event));
153
154 // Evaluate event queries against other to verify the queries fail when the
155 // event members are wrong.
156 EXPECT_FALSE(event_pid.Evaluate(other));
157 EXPECT_FALSE(event_tid.Evaluate(other));
158 EXPECT_FALSE(event_time.Evaluate(other));
159 EXPECT_FALSE(event_duration.Evaluate(other));
160 EXPECT_FALSE(event_phase.Evaluate(other));
161 EXPECT_FALSE(event_category.Evaluate(other));
162 EXPECT_FALSE(event_name.Evaluate(other));
163 EXPECT_FALSE(event_has_arg1.Evaluate(other));
164 EXPECT_FALSE(event_has_arg2.Evaluate(other));
165 EXPECT_FALSE(event_arg1.Evaluate(other));
166 EXPECT_FALSE(event_arg2.Evaluate(other));
167 EXPECT_FALSE(event_has_other.Evaluate(other));
168 }
169
170 TEST_F(TraceEventAnalyzerTest, BooleanOperators) {
171 using namespace trace_analyzer;
172 ManualSetUp();
173
174 BeginTracing();
175 {
176 TRACE_EVENT_INSTANT1("cat1", "name1", "num", 1);
177 TRACE_EVENT_INSTANT1("cat1", "name2", "num", 2);
178 TRACE_EVENT_INSTANT1("cat2", "name3", "num", 3);
179 TRACE_EVENT_INSTANT1("cat2", "name4", "num", 4);
180 }
181 EndTracing();
182
183 scoped_ptr<TraceAnalyzer>
184 analyzer(TraceAnalyzer::Create(output_.json_output));
185 ASSERT_TRUE(!!analyzer.get());
186
187 TraceAnalyzer::TraceEventVector found;
188
189 // ==
190
191 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1"), &found);
192 ASSERT_EQ(2u, found.size());
193 EXPECT_STREQ("name1", found[0]->name.c_str());
194 EXPECT_STREQ("name2", found[1]->name.c_str());
195
196 analyzer->FindEvents(Query(EVENT_ARG, "num") == Query::Int(2), &found);
197 ASSERT_EQ(1u, found.size());
198 EXPECT_STREQ("name2", found[0]->name.c_str());
199
200 // !=
201
202 analyzer->FindEvents(Query(EVENT_CATEGORY) != Query::String("cat1"), &found);
203 ASSERT_EQ(2u, found.size());
204 EXPECT_STREQ("name3", found[0]->name.c_str());
205 EXPECT_STREQ("name4", found[1]->name.c_str());
206
207 analyzer->FindEvents(Query(EVENT_ARG, "num") != Query::Int(2), &found);
208 ASSERT_EQ(3u, found.size());
209 EXPECT_STREQ("name1", found[0]->name.c_str());
210 EXPECT_STREQ("name3", found[1]->name.c_str());
211 EXPECT_STREQ("name4", found[2]->name.c_str());
212
213 // <
214 analyzer->FindEvents(Query(EVENT_ARG, "num") < Query::Int(2), &found);
215 ASSERT_EQ(1u, found.size());
216 EXPECT_STREQ("name1", found[0]->name.c_str());
217
218 // <=
219 analyzer->FindEvents(Query(EVENT_ARG, "num") <= Query::Int(2), &found);
220 ASSERT_EQ(2u, found.size());
221 EXPECT_STREQ("name1", found[0]->name.c_str());
222 EXPECT_STREQ("name2", found[1]->name.c_str());
223
224 // >
225 analyzer->FindEvents(Query(EVENT_ARG, "num") > Query::Int(3), &found);
226 ASSERT_EQ(1u, found.size());
227 EXPECT_STREQ("name4", found[0]->name.c_str());
228
229 // >=
230 analyzer->FindEvents(Query(EVENT_ARG, "num") >= Query::Int(4), &found);
231 ASSERT_EQ(1u, found.size());
232 EXPECT_STREQ("name4", found[0]->name.c_str());
233
234 // &&
235 analyzer->FindEvents(Query(EVENT_NAME) != Query::String("name1") &&
236 Query(EVENT_ARG, "num") < Query::Int(3), &found);
237 ASSERT_EQ(1u, found.size());
238 EXPECT_STREQ("name2", found[0]->name.c_str());
239
240 // ||
241 analyzer->FindEvents(Query(EVENT_NAME) == Query::String("name1") ||
242 Query(EVENT_ARG, "num") == Query::Int(3), &found);
243 ASSERT_EQ(2u, found.size());
244 EXPECT_STREQ("name1", found[0]->name.c_str());
245 EXPECT_STREQ("name3", found[1]->name.c_str());
246
247 // !
248 analyzer->FindEvents(!(Query(EVENT_NAME) == Query::String("name1") ||
249 Query(EVENT_ARG, "num") == Query::Int(3)), &found);
250 ASSERT_EQ(2u, found.size());
251 EXPECT_STREQ("name2", found[0]->name.c_str());
252 EXPECT_STREQ("name4", found[1]->name.c_str());
253 }
254
255 TEST_F(TraceEventAnalyzerTest, ArithmeticOperators) {
256 using namespace trace_analyzer;
257 ManualSetUp();
258
259 BeginTracing();
260 {
261 // These events are searched for:
262 TRACE_EVENT_INSTANT2("cat1", "math1", "a", 10, "b", 5);
263 TRACE_EVENT_INSTANT2("cat1", "math2", "a", 10, "b", 10);
264 // Extra events that never match, for noise:
265 TRACE_EVENT_INSTANT2("noise", "math3", "a", 1, "b", 3);
266 TRACE_EVENT_INSTANT2("noise", "math4", "c", 10, "d", 5);
267 }
268 EndTracing();
269
270 scoped_ptr<TraceAnalyzer>
271 analyzer(TraceAnalyzer::Create(output_.json_output));
272 ASSERT_TRUE(analyzer.get());
273
274 TraceAnalyzer::TraceEventVector found;
275
276 // Verify that arithmetic operators function:
277
278 // +
279 analyzer->FindEvents(Query(EVENT_ARG, "a") + Query(EVENT_ARG, "b") ==
280 Query::Int(20), &found);
281 EXPECT_EQ(1u, found.size());
282 EXPECT_STREQ("math2", found.front()->name.c_str());
283
284 // -
285 analyzer->FindEvents(Query(EVENT_ARG, "a") - Query(EVENT_ARG, "b") ==
286 Query::Int(5), &found);
287 EXPECT_EQ(1u, found.size());
288 EXPECT_STREQ("math1", found.front()->name.c_str());
289
290 // *
291 analyzer->FindEvents(Query(EVENT_ARG, "a") * Query(EVENT_ARG, "b") ==
292 Query::Int(50), &found);
293 EXPECT_EQ(1u, found.size());
294 EXPECT_STREQ("math1", found.front()->name.c_str());
295
296 // /
297 analyzer->FindEvents(Query(EVENT_ARG, "a") / Query(EVENT_ARG, "b") ==
298 Query::Int(2), &found);
299 EXPECT_EQ(1u, found.size());
300 EXPECT_STREQ("math1", found.front()->name.c_str());
301
302 // %
303 analyzer->FindEvents(Query(EVENT_ARG, "a") % Query(EVENT_ARG, "b") ==
304 Query::Int(0), &found);
305 EXPECT_EQ(2u, found.size());
306
307 // - (negate)
308 analyzer->FindEvents(-Query(EVENT_ARG, "b") == Query::Int(-10), &found);
309 EXPECT_EQ(1u, found.size());
310 EXPECT_STREQ("math2", found.front()->name.c_str());
311 }
312
313 TEST_F(TraceEventAnalyzerTest, StringPattern) {
314 using namespace trace_analyzer;
315 ManualSetUp();
316
317 BeginTracing();
318 {
319 TRACE_EVENT_INSTANT0("cat1", "name1");
320 TRACE_EVENT_INSTANT0("cat1", "name2");
321 TRACE_EVENT_INSTANT0("cat1", "no match");
322 TRACE_EVENT_INSTANT0("cat1", "name3x");
323 }
324 EndTracing();
325
326 scoped_ptr<TraceAnalyzer>
327 analyzer(TraceAnalyzer::Create(output_.json_output));
328 ASSERT_TRUE(analyzer.get());
329
330 TraceAnalyzer::TraceEventVector found;
331
332 analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name?"), &found);
333 ASSERT_EQ(2u, found.size());
334 EXPECT_STREQ("name1", found[0]->name.c_str());
335 EXPECT_STREQ("name2", found[1]->name.c_str());
336
337 analyzer->FindEvents(Query(EVENT_NAME) == Query::Pattern("name*"), &found);
338 ASSERT_EQ(3u, found.size());
339 EXPECT_STREQ("name1", found[0]->name.c_str());
340 EXPECT_STREQ("name2", found[1]->name.c_str());
341 EXPECT_STREQ("name3x", found[2]->name.c_str());
342
343 analyzer->FindEvents(Query(EVENT_NAME) != Query::Pattern("name*"), &found);
344 ASSERT_EQ(1u, found.size());
345 EXPECT_STREQ("no match", found[0]->name.c_str());
346 }
347
348 // Test that duration queries work.
349 TEST_F(TraceEventAnalyzerTest, Duration) {
350 using namespace trace_analyzer;
351 ManualSetUp();
352
353 int sleep_time_us = 200000;
354 // We will search for events that have a duration of greater than 90% of the
355 // sleep time, so that there is no flakiness.
356 int duration_cutoff_us = (sleep_time_us * 9) / 10;
357
358 BeginTracing();
359 {
360 TRACE_EVENT0("cat1", "name1"); // found by duration query
361 TRACE_EVENT0("noise", "name2"); // not searched for, just noise
362 {
363 TRACE_EVENT0("cat2", "name3"); // found by duration query
364 TRACE_EVENT_INSTANT0("noise", "name4"); // not searched for, just noise
365 base::PlatformThread::Sleep(sleep_time_us / 1000);
366 TRACE_EVENT0("cat2", "name5"); // not found (duration too short)
367 }
368 }
369 EndTracing();
370
371 scoped_ptr<TraceAnalyzer>
372 analyzer(TraceAnalyzer::Create(output_.json_output));
373 ASSERT_TRUE(analyzer.get());
374 analyzer->AssociateBeginEndEvents();
375
376 TraceAnalyzer::TraceEventVector found;
377 analyzer->FindEvents(Query::MatchBeginWithEnd() &&
378 Query(EVENT_DURATION) > Query::Int(duration_cutoff_us) &&
379 (Query(EVENT_CATEGORY) == Query::String("cat1") ||
380 Query(EVENT_CATEGORY) == Query::String("cat2") ||
381 Query(EVENT_CATEGORY) == Query::String("cat3")), &found);
382 ASSERT_EQ(2u, found.size());
383 EXPECT_STREQ("name1", found[0]->name.c_str());
384 EXPECT_STREQ("name3", found[1]->name.c_str());
385 }
386
387 // Test that arithmetic operators work.
388 TEST_F(TraceEventAnalyzerTest, BeginEndAssocations) {
389 using namespace trace_analyzer;
390 ManualSetUp();
391
392 BeginTracing();
393 {
394 TRACE_EVENT_END0("cat1", "name1"); // does not match out of order begin
395 TRACE_EVENT0("cat1", "name2");
396 TRACE_EVENT_INSTANT0("cat1", "name3");
397 TRACE_EVENT_BEGIN0("cat1", "name1");
398 }
399 EndTracing();
400
401 scoped_ptr<TraceAnalyzer>
402 analyzer(TraceAnalyzer::Create(output_.json_output));
403 ASSERT_TRUE(analyzer.get());
404 analyzer->AssociateBeginEndEvents();
405
406 TraceAnalyzer::TraceEventVector found;
407 analyzer->FindEvents(Query::MatchBeginWithEnd(), &found);
408 ASSERT_EQ(1u, found.size());
409 EXPECT_STREQ("name2", found[0]->name.c_str());
410 }
411
412 // Test that the TraceAnalyzer custom associations work.
413 TEST_F(TraceEventAnalyzerTest, CustomAssociations) {
414 using namespace trace_analyzer;
415 ManualSetUp();
416
417 // Add events that begin/end in pipelined ordering with unique ID parameter
418 // to match up the begin/end pairs.
419 BeginTracing();
420 {
421 TRACE_EVENT_INSTANT1("cat1", "end", "id", 1); // no begin match
422 TRACE_EVENT_INSTANT1("cat2", "begin", "id", 2); // end is cat4
423 TRACE_EVENT_INSTANT1("cat3", "begin", "id", 3); // end is cat5
424 TRACE_EVENT_INSTANT1("cat4", "end", "id", 2);
425 TRACE_EVENT_INSTANT1("cat5", "end", "id", 3);
426 TRACE_EVENT_INSTANT1("cat6", "begin", "id", 1); // no end match
427 }
428 EndTracing();
429
430 scoped_ptr<TraceAnalyzer>
431 analyzer(TraceAnalyzer::Create(output_.json_output));
432 ASSERT_TRUE(analyzer.get());
433
434 // begin, end, and match queries to find proper begin/end pairs.
435 Query begin(Query(EVENT_NAME) == Query::String("begin"));
436 Query end(Query(EVENT_NAME) == Query::String("end"));
437 Query match(Query(EVENT_ARG, "id") == Query(OTHER_ARG, "id"));
438 analyzer->AssociateEvents(begin, end, match);
439
440 TraceAnalyzer::TraceEventVector found;
441
442 // cat1 has no other_event.
443 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") &&
444 Query(EVENT_HAS_OTHER), &found);
445 EXPECT_EQ(0u, found.size());
446
447 // cat1 has no other_event.
448 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat1") &&
449 !Query(EVENT_HAS_OTHER), &found);
450 EXPECT_EQ(1u, found.size());
451
452 // cat6 has no other_event.
453 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat6") &&
454 !Query(EVENT_HAS_OTHER), &found);
455 EXPECT_EQ(1u, found.size());
456
457 // cat2 and cat4 are a associated.
458 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat2") &&
459 Query(OTHER_CATEGORY) == Query::String("cat4"), &found);
460 EXPECT_EQ(1u, found.size());
461
462 // cat4 and cat2 are a associated.
463 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat4") &&
464 Query(OTHER_CATEGORY) == Query::String("cat2"), &found);
465 EXPECT_EQ(1u, found.size());
466
467 // cat3 and cat5 are a associated.
468 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat3") &&
469 Query(OTHER_CATEGORY) == Query::String("cat5"), &found);
470 EXPECT_EQ(1u, found.size());
471
472 // cat5 and cat3 are a associated.
473 analyzer->FindEvents(Query(EVENT_CATEGORY) == Query::String("cat5") &&
474 Query(OTHER_CATEGORY) == Query::String("cat3"), &found);
475 EXPECT_EQ(1u, found.size());
476 }
477
478 // Verify that Query literals and types are properly casted.
479 TEST_F(TraceEventAnalyzerTest, Literals) {
480 using namespace trace_analyzer;
481 ManualSetUp();
482
483 // Since these queries don't refer to the event data, the dummy event below
484 // will never be accessed.
485 TraceEvent dummy;
486 char char_num = 5;
487 short short_num = -5;
488 EXPECT_TRUE((Query::Double(5.0) == Query::Int(char_num)).Evaluate(dummy));
489 EXPECT_TRUE((Query::Double(-5.0) == Query::Int(short_num)).Evaluate(dummy));
490 EXPECT_TRUE((Query::Double(1.0) == Query::Uint(1u)).Evaluate(dummy));
491 EXPECT_TRUE((Query::Double(1.0) == Query::Int(1)).Evaluate(dummy));
492 EXPECT_TRUE((Query::Double(-1.0) == Query::Int(-1)).Evaluate(dummy));
493 EXPECT_TRUE((Query::Double(1.0) == Query::Double(1.0f)).Evaluate(dummy));
494 EXPECT_TRUE((Query::Bool(true) == Query::Int(1)).Evaluate(dummy));
495 EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy));
496 EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy));
497 EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy));
498 }
499
500
501 } // namespace trace_analyzer
502
OLDNEW
« no previous file with comments | « base/test/trace_event_analyzer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698