1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file.
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <math.h>
6cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h>
7cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h>
8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <cstdlib>
10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/bind.h"
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/command_line.h"
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_reader.h"
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/json/json_writer.h"
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/location.h"
16cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/macros.h"
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/ref_counted_memory.h"
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/scoped_ptr.h"
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/memory/singleton.h"
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/process/process_handle.h"
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/single_thread_task_runner.h"
22cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/stl_util.h"
23cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/strings/pattern.h"
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/strings/stringprintf.h"
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/synchronization/waitable_event.h"
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/threading/platform_thread.h"
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/threading/thread.h"
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h"
29cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/trace_event/trace_buffer.h"
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event.h"
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event_synthetic_delay.h"
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/values.h"
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gmock/include/gmock/gmock.h"
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "testing/gtest/include/gtest/gtest.h"
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event {
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace {
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
41b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratenum CompareOp {
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  IS_EQUAL,
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  IS_NOT_EQUAL,
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstruct JsonKeyValue {
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const char* key;
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const char* value;
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  CompareOp op;
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kThreadId = 42;
53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kAsyncId = 5;
54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kAsyncIdStr[] = "0x5";
55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kAsyncId2 = 6;
56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kAsyncId2Str[] = "0x6";
57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kFlowId = 7;
58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kFlowIdStr[] = "0x7";
59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst  char kRecordAllCategoryFilter[] = "*";
61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceEventTestFixture : public testing::Test {
63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void OnTraceDataCollected(
65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      WaitableEvent* flush_complete_event,
66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      const scoped_refptr<base::RefCountedString>& events_str,
67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      bool has_more_events);
68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void OnWatchEventMatched() {
69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ++event_watch_notification_;
70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values);
72b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* FindNamePhase(const char* name, const char* phase);
73b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* FindNamePhaseKeyValue(const char* name,
74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                         const char* phase,
75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                         const char* key,
76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                         const char* value);
77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void DropTracedMetadataRecords();
78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool FindMatchingValue(const char* key,
79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         const char* value);
80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool FindNonMatchingValue(const char* key,
81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                            const char* value);
82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void Clear() {
83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed_.Clear();
84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    json_output_.json_output.clear();
85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void BeginTrace() {
88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    BeginSpecificTrace("*");
89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void BeginSpecificTrace(const std::string& filter) {
92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    event_watch_notification_ = 0;
93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->SetEnabled(TraceConfig(filter, ""),
94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                        TraceLog::RECORDING_MODE);
95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
97cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void CancelTrace() {
98cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    WaitableEvent flush_complete_event(false, false);
99cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    CancelTraceAsync(&flush_complete_event);
100cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    flush_complete_event.Wait();
101cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
102cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void EndTraceAndFlush() {
104cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    num_flush_callbacks_ = 0;
105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    WaitableEvent flush_complete_event(false, false);
106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EndTraceAndFlushAsync(&flush_complete_event);
107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    flush_complete_event.Wait();
108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Used when testing thread-local buffers which requires the thread initiating
111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // flush to have a message loop.
112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void EndTraceAndFlushInThreadWithMessageLoop() {
113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    WaitableEvent flush_complete_event(false, false);
114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    Thread flush_thread("flush");
115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    flush_thread.Start();
116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    flush_thread.task_runner()->PostTask(
117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        FROM_HERE, base::Bind(&TraceEventTestFixture::EndTraceAndFlushAsync,
118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              base::Unretained(this), &flush_complete_event));
119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    flush_complete_event.Wait();
120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
122cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  void CancelTraceAsync(WaitableEvent* flush_complete_event) {
123cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    TraceLog::GetInstance()->CancelTracing(
124cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko        base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
125cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                   base::Unretained(static_cast<TraceEventTestFixture*>(this)),
126cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                   base::Unretained(flush_complete_event)));
127cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
128cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) {
130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->SetDisabled();
131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->Flush(
132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                   base::Unretained(static_cast<TraceEventTestFixture*>(this)),
134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                   base::Unretained(flush_complete_event)));
135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void FlushMonitoring() {
138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    WaitableEvent flush_complete_event(false, false);
139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    FlushMonitoring(&flush_complete_event);
140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    flush_complete_event.Wait();
141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void FlushMonitoring(WaitableEvent* flush_complete_event) {
144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->FlushButLeaveBufferIntact(
145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                   base::Unretained(static_cast<TraceEventTestFixture*>(this)),
147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                   base::Unretained(flush_complete_event)));
148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void SetUp() override {
151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* name = PlatformThread::GetName();
152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    old_thread_name_ = name ? strdup(name) : NULL;
153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::DeleteForTesting();
155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog* tracelog = TraceLog::GetInstance();
156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(tracelog);
157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_FALSE(tracelog->IsEnabled());
158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_buffer_.SetOutputCallback(json_output_.GetCallback());
159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    event_watch_notification_ = 0;
160cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    num_flush_callbacks_ = 0;
161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void TearDown() override {
163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (TraceLog::GetInstance())
164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    PlatformThread::SetName(old_thread_name_ ? old_thread_name_ : "");
166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    free(old_thread_name_);
167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    old_thread_name_ = NULL;
168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // We want our singleton torn down after each test.
169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::DeleteForTesting();
170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  char* old_thread_name_;
173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ListValue trace_parsed_;
174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceResultBuffer trace_buffer_;
175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceResultBuffer::SimpleOutput json_output_;
176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int event_watch_notification_;
177cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  size_t num_flush_callbacks_;
178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private:
180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // We want our singleton torn down after each test.
181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ShadowingAtExitManager at_exit_manager_;
182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Lock lock_;
183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceEventTestFixture::OnTraceDataCollected(
186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    WaitableEvent* flush_complete_event,
187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const scoped_refptr<base::RefCountedString>& events_str,
188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    bool has_more_events) {
189cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  num_flush_callbacks_++;
190cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  if (num_flush_callbacks_ > 1) {
191cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_FALSE(events_str->data().empty());
192cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  AutoLock lock(lock_);
194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  json_output_.json_output.clear();
195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.Start();
196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.AddFragment(events_str->data());
197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.Finish();
198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
199cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  scoped_ptr<Value> root = base::JSONReader::Read(
200cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      json_output_.json_output, JSON_PARSE_RFC | JSON_DETACHABLE_CHILDREN);
201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!root.get()) {
203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    LOG(ERROR) << json_output_.json_output;
204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ListValue* root_list = NULL;
207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(root.get());
208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(root->GetAsList(&root_list));
209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Move items into our aggregate collection
211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  while (root_list->GetSize()) {
212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    scoped_ptr<Value> item;
213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    root_list->Remove(0, &item);
214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed_.Append(item.release());
215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!has_more_events)
218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    flush_complete_event->Signal();
219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic bool CompareJsonValues(const std::string& lhs,
222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              const std::string& rhs,
223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              CompareOp op) {
224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  switch (op) {
225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case IS_EQUAL:
226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return lhs == rhs;
227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    case IS_NOT_EQUAL:
228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return lhs != rhs;
229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    default:
230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      CHECK(0);
231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic bool IsKeyValueInDict(const JsonKeyValue* key_value,
236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                             DictionaryValue* dict) {
237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Value* value = NULL;
238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string value_str;
239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (dict->Get(key_value->key, &value) &&
240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      value->GetAsString(&value_str) &&
241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      CompareJsonValues(value_str, key_value->value, key_value->op))
242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return true;
243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Recurse to test arguments
245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* args_dict = NULL;
246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (args_dict)
248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return IsKeyValueInDict(key_value, args_dict);
249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic bool IsAllKeyValueInDict(const JsonKeyValue* key_values,
254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                DictionaryValue* dict) {
255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Scan all key_values, they must all be present and equal.
256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  while (key_values && key_values->key) {
257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!IsKeyValueInDict(key_values, dict))
258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return false;
259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ++key_values;
260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return true;
262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratDictionaryValue* TraceEventTestFixture::FindMatchingTraceEntry(
265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const JsonKeyValue* key_values) {
266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Scan all items
267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t trace_parsed_count = trace_parsed_.GetSize();
268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < trace_parsed_count; i++) {
269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    Value* value = NULL;
270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed_.Get(i, &value);
271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!value || value->GetType() != Value::TYPE_DICTIONARY)
272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    DictionaryValue* dict = static_cast<DictionaryValue*>(value);
274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (IsAllKeyValueInDict(key_values, dict))
276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return dict;
277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return NULL;
279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceEventTestFixture::DropTracedMetadataRecords() {
282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_ptr<ListValue> old_trace_parsed(trace_parsed_.DeepCopy());
283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t old_trace_parsed_size = old_trace_parsed->GetSize();
284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_parsed_.Clear();
285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < old_trace_parsed_size; i++) {
287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    Value* value = NULL;
288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    old_trace_parsed->Get(i, &value);
289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!value || value->GetType() != Value::TYPE_DICTIONARY) {
290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_parsed_.Append(value->DeepCopy());
291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    DictionaryValue* dict = static_cast<DictionaryValue*>(value);
294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string tmp;
295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (dict->GetString("ph", &tmp) && tmp == "M")
296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed_.Append(value->DeepCopy());
299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratDictionaryValue* TraceEventTestFixture::FindNamePhase(const char* name,
303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                                      const char* phase) {
304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  JsonKeyValue key_values[] = {
305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {"name", name, IS_EQUAL},
306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {"ph", phase, IS_EQUAL},
307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {0, 0, IS_EQUAL}
308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  };
309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return FindMatchingTraceEntry(key_values);
310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratDictionaryValue* TraceEventTestFixture::FindNamePhaseKeyValue(
313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* name,
314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* phase,
315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* key,
316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* value) {
317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  JsonKeyValue key_values[] = {
318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {"name", name, IS_EQUAL},
319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {"ph", phase, IS_EQUAL},
320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {key, value, IS_EQUAL},
321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {0, 0, IS_EQUAL}
322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  };
323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return FindMatchingTraceEntry(key_values);
324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceEventTestFixture::FindMatchingValue(const char* key,
327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                              const char* value) {
328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  JsonKeyValue key_values[] = {
329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {key, value, IS_EQUAL},
330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {0, 0, IS_EQUAL}
331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  };
332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return FindMatchingTraceEntry(key_values);
333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool TraceEventTestFixture::FindNonMatchingValue(const char* key,
336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                                 const char* value) {
337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  JsonKeyValue key_values[] = {
338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {key, value, IS_NOT_EQUAL},
339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    {0, 0, IS_EQUAL}
340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  };
341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return FindMatchingTraceEntry(key_values);
342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool IsStringInDict(const char* string_to_match, const DictionaryValue* dict) {
345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (it.key().find(string_to_match) != std::string::npos)
347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return true;
348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string value_str;
350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    it.value().GetAsString(&value_str);
351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (value_str.find(string_to_match) != std::string::npos)
352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return true;
353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Recurse to test arguments
356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* args_dict = NULL;
357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (args_dict)
359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return IsStringInDict(string_to_match, args_dict);
360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst DictionaryValue* FindTraceEntry(
365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const ListValue& trace_parsed,
366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* string_to_match,
367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* match_after_this_item = NULL) {
368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Scan all items
369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t trace_parsed_count = trace_parsed.GetSize();
370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < trace_parsed_count; i++) {
371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const Value* value = NULL;
372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed.Get(i, &value);
373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (match_after_this_item) {
374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      if (value == match_after_this_item)
375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat         match_after_this_item = NULL;
376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!value || value->GetType() != Value::TYPE_DICTIONARY)
379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (IsStringInDict(string_to_match, dict))
383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      return dict;
384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return NULL;
386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::vector<const DictionaryValue*> FindTraceEntries(
389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const ListValue& trace_parsed,
390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* string_to_match) {
391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<const DictionaryValue*> hits;
392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t trace_parsed_count = trace_parsed.GetSize();
393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < trace_parsed_count; i++) {
394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const Value* value = NULL;
395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed.Get(i, &value);
396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!value || value->GetType() != Value::TYPE_DICTIONARY)
397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (IsStringInDict(string_to_match, dict))
401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      hits.push_back(dict);
402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return hits;
404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst char kControlCharacters[] = "\001\002\003\n\r";
407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceWithAllMacroVariants(WaitableEvent* task_complete_event) {
409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("all", "TRACE_EVENT0 call");
411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT1("all", "TRACE_EVENT1 call", "name1", "value1");
412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT2("all", "TRACE_EVENT2 call",
413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                 "name1", "\"value1\"",
414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                 "name2", "value\\2");
415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT0("all", "TRACE_EVENT_INSTANT0 call",
417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TRACE_EVENT_SCOPE_GLOBAL);
418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT1("all", "TRACE_EVENT_INSTANT1 call",
419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TRACE_EVENT_SCOPE_PROCESS, "name1", "value1");
420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT2("all", "TRACE_EVENT_INSTANT2 call",
421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TRACE_EVENT_SCOPE_THREAD,
422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         "name1", "value1",
423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         "name2", "value2");
424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_BEGIN0("all", "TRACE_EVENT_BEGIN0 call");
426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_BEGIN1("all", "TRACE_EVENT_BEGIN1 call", "name1", "value1");
427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_BEGIN2("all", "TRACE_EVENT_BEGIN2 call",
428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       "name1", "value1",
429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       "name2", "value2");
430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_END0("all", "TRACE_EVENT_END0 call");
432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_END1("all", "TRACE_EVENT_END1 call", "name1", "value1");
433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_END2("all", "TRACE_EVENT_END2 call",
434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                     "name1", "value1",
435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                     "name2", "value2");
436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_BEGIN0("all", "TRACE_EVENT_ASYNC_BEGIN0 call", kAsyncId);
438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_BEGIN1("all", "TRACE_EVENT_ASYNC_BEGIN1 call", kAsyncId,
439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                             "name1", "value1");
440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_BEGIN2("all", "TRACE_EVENT_ASYNC_BEGIN2 call", kAsyncId,
441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                             "name1", "value1",
442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                             "name2", "value2");
443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_STEP_INTO0("all", "TRACE_EVENT_ASYNC_STEP_INTO0 call",
445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                 kAsyncId, "step_begin1");
446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_STEP_INTO1("all", "TRACE_EVENT_ASYNC_STEP_INTO1 call",
447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                 kAsyncId, "step_begin2", "name1", "value1");
448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_END0("all", "TRACE_EVENT_ASYNC_END0 call", kAsyncId);
450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_END1("all", "TRACE_EVENT_ASYNC_END1 call", kAsyncId,
451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           "name1", "value1");
452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_END2("all", "TRACE_EVENT_ASYNC_END2 call", kAsyncId,
453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           "name1", "value1",
454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           "name2", "value2");
455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_FLOW_BEGIN0("all", "TRACE_EVENT_FLOW_BEGIN0 call", kFlowId);
457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_FLOW_STEP0("all", "TRACE_EVENT_FLOW_STEP0 call",
458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           kFlowId, "step1");
459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0("all",
460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        "TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call", kFlowId);
461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_COUNTER1("all", "TRACE_COUNTER1 call", 31415);
463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_COUNTER2("all", "TRACE_COUNTER2 call",
464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                   "a", 30000,
465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                   "b", 1415);
466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
467cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    TRACE_COUNTER_WITH_TIMESTAMP1("all", "TRACE_COUNTER_WITH_TIMESTAMP1 call",
468cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                  42, 31415);
469cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    TRACE_COUNTER_WITH_TIMESTAMP2("all", "TRACE_COUNTER_WITH_TIMESTAMP2 call",
470cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                  42, "a", 30000, "b", 1415);
471cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_COUNTER_ID1("all", "TRACE_COUNTER_ID1 call", 0x319009, 31415);
473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_COUNTER_ID2("all", "TRACE_COUNTER_ID2 call", 0x319009,
474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      "a", 30000, "b", 1415);
475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all",
477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        "TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call",
478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        kAsyncId, kThreadId, 12345);
479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("all",
480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        "TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call",
481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        kAsyncId, kThreadId, 23456);
482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all",
484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        "TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call",
485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        kAsyncId2, kThreadId, 34567);
486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_STEP_PAST0("all", "TRACE_EVENT_ASYNC_STEP_PAST0 call",
487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                 kAsyncId2, "step_end1");
488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_ASYNC_STEP_PAST1("all", "TRACE_EVENT_ASYNC_STEP_PAST1 call",
489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                 kAsyncId2, "step_end2", "name1", "value1");
490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0("all",
492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        "TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call",
493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        kAsyncId2, kThreadId, 45678);
494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_OBJECT_CREATED_WITH_ID("all", "tracked object 1", 0x42);
496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        "all", "tracked object 1", 0x42, "hello");
498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_OBJECT_DELETED_WITH_ID("all", "tracked object 1", 0x42);
499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceScopedTrackableObject<int> trackable("all", "tracked object 2",
501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                              0x2128506);
502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trackable.snapshot("world");
503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT1(kControlCharacters, kControlCharacters,
505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                 kControlCharacters, kControlCharacters);
506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }  // Scope close causes TRACE_EVENT0 etc to send their END events.
507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (task_complete_event)
509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    task_complete_event->Signal();
510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* item = NULL;
514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define EXPECT_FIND_(string) \
516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, string); \
517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item);
518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define EXPECT_NOT_FIND_(string) \
519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, string); \
520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FALSE(item);
521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define EXPECT_SUB_FIND_(string) \
522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (item) \
523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_TRUE(IsStringInDict(string, item));
524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT0 call");
526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string ph;
528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string ph_end;
529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call")));
530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("ph", &ph)));
531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("X", ph);
532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call", item);
533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FALSE(item);
534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT1 call");
536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT2 call");
539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("\"value1\"");
541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name2");
542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value\\2");
543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_INSTANT0 call");
545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string scope;
547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("s", &scope)));
548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("g", scope);
549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_INSTANT1 call");
551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string scope;
553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("s", &scope)));
554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("p", scope);
555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_INSTANT2 call");
559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string scope;
561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("s", &scope)));
562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("t", scope);
563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name2");
567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value2");
568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_BEGIN0 call");
570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_BEGIN1 call");
571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_BEGIN2 call");
574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name2");
577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value2");
578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_END0 call");
580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_END1 call");
581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_END2 call");
584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name2");
587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value2");
588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN0 call");
590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN1 call");
593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN2 call");
598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name2");
603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value2");
604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO0 call");
606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("step_begin1");
609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO1 call");
610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("step_begin2");
613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_END0 call");
617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_END1 call");
620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_END2 call");
625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kAsyncIdStr);
627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name1");
628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value1");
629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("name2");
630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("value2");
631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
632b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_FLOW_BEGIN0 call");
633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kFlowIdStr);
635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_FLOW_STEP0 call");
636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kFlowIdStr);
638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("step1");
639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call");
640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_("id");
641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kFlowIdStr);
642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_COUNTER1 call");
644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string ph;
646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("ph", &ph)));
647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("C", ph);
648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int value;
650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(31415, value);
652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_COUNTER2 call");
655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string ph;
657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("ph", &ph)));
658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("C", ph);
659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int value;
661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(30000, value);
663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(1415, value);
666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
668cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_FIND_("TRACE_COUNTER_WITH_TIMESTAMP1 call");
669cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  {
670cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    std::string ph;
671cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetString("ph", &ph)));
672cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ("C", ph);
673cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
674cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    int value;
675cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
676cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ(31415, value);
677cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
678cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    int ts;
679cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetInteger("ts", &ts)));
680cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ(42, ts);
681cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
682cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
683cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_FIND_("TRACE_COUNTER_WITH_TIMESTAMP2 call");
684cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  {
685cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    std::string ph;
686cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetString("ph", &ph)));
687cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ("C", ph);
688cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
689cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    int value;
690cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
691cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ(30000, value);
692cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
693cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
694cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ(1415, value);
695cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
696cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    int ts;
697cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_TRUE((item && item->GetInteger("ts", &ts)));
698cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EXPECT_EQ(42, ts);
699cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
700cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_COUNTER_ID1 call");
702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x319009", id);
706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string ph;
708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("ph", &ph)));
709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("C", ph);
710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int value;
712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(31415, value);
714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_COUNTER_ID2 call");
717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x319009", id);
721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string ph;
723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("ph", &ph)));
724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("C", ph);
725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int value;
727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(30000, value);
729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(1415, value);
732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call");
735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int val;
737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(12345, val);
739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kThreadId, val);
741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kAsyncIdStr, id);
744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call");
747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int val;
749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(23456, val);
751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kThreadId, val);
753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kAsyncIdStr, id);
756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call");
759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int val;
761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(34567, val);
763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kThreadId, val);
765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kAsyncId2Str, id);
768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST0 call");
771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_("id");
773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_(kAsyncId2Str);
774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_("step_end1");
775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST1 call");
776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_("id");
777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_(kAsyncId2Str);
778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_("step_end2");
779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_("name1");
780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_SUB_FIND_("value1");
781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call");
784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int val;
786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(45678, val);
788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kThreadId, val);
790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(kAsyncId2Str, id);
793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("tracked object 1");
796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string phase;
798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string snapshot;
800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("ph", &phase)));
802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("N", phase);
803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE((item && item->GetString("id", &id)));
804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x42", id);
805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, "tracked object 1", item);
807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item);
808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("ph", &phase));
809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("O", phase);
810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("id", &id));
811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x42", id);
812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("hello", snapshot);
814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, "tracked object 1", item);
816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item);
817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("ph", &phase));
818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("D", phase);
819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("id", &id));
820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x42", id);
821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_("tracked object 2");
824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string phase;
826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string id;
827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string snapshot;
828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("ph", &phase));
830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("N", phase);
831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("id", &id));
832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x2128506", id);
833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, "tracked object 2", item);
835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item);
836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("ph", &phase));
837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("O", phase);
838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("id", &id));
839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x2128506", id);
840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("world", snapshot);
842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = FindTraceEntry(trace_parsed, "tracked object 2", item);
844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item);
845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("ph", &phase));
846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("D", phase);
847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item && item->GetString("id", &id));
848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ("0x2128506", id);
849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FIND_(kControlCharacters);
852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_SUB_FIND_(kControlCharacters);
853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid TraceManyInstantEvents(int thread_id, int num_events,
856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                            WaitableEvent* task_complete_event) {
857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < num_events; i++) {
858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT2("all", "multi thread event",
859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         TRACE_EVENT_SCOPE_THREAD,
860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         "thread", thread_id,
861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                         "event", i);
862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (task_complete_event)
865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    task_complete_event->Signal();
866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid ValidateInstantEventPresentOnEveryThread(const ListValue& trace_parsed,
869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                              int num_threads,
870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                              int num_events) {
871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::map<int, std::map<int, bool> > results;
872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t trace_parsed_count = trace_parsed.GetSize();
874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < trace_parsed_count; i++) {
875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const Value* value = NULL;
876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_parsed.Get(i, &value);
877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (!value || value->GetType() != Value::TYPE_DICTIONARY)
878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    std::string name;
881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    dict->GetString("name", &name);
882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    if (name != "multi thread event")
883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      continue;
884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int thread = 0;
886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    int event = 0;
887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(dict->GetInteger("args.thread", &thread));
888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(dict->GetInteger("args.event", &event));
889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    results[thread][event] = true;
890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(results[-1][-1]);
893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int thread = 0; thread < num_threads; thread++) {
894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    for (int event = 0; event < num_events; event++) {
895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_TRUE(results[thread][event]);
896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
898b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
899b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
900b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace
901b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
902b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Simple Test for emitting data and validating it was received.
903b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DataCaptured) {
904b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
905b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
906b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
907b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceWithAllMacroVariants(NULL);
908b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
909b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
910b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
911b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ValidateAllTraceMacrosCreatedData(trace_parsed_);
912b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
914cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko// Emit some events and validate that only empty strings are received
915cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko// if we tell Flush() to discard events.
916cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex VakulenkoTEST_F(TraceEventTestFixture, DataDiscarded) {
917cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
918cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                      TraceLog::RECORDING_MODE);
919cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
920cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TraceWithAllMacroVariants(NULL);
921cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
922cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  CancelTrace();
923cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
924cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(trace_parsed_.empty());
925cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}
926cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass MockEnabledStateChangedObserver :
928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      public TraceLog::EnabledStateObserver {
929b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
930b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  MOCK_METHOD0(OnTraceLogEnabled, void());
931b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  MOCK_METHOD0(OnTraceLogDisabled, void());
932b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
933b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
934b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverFiresOnEnable) {
935b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  MockEnabledStateChangedObserver observer;
936b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
937b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
938b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_CALL(observer, OnTraceLogEnabled())
939b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      .Times(1);
940b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
941b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
942b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  testing::Mock::VerifyAndClear(&observer);
943b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
944b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
945b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Cleanup.
946b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
947b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
948b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
949b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
950b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnSecondEnable) {
951b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
952b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
953b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
954b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  testing::StrictMock<MockEnabledStateChangedObserver> observer;
955b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
956b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
957b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_CALL(observer, OnTraceLogEnabled())
958b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      .Times(0);
959b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_CALL(observer, OnTraceLogDisabled())
960b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      .Times(0);
961b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
962b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
963b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  testing::Mock::VerifyAndClear(&observer);
964b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
965b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
966b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Cleanup.
967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
971b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverFiresOnFirstDisable) {
973b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceConfig tc_inc_all("*", "");
974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  testing::StrictMock<MockEnabledStateChangedObserver> observer;
978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
979b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_CALL(observer, OnTraceLogEnabled())
981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      .Times(0);
982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_CALL(observer, OnTraceLogDisabled())
983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      .Times(1);
984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  testing::Mock::VerifyAndClear(&observer);
986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Cleanup.
988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EnabledObserverFiresOnDisable) {
993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  MockEnabledStateChangedObserver observer;
997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_CALL(observer, OnTraceLogDisabled())
1000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      .Times(1);
1001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
1002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  testing::Mock::VerifyAndClear(&observer);
1003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Cleanup.
1005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
1006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Tests the IsEnabled() state of TraceLog changes before callbacks.
1009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass AfterStateChangeEnabledStateObserver
1010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    : public TraceLog::EnabledStateObserver {
1011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
1012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  AfterStateChangeEnabledStateObserver() {}
1013cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ~AfterStateChangeEnabledStateObserver() override {}
1014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // TraceLog::EnabledStateObserver overrides:
1016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void OnTraceLogEnabled() override {
1017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
1018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void OnTraceLogDisabled() override {
1021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
1022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
1024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ObserversFireAfterStateChange) {
1026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  AfterStateChangeEnabledStateObserver observer;
1027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
1028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
1030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
1032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
1034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
1035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
1037b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1038b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1039b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Tests that a state observer can remove itself during a callback.
1040b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass SelfRemovingEnabledStateObserver
1041b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    : public TraceLog::EnabledStateObserver {
1042b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
1043b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SelfRemovingEnabledStateObserver() {}
1044cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ~SelfRemovingEnabledStateObserver() override {}
1045b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1046b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // TraceLog::EnabledStateObserver overrides:
1047b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void OnTraceLogEnabled() override {}
1048b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1049b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void OnTraceLogDisabled() override {
1050b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->RemoveEnabledStateObserver(this);
1051b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1052b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
1053b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1054b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SelfRemovingObserver) {
1055b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
1056b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1057b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  SelfRemovingEnabledStateObserver observer;
1058b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
1059b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest());
1060b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1061b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
1062b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1063b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
1064b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // The observer removed itself on disable.
1065b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
1066b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1067b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1068b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool IsNewTrace() {
1069b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool is_new_trace;
1070b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
1071b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return is_new_trace;
1072b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1073b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1074b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, NewTraceRecording) {
1075b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_FALSE(IsNewTrace());
1076b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
1077b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1078b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // First call to IsNewTrace() should succeed. But, the second shouldn't.
1079b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(IsNewTrace());
1080b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_FALSE(IsNewTrace());
1081b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1082b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1083b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // IsNewTrace() should definitely be false now.
1084b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_FALSE(IsNewTrace());
1085b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1086b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Start another trace. IsNewTrace() should become true again, briefly, as
1087b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // before.
1088b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
1089b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1090b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(IsNewTrace());
1091b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_FALSE(IsNewTrace());
1092b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1093b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Cleanup.
1094b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1095b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1096b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1097cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex VakulenkoTEST_F(TraceEventTestFixture, TestTraceFlush) {
1098cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  size_t min_traces = 1;
1099cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  size_t max_traces = 1;
1100cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  do {
1101cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    max_traces *= 2;
1102cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    TraceLog::GetInstance()->SetEnabled(TraceConfig(),
1103cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                        TraceLog::RECORDING_MODE);
1104cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    for (size_t i = 0; i < max_traces; i++) {
1105cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD);
1106cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    }
1107cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EndTraceAndFlush();
1108cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  } while (num_flush_callbacks_ < 2);
1109cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1110cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  while (min_traces + 50 <  max_traces) {
1111cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    size_t traces = (min_traces + max_traces) / 2;
1112cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    TraceLog::GetInstance()->SetEnabled(TraceConfig(),
1113cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                        TraceLog::RECORDING_MODE);
1114cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    for (size_t i = 0; i < traces; i++) {
1115cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD);
1116cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    }
1117cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EndTraceAndFlush();
1118cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    if (num_flush_callbacks_ < 2) {
1119cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      min_traces = traces - 10;
1120cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    } else {
1121cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      max_traces = traces + 10;
1122cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    }
1123cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
1124cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1125cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  for (size_t traces = min_traces; traces < max_traces; traces++) {
1126cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    TraceLog::GetInstance()->SetEnabled(TraceConfig(),
1127cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                        TraceLog::RECORDING_MODE);
1128cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    for (size_t i = 0; i < traces; i++) {
1129cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD);
1130cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    }
1131cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    EndTraceAndFlush();
1132cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
1133cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}
1134cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1135cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex VakulenkoTEST_F(TraceEventTestFixture, AddMetadataEvent) {
1136cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  int num_calls = 0;
1137cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1138cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  class Convertable : public ConvertableToTraceFormat {
1139cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko   public:
1140cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    explicit Convertable(int* num_calls) : num_calls_(num_calls) {}
1141cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    void AppendAsTraceFormat(std::string* out) const override {
1142cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      (*num_calls_)++;
1143cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      out->append("\"metadata_value\"");
1144cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    }
1145cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1146cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko   private:
1147cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    ~Convertable() override {}
1148cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    int* num_calls_;
1149cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  };
1150cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1151cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  scoped_refptr<ConvertableToTraceFormat> convertable =
1152cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      new Convertable(&num_calls);
1153cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1154cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  BeginTrace();
1155cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TRACE_EVENT_API_ADD_METADATA_EVENT("metadata_event_name", "metadata_arg_name",
1156cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                     convertable);
1157cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1158cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // |AppendAsTraceFormat| should only be called on flush, not when the event
1159cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // is added.
1160cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_EQ(0, num_calls);
1161cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EndTraceAndFlush();
1162cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_EQ(1, num_calls);
1163cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(FindNamePhaseKeyValue("metadata_event_name", "M",
1164cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                    "metadata_arg_name", "metadata_value"));
1165cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1166cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // The metadata event should only be adde to the current trace. In this new
1167cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // trace, the event should not appear.
1168cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  BeginTrace();
1169cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EndTraceAndFlush();
1170cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_EQ(1, num_calls);
1171cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1172cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // Flushing should cause |AppendAsTraceFormat| to be called, but if the buffer
1173cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // is left intact, it the flush at the end of the trace should still call it;
1174cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // the metadata event should not be removed.
1175cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TraceLog::GetInstance()->SetEnabled(
1176cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      TraceConfig(kRecordAllCategoryFilter,
1177cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                  "record-until-full,enable-sampling"),
1178cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      TraceLog::MONITORING_MODE);
1179cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TRACE_EVENT_API_ADD_METADATA_EVENT("metadata_event_name", "metadata_arg_name",
1180cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                     convertable);
1181cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  FlushMonitoring();
1182cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_EQ(2, num_calls);
1183cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1184cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // Flushing the trace at this point will case |AppendAsTraceFormat| to be
1185cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // called twice: once for the event that was added by the monitoring flush,
1186cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // and once for the end trace flush; the metadata event will be duplicated.
1187cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  // This is consistent with the other metadata events.
1188cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EndTraceAndFlush();
1189cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_EQ(4, num_calls);
1190cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}
1191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that categories work.
1193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, Categories) {
1194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Test that categories that are used can be retrieved whether trace was
1195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // enabled or disabled when the trace event was encountered.
1196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c1", "name", TRACE_EVENT_SCOPE_THREAD);
1197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c2", "name", TRACE_EVENT_SCOPE_THREAD);
1198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c3", "name", TRACE_EVENT_SCOPE_THREAD);
1200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c4", "name", TRACE_EVENT_SCOPE_THREAD);
1201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Category groups containing more than one category.
1202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c5,c6", "name", TRACE_EVENT_SCOPE_THREAD);
1203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c7,c8", "name", TRACE_EVENT_SCOPE_THREAD);
1204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("c9"), "name",
1205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       TRACE_EVENT_SCOPE_THREAD);
1206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<std::string> cat_groups;
1209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->GetKnownCategoryGroups(&cat_groups);
1210cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "c1"));
1211cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "c2"));
1212cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "c3"));
1213cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "c4"));
1214cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "c5,c6"));
1215cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "c7,c8"));
1216cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(ContainsValue(cat_groups, "disabled-by-default-c9"));
1217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure metadata isn't returned.
1218cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_FALSE(ContainsValue(cat_groups, "__metadata"));
1219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const std::vector<std::string> empty_categories;
1221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<std::string> included_categories;
1222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<std::string> excluded_categories;
1223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Test that category filtering works.
1225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Include nonexistent category -> no events
1227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories.clear();
1229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("not_found823564786", ""),
1230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat1", "name", TRACE_EVENT_SCOPE_THREAD);
1232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat2", "name", TRACE_EVENT_SCOPE_THREAD);
1233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
1235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_parsed_.empty());
1236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Include existent category -> only events of that category
1238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories.clear();
1240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("inc", ""),
1241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc", "name", TRACE_EVENT_SCOPE_THREAD);
1243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc2", "name", TRACE_EVENT_SCOPE_THREAD);
1244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
1246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc"));
1247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindNonMatchingValue("cat", "inc"));
1248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Include existent wildcard -> all categories matching wildcard
1250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories.clear();
1252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
1253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig("inc_wildcard_*,inc_wildchar_?_end", ""),
1254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
1255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildcard_abc", "included",
1256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildcard_", "included", TRACE_EVENT_SCOPE_THREAD);
1258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "included",
1259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc",
1261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat1", "not_inc", TRACE_EVENT_SCOPE_THREAD);
1263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat2", "not_inc", TRACE_EVENT_SCOPE_THREAD);
1264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildcard_category,other_category", "included",
1265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0(
1267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "non_included_category,inc_wildcard_category", "included",
1268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc"));
1271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_"));
1272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end"));
1273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindMatchingValue("name", "not_inc"));
1274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_category,other_category"));
1275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat",
1276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                "non_included_category,inc_wildcard_category"));
1277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  included_categories.clear();
1279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Exclude nonexistent category -> all events
1281b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1282b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("-not_found823564786", ""),
1283b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1284b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat1", "name", TRACE_EVENT_SCOPE_THREAD);
1285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat2", "name", TRACE_EVENT_SCOPE_THREAD);
1286b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("category1,category2", "name", TRACE_EVENT_SCOPE_THREAD);
1287b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1288b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
1289b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
1290b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "category1,category2"));
1291b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1292b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Exclude existent category -> only events of other categories
1293b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1294b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("-inc", ""),
1295b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
1296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc", "name", TRACE_EVENT_SCOPE_THREAD);
1297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc2", "name", TRACE_EVENT_SCOPE_THREAD);
1298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc2,inc", "name", TRACE_EVENT_SCOPE_THREAD);
1299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc,inc2", "name", TRACE_EVENT_SCOPE_THREAD);
1300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc2"));
1302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindMatchingValue("cat", "inc"));
1303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc2,inc"));
1304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc,inc2"));
1305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Exclude existent wildcard -> all categories not matching wildcard
1307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
1309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig("-inc_wildcard_*,-inc_wildchar_?_end", ""),
1310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
1311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildcard_abc", "not_inc",
1312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildcard_", "not_inc",
1314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "not_inc",
1316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included",
1318b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_SCOPE_THREAD);
1319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat1", "included", TRACE_EVENT_SCOPE_THREAD);
1320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat2", "included", TRACE_EVENT_SCOPE_THREAD);
1321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end"));
1323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
1324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
1325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindMatchingValue("name", "not_inc"));
1326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test EVENT_WATCH_NOTIFICATION
1330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EventWatchNotification) {
1331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Basic one occurrence.
1332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::WatchEventCallback callback =
1334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      base::Bind(&TraceEventTestFixture::OnWatchEventMatched,
1335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                 base::Unretained(this));
1336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback);
1337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD);
1338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(event_watch_notification_, 1);
1340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1341b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Auto-reset after end trace.
1342b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1343b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback);
1344b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1345b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1346b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD);
1347b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1348b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(event_watch_notification_, 0);
1349b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1350b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Multiple occurrence.
1351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int num_occurrences = 5;
1353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback);
1354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < num_occurrences; ++i)
1355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD);
1356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(event_watch_notification_, num_occurrences);
1358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Wrong category.
1360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback);
1362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("wrong_cat", "event", TRACE_EVENT_SCOPE_THREAD);
1363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(event_watch_notification_, 0);
1365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Wrong name.
1367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback);
1369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat", "wrong_event", TRACE_EVENT_SCOPE_THREAD);
1370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(event_watch_notification_, 0);
1372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Canceled.
1374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetWatchEvent("cat", "event", callback);
1376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->CancelWatchEvent();
1377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("cat", "event", TRACE_EVENT_SCOPE_THREAD);
1378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(event_watch_notification_, 0);
1380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test ASYNC_BEGIN/END events
1383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, AsyncBeginEndEvents) {
1384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  unsigned long long id = 0xfeedbeeffeedbeefull;
1387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_BEGIN0("cat", "name1", id);
1388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_STEP_INTO0("cat", "name1", id, "step1");
1389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_END0("cat", "name1", id);
1390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_BEGIN0("cat", "name2");
1391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_BEGIN0("cat", "name3", 0);
1392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_STEP_PAST0("cat", "name3", 0, "step2");
1393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("name1", "S"));
1397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("name1", "T"));
1398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("name1", "F"));
1399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string id_str;
1401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  StringAppendF(&id_str, "0x%llx", id);
1402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str()));
1404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str()));
1405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str()));
1406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0x0"));
1407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhaseKeyValue("name3", "p", "id", "0x0"));
1408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // BEGIN events should not have id
1410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0"));
1411b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test ASYNC_BEGIN/END events
1414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) {
1415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void* ptr = this;
1416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetProcessID(100);
1418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_BEGIN0("cat", "name1", ptr);
1420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_BEGIN0("cat", "name2", ptr);
1421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetProcessID(200);
1424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_ASYNC_END0("cat", "name1", ptr);
1426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* async_begin = FindNamePhase("name1", "S");
1429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* async_begin2 = FindNamePhase("name2", "S");
1430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* async_end = FindNamePhase("name1", "F");
1431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(async_begin);
1432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(async_begin2);
1433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(async_end);
1434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Value* value = NULL;
1436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string async_begin_id_str;
1437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string async_begin2_id_str;
1438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string async_end_id_str;
1439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(async_begin->Get("id", &value));
1440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsString(&async_begin_id_str));
1441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(async_begin2->Get("id", &value));
1442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsString(&async_begin2_id_str));
1443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(async_end->Get("id", &value));
1444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsString(&async_end_id_str));
1445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(async_begin_id_str.c_str(), async_begin2_id_str.c_str());
1447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STRNE(async_begin_id_str.c_str(), async_end_id_str.c_str());
1448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that static strings are not copied.
1451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, StaticStringVsString) {
1452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog* tracer = TraceLog::GetInstance();
1453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure old events are flushed:
1454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0u, tracer->GetStatus().event_count);
1455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const unsigned char* category_group_enabled =
1456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED("cat");
1457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    BeginTrace();
1460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Test that string arguments are copied.
1461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceEventHandle handle1 =
1462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        trace_event_internal::AddTraceEvent(
1463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1", 0, 0,
1464cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko            trace_event_internal::kNoId,
1465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            "arg1", std::string("argval"), "arg2", std::string("argval"));
1466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Test that static TRACE_STR_COPY string arguments are copied.
1467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceEventHandle handle2 =
1468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        trace_event_internal::AddTraceEvent(
1469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2", 0, 0,
1470cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko            trace_event_internal::kNoId,
1471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            "arg1", TRACE_STR_COPY("argval"),
1472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            "arg2", TRACE_STR_COPY("argval"));
1473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(tracer->GetStatus().event_count, 1u);
1474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const TraceEvent* event1 = tracer->GetEventByHandle(handle1);
1475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const TraceEvent* event2 = tracer->GetEventByHandle(handle2);
1476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(event1);
1477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(event2);
1478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ("name1", event1->name());
1479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ("name2", event2->name());
1480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(event1->parameter_copy_storage() != NULL);
1481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(event2->parameter_copy_storage() != NULL);
1482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(event1->parameter_copy_storage()->size(), 0u);
1483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(event2->parameter_copy_storage()->size(), 0u);
1484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EndTraceAndFlush();
1485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    BeginTrace();
1489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Test that static literal string arguments are not copied.
1490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceEventHandle handle1 =
1491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        trace_event_internal::AddTraceEvent(
1492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1", 0, 0,
1493cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko            trace_event_internal::kNoId,
1494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            "arg1", "argval", "arg2", "argval");
1495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Test that static TRACE_STR_COPY NULL string arguments are not copied.
1496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* str1 = NULL;
1497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const char* str2 = NULL;
1498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceEventHandle handle2 =
1499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        trace_event_internal::AddTraceEvent(
1500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2", 0, 0,
1501cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko            trace_event_internal::kNoId,
1502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            "arg1", TRACE_STR_COPY(str1),
1503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            "arg2", TRACE_STR_COPY(str2));
1504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(tracer->GetStatus().event_count, 1u);
1505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const TraceEvent* event1 = tracer->GetEventByHandle(handle1);
1506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const TraceEvent* event2 = tracer->GetEventByHandle(handle2);
1507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(event1);
1508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(event2);
1509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ("name1", event1->name());
1510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ("name2", event2->name());
1511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(event1->parameter_copy_storage() == NULL);
1512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(event2->parameter_copy_storage() == NULL);
1513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EndTraceAndFlush();
1514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that data sent from other threads is gathered
1518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DataCapturedOnThread) {
1519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Thread thread("1");
1522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_complete_event(false, false);
1523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Start();
1524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
1526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event));
1527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Wait();
1528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Stop();
1529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ValidateAllTraceMacrosCreatedData(trace_parsed_);
1532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that data sent from multiple threads is gathered
1535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
1536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const int num_threads = 4;
1539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const int num_events = 4000;
1540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Thread* threads[num_threads];
1541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent* task_complete_events[num_threads];
1542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < num_threads; i++) {
1543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i] = new Thread(StringPrintf("Thread %d", i));
1544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    task_complete_events[i] = new WaitableEvent(false, false);
1545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->Start();
1546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->task_runner()->PostTask(
1547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        FROM_HERE, base::Bind(&TraceManyInstantEvents, i, num_events,
1548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              task_complete_events[i]));
1549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < num_threads; i++) {
1552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    task_complete_events[i]->Wait();
1553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Let half of the threads end before flush.
1556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < num_threads / 2; i++) {
1557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->Stop();
1558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    delete threads[i];
1559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    delete task_complete_events[i];
1560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlushInThreadWithMessageLoop();
1563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ValidateInstantEventPresentOnEveryThread(trace_parsed_,
1564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                           num_threads, num_events);
1565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Let the other half of the threads end after flush.
1567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = num_threads / 2; i < num_threads; i++) {
1568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->Stop();
1569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    delete threads[i];
1570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    delete task_complete_events[i];
1571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that thread and process names show up in the trace
1575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ThreadNames) {
1576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Create threads before we enable tracing to make sure
1577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // that tracelog still captures them.
1578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const int kNumThreads = 4;
1579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const int kNumEvents = 10;
1580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Thread* threads[kNumThreads];
1581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PlatformThreadId thread_ids[kNumThreads];
1582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < kNumThreads; i++)
1583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i] = new Thread(StringPrintf("Thread %d", i));
1584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Enable tracing.
1586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Now run some trace code on these threads.
1589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent* task_complete_events[kNumThreads];
1590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < kNumThreads; i++) {
1591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    task_complete_events[i] = new WaitableEvent(false, false);
1592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->Start();
1593cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    thread_ids[i] = threads[i]->GetThreadId();
1594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->task_runner()->PostTask(
1595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        FROM_HERE, base::Bind(&TraceManyInstantEvents, i, kNumEvents,
1596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                              task_complete_events[i]));
1597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < kNumThreads; i++) {
1599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    task_complete_events[i]->Wait();
1600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Shut things down.
1603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < kNumThreads; i++) {
1604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    threads[i]->Stop();
1605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    delete threads[i];
1606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    delete task_complete_events[i];
1607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string tmp;
1612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int tmp_int;
1613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* item;
1614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure we get thread name metadata.
1616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Note, the test suite may have created a ton of threads.
1617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // So, we'll have thread names for threads we didn't create.
1618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<const DictionaryValue*> items =
1619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FindTraceEntries(trace_parsed_, "thread_name");
1620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (int i = 0; i < static_cast<int>(items.size()); i++) {
1621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    item = items[i];
1622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(item);
1623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item->GetInteger("tid", &tmp_int));
1624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // See if this thread name is one of the threads we just created
1626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    for (int j = 0; j < kNumThreads; j++) {
1627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      if (static_cast<int>(thread_ids[j]) != tmp_int)
1628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        continue;
1629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      std::string expected_name = StringPrintf("Thread %d", j);
1631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_TRUE(item->GetString("ph", &tmp) && tmp == "M");
1632b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_TRUE(item->GetInteger("pid", &tmp_int) &&
1633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                  tmp_int == static_cast<int>(base::GetCurrentProcId()));
1634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      // If the thread name changes or the tid gets reused, the name will be
1635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      // a comma-separated list of thread names, so look for a substring.
1636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_TRUE(item->GetString("args.name", &tmp) &&
1637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                  tmp.find(expected_name) != std::string::npos);
1638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
1639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ThreadNameChanges) {
1643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PlatformThread::SetName("");
1646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("drink", "water", TRACE_EVENT_SCOPE_THREAD);
1647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PlatformThread::SetName("cafe");
1649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("drink", "coffee", TRACE_EVENT_SCOPE_THREAD);
1650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PlatformThread::SetName("shop");
1652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // No event here, so won't appear in combined name.
1653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PlatformThread::SetName("pub");
1655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("drink", "beer", TRACE_EVENT_SCOPE_THREAD);
1656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("drink", "wine", TRACE_EVENT_SCOPE_THREAD);
1657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  PlatformThread::SetName(" bar");
1659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("drink", "whisky", TRACE_EVENT_SCOPE_THREAD);
1660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<const DictionaryValue*> items =
1664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FindTraceEntries(trace_parsed_, "thread_name");
1665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1u, items.size());
1666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_GT(items.size(), 0u);
1667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* item = items[0];
1668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(item);
1669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int tid;
1670b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(item->GetInteger("tid", &tid));
1671b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(PlatformThread::CurrentId(), static_cast<PlatformThreadId>(tid));
1672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1673b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string expected_name = "cafe,pub, bar";
1674b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string tmp;
1675b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(item->GetString("args.name", &tmp));
1676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(expected_name, tmp);
1677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1678b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that the disabled trace categories are included/excluded from the
1680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// trace output correctly.
1681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DisabledCategories) {
1682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc"), "first",
1684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       TRACE_EVENT_SCOPE_THREAD);
1685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("included", "first", TRACE_EVENT_SCOPE_THREAD);
1686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* item = NULL;
1689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ListValue& trace_parsed = trace_parsed_;
1690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_NOT_FIND_("disabled-by-default-cc");
1691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FIND_("included");
1692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginSpecificTrace("disabled-by-default-cc");
1696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc"), "second",
1697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       TRACE_EVENT_SCOPE_THREAD);
1698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("other_included", "second", TRACE_EVENT_SCOPE_THREAD);
1699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* item = NULL;
1703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ListValue& trace_parsed = trace_parsed_;
1704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FIND_("disabled-by-default-cc");
1705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FIND_("other_included");
1706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginSpecificTrace("other_included");
1711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc") ",other_included",
1712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       "first", TRACE_EVENT_SCOPE_THREAD);
1713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("other_included," TRACE_DISABLED_BY_DEFAULT("cc"),
1714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       "second", TRACE_EVENT_SCOPE_THREAD);
1715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* item = NULL;
1719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ListValue& trace_parsed = trace_parsed_;
1720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FIND_("disabled-by-default-cc,other_included");
1721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FIND_("other_included,disabled-by-default-cc");
1722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, NormallyNoDeepCopy) {
1726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Test that the TRACE_EVENT macros do not deep-copy their string. If they
1727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // do so it may indicate a performance regression, but more-over it would
1728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // make the DEEP_COPY overloads redundant.
1729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string name_string("event name");
1730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("category", name_string.c_str(),
1733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       TRACE_EVENT_SCOPE_THREAD);
1734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Modify the string in place (a wholesale reassignment may leave the old
1736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // string intact on the heap).
1737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  name_string[0] = '@';
1738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name"));
1742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str()));
1743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, DeepCopy) {
1746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static const char kOriginalName1[] = "name1";
1747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static const char kOriginalName2[] = "name2";
1748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static const char kOriginalName3[] = "name3";
1749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string name1(kOriginalName1);
1750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string name2(kOriginalName2);
1751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string name3(kOriginalName3);
1752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string arg1("arg1");
1753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string arg2("arg2");
1754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string val1("val1");
1755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string val2("val2");
1756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_COPY_INSTANT0("category", name1.c_str(),
1759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                            TRACE_EVENT_SCOPE_THREAD);
1760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(),
1761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                          arg1.c_str(), 5);
1762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_COPY_END2("category", name3.c_str(),
1763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                        arg1.c_str(), val1,
1764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                        arg2.c_str(), val2);
1765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // As per NormallyNoDeepCopy, modify the strings in place.
1767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@';
1768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str()));
1772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str()));
1773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindTraceEntry(trace_parsed_, name3.c_str()));
1774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* entry1 = FindTraceEntry(trace_parsed_, kOriginalName1);
1776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* entry2 = FindTraceEntry(trace_parsed_, kOriginalName2);
1777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* entry3 = FindTraceEntry(trace_parsed_, kOriginalName3);
1778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(entry1);
1779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(entry2);
1780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(entry3);
1781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int i;
1783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(entry2->GetInteger("args.@rg1", &i));
1784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(entry2->GetInteger("args.arg1", &i));
1785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(5, i);
1786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string s;
1788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(entry3->GetString("args.arg1", &s));
1789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("val1", s);
1790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(entry3->GetString("args.arg2", &s));
1791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("val2", s);
1792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that TraceResultBuffer outputs the correct result whether it is added
1795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// in chunks or added all at once.
1796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceResultBuffer) {
1797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.Start();
1800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.AddFragment("bla1");
1801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.AddFragment("bla2");
1802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.AddFragment("bla3,bla4");
1803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.Finish();
1804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]");
1805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.Start();
1809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.AddFragment("bla1,bla2,bla3,bla4");
1810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_buffer_.Finish();
1811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]");
1812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Test that trace_event parameters are not evaluated if the tracing
1815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// system is disabled.
1816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TracingIsLazy) {
1817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
1818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int a = 0;
1820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT1("category", "test", TRACE_EVENT_SCOPE_THREAD, "a", a++);
1821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, a);
1822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
1824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT1("category", "test", TRACE_EVENT_SCOPE_THREAD, "a", a++);
1826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, a);
1827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceEnableDisable) {
1832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog* trace_log = TraceLog::GetInstance();
1833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceConfig tc_inc_all("*", "");
1834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
1835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_log->IsEnabled());
1836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(trace_log->IsEnabled());
1838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
1840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_log->IsEnabled());
1841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const std::vector<std::string> empty;
1842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE);
1843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_log->IsEnabled());
1844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(trace_log->IsEnabled());
1846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(trace_log->IsEnabled());
1848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceCategoriesAfterNestedEnable) {
1851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog* trace_log = TraceLog::GetInstance();
1852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig("foo,bar", ""), TraceLog::RECORDING_MODE);
1853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo"));
1854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar"));
1855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz"));
1856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig("foo2", ""), TraceLog::RECORDING_MODE);
1857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo2"));
1858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz"));
1859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // The "" becomes the default catergory set when applied.
1860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE);
1861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo"));
1862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz"));
1863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(
1864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "-*Debug,-*Test",
1865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str());
1866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo"));
1870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz"));
1871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig("-foo,-bar", ""), TraceLog::RECORDING_MODE);
1873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo"));
1874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz"));
1875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig("moo", ""), TraceLog::RECORDING_MODE);
1876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz"));
1877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("moo"));
1878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo"));
1879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(
1880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "-foo,-bar",
1881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str());
1882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure disabled categories aren't cleared if we set in the second.
1886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig("disabled-by-default-cc,foo", ""),
1887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                        TraceLog::RECORDING_MODE);
1888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("bar"));
1889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(TraceConfig("disabled-by-default-gpu", ""),
1890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                        TraceLog::RECORDING_MODE);
1891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-cc"));
1892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-gpu"));
1893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar"));
1894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(
1895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "disabled-by-default-cc,disabled-by-default-gpu",
1896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str());
1897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1898b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetDisabled();
1899b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1900b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1901b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceSampling) {
1902b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
1903b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceConfig(kRecordAllCategoryFilter, "record-until-full,enable-sampling"),
1904b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::RECORDING_MODE);
1905b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1906b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "cc", "Stuff");
1907b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1908b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "cc", "Things");
1909b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1910b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1911b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1912b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure we hit at least once.
1914b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("Stuff", "P"));
1915b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("Things", "P"));
1916b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1917b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1918b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceSamplingScope) {
1919b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
1920b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceConfig(kRecordAllCategoryFilter, "record-until-full,enable-sampling"),
1921b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::RECORDING_MODE);
1922b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1923b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SCOPED_SAMPLING_STATE("AAA", "name");
1924b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1925b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1926b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA");
1927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_SCOPED_SAMPLING_STATE("BBB", "name");
1928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->WaitSamplingEventForTesting();
1929b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "BBB");
1930b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1931b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1932b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1933b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA");
1934b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_SCOPED_SAMPLING_STATE("CCC", "name");
1935b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->WaitSamplingEventForTesting();
1936b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "CCC");
1937b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1938b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1939b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
1940b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA");
1941b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_SET_SAMPLING_STATE("DDD", "name");
1942b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->WaitSamplingEventForTesting();
1943b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "DDD");
1944b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
1945b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1946b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "DDD");
1947b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1948b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
1949b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1950b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1951b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceContinuousSampling) {
1952b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
1953b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceConfig(kRecordAllCategoryFilter, "record-until-full,enable-sampling"),
1954b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::MONITORING_MODE);
1955b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1956b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "AAA");
1957b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1958b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "BBB");
1959b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1960b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1961b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  FlushMonitoring();
1962b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1963b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure we can get the profiled data.
1964b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("AAA", "P"));
1965b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("BBB", "P"));
1966b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "CCC");
1971b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "category", "DDD");
1973b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->WaitSamplingEventForTesting();
1974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  FlushMonitoring();
1976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure the profiled data is accumulated.
1978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("AAA", "P"));
1979b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("BBB", "P"));
1980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("CCC", "P"));
1981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(FindNamePhase("DDD", "P"));
1982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
1986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Make sure disabling the continuous sampling thread clears
1988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // the profiled data.
1989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindNamePhase("AAA", "P"));
1990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindNamePhase("BBB", "P"));
1991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindNamePhase("CCC", "P"));
1992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(FindNamePhase("DDD", "P"));
1993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
1995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
1996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass MyData : public ConvertableToTraceFormat {
1998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
1999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  MyData() {}
2000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void AppendAsTraceFormat(std::string* out) const override {
2002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    out->append("{\"foo\":1}");
2003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private:
2006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ~MyData() override {}
2007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DISALLOW_COPY_AND_ASSIGN(MyData);
2008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
2009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ConvertableTypes) {
2011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
2012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2013b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_refptr<ConvertableToTraceFormat> data(new MyData());
2015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_refptr<ConvertableToTraceFormat> data1(new MyData());
2016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_refptr<ConvertableToTraceFormat> data2(new MyData());
2017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "bar", "data", data);
2018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT2("foo", "baz",
2019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat               "data1", data1,
2020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat               "data2", data2);
2021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_refptr<ConvertableToTraceFormat> convertData1(new MyData());
2024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_refptr<ConvertableToTraceFormat> convertData2(new MyData());
2025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT2(
2026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "foo",
2027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "string_first",
2028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "str",
2029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "string value 1",
2030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "convert",
2031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      convertData1);
2032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT2(
2033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "foo",
2034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "string_second",
2035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "convert",
2036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      convertData2,
2037b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "str",
2038b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "string value 2");
2039b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2040b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2041b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // One arg version.
2042b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* dict = FindNamePhase("bar", "X");
2043b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2044b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2045b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* args_dict = NULL;
2046b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2047b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2048b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2049b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const Value* value = NULL;
2050b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* convertable_dict = NULL;
2051b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("data", &value));
2052b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
2053b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2054b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int foo_val;
2055b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val));
2056b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, foo_val);
2057b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2058b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Two arg version.
2059b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("baz", "X");
2060b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2061b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2062b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  args_dict = NULL;
2063b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2064b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2065b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2066b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  value = NULL;
2067b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  convertable_dict = NULL;
2068b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("data1", &value));
2069b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
2070b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2071b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  value = NULL;
2072b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  convertable_dict = NULL;
2073b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("data2", &value));
2074b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
2075b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2076b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Convertable with other types.
2077b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("string_first", "X");
2078b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2079b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2080b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  args_dict = NULL;
2081b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2082b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2083b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2084b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string str_value;
2085b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("str", &str_value));
2086b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("string value 1", str_value.c_str());
2087b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2088b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  value = NULL;
2089b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  convertable_dict = NULL;
2090b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  foo_val = 0;
2091b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("convert", &value));
2092b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
2093b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val));
2094b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, foo_val);
2095b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2096b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("string_second", "X");
2097b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2098b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2099b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  args_dict = NULL;
2100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("str", &str_value));
2104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("string value 2", str_value.c_str());
2105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  value = NULL;
2107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  convertable_dict = NULL;
2108b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  foo_val = 0;
2109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("convert", &value));
2110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
2111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val));
2112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, foo_val);
2113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2114b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2115b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, PrimitiveArgs) {
2116b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
2117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event1", "int_one", 1);
2120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event2", "int_neg_ten", -10);
2121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event3", "float_one", 1.0f);
2122b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event4", "float_half", .5f);
2123b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event5", "float_neghalf", -.5f);
2124b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event6", "float_infinity",
2125b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      std::numeric_limits<float>::infinity());
2126b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event6b", "float_neg_infinity",
2127b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      -std::numeric_limits<float>::infinity());
2128b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event7", "double_nan",
2129b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      std::numeric_limits<double>::quiet_NaN());
2130b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void* p = 0;
2131b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event8", "pointer_null", p);
2132b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  p = reinterpret_cast<void*>(0xbadf00d);
2133b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event9", "pointer_badf00d", p);
2134b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event10", "bool_true", true);
2135b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event11", "bool_false", false);
2136b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event12", "time_null",
2137b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      base::Time());
2138b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event13", "time_one",
2139b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      base::Time::FromInternalValue(1));
2140b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event14", "timeticks_null",
2141b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      base::TimeTicks());
2142b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("foo", "event15", "timeticks_one",
2143b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      base::TimeTicks::FromInternalValue(1));
2144b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2145b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2146b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* args_dict = NULL;
2147b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* dict = NULL;
2148b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const Value* value = NULL;
2149b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string str_value;
2150b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int int_value;
2151b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double double_value;
2152b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  bool bool_value;
2153b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2154b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event1", "X");
2155b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2156b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2157b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2158b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("int_one", &int_value));
2159b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, int_value);
2160b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event2", "X");
2162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2165b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("int_neg_ten", &int_value));
2166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(-10, int_value);
2167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2168b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // 1f must be serlized to JSON as "1.0" in order to be a double, not an int.
2169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event3", "X");
2170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2173b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("float_one", &value));
2174b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(value->IsType(Value::TYPE_DOUBLE));
2175b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(value->GetAsDouble(&double_value));
2176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, double_value);
2177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // .5f must be serlized to JSON as "0.5".
2179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event4", "X");
2180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("float_half", &value));
2184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(value->IsType(Value::TYPE_DOUBLE));
2185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(value->GetAsDouble(&double_value));
2186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0.5, double_value);
2187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2188b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // -.5f must be serlized to JSON as "-0.5".
2189b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event5", "X");
2190b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2191b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2192b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2193b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->Get("float_neghalf", &value));
2194b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(value->IsType(Value::TYPE_DOUBLE));
2195b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(value->GetAsDouble(&double_value));
2196b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(-0.5, double_value);
2197b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Infinity is serialized to JSON as a string.
2199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event6", "X");
2200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("float_infinity", &str_value));
2204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("Infinity", str_value.c_str());
2205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event6b", "X");
2206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("float_neg_infinity", &str_value));
2210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("-Infinity", str_value.c_str());
2211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // NaN is serialized to JSON as a string.
2213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event7", "X");
2214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("double_nan", &str_value));
2218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("NaN", str_value.c_str());
2219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // NULL pointers should be serialized as "0x0".
2221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event8", "X");
2222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("pointer_null", &str_value));
2226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("0x0", str_value.c_str());
2227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Other pointers should be serlized as a hex string.
2229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event9", "X");
2230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetString("pointer_badf00d", &str_value));
2234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_STREQ("0xbadf00d", str_value.c_str());
2235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event10", "X");
2237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetBoolean("bool_true", &bool_value));
2241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(bool_value);
2242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event11", "X");
2244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetBoolean("bool_false", &bool_value));
2248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(bool_value);
2249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event12", "X");
2251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("time_null", &int_value));
2255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0, int_value);
2256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event13", "X");
2258b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2259b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("time_one", &int_value));
2262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, int_value);
2263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event14", "X");
2265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("timeticks_null", &int_value));
2269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0, int_value);
2270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event15", "X");
2272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2274b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2275b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("timeticks_one", &int_value));
2276b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, int_value);
2277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace {
2280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2281cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkobool IsArgNameWhitelisted(const char* arg_name) {
2282cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  return base::MatchPattern(arg_name, "granular_arg_whitelisted");
2283cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko}
2284cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2285b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool IsTraceEventArgsWhitelisted(const char* category_group_name,
2286cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                 const char* event_name,
2287cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                                 ArgumentNameFilterPredicate* arg_filter) {
2288cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  if (base::MatchPattern(category_group_name, "toplevel") &&
2289cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      base::MatchPattern(event_name, "*")) {
2290cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    return true;
2291cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  }
2292cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2293cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  if (base::MatchPattern(category_group_name, "benchmark") &&
2294cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      base::MatchPattern(event_name, "granularly_whitelisted")) {
2295cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    *arg_filter = base::Bind(&IsArgNameWhitelisted);
2296b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    return true;
2297b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2298b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
2300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace
2303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ArgsWhitelisting) {
2305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetArgumentFilterPredicate(
2306b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      base::Bind(&IsTraceEventArgsWhitelisted));
2307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceConfig(kRecordAllCategoryFilter, "enable-argument-filter"),
2310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::RECORDING_MODE);
2311b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2312b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("toplevel", "event1", "int_one", 1);
2313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT1("whitewashed", "event2", "int_two", 1);
2314cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2315cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TRACE_EVENT2("benchmark", "granularly_whitelisted",
2316cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko               "granular_arg_whitelisted", "whitelisted_value",
2317cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko               "granular_arg_blacklisted", "blacklisted_value");
2318cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2319b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2320b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2321b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* args_dict = NULL;
2322b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DictionaryValue* dict = NULL;
2323b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  int int_value;
2324b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2325b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event1", "X");
2326b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2327b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2328b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2329b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(args_dict->GetInteger("int_one", &int_value));
2330b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(1, int_value);
2331b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict = FindNamePhase("event2", "X");
2333b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(dict);
2334b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  dict->GetDictionary("args", &args_dict);
2335b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_TRUE(args_dict);
2336b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(args_dict->GetInteger("int_two", &int_value));
2337b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2338b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string args_string;
2339b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(dict->GetString("args", &args_string));
2340b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(args_string, "__stripped__");
2341cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2342cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  dict = FindNamePhase("granularly_whitelisted", "X");
2343cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_TRUE(dict);
2344cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  dict->GetDictionary("args", &args_dict);
2345cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  ASSERT_TRUE(args_dict);
2346cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2347cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(args_dict->GetString("granular_arg_whitelisted", &args_string));
2348cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_EQ(args_string, "whitelisted_value");
2349cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
2350cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_TRUE(args_dict->GetString("granular_arg_blacklisted", &args_string));
2351cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  EXPECT_EQ(args_string, "__stripped__");
2352b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2353b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2354b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceEventCallbackTest : public TraceEventTestFixture {
2355b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public:
2356b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void SetUp() override {
2357b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceEventTestFixture::SetUp();
2358b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_EQ(NULL, s_instance);
2359b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    s_instance = this;
2360b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2361b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void TearDown() override {
2362b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->SetDisabled();
2363b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    ASSERT_TRUE(s_instance);
2364b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    s_instance = NULL;
2365b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceEventTestFixture::TearDown();
2366b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2367b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2368b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat protected:
2369b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // For TraceEventCallbackAndRecordingX tests.
2370b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void VerifyCallbackAndRecordedEvents(size_t expected_callback_count,
2371b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                       size_t expected_recorded_count) {
2372b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Callback events.
2373b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(expected_callback_count, collected_events_names_.size());
2374b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    for (size_t i = 0; i < collected_events_names_.size(); ++i) {
2375b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_EQ("callback", collected_events_categories_[i]);
2376b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      EXPECT_EQ("yes", collected_events_names_[i]);
2377b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    }
2378b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2379b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // Recorded events.
2380b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(expected_recorded_count, trace_parsed_.GetSize());
2381b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(FindTraceEntry(trace_parsed_, "recording"));
2382b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FALSE(FindTraceEntry(trace_parsed_, "callback"));
2383b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(FindTraceEntry(trace_parsed_, "yes"));
2384b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_FALSE(FindTraceEntry(trace_parsed_, "no"));
2385b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2386b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2387b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  void VerifyCollectedEvent(size_t i,
2388b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                            unsigned phase,
2389b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                            const std::string& category,
2390b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                            const std::string& name) {
2391b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(phase, collected_events_phases_[i]);
2392b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(category, collected_events_categories_[i]);
2393b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(name, collected_events_names_[i]);
2394b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<std::string> collected_events_categories_;
2397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<std::string> collected_events_names_;
2398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::vector<unsigned char> collected_events_phases_;
2399cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  std::vector<TimeTicks> collected_events_timestamps_;
2400b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2401b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  static TraceEventCallbackTest* s_instance;
2402cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  static void Callback(TimeTicks timestamp,
2403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       char phase,
2404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       const unsigned char* category_group_enabled,
2405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       const char* name,
2406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       unsigned long long id,
2407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       int num_args,
2408b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       const char* const arg_names[],
2409b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       const unsigned char arg_types[],
2410b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       const unsigned long long arg_values[],
2411cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko                       unsigned int flags) {
2412b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    s_instance->collected_events_phases_.push_back(phase);
2413b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    s_instance->collected_events_categories_.push_back(
2414b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        TraceLog::GetCategoryGroupName(category_group_enabled));
2415b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    s_instance->collected_events_names_.push_back(name);
2416b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    s_instance->collected_events_timestamps_.push_back(timestamp);
2417b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2418b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat};
2419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTraceEventCallbackTest* TraceEventCallbackTest::s_instance;
2421b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2422b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallback) {
2423b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("all", "before enable", TRACE_EVENT_SCOPE_THREAD);
2424b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(
2425b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, ""), Callback);
2426b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("all", "event1", TRACE_EVENT_SCOPE_GLOBAL);
2427b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("all", "event2", TRACE_EVENT_SCOPE_GLOBAL);
2428b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
2429b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("all", "duration");
2430b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT0("all", "event3", TRACE_EVENT_SCOPE_GLOBAL);
2431b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2432b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2433b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("all", "after callback removed",
2434b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       TRACE_EVENT_SCOPE_GLOBAL);
2435b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_EQ(5u, collected_events_names_.size());
2436b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("event1", collected_events_names_[0]);
2437b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[0]);
2438b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("event2", collected_events_names_[1]);
2439b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[1]);
2440b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("duration", collected_events_names_[2]);
2441b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TRACE_EVENT_PHASE_BEGIN, collected_events_phases_[2]);
2442b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("event3", collected_events_names_[3]);
2443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[3]);
2444b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("duration", collected_events_names_[4]);
2445b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TRACE_EVENT_PHASE_END, collected_events_phases_[4]);
2446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 1; i < collected_events_timestamps_.size(); i++) {
2447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_LE(collected_events_timestamps_[i - 1],
2448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat              collected_events_timestamps_[i]);
2449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2450b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2451b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2452b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackWhileFull) {
2453b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
2454b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2455b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  do {
2456b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_INSTANT0("all", "badger badger", TRACE_EVENT_SCOPE_GLOBAL);
2457b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  } while (!TraceLog::GetInstance()->BufferIsFull());
2458b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(
2459b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, ""), Callback);
2460b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("all", "a snake", TRACE_EVENT_SCOPE_GLOBAL);
2461b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2462b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_EQ(1u, collected_events_names_.size());
2463b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("a snake", collected_events_names_[0]);
2464b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2465b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 1: Enable callback, enable recording, disable callback, disable recording.
2467b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording1) {
2468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2469b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2470b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""),
2471b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                                   Callback);
2472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2474b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""),
2475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2477b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2478b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2479b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2480b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2481b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2482b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2483b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2484b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2485b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
2486b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCallbackAndRecordedEvents(2, 2);
2487b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2488b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2489b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 2: Enable callback, enable recording, disable recording, disable callback.
2490b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording2) {
2491b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2492b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2493b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""),
2494b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                                   Callback);
2495b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2496b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2497b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""),
2498b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2499b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2500b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2501b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2502b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2503b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2504b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2505b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2506b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2507b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2508b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
2509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCallbackAndRecordedEvents(3, 1);
2510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2511b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2512b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 3: Enable recording, enable callback, disable callback, disable recording.
2513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording3) {
2514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""),
2517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""),
2521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                                   Callback);
2522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
2532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCallbackAndRecordedEvents(1, 3);
2533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 4: Enable recording, enable callback, disable recording, disable callback.
2536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording4) {
2537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(TraceConfig("recording", ""),
2540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                      TraceLog::RECORDING_MODE);
2541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(TraceConfig("callback", ""),
2544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                                   Callback);
2545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL);
2550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL);
2552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL);
2553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
2555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCallbackAndRecordedEvents(2, 2);
2556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecordingDuration) {
2559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackEnabled(
2560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, ""), Callback);
2561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
2562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("callback", "duration1");
2563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::GetInstance()->SetEnabled(
2564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        TraceConfig(kRecordAllCategoryFilter, ""), TraceLog::RECORDING_MODE);
2565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("callback", "duration2");
2566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EndTraceAndFlush();
2567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("callback", "duration3");
2568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEventCallbackDisabled();
2570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ASSERT_EQ(6u, collected_events_names_.size());
2572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCollectedEvent(0, TRACE_EVENT_PHASE_BEGIN, "callback", "duration1");
2573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCollectedEvent(1, TRACE_EVENT_PHASE_BEGIN, "callback", "duration2");
2574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCollectedEvent(2, TRACE_EVENT_PHASE_BEGIN, "callback", "duration3");
2575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCollectedEvent(3, TRACE_EVENT_PHASE_END, "callback", "duration3");
2576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCollectedEvent(4, TRACE_EVENT_PHASE_END, "callback", "duration2");
2577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  VerifyCollectedEvent(5, TRACE_EVENT_PHASE_END, "callback", "duration1");
2578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferVectorReportFull) {
2581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog* trace_log = TraceLog::GetInstance();
2582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->SetEnabled(
2583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, ""), TraceLog::RECORDING_MODE);
2584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_log->logged_events_.reset(
2585cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      TraceBuffer::CreateTraceBufferVectorOfSize(100));
2586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  do {
2587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(
2588cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko        "all", "with_timestamp", 0, 0, TimeTicks::Now().ToInternalValue());
2589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(
2590cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko        "all", "with_timestamp", 0, 0, TimeTicks::Now().ToInternalValue());
2591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  } while (!trace_log->BufferIsFull());
2592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* trace_full_metadata = NULL;
2596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  trace_full_metadata = FindTraceEntry(trace_parsed_,
2598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                       "overflowed_at_ts");
2599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  std::string phase;
2600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double buffer_limit_reached_timestamp = 0;
2601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_full_metadata);
2603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_full_metadata->GetString("ph", &phase));
2604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ("M", phase);
2605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_full_metadata->GetDouble(
2606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      "args.overflowed_at_ts", &buffer_limit_reached_timestamp));
2607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_DOUBLE_EQ(
2608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      static_cast<double>(
2609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat          trace_log->buffer_limit_reached_timestamp_.ToInternalValue()),
2610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      buffer_limit_reached_timestamp);
2611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Test that buffer_limit_reached_timestamp's value is between the timestamp
2613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // of the last trace event and current time.
2614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
2615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const DictionaryValue* last_trace_event = NULL;
2616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double last_trace_event_timestamp = 0;
2617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(trace_parsed_.GetDictionary(trace_parsed_.GetSize() - 1,
2618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                          &last_trace_event));
2619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_TRUE(last_trace_event->GetDouble("ts", &last_trace_event_timestamp));
2620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_LE(last_trace_event_timestamp, buffer_limit_reached_timestamp);
2621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_LE(buffer_limit_reached_timestamp,
2622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            trace_log->OffsetNow().ToInternalValue());
2623b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferRingBufferGetReturnChunk) {
2626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY),
2628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
2629b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
2630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t capacity = buffer->Capacity();
2631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize;
2632cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  uint32_t last_seq = 0;
2633b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t chunk_index;
2634b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0u, buffer->Size());
2635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2636b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_ptr<TraceBufferChunk*[]> chunks(new TraceBufferChunk*[num_chunks]);
2637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i) {
2638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    chunks[i] = buffer->GetChunk(&chunk_index).release();
2639b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(chunks[i]);
2640b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(i, chunk_index);
2641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(chunks[i]->seq(), last_seq);
2642b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ((i + 1) * TraceBufferChunk::kTraceBufferChunkSize,
2643b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat              buffer->Size());
2644b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    last_seq = chunks[i]->seq();
2645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2647b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Ring buffer is never full.
2648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(buffer->IsFull());
2649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return all chunks in original order.
2651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i)
2652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i]));
2653b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Should recycle the chunks in the returned order.
2655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i) {
2656b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    chunks[i] = buffer->GetChunk(&chunk_index).release();
2657b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(chunks[i]);
2658b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(i, chunk_index);
2659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(chunks[i]->seq(), last_seq);
2660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    last_seq = chunks[i]->seq();
2661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2662b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Return all chunks in reverse order.
2664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i) {
2665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    buffer->ReturnChunk(
2666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        num_chunks - i - 1,
2667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat        scoped_ptr<TraceBufferChunk>(chunks[num_chunks - i - 1]));
2668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2670b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Should recycle the chunks in the returned order.
2671b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i) {
2672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    chunks[i] = buffer->GetChunk(&chunk_index).release();
2673b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(chunks[i]);
2674b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(num_chunks - i - 1, chunk_index);
2675b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GT(chunks[i]->seq(), last_seq);
2676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    last_seq = chunks[i]->seq();
2677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2678b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i)
2680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i]));
2681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
2683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2684b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferRingBufferHalfIteration) {
2686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2687b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY),
2688b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
2689b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
2690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t capacity = buffer->Capacity();
2691b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize;
2692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t chunk_index;
2693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0u, buffer->Size());
2694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(buffer->NextChunk());
2695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t half_chunks = num_chunks / 2;
2697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_ptr<TraceBufferChunk*[]> chunks(new TraceBufferChunk*[half_chunks]);
2698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < half_chunks; ++i) {
2700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    chunks[i] = buffer->GetChunk(&chunk_index).release();
2701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(chunks[i]);
2702b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(i, chunk_index);
2703b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < half_chunks; ++i)
2705b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i]));
2706b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2707b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < half_chunks; ++i)
2708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(chunks[i], buffer->NextChunk());
2709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(buffer->NextChunk());
2710b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
2711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceBufferRingBufferFullIteration) {
2714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY),
2716b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
2717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
2718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t capacity = buffer->Capacity();
2719b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize;
2720b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  size_t chunk_index;
2721b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(0u, buffer->Size());
2722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(buffer->NextChunk());
2723b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  scoped_ptr<TraceBufferChunk*[]> chunks(new TraceBufferChunk*[num_chunks]);
2725b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i) {
2727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    chunks[i] = buffer->GetChunk(&chunk_index).release();
2728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(chunks[i]);
2729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(i, chunk_index);
2730b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2731b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i)
2732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    buffer->ReturnChunk(i, scoped_ptr<TraceBufferChunk>(chunks[i]));
2733b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2734b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < num_chunks; ++i)
2735b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(chunks[i] == buffer->NextChunk());
2736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_FALSE(buffer->NextChunk());
2737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
2738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TraceRecordAsMuchAsPossibleMode) {
2741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceConfig(kRecordAllCategoryFilter, RECORD_AS_MUCH_AS_POSSIBLE),
2743b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceLog::RECORDING_MODE);
2744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
2745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(512000000UL, buffer->Capacity());
2746b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetDisabled();
2747b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2748b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid BlockUntilStopped(WaitableEvent* task_start_event,
2750b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                       WaitableEvent* task_stop_event) {
2751b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_start_event->Signal();
2752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_stop_event->Wait();
2753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopBeforeTracing) {
2756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
2757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2758b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Thread thread("1");
2759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_complete_event(false, false);
2760b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Start();
2761b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&TraceLog::SetCurrentThreadBlocksMessageLoop,
2763b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      Unretained(TraceLog::GetInstance())));
2764b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2765b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2766b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Wait();
2768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_start_event(false, false);
2770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_stop_event(false, false);
2771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event));
2773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_start_event.Wait();
2774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2775b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ValidateAllTraceMacrosCreatedData(trace_parsed_);
2777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2778b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_stop_event.Signal();
2779b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Stop();
2780b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ConvertTraceConfigToInternalOptions) {
2783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog* trace_log = TraceLog::GetInstance();
2784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TraceLog::kInternalRecordUntilFull,
2785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            trace_log->GetInternalOptionsFromTraceConfig(
2786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                TraceConfig(kRecordAllCategoryFilter, RECORD_UNTIL_FULL)));
2787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2788b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TraceLog::kInternalRecordContinuously,
2789b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            trace_log->GetInternalOptionsFromTraceConfig(
2790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY)));
2791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(TraceLog::kInternalEchoToConsole,
2793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat            trace_log->GetInternalOptionsFromTraceConfig(
2794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE)));
2795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(
2797b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::kInternalRecordUntilFull | TraceLog::kInternalEnableSampling,
2798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_log->GetInternalOptionsFromTraceConfig(
2799b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat          TraceConfig(kRecordAllCategoryFilter,
2800b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      "record-until-full,enable-sampling")));
2801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(
2803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::kInternalRecordContinuously | TraceLog::kInternalEnableSampling,
2804b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_log->GetInternalOptionsFromTraceConfig(
2805b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat          TraceConfig(kRecordAllCategoryFilter,
2806b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      "record-continuously,enable-sampling")));
2807b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2808b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(
2809b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::kInternalEchoToConsole | TraceLog::kInternalEnableSampling,
2810b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_log->GetInternalOptionsFromTraceConfig(
2811b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat          TraceConfig(kRecordAllCategoryFilter,
2812b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      "trace-to-console,enable-sampling")));
2813b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2814b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(
2815b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::kInternalEchoToConsole | TraceLog::kInternalEnableSampling,
2816b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      trace_log->GetInternalOptionsFromTraceConfig(
2817b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat          TraceConfig("*",
2818b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      "trace-to-console,enable-sampling,enable-systrace")));
2819b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2820b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2821b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratvoid SetBlockingFlagAndBlockUntilStopped(WaitableEvent* task_start_event,
2822b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                         WaitableEvent* task_stop_event) {
2823b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetCurrentThreadBlocksMessageLoop();
2824b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BlockUntilStopped(task_start_event, task_stop_event);
2825b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopAfterTracing) {
2828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
2829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Thread thread("1");
2831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_complete_event(false, false);
2832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Start();
2833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2834b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Wait();
2837b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2838b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_start_event(false, false);
2839b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_stop_event(false, false);
2840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&SetBlockingFlagAndBlockUntilStopped, &task_start_event,
2842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                      &task_stop_event));
2843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_start_event.Wait();
2844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ValidateAllTraceMacrosCreatedData(trace_parsed_);
2847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_stop_event.Signal();
2849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Stop();
2850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2851b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2852b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ThreadOnceBlocking) {
2853b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
2854b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2855b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Thread thread("1");
2856b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_complete_event(false, false);
2857b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.Start();
2858b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2859b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2860b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2861b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Wait();
2862b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Reset();
2863b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2864b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_start_event(false, false);
2865b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  WaitableEvent task_stop_event(false, false);
2866b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2867b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event));
2868b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_start_event.Wait();
2869b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2870b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // The thread will timeout in this flush.
2871b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlushInThreadWithMessageLoop();
2872b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
2873b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2874b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Let the thread's message loop continue to spin.
2875b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_stop_event.Signal();
2876b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2877b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // The following sequence ensures that the FlushCurrentThread task has been
2878b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // executed in the thread before continuing.
2879b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_start_event.Reset();
2880b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_stop_event.Reset();
2881b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2882b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&BlockUntilStopped, &task_start_event, &task_stop_event));
2883b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_start_event.Wait();
2884b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_stop_event.Signal();
2885b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  Clear();
2886b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2887b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // TraceLog should discover the generation mismatch and recover the thread
2888b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // local buffer for the thread without any error.
2889b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
2890b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  thread.task_runner()->PostTask(
2891b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      FROM_HERE, Bind(&TraceWithAllMacroVariants, &task_complete_event));
2892b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Wait();
2893b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  task_complete_event.Reset();
2894b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlushInThreadWithMessageLoop();
2895b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ValidateAllTraceMacrosCreatedData(trace_parsed_);
2896b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2897b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2898b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstd::string* g_log_buffer = NULL;
2899b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool MockLogMessageHandler(int, const char*, int, size_t,
2900b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                           const std::string& str) {
2901b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  if (!g_log_buffer)
2902b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    g_log_buffer = new std::string();
2903b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  g_log_buffer->append(str);
2904b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
2905b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2906b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2907b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EchoToConsole) {
2908b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  logging::LogMessageHandlerFunction old_log_message_handler =
2909b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      logging::GetLogMessageHandler();
2910b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  logging::SetLogMessageHandler(MockLogMessageHandler);
2911b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2912b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE),
2914b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
2915b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_BEGIN0("a", "begin_end");
2916b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
2917b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("b", "duration");
2918b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("b1", "duration1");
2919b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2920b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_INSTANT0("c", "instant", TRACE_EVENT_SCOPE_GLOBAL);
2921b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_END0("a", "begin_end");
2922b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2923b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("begin_end[a]\x1b"));
2924b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("| duration[b]\x1b"));
2925b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("| | duration1[b1]\x1b"));
2926b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("| | duration1[b1] ("));
2927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("| duration[b] ("));
2928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("| instant[c]\x1b"));
2929b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_NE(std::string::npos, g_log_buffer->find("begin_end[a] ("));
2930b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2931b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2932b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  delete g_log_buffer;
2933b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  logging::SetLogMessageHandler(old_log_message_handler);
2934b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  g_log_buffer = NULL;
2935b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2936b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2937b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool LogMessageHandlerWithTraceEvent(int, const char*, int, size_t,
2938b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat                                     const std::string&) {
2939b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT0("log", "trace_event");
2940b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return false;
2941b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2942b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2943b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, EchoToConsoleTraceEventRecursion) {
2944b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  logging::LogMessageHandlerFunction old_log_message_handler =
2945b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      logging::GetLogMessageHandler();
2946b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  logging::SetLogMessageHandler(LogMessageHandlerWithTraceEvent);
2947b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2948b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetEnabled(
2949b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE),
2950b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat      TraceLog::RECORDING_MODE);
2951b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
2952b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    // This should not cause deadlock or infinite recursion.
2953b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("b", "duration");
2954b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2955b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2956b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2957b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  logging::SetLogMessageHandler(old_log_message_handler);
2958b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2959b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2960b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, TimeOffset) {
2961b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginTrace();
2962b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  // Let TraceLog timer start from 0.
2963cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  TimeDelta time_offset = TimeTicks::Now() - TimeTicks();
2964b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceLog::GetInstance()->SetTimeOffset(time_offset);
2965b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2966b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
2967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("all", "duration1");
2968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT0("all", "duration2");
2969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(
2971cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      "all", "with_timestamp", 0, 0, TimeTicks::Now().ToInternalValue());
2972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(
2973cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      "all", "with_timestamp", 0, 0, TimeTicks::Now().ToInternalValue());
2974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
2976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DropTracedMetadataRecords();
2977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double end_time = static_cast<double>(
2979cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko      (TimeTicks::Now() - time_offset).ToInternalValue());
2980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  double last_timestamp = 0;
2981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < trace_parsed_.GetSize(); ++i) {
2982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const DictionaryValue* item;
2983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(trace_parsed_.GetDictionary(i, &item));
2984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    double timestamp;
2985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_TRUE(item->GetDouble("ts", &timestamp));
2986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_GE(timestamp, last_timestamp);
2987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_LE(timestamp, end_time);
2988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    last_timestamp = timestamp;
2989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
2991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, ConfigureSyntheticDelays) {
2993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  BeginSpecificTrace("DELAY(test.Delay;0.05)");
2994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
2995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  base::TimeTicks start = base::TimeTicks::Now();
2996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  {
2997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TRACE_EVENT_SYNTHETIC_DELAY("test.Delay");
2998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
2999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  base::TimeDelta duration = base::TimeTicks::Now() - start;
3000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_GE(duration.InMilliseconds(), 50);
3001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EndTraceAndFlush();
3003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
3004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, BadSyntheticDelayConfigurations) {
3006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const char* const filters[] = {
3007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "",
3008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "DELAY(",
3009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "DELAY(;",
3010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "DELAY(;)",
3011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "DELAY(test.Delay)",
3012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    "DELAY(test.Delay;)"
3013b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  };
3014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  for (size_t i = 0; i < arraysize(filters); i++) {
3015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    BeginSpecificTrace(filters[i]);
3016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EndTraceAndFlush();
3017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    TraceConfig trace_config = TraceLog::GetInstance()->GetCurrentTraceConfig();
3018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    EXPECT_EQ(0u, trace_config.GetSyntheticDelayValues().size());
3019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  }
3020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
3021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SyntheticDelayConfigurationMerging) {
3023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceConfig config1("DELAY(test.Delay1;16)", "");
3024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceConfig config2("DELAY(test.Delay2;32)", "");
3025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  config1.Merge(config2);
3026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(2u, config1.GetSyntheticDelayValues().size());
3027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
3028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTEST_F(TraceEventTestFixture, SyntheticDelayConfigurationToString) {
3030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  const char filter[] = "DELAY(test.Delay;16;oneshot)";
3031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  TraceConfig config(filter, "");
3032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  EXPECT_EQ(filter, config.ToCategoryFilterString());
3033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
3034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
3035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace trace_event
3036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
3037