1 // Copyright (c) 2013 The Chromium Embedded Framework Authors. All rights
2 // reserved. Use of this source code is governed by a BSD-style license that
3 // can be found in the LICENSE file.
5 #include "include/base/cef_bind.h"
6 #include "include/cef_file_util.h"
7 #include "include/cef_task.h"
8 #include "include/cef_trace.h"
9 #include "include/cef_waitable_event.h"
10 #include "include/wrapper/cef_closure_task.h"
11 #include "tests/ceftests/file_util.h"
12 #include "tests/ceftests/test_handler.h"
13 #include "tests/gtest/include/gtest/gtest.h"
15 // Use the CEF version of the TRACE_* macros instead of the Chromium version.
16 #undef USING_CHROMIUM_INCLUDES
17 #include "include/base/cef_trace_event.h"
19 enum TracingTestType {
23 TT_TRACE_EVENT_INSTANT0,
24 TT_TRACE_EVENT_INSTANT1,
25 TT_TRACE_EVENT_INSTANT2,
26 TT_TRACE_EVENT_COPY_INSTANT0,
27 TT_TRACE_EVENT_COPY_INSTANT1,
28 TT_TRACE_EVENT_COPY_INSTANT2,
29 TT_TRACE_EVENT_BEGIN0,
30 TT_TRACE_EVENT_BEGIN1,
31 TT_TRACE_EVENT_BEGIN2,
32 TT_TRACE_EVENT_COPY_BEGIN0,
33 TT_TRACE_EVENT_COPY_BEGIN1,
34 TT_TRACE_EVENT_COPY_BEGIN2,
38 TT_TRACE_EVENT_COPY_END0,
39 TT_TRACE_EVENT_COPY_END1,
40 TT_TRACE_EVENT_COPY_END2,
42 TT_TRACE_COPY_COUNTER1,
44 TT_TRACE_COPY_COUNTER2,
46 TT_TRACE_COPY_COUNTER_ID1,
48 TT_TRACE_COPY_COUNTER_ID2,
49 TT_TRACE_EVENT_ASYNC_BEGIN0,
50 TT_TRACE_EVENT_ASYNC_BEGIN1,
51 TT_TRACE_EVENT_ASYNC_BEGIN2,
52 TT_TRACE_EVENT_COPY_ASYNC_BEGIN0,
53 TT_TRACE_EVENT_COPY_ASYNC_BEGIN1,
54 TT_TRACE_EVENT_COPY_ASYNC_BEGIN2,
55 TT_TRACE_EVENT_ASYNC_STEP_INTO0,
56 TT_TRACE_EVENT_ASYNC_STEP_INTO1,
57 TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO0,
58 TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO1,
59 TT_TRACE_EVENT_ASYNC_STEP_PAST0,
60 TT_TRACE_EVENT_ASYNC_STEP_PAST1,
61 TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST0,
62 TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST1,
63 TT_TRACE_EVENT_ASYNC_END0,
64 TT_TRACE_EVENT_ASYNC_END1,
65 TT_TRACE_EVENT_ASYNC_END2,
66 TT_TRACE_EVENT_COPY_ASYNC_END0,
67 TT_TRACE_EVENT_COPY_ASYNC_END1,
68 TT_TRACE_EVENT_COPY_ASYNC_END2
71 const char kTraceTestCategory[] = "test_category";
73 class TracingTestHandler : public CefEndTracingCallback,
74 public CefCompletionCallback {
76 TracingTestHandler(TracingTestType type, const char* trace_type)
77 : trace_type_(trace_type),
79 completion_event_ = CefWaitableEvent::CreateWaitableEvent(true, false);
82 void ReadTracingFile(const std::string& file_path) {
85 EXPECT_TRUE(file_util::ReadFileToString(file_path, &trace_data_));
86 EXPECT_TRUE(CefDeleteFile(file_path, false));
88 completion_event_->Signal();
91 // CefEndTracingCallback method:
92 void OnEndTracingComplete(const CefString& tracing_file) override {
96 base::Bind(&TracingTestHandler::ReadTracingFile, this, tracing_file));
102 // Results in a call to OnComplete.
103 CefBeginTracing(kTraceTestCategory, this);
106 void OnComplete() override {
110 case TT_TRACE_EVENT0: {
111 TRACE_EVENT0(kTraceTestCategory, "TT_TRACE_EVENT0");
113 case TT_TRACE_EVENT1: {
114 TRACE_EVENT1(kTraceTestCategory, "TT_TRACE_EVENT1", "arg1", 1);
116 case TT_TRACE_EVENT2: {
117 TRACE_EVENT2(kTraceTestCategory, "TT_TRACE_EVENT2", "arg1", 1,
120 case TT_TRACE_EVENT_INSTANT0:
121 TRACE_EVENT_INSTANT0(kTraceTestCategory,
122 "TT_TRACE_EVENT_INSTANT0");
124 case TT_TRACE_EVENT_INSTANT1:
125 TRACE_EVENT_INSTANT1(kTraceTestCategory, "TT_TRACE_EVENT_INSTANT1",
128 case TT_TRACE_EVENT_INSTANT2:
129 TRACE_EVENT_INSTANT2(kTraceTestCategory, "TT_TRACE_EVENT_INSTANT2",
130 "arg1", 1, "arg2", 2);
132 case TT_TRACE_EVENT_COPY_INSTANT0:
133 TRACE_EVENT_COPY_INSTANT0(kTraceTestCategory,
134 "TT_TRACE_EVENT_COPY_INSTANT0");
136 case TT_TRACE_EVENT_COPY_INSTANT1:
137 TRACE_EVENT_COPY_INSTANT1(kTraceTestCategory,
138 "TT_TRACE_EVENT_COPY_INSTANT1",
141 case TT_TRACE_EVENT_COPY_INSTANT2:
142 TRACE_EVENT_COPY_INSTANT2(kTraceTestCategory,
143 "TT_TRACE_EVENT_COPY_INSTANT2",
144 "arg1", 1, "arg2", 2);
146 case TT_TRACE_EVENT_BEGIN0:
147 TRACE_EVENT_BEGIN0(kTraceTestCategory, "TT_TRACE_EVENT_BEGIN0");
149 case TT_TRACE_EVENT_BEGIN1:
150 TRACE_EVENT_BEGIN1(kTraceTestCategory, "TT_TRACE_EVENT_BEGIN1",
153 case TT_TRACE_EVENT_BEGIN2:
154 TRACE_EVENT_BEGIN2(kTraceTestCategory, "TT_TRACE_EVENT_BEGIN2",
155 "arg1", 1, "arg2", 2);
157 case TT_TRACE_EVENT_COPY_BEGIN0:
158 TRACE_EVENT_COPY_BEGIN0(kTraceTestCategory,
159 "TT_TRACE_EVENT_COPY_BEGIN0");
161 case TT_TRACE_EVENT_COPY_BEGIN1:
162 TRACE_EVENT_COPY_BEGIN1(kTraceTestCategory,
163 "TT_TRACE_EVENT_COPY_BEGIN1",
166 case TT_TRACE_EVENT_COPY_BEGIN2:
167 TRACE_EVENT_COPY_BEGIN2(kTraceTestCategory,
168 "TT_TRACE_EVENT_COPY_BEGIN2",
169 "arg1", 1, "arg2", 2);
171 case TT_TRACE_EVENT_END0:
172 TRACE_EVENT_END0(kTraceTestCategory, "TT_TRACE_EVENT_END0");
174 case TT_TRACE_EVENT_END1:
175 TRACE_EVENT_END1(kTraceTestCategory, "TT_TRACE_EVENT_END1",
178 case TT_TRACE_EVENT_END2:
179 TRACE_EVENT_END2(kTraceTestCategory, "TT_TRACE_EVENT_END2",
180 "arg1", 1, "arg2", 2);
182 case TT_TRACE_EVENT_COPY_END0:
183 TRACE_EVENT_COPY_END0(kTraceTestCategory,
184 "TT_TRACE_EVENT_COPY_END0");
186 case TT_TRACE_EVENT_COPY_END1:
187 TRACE_EVENT_COPY_END1(kTraceTestCategory,
188 "TT_TRACE_EVENT_COPY_END1", "arg1", 1);
190 case TT_TRACE_EVENT_COPY_END2:
191 TRACE_EVENT_COPY_END2(kTraceTestCategory,
192 "TT_TRACE_EVENT_COPY_END2", "arg1", 1, "arg2", 2);
194 case TT_TRACE_COUNTER1:
195 TRACE_COUNTER1(kTraceTestCategory, "TT_TRACE_COUNTER1", 5);
197 case TT_TRACE_COPY_COUNTER1:
198 TRACE_COPY_COUNTER1(kTraceTestCategory, "TT_TRACE_COPY_COUNTER1", 5);
200 case TT_TRACE_COUNTER2:
201 TRACE_COUNTER2(kTraceTestCategory, "TT_TRACE_COUNTER2", "val1", 5,
204 case TT_TRACE_COPY_COUNTER2:
205 TRACE_COPY_COUNTER2(kTraceTestCategory, "TT_TRACE_COPY_COUNTER2",
206 "val1", 5, "val2", 10);
208 case TT_TRACE_COUNTER_ID1:
209 TRACE_COUNTER_ID1(kTraceTestCategory, "TT_TRACE_COUNTER_ID1", 100, 5);
211 case TT_TRACE_COPY_COUNTER_ID1:
212 TRACE_COPY_COUNTER_ID1(kTraceTestCategory,
213 "TT_TRACE_COPY_COUNTER_ID1", 100, 5);
215 case TT_TRACE_COUNTER_ID2:
216 TRACE_COUNTER_ID2(kTraceTestCategory, "TT_TRACE_COUNTER_ID2", 100,
217 "val1", 5, "val2", 10);
219 case TT_TRACE_COPY_COUNTER_ID2:
220 TRACE_COPY_COUNTER_ID2(kTraceTestCategory,
221 "TT_TRACE_COPY_COUNTER_ID2", 100,
222 "val1", 5, "val2", 10);
224 case TT_TRACE_EVENT_ASYNC_BEGIN0:
225 TRACE_EVENT_ASYNC_BEGIN0(kTraceTestCategory,
226 "TT_TRACE_EVENT_ASYNC_BEGIN0", 100);
228 case TT_TRACE_EVENT_ASYNC_BEGIN1:
229 TRACE_EVENT_ASYNC_BEGIN1(kTraceTestCategory,
230 "TT_TRACE_EVENT_ASYNC_BEGIN1", 100, "arg1", 1);
232 case TT_TRACE_EVENT_ASYNC_BEGIN2:
233 TRACE_EVENT_ASYNC_BEGIN2(kTraceTestCategory,
234 "TT_TRACE_EVENT_ASYNC_BEGIN2",
235 100, "arg1", 1, "arg2", 2);
237 case TT_TRACE_EVENT_COPY_ASYNC_BEGIN0:
238 TRACE_EVENT_COPY_ASYNC_BEGIN0(kTraceTestCategory,
239 "TT_TRACE_EVENT_COPY_ASYNC_BEGIN0",
242 case TT_TRACE_EVENT_COPY_ASYNC_BEGIN1:
243 TRACE_EVENT_COPY_ASYNC_BEGIN1(kTraceTestCategory,
244 "TT_TRACE_EVENT_COPY_ASYNC_BEGIN1",
247 case TT_TRACE_EVENT_COPY_ASYNC_BEGIN2:
248 TRACE_EVENT_COPY_ASYNC_BEGIN2(kTraceTestCategory,
249 "TT_TRACE_EVENT_COPY_ASYNC_BEGIN2",
250 100, "arg1", 1, "arg2", 2);
252 case TT_TRACE_EVENT_ASYNC_STEP_INTO0:
253 TRACE_EVENT_ASYNC_STEP_INTO0(
254 kTraceTestCategory, "TT_TRACE_EVENT_ASYNC_STEP_INTO0", 100, 1000);
256 case TT_TRACE_EVENT_ASYNC_STEP_INTO1:
257 TRACE_EVENT_ASYNC_STEP_INTO1(
258 kTraceTestCategory, "TT_TRACE_EVENT_ASYNC_STEP_INTO1", 100, 1000,
261 case TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO0:
262 TRACE_EVENT_COPY_ASYNC_STEP_INTO0(
263 kTraceTestCategory, "TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO0", 100,
266 case TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO1:
267 TRACE_EVENT_COPY_ASYNC_STEP_INTO1(
268 kTraceTestCategory, "TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO1", 100,
271 case TT_TRACE_EVENT_ASYNC_STEP_PAST0:
272 TRACE_EVENT_ASYNC_STEP_PAST0(
273 kTraceTestCategory, "TT_TRACE_EVENT_ASYNC_STEP_PAST0", 100, 1000);
275 case TT_TRACE_EVENT_ASYNC_STEP_PAST1:
276 TRACE_EVENT_ASYNC_STEP_PAST1(
277 kTraceTestCategory, "TT_TRACE_EVENT_ASYNC_STEP_PAST1", 100, 1000,
280 case TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST0:
281 TRACE_EVENT_COPY_ASYNC_STEP_PAST0(
282 kTraceTestCategory, "TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST0", 100,
285 case TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST1:
286 TRACE_EVENT_COPY_ASYNC_STEP_PAST1(
287 kTraceTestCategory, "TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST1", 100,
290 case TT_TRACE_EVENT_ASYNC_END0:
291 TRACE_EVENT_ASYNC_END0(kTraceTestCategory,
292 "TT_TRACE_EVENT_ASYNC_END0", 100);
294 case TT_TRACE_EVENT_ASYNC_END1:
295 TRACE_EVENT_ASYNC_END1(kTraceTestCategory,
296 "TT_TRACE_EVENT_ASYNC_END1", 100,
299 case TT_TRACE_EVENT_ASYNC_END2:
300 TRACE_EVENT_ASYNC_END2(kTraceTestCategory,
301 "TT_TRACE_EVENT_ASYNC_END2", 100,
302 "arg1", 1, "arg2", 2);
303 case TT_TRACE_EVENT_COPY_ASYNC_END0:
304 TRACE_EVENT_COPY_ASYNC_END0(kTraceTestCategory,
305 "TT_TRACE_EVENT_COPY_ASYNC_END0",
308 case TT_TRACE_EVENT_COPY_ASYNC_END1:
309 TRACE_EVENT_COPY_ASYNC_END1(kTraceTestCategory,
310 "TT_TRACE_EVENT_COPY_ASYNC_END1",
313 case TT_TRACE_EVENT_COPY_ASYNC_END2:
314 TRACE_EVENT_COPY_ASYNC_END2(kTraceTestCategory,
315 "TT_TRACE_EVENT_COPY_ASYNC_END2",
316 100, "arg1", 1, "arg2", 2);
320 // Results in a call to OnEndTracingComplete.
321 CefEndTracing(CefString(), this);
326 CefPostTask(TID_UI, base::Bind(&TracingTestHandler::RunTracing, this));
328 // Wait for the test to complete.
329 completion_event_->Wait();
331 // Verify the results.
332 EXPECT_TRUE(!trace_data_.empty());
333 EXPECT_TRUE(trace_type_ != NULL);
334 EXPECT_TRUE(strstr(trace_data_.c_str(), trace_type_) != NULL);
338 ~TracingTestHandler() override {}
340 // Handle used to notify when the test is complete.
341 CefRefPtr<CefWaitableEvent> completion_event_;
343 const char* trace_type_;
344 TracingTestType type_;
345 std::string trace_data_;
347 IMPLEMENT_REFCOUNTING(TracingTestHandler);
350 // Helper for defining tracing tests.
351 #define TRACING_TEST(name, test_type) \
352 TEST(TracingTest, name) { \
353 CefRefPtr<TracingTestHandler> handler = \
354 new TracingTestHandler(test_type, #test_type); \
355 handler->ExecuteTest(); \
359 TRACING_TEST(TraceEvent0, TT_TRACE_EVENT0);
360 TRACING_TEST(TraceEvent1, TT_TRACE_EVENT1);
361 TRACING_TEST(TraceEvent2, TT_TRACE_EVENT2);
362 TRACING_TEST(TraceEventInstant0, TT_TRACE_EVENT_INSTANT0);
363 TRACING_TEST(TraceEventInstant1, TT_TRACE_EVENT_INSTANT1);
364 TRACING_TEST(TraceEventInstant2, TT_TRACE_EVENT_INSTANT2);
365 TRACING_TEST(TraceEventCopyInstant0, TT_TRACE_EVENT_COPY_INSTANT0);
366 TRACING_TEST(TraceEventCopyInstant1, TT_TRACE_EVENT_COPY_INSTANT1);
367 TRACING_TEST(TraceEventCopyInstant2, TT_TRACE_EVENT_COPY_INSTANT2);
368 TRACING_TEST(TraceEventBegin0, TT_TRACE_EVENT_BEGIN0);
369 TRACING_TEST(TraceEventBegin1, TT_TRACE_EVENT_BEGIN1);
370 TRACING_TEST(TraceEventBegin2, TT_TRACE_EVENT_BEGIN2);
371 TRACING_TEST(TraceEventCopyBegin0, TT_TRACE_EVENT_COPY_BEGIN0);
372 TRACING_TEST(TraceEventCopyBegin1, TT_TRACE_EVENT_COPY_BEGIN1);
373 TRACING_TEST(TraceEventCopyBegin2, TT_TRACE_EVENT_COPY_BEGIN2);
374 TRACING_TEST(TraceEventEnd0, TT_TRACE_EVENT_END0);
375 TRACING_TEST(TraceEventEnd1, TT_TRACE_EVENT_END1);
376 TRACING_TEST(TraceEventEnd2, TT_TRACE_EVENT_END2);
377 TRACING_TEST(TraceEventCopyEnd0, TT_TRACE_EVENT_COPY_END0);
378 TRACING_TEST(TraceEventCopyEnd1, TT_TRACE_EVENT_COPY_END1);
379 TRACING_TEST(TraceEventCopyEnd2, TT_TRACE_EVENT_COPY_END1);
380 TRACING_TEST(TraceCounter1, TT_TRACE_COUNTER1);
381 TRACING_TEST(TraceCopyCounter1, TT_TRACE_COPY_COUNTER1);
382 TRACING_TEST(TraceCounter2, TT_TRACE_COUNTER2);
383 TRACING_TEST(TraceCopyCounter2, TT_TRACE_COPY_COUNTER2);
384 TRACING_TEST(TraceCounterId1, TT_TRACE_COUNTER_ID1);
385 TRACING_TEST(TraceCopyCounterId1, TT_TRACE_COPY_COUNTER_ID1);
386 TRACING_TEST(TraceCounterId2, TT_TRACE_COUNTER_ID2);
387 TRACING_TEST(TraceCopyCounterId2, TT_TRACE_COPY_COUNTER_ID1);
388 TRACING_TEST(TraceEventAsyncBegin0, TT_TRACE_EVENT_ASYNC_BEGIN0);
389 TRACING_TEST(TraceEventAsyncBegin1, TT_TRACE_EVENT_ASYNC_BEGIN1);
390 TRACING_TEST(TraceEventAsyncBegin2, TT_TRACE_EVENT_ASYNC_BEGIN2);
391 TRACING_TEST(TraceEventCopyAsyncBegin0,
392 TT_TRACE_EVENT_COPY_ASYNC_BEGIN0);
393 TRACING_TEST(TraceEventCopyAsyncBegin1,
394 TT_TRACE_EVENT_COPY_ASYNC_BEGIN1);
395 TRACING_TEST(TraceEventCopyAsyncBegin2,
396 TT_TRACE_EVENT_COPY_ASYNC_BEGIN2);
397 TRACING_TEST(TraceEventAsyncStepInto0,
398 TT_TRACE_EVENT_ASYNC_STEP_INTO0);
399 TRACING_TEST(TraceEventAsyncStepInto1,
400 TT_TRACE_EVENT_ASYNC_STEP_INTO1);
401 TRACING_TEST(TraceEventCopyAsyncStepInto0,
402 TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO0);
403 TRACING_TEST(TraceEventCopyAsyncStepInto1,
404 TT_TRACE_EVENT_COPY_ASYNC_STEP_INTO1);
405 TRACING_TEST(TraceEventAsyncStepPast0,
406 TT_TRACE_EVENT_ASYNC_STEP_PAST0);
407 TRACING_TEST(TraceEventAsyncStepPast1,
408 TT_TRACE_EVENT_ASYNC_STEP_PAST1);
409 TRACING_TEST(TraceEventCopyAsyncStepPast0,
410 TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST0);
411 TRACING_TEST(TraceEventCopyAsyncStepPast1,
412 TT_TRACE_EVENT_COPY_ASYNC_STEP_PAST1);
413 TRACING_TEST(TraceEventAsyncEnd0, TT_TRACE_EVENT_ASYNC_END0);
414 TRACING_TEST(TraceEventAsyncEnd1, TT_TRACE_EVENT_ASYNC_END1);
415 TRACING_TEST(TraceEventAsyncEnd2, TT_TRACE_EVENT_ASYNC_END2);
416 TRACING_TEST(TraceEventCopyAsyncEnd0, TT_TRACE_EVENT_COPY_ASYNC_END0);
419 TEST(TracingTest, NowFromSystemTraceTime) {
420 int64 val = CefNowFromSystemTraceTime();