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