blob: e8e6c8ac1af03918a22630355b4a2e5deeb1fbe2 [file] [log] [blame]
jbates@chromium.org59c27602012-01-13 12:12:44 +09001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
scheib@chromium.org603f46e2011-05-10 11:23:58 +09002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
jbates@chromium.org5e2f67d2012-08-16 13:32:49 +09005#include "base/debug/trace_event_unittest.h"
scheib@chromium.org603f46e2011-05-10 11:23:58 +09006
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +09007#include <cstdlib>
8
scheib@chromium.org603f46e2011-05-10 11:23:58 +09009#include "base/bind.h"
10#include "base/command_line.h"
jbates@chromium.org5e2f67d2012-08-16 13:32:49 +090011#include "base/debug/trace_event.h"
scheib@chromium.org603f46e2011-05-10 11:23:58 +090012#include "base/json/json_reader.h"
13#include "base/json/json_writer.h"
jbates@chromium.org1f18e462011-09-07 02:56:24 +090014#include "base/memory/ref_counted_memory.h"
scheib@chromium.org603f46e2011-05-10 11:23:58 +090015#include "base/memory/scoped_ptr.h"
joth@chromium.org088ae012011-11-11 01:26:23 +090016#include "base/memory/singleton.h"
nduca@chromium.org6d048772011-08-10 00:16:25 +090017#include "base/process_util.h"
scheib@chromium.org603f46e2011-05-10 11:23:58 +090018#include "base/stringprintf.h"
19#include "base/synchronization/waitable_event.h"
joth@chromium.org088ae012011-11-11 01:26:23 +090020#include "base/threading/platform_thread.h"
scheib@chromium.org603f46e2011-05-10 11:23:58 +090021#include "base/threading/thread.h"
22#include "base/values.h"
23#include "testing/gmock/include/gmock/gmock.h"
24#include "testing/gtest/include/gtest/gtest.h"
25
jbates@chromium.org5e2f67d2012-08-16 13:32:49 +090026using base::debug::HighResSleepForTraceTest;
27
scheib@chromium.org603f46e2011-05-10 11:23:58 +090028namespace base {
29namespace debug {
30
31namespace {
32
jbates@chromium.org11d4c362011-09-13 07:03:41 +090033enum CompareOp {
34 IS_EQUAL,
35 IS_NOT_EQUAL,
36};
37
jbates@chromium.orgb3cab862011-05-14 08:30:35 +090038struct JsonKeyValue {
39 const char* key;
40 const char* value;
jbates@chromium.org11d4c362011-09-13 07:03:41 +090041 CompareOp op;
jbates@chromium.orgb3cab862011-05-14 08:30:35 +090042};
43
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +090044static int kThreadId = 42;
45static int kAsyncId = 5;
46static const char kAsyncIdStr[] = "5";
47
scheib@chromium.org603f46e2011-05-10 11:23:58 +090048class TraceEventTestFixture : public testing::Test {
49 public:
joth@chromium.org113de992011-07-21 21:28:59 +090050 // This fixture does not use SetUp() because the fixture must be manually set
51 // up multiple times when testing AtExit. Use ManualTestSetUp for this.
scheib@chromium.org603f46e2011-05-10 11:23:58 +090052 void ManualTestSetUp();
ajwong@chromium.orgec1750a2011-06-27 01:22:50 +090053 void OnTraceDataCollected(
husky@chromium.org3b366292012-02-24 13:17:06 +090054 const scoped_refptr<base::RefCountedString>& events_str);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +090055 void OnTraceNotification(int notification) {
56 if (notification & TraceLog::EVENT_WATCH_NOTIFICATION)
57 ++event_watch_notification_;
58 }
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +090059 DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values);
60 DictionaryValue* FindNamePhase(const char* name, const char* phase);
61 DictionaryValue* FindNamePhaseKeyValue(const char* name,
62 const char* phase,
63 const char* key,
64 const char* value);
jbates@chromium.org11d4c362011-09-13 07:03:41 +090065 bool FindMatchingValue(const char* key,
66 const char* value);
67 bool FindNonMatchingValue(const char* key,
68 const char* value);
69 void Clear() {
jbates@chromium.org11d4c362011-09-13 07:03:41 +090070 trace_parsed_.Clear();
jbates@chromium.org6a092d72011-10-25 01:34:08 +090071 json_output_.json_output.clear();
jbates@chromium.org11d4c362011-09-13 07:03:41 +090072 }
scheib@chromium.org603f46e2011-05-10 11:23:58 +090073
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +090074 void BeginTrace() {
75 event_watch_notification_ = 0;
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +090076 TraceLog::GetInstance()->SetEnabled(std::string("*"),
77 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +090078 }
79
80 void EndTraceAndFlush() {
caseq@google.comedcf6262013-01-16 20:41:57 +090081 while (TraceLog::GetInstance()->IsEnabled())
82 TraceLog::GetInstance()->SetDisabled();
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +090083 TraceLog::GetInstance()->Flush(
84 base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
85 base::Unretained(this)));
86 }
87
rsleevi@chromium.orgde3a6cf2012-04-06 12:53:02 +090088 virtual void SetUp() OVERRIDE {
dsinclair@chromium.org38608f82013-01-26 05:41:19 +090089 const char* name = PlatformThread::GetName();
90 old_thread_name_ = name ? strdup(name) : NULL;
joth@chromium.org088ae012011-11-11 01:26:23 +090091 }
rsleevi@chromium.orgde3a6cf2012-04-06 12:53:02 +090092 virtual void TearDown() OVERRIDE {
nduca@chromium.org6a7360c2012-02-20 15:35:15 +090093 if (TraceLog::GetInstance())
94 EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
dsinclair@chromium.org38608f82013-01-26 05:41:19 +090095 PlatformThread::SetName(old_thread_name_ ? old_thread_name_ : "");
96 free(old_thread_name_);
97 old_thread_name_ = NULL;
joth@chromium.org088ae012011-11-11 01:26:23 +090098 }
99
dsinclair@chromium.org38608f82013-01-26 05:41:19 +0900100 char* old_thread_name_;
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900101 ListValue trace_parsed_;
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900102 base::debug::TraceResultBuffer trace_buffer_;
103 base::debug::TraceResultBuffer::SimpleOutput json_output_;
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900104 int event_watch_notification_;
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900105
106 private:
107 // We want our singleton torn down after each test.
108 ShadowingAtExitManager at_exit_manager_;
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900109 Lock lock_;
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900110};
111
112void TraceEventTestFixture::ManualTestSetUp() {
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900113 TraceLog::DeleteForTesting();
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900114 TraceLog::Resurrect();
115 TraceLog* tracelog = TraceLog::GetInstance();
116 ASSERT_TRUE(tracelog);
117 ASSERT_FALSE(tracelog->IsEnabled());
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900118 tracelog->SetNotificationCallback(
119 base::Bind(&TraceEventTestFixture::OnTraceNotification,
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900120 base::Unretained(this)));
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900121 trace_buffer_.SetOutputCallback(json_output_.GetCallback());
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900122}
123
124void TraceEventTestFixture::OnTraceDataCollected(
husky@chromium.org3b366292012-02-24 13:17:06 +0900125 const scoped_refptr<base::RefCountedString>& events_str) {
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900126 AutoLock lock(lock_);
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900127 json_output_.json_output.clear();
128 trace_buffer_.Start();
husky@chromium.org3b366292012-02-24 13:17:06 +0900129 trace_buffer_.AddFragment(events_str->data());
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900130 trace_buffer_.Finish();
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900131
132 scoped_ptr<Value> root;
rsesek@chromium.orgc2d2b202012-05-17 00:23:30 +0900133 root.reset(base::JSONReader::Read(json_output_.json_output,
134 JSON_PARSE_RFC | JSON_DETACHABLE_CHILDREN));
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900135
jbates@chromium.org59c27602012-01-13 12:12:44 +0900136 if (!root.get()) {
137 LOG(ERROR) << json_output_.json_output;
138 }
139
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900140 ListValue* root_list = NULL;
141 ASSERT_TRUE(root.get());
142 ASSERT_TRUE(root->GetAsList(&root_list));
143
144 // Move items into our aggregate collection
145 while (root_list->GetSize()) {
146 Value* item = NULL;
147 root_list->Remove(0, &item);
148 trace_parsed_.Append(item);
149 }
150}
151
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900152static bool CompareJsonValues(const std::string& lhs,
153 const std::string& rhs,
154 CompareOp op) {
155 switch (op) {
156 case IS_EQUAL:
157 return lhs == rhs;
158 case IS_NOT_EQUAL:
159 return lhs != rhs;
160 default:
161 CHECK(0);
162 }
163 return false;
164}
165
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900166static bool IsKeyValueInDict(const JsonKeyValue* key_value,
167 DictionaryValue* dict) {
168 Value* value = NULL;
169 std::string value_str;
170 if (dict->Get(key_value->key, &value) &&
171 value->GetAsString(&value_str) &&
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900172 CompareJsonValues(value_str, key_value->value, key_value->op))
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900173 return true;
174
175 // Recurse to test arguments
176 DictionaryValue* args_dict = NULL;
177 dict->GetDictionary("args", &args_dict);
178 if (args_dict)
179 return IsKeyValueInDict(key_value, args_dict);
180
181 return false;
182}
183
184static bool IsAllKeyValueInDict(const JsonKeyValue* key_values,
185 DictionaryValue* dict) {
186 // Scan all key_values, they must all be present and equal.
187 while (key_values && key_values->key) {
188 if (!IsKeyValueInDict(key_values, dict))
189 return false;
190 ++key_values;
191 }
192 return true;
193}
194
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900195DictionaryValue* TraceEventTestFixture::FindMatchingTraceEntry(
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900196 const JsonKeyValue* key_values) {
197 // Scan all items
198 size_t trace_parsed_count = trace_parsed_.GetSize();
199 for (size_t i = 0; i < trace_parsed_count; i++) {
200 Value* value = NULL;
201 trace_parsed_.Get(i, &value);
202 if (!value || value->GetType() != Value::TYPE_DICTIONARY)
203 continue;
204 DictionaryValue* dict = static_cast<DictionaryValue*>(value);
205
206 if (IsAllKeyValueInDict(key_values, dict))
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900207 return dict;
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900208 }
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900209 return NULL;
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900210}
211
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900212DictionaryValue* TraceEventTestFixture::FindNamePhase(const char* name,
213 const char* phase) {
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900214 JsonKeyValue key_values[] = {
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900215 {"name", name, IS_EQUAL},
216 {"ph", phase, IS_EQUAL},
217 {0, 0, IS_EQUAL}
218 };
219 return FindMatchingTraceEntry(key_values);
220}
221
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900222DictionaryValue* TraceEventTestFixture::FindNamePhaseKeyValue(
223 const char* name,
224 const char* phase,
225 const char* key,
226 const char* value) {
227 JsonKeyValue key_values[] = {
228 {"name", name, IS_EQUAL},
229 {"ph", phase, IS_EQUAL},
230 {key, value, IS_EQUAL},
231 {0, 0, IS_EQUAL}
232 };
233 return FindMatchingTraceEntry(key_values);
234}
235
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900236bool TraceEventTestFixture::FindMatchingValue(const char* key,
237 const char* value) {
238 JsonKeyValue key_values[] = {
239 {key, value, IS_EQUAL},
240 {0, 0, IS_EQUAL}
241 };
242 return FindMatchingTraceEntry(key_values);
243}
244
245bool TraceEventTestFixture::FindNonMatchingValue(const char* key,
246 const char* value) {
247 JsonKeyValue key_values[] = {
248 {key, value, IS_NOT_EQUAL},
249 {0, 0, IS_EQUAL}
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900250 };
251 return FindMatchingTraceEntry(key_values);
252}
253
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900254bool IsStringInDict(const char* string_to_match, const DictionaryValue* dict) {
pneubeck@chromium.orga2fbefc2013-01-18 23:43:27 +0900255 for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
256 if (it.key().find(string_to_match) != std::string::npos)
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900257 return true;
258
259 std::string value_str;
pneubeck@chromium.orga2fbefc2013-01-18 23:43:27 +0900260 it.value().GetAsString(&value_str);
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900261 if (value_str.find(string_to_match) != std::string::npos)
262 return true;
263 }
264
265 // Recurse to test arguments
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900266 const DictionaryValue* args_dict = NULL;
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900267 dict->GetDictionary("args", &args_dict);
268 if (args_dict)
269 return IsStringInDict(string_to_match, args_dict);
270
271 return false;
272}
273
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900274const DictionaryValue* FindTraceEntry(
275 const ListValue& trace_parsed,
276 const char* string_to_match,
277 const DictionaryValue* match_after_this_item = NULL) {
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900278 // Scan all items
279 size_t trace_parsed_count = trace_parsed.GetSize();
280 for (size_t i = 0; i < trace_parsed_count; i++) {
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900281 const Value* value = NULL;
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900282 trace_parsed.Get(i, &value);
283 if (match_after_this_item) {
284 if (value == match_after_this_item)
285 match_after_this_item = NULL;
286 continue;
287 }
288 if (!value || value->GetType() != Value::TYPE_DICTIONARY)
289 continue;
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900290 const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900291
292 if (IsStringInDict(string_to_match, dict))
293 return dict;
294 }
295 return NULL;
296}
297
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900298std::vector<const DictionaryValue*> FindTraceEntries(
nduca@chromium.org6d048772011-08-10 00:16:25 +0900299 const ListValue& trace_parsed,
300 const char* string_to_match) {
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900301 std::vector<const DictionaryValue*> hits;
nduca@chromium.org6d048772011-08-10 00:16:25 +0900302 size_t trace_parsed_count = trace_parsed.GetSize();
303 for (size_t i = 0; i < trace_parsed_count; i++) {
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900304 const Value* value = NULL;
nduca@chromium.org6d048772011-08-10 00:16:25 +0900305 trace_parsed.Get(i, &value);
306 if (!value || value->GetType() != Value::TYPE_DICTIONARY)
307 continue;
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900308 const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
nduca@chromium.org6d048772011-08-10 00:16:25 +0900309
310 if (IsStringInDict(string_to_match, dict))
311 hits.push_back(dict);
312 }
313 return hits;
314}
315
316void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) {
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900317 {
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900318 TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW call", 0x1122, "extrastring1");
319 TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW call", 0x3344, "extrastring2");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900320 TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW call",
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900321 0x5566, "extrastring3");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900322
323 TRACE_EVENT0("all", "TRACE_EVENT0 call");
324 TRACE_EVENT1("all", "TRACE_EVENT1 call", "name1", "value1");
325 TRACE_EVENT2("all", "TRACE_EVENT2 call",
jbates@chromium.org788d5a12011-09-07 09:43:11 +0900326 "name1", "\"value1\"",
327 "name2", "value\\2");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900328
329 TRACE_EVENT_INSTANT0("all", "TRACE_EVENT_INSTANT0 call");
330 TRACE_EVENT_INSTANT1("all", "TRACE_EVENT_INSTANT1 call", "name1", "value1");
331 TRACE_EVENT_INSTANT2("all", "TRACE_EVENT_INSTANT2 call",
332 "name1", "value1",
333 "name2", "value2");
334
335 TRACE_EVENT_BEGIN0("all", "TRACE_EVENT_BEGIN0 call");
336 TRACE_EVENT_BEGIN1("all", "TRACE_EVENT_BEGIN1 call", "name1", "value1");
337 TRACE_EVENT_BEGIN2("all", "TRACE_EVENT_BEGIN2 call",
338 "name1", "value1",
339 "name2", "value2");
340
341 TRACE_EVENT_END0("all", "TRACE_EVENT_END0 call");
342 TRACE_EVENT_END1("all", "TRACE_EVENT_END1 call", "name1", "value1");
343 TRACE_EVENT_END2("all", "TRACE_EVENT_END2 call",
344 "name1", "value1",
345 "name2", "value2");
nduca@chromium.org62210b02011-11-18 18:36:36 +0900346
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900347 TRACE_EVENT_ASYNC_BEGIN0("all", "TRACE_EVENT_ASYNC_BEGIN0 call", kAsyncId);
348 TRACE_EVENT_ASYNC_BEGIN1("all", "TRACE_EVENT_ASYNC_BEGIN1 call", kAsyncId,
jbates@chromium.org88295f92012-03-01 12:04:59 +0900349 "name1", "value1");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900350 TRACE_EVENT_ASYNC_BEGIN2("all", "TRACE_EVENT_ASYNC_BEGIN2 call", kAsyncId,
jbates@chromium.org88295f92012-03-01 12:04:59 +0900351 "name1", "value1",
352 "name2", "value2");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900353
jbates@chromium.orgbd9d20a2012-09-11 14:56:05 +0900354 TRACE_EVENT_ASYNC_STEP0("all", "TRACE_EVENT_ASYNC_STEP0 call",
simonjam@chromium.org87d003c2012-03-28 09:14:11 +0900355 5, "step1");
jbates@chromium.orgbd9d20a2012-09-11 14:56:05 +0900356 TRACE_EVENT_ASYNC_STEP1("all", "TRACE_EVENT_ASYNC_STEP1 call",
simonjam@chromium.org87d003c2012-03-28 09:14:11 +0900357 5, "step2", "name1", "value1");
jbates@chromium.org88295f92012-03-01 12:04:59 +0900358
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900359 TRACE_EVENT_ASYNC_END0("all", "TRACE_EVENT_ASYNC_END0 call", kAsyncId);
360 TRACE_EVENT_ASYNC_END1("all", "TRACE_EVENT_ASYNC_END1 call", kAsyncId,
jbates@chromium.org88295f92012-03-01 12:04:59 +0900361 "name1", "value1");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900362 TRACE_EVENT_ASYNC_END2("all", "TRACE_EVENT_ASYNC_END2 call", kAsyncId,
jbates@chromium.org88295f92012-03-01 12:04:59 +0900363 "name1", "value1",
364 "name2", "value2");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900365
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900366 TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW0 call", kAsyncId, NULL);
367 TRACE_EVENT_BEGIN_ETW("TRACE_EVENT_BEGIN_ETW1 call", kAsyncId, "value");
368 TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW0 call", kAsyncId, NULL);
369 TRACE_EVENT_END_ETW("TRACE_EVENT_END_ETW1 call", kAsyncId, "value");
370 TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW0 call", kAsyncId, NULL);
371 TRACE_EVENT_INSTANT_ETW("TRACE_EVENT_INSTANT_ETW1 call", kAsyncId, "value");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900372
nduca@chromium.org62210b02011-11-18 18:36:36 +0900373 TRACE_COUNTER1("all", "TRACE_COUNTER1 call", 31415);
374 TRACE_COUNTER2("all", "TRACE_COUNTER2 call",
375 "a", 30000,
376 "b", 1415);
piman@chromium.org902b2952011-12-16 10:19:06 +0900377
378 TRACE_COUNTER_ID1("all", "TRACE_COUNTER_ID1 call", 0x319009, 31415);
379 TRACE_COUNTER_ID2("all", "TRACE_COUNTER_ID2 call", 0x319009,
380 "a", 30000, "b", 1415);
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900381
382 TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all",
383 "TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call",
384 kAsyncId, kThreadId, 12345);
385 TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("all",
386 "TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call",
387 kAsyncId, kThreadId, 23456);
388
389 TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all",
390 "TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call",
391 kAsyncId + 1, kThreadId, 34567);
392 TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0("all",
393 "TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call",
394 kAsyncId + 1, kThreadId, 45678);
395
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900396 } // Scope close causes TRACE_EVENT0 etc to send their END events.
397
398 if (task_complete_event)
399 task_complete_event->Signal();
400}
401
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900402void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900403 const DictionaryValue* item = NULL;
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900404
405#define EXPECT_FIND_(string) \
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900406 EXPECT_TRUE((item = FindTraceEntry(trace_parsed, string)));
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900407#define EXPECT_NOT_FIND_(string) \
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900408 EXPECT_FALSE((item = FindTraceEntry(trace_parsed, string)));
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900409#define EXPECT_SUB_FIND_(string) \
jbates@chromium.orgb84db522011-10-04 02:51:25 +0900410 if (item) EXPECT_TRUE((IsStringInDict(string, item)));
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900411
412 EXPECT_FIND_("ETW Trace Event");
413 EXPECT_FIND_("all");
414 EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW call");
415 {
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900416 std::string str_val;
417 EXPECT_TRUE(item && item->GetString("args.id", &str_val));
418 EXPECT_STREQ("1122", str_val.c_str());
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900419 }
420 EXPECT_SUB_FIND_("extrastring1");
421 EXPECT_FIND_("TRACE_EVENT_END_ETW call");
422 EXPECT_FIND_("TRACE_EVENT_INSTANT_ETW call");
423 EXPECT_FIND_("TRACE_EVENT0 call");
424 {
425 std::string ph_begin;
426 std::string ph_end;
427 EXPECT_TRUE((item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call")));
428 EXPECT_TRUE((item && item->GetString("ph", &ph_begin)));
429 EXPECT_TRUE((item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call",
430 item)));
431 EXPECT_TRUE((item && item->GetString("ph", &ph_end)));
432 EXPECT_EQ("B", ph_begin);
433 EXPECT_EQ("E", ph_end);
434 }
435 EXPECT_FIND_("TRACE_EVENT1 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900436 EXPECT_SUB_FIND_("name1");
437 EXPECT_SUB_FIND_("value1");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900438 EXPECT_FIND_("TRACE_EVENT2 call");
439 EXPECT_SUB_FIND_("name1");
jbates@chromium.org788d5a12011-09-07 09:43:11 +0900440 EXPECT_SUB_FIND_("\"value1\"");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900441 EXPECT_SUB_FIND_("name2");
jbates@chromium.org788d5a12011-09-07 09:43:11 +0900442 EXPECT_SUB_FIND_("value\\2");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900443
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900444 EXPECT_FIND_("TRACE_EVENT_INSTANT0 call");
445 EXPECT_FIND_("TRACE_EVENT_INSTANT1 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900446 EXPECT_SUB_FIND_("name1");
447 EXPECT_SUB_FIND_("value1");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900448 EXPECT_FIND_("TRACE_EVENT_INSTANT2 call");
449 EXPECT_SUB_FIND_("name1");
450 EXPECT_SUB_FIND_("value1");
451 EXPECT_SUB_FIND_("name2");
452 EXPECT_SUB_FIND_("value2");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900453
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900454 EXPECT_FIND_("TRACE_EVENT_BEGIN0 call");
455 EXPECT_FIND_("TRACE_EVENT_BEGIN1 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900456 EXPECT_SUB_FIND_("name1");
457 EXPECT_SUB_FIND_("value1");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900458 EXPECT_FIND_("TRACE_EVENT_BEGIN2 call");
459 EXPECT_SUB_FIND_("name1");
460 EXPECT_SUB_FIND_("value1");
461 EXPECT_SUB_FIND_("name2");
462 EXPECT_SUB_FIND_("value2");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900463
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900464 EXPECT_FIND_("TRACE_EVENT_END0 call");
465 EXPECT_FIND_("TRACE_EVENT_END1 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900466 EXPECT_SUB_FIND_("name1");
467 EXPECT_SUB_FIND_("value1");
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900468 EXPECT_FIND_("TRACE_EVENT_END2 call");
469 EXPECT_SUB_FIND_("name1");
470 EXPECT_SUB_FIND_("value1");
471 EXPECT_SUB_FIND_("name2");
472 EXPECT_SUB_FIND_("value2");
nduca@chromium.org62210b02011-11-18 18:36:36 +0900473
jbates@chromium.org88295f92012-03-01 12:04:59 +0900474 EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN0 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900475 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900476 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org88295f92012-03-01 12:04:59 +0900477 EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN1 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900478 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900479 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900480 EXPECT_SUB_FIND_("name1");
481 EXPECT_SUB_FIND_("value1");
jbates@chromium.org88295f92012-03-01 12:04:59 +0900482 EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN2 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900483 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900484 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900485 EXPECT_SUB_FIND_("name1");
486 EXPECT_SUB_FIND_("value1");
487 EXPECT_SUB_FIND_("name2");
488 EXPECT_SUB_FIND_("value2");
489
jbates@chromium.orgbd9d20a2012-09-11 14:56:05 +0900490 EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP0 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900491 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900492 EXPECT_SUB_FIND_(kAsyncIdStr);
simonjam@chromium.org87d003c2012-03-28 09:14:11 +0900493 EXPECT_SUB_FIND_("step1");
jbates@chromium.orgbd9d20a2012-09-11 14:56:05 +0900494 EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP1 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900495 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900496 EXPECT_SUB_FIND_(kAsyncIdStr);
simonjam@chromium.org87d003c2012-03-28 09:14:11 +0900497 EXPECT_SUB_FIND_("step2");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900498 EXPECT_SUB_FIND_("name1");
499 EXPECT_SUB_FIND_("value1");
jbates@chromium.org88295f92012-03-01 12:04:59 +0900500
501 EXPECT_FIND_("TRACE_EVENT_ASYNC_END0 call");
502 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900503 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org88295f92012-03-01 12:04:59 +0900504 EXPECT_FIND_("TRACE_EVENT_ASYNC_END1 call");
505 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900506 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org88295f92012-03-01 12:04:59 +0900507 EXPECT_SUB_FIND_("name1");
508 EXPECT_SUB_FIND_("value1");
509 EXPECT_FIND_("TRACE_EVENT_ASYNC_END2 call");
jbates@chromium.org59c27602012-01-13 12:12:44 +0900510 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900511 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900512 EXPECT_SUB_FIND_("name1");
513 EXPECT_SUB_FIND_("value1");
514 EXPECT_SUB_FIND_("name2");
515 EXPECT_SUB_FIND_("value2");
516
517 EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW0 call");
518 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900519 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900520 EXPECT_SUB_FIND_("extra");
521 EXPECT_SUB_FIND_("NULL");
522 EXPECT_FIND_("TRACE_EVENT_BEGIN_ETW1 call");
523 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900524 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900525 EXPECT_SUB_FIND_("extra");
526 EXPECT_SUB_FIND_("value");
527 EXPECT_FIND_("TRACE_EVENT_END_ETW0 call");
528 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900529 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900530 EXPECT_SUB_FIND_("extra");
531 EXPECT_SUB_FIND_("NULL");
532 EXPECT_FIND_("TRACE_EVENT_END_ETW1 call");
533 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900534 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900535 EXPECT_SUB_FIND_("extra");
536 EXPECT_SUB_FIND_("value");
537 EXPECT_FIND_("TRACE_EVENT_INSTANT_ETW0 call");
538 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900539 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900540 EXPECT_SUB_FIND_("extra");
541 EXPECT_SUB_FIND_("NULL");
542 EXPECT_FIND_("TRACE_EVENT_INSTANT_ETW1 call");
543 EXPECT_SUB_FIND_("id");
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900544 EXPECT_SUB_FIND_(kAsyncIdStr);
jbates@chromium.org59c27602012-01-13 12:12:44 +0900545 EXPECT_SUB_FIND_("extra");
546 EXPECT_SUB_FIND_("value");
547
nduca@chromium.org62210b02011-11-18 18:36:36 +0900548 EXPECT_FIND_("TRACE_COUNTER1 call");
549 {
550 std::string ph;
551 EXPECT_TRUE((item && item->GetString("ph", &ph)));
552 EXPECT_EQ("C", ph);
553
554 int value;
555 EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
556 EXPECT_EQ(31415, value);
557 }
558
559 EXPECT_FIND_("TRACE_COUNTER2 call");
560 {
561 std::string ph;
562 EXPECT_TRUE((item && item->GetString("ph", &ph)));
563 EXPECT_EQ("C", ph);
564
565 int value;
566 EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
567 EXPECT_EQ(30000, value);
568
569 EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
570 EXPECT_EQ(1415, value);
571 }
572
piman@chromium.org902b2952011-12-16 10:19:06 +0900573 EXPECT_FIND_("TRACE_COUNTER_ID1 call");
574 {
575 std::string id;
576 EXPECT_TRUE((item && item->GetString("id", &id)));
577 EXPECT_EQ("319009", id);
578
579 std::string ph;
580 EXPECT_TRUE((item && item->GetString("ph", &ph)));
581 EXPECT_EQ("C", ph);
582
583 int value;
584 EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
585 EXPECT_EQ(31415, value);
586 }
587
588 EXPECT_FIND_("TRACE_COUNTER_ID2 call");
589 {
590 std::string id;
591 EXPECT_TRUE((item && item->GetString("id", &id)));
592 EXPECT_EQ("319009", id);
593
594 std::string ph;
595 EXPECT_TRUE((item && item->GetString("ph", &ph)));
596 EXPECT_EQ("C", ph);
597
598 int value;
599 EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
600 EXPECT_EQ(30000, value);
601
602 EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
603 EXPECT_EQ(1415, value);
604 }
dsinclair@chromium.org9aed8362013-02-16 03:58:25 +0900605
606 EXPECT_FIND_("TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call");
607 {
608 int val;
609 EXPECT_TRUE((item && item->GetInteger("ts", &val)));
610 EXPECT_EQ(12345, val);
611 EXPECT_TRUE((item && item->GetInteger("tid", &val)));
612 EXPECT_EQ(kThreadId, val);
613 std::string id;
614 EXPECT_TRUE((item && item->GetString("id", &id)));
615 EXPECT_EQ(kAsyncId, atoi(id.c_str()));
616 }
617
618 EXPECT_FIND_("TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call");
619 {
620 int val;
621 EXPECT_TRUE((item && item->GetInteger("ts", &val)));
622 EXPECT_EQ(23456, val);
623 EXPECT_TRUE((item && item->GetInteger("tid", &val)));
624 EXPECT_EQ(kThreadId, val);
625 std::string id;
626 EXPECT_TRUE((item && item->GetString("id", &id)));
627 EXPECT_EQ(kAsyncId, atoi(id.c_str()));
628 }
629
630 EXPECT_FIND_("TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call");
631 {
632 int val;
633 EXPECT_TRUE((item && item->GetInteger("ts", &val)));
634 EXPECT_EQ(34567, val);
635 EXPECT_TRUE((item && item->GetInteger("tid", &val)));
636 EXPECT_EQ(kThreadId, val);
637 std::string id;
638 EXPECT_TRUE((item && item->GetString("id", &id)));
639 EXPECT_EQ(kAsyncId + 1, atoi(id.c_str()));
640 }
641
642 EXPECT_FIND_("TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call");
643 {
644 int val;
645 EXPECT_TRUE((item && item->GetInteger("ts", &val)));
646 EXPECT_EQ(45678, val);
647 EXPECT_TRUE((item && item->GetInteger("tid", &val)));
648 EXPECT_EQ(kThreadId, val);
649 std::string id;
650 EXPECT_TRUE((item && item->GetString("id", &id)));
651 EXPECT_EQ(kAsyncId + 1, atoi(id.c_str()));
652 }
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900653}
654
nduca@chromium.org6d048772011-08-10 00:16:25 +0900655void TraceManyInstantEvents(int thread_id, int num_events,
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900656 WaitableEvent* task_complete_event) {
nduca@chromium.org6d048772011-08-10 00:16:25 +0900657 for (int i = 0; i < num_events; i++) {
658 TRACE_EVENT_INSTANT2("all", "multi thread event",
659 "thread", thread_id,
660 "event", i);
661 }
662
663 if (task_complete_event)
664 task_complete_event->Signal();
665}
666
667void ValidateInstantEventPresentOnEveryThread(const ListValue& trace_parsed,
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900668 int num_threads,
669 int num_events) {
nduca@chromium.org6d048772011-08-10 00:16:25 +0900670 std::map<int, std::map<int, bool> > results;
671
672 size_t trace_parsed_count = trace_parsed.GetSize();
673 for (size_t i = 0; i < trace_parsed_count; i++) {
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900674 const Value* value = NULL;
nduca@chromium.org6d048772011-08-10 00:16:25 +0900675 trace_parsed.Get(i, &value);
676 if (!value || value->GetType() != Value::TYPE_DICTIONARY)
677 continue;
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +0900678 const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
nduca@chromium.org6d048772011-08-10 00:16:25 +0900679 std::string name;
680 dict->GetString("name", &name);
681 if (name != "multi thread event")
682 continue;
683
684 int thread = 0;
685 int event = 0;
686 EXPECT_TRUE(dict->GetInteger("args.thread", &thread));
687 EXPECT_TRUE(dict->GetInteger("args.event", &event));
688 results[thread][event] = true;
689 }
690
691 EXPECT_FALSE(results[-1][-1]);
692 for (int thread = 0; thread < num_threads; thread++) {
693 for (int event = 0; event < num_events; event++) {
694 EXPECT_TRUE(results[thread][event]);
695 }
696 }
697}
698
699void TraceCallsWithCachedCategoryPointersPointers(const char* name_str) {
700 TRACE_EVENT0("category name1", name_str);
701 TRACE_EVENT_INSTANT0("category name2", name_str);
702 TRACE_EVENT_BEGIN0("category name3", name_str);
703 TRACE_EVENT_END0("category name4", name_str);
704}
705
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900706} // namespace
707
jbates@chromium.org5e2f67d2012-08-16 13:32:49 +0900708void HighResSleepForTraceTest(base::TimeDelta elapsed) {
709 base::TimeTicks end_time = base::TimeTicks::HighResNow() + elapsed;
710 do {
711 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
712 } while (base::TimeTicks::HighResNow() < end_time);
713}
714
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900715// Simple Test for emitting data and validating it was received.
716TEST_F(TraceEventTestFixture, DataCaptured) {
717 ManualTestSetUp();
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900718 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900719
nduca@chromium.org6d048772011-08-10 00:16:25 +0900720 TraceWithAllMacroVariants(NULL);
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900721
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900722 EndTraceAndFlush();
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900723
jbates@chromium.org6a092d72011-10-25 01:34:08 +0900724 ValidateAllTraceMacrosCreatedData(trace_parsed_);
scheib@chromium.org603f46e2011-05-10 11:23:58 +0900725}
726
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900727class MockEnabledStateChangedObserver :
728 public base::debug::TraceLog::EnabledStateChangedObserver {
729 public:
730 MOCK_METHOD0(OnTraceLogWillEnable, void());
731 MOCK_METHOD0(OnTraceLogWillDisable, void());
732};
733
734TEST_F(TraceEventTestFixture, EnabledObserverFiresOnEnable) {
735 ManualTestSetUp();
736
737 MockEnabledStateChangedObserver observer;
738 TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
739
740 EXPECT_CALL(observer, OnTraceLogWillEnable())
741 .Times(1);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900742 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900743 testing::Mock::VerifyAndClear(&observer);
744
745 // Cleanup.
746 TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900747 TraceLog::GetInstance()->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900748}
749
750TEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnSecondEnable) {
751 ManualTestSetUp();
752
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900753 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900754
755 testing::StrictMock<MockEnabledStateChangedObserver> observer;
756 TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
757
758 EXPECT_CALL(observer, OnTraceLogWillEnable())
759 .Times(0);
760 EXPECT_CALL(observer, OnTraceLogWillDisable())
761 .Times(0);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900762 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900763 testing::Mock::VerifyAndClear(&observer);
764
765 // Cleanup.
766 TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900767 TraceLog::GetInstance()->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
768 TraceLog::GetInstance()->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900769}
770
caseq@google.comedcf6262013-01-16 20:41:57 +0900771TEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnNestedDisable) {
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900772 ManualTestSetUp();
773
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900774 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
775 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900776
777 testing::StrictMock<MockEnabledStateChangedObserver> observer;
778 TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
779
780 EXPECT_CALL(observer, OnTraceLogWillEnable())
781 .Times(0);
782 EXPECT_CALL(observer, OnTraceLogWillDisable())
783 .Times(0);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900784 TraceLog::GetInstance()->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900785 testing::Mock::VerifyAndClear(&observer);
786
787 // Cleanup.
788 TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900789 TraceLog::GetInstance()->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900790}
791
792TEST_F(TraceEventTestFixture, EnabledObserverFiresOnDisable) {
793 ManualTestSetUp();
794
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900795 TraceLog::GetInstance()->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900796
797 MockEnabledStateChangedObserver observer;
798 TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
799
800 EXPECT_CALL(observer, OnTraceLogWillDisable())
801 .Times(1);
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900802 TraceLog::GetInstance()->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
nduca@chromium.org6a7360c2012-02-20 15:35:15 +0900803 testing::Mock::VerifyAndClear(&observer);
804
805 // Cleanup.
806 TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
807}
808
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900809// Test that categories work.
810TEST_F(TraceEventTestFixture, Categories) {
811 ManualTestSetUp();
812
813 // Test that categories that are used can be retrieved whether trace was
814 // enabled or disabled when the trace event was encountered.
815 TRACE_EVENT_INSTANT0("c1", "name");
816 TRACE_EVENT_INSTANT0("c2", "name");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900817 BeginTrace();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900818 TRACE_EVENT_INSTANT0("c3", "name");
819 TRACE_EVENT_INSTANT0("c4", "name");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900820 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900821 std::vector<std::string> cats;
822 TraceLog::GetInstance()->GetKnownCategories(&cats);
823 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c1") != cats.end());
824 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c2") != cats.end());
825 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c3") != cats.end());
826 EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c4") != cats.end());
827
828 const std::vector<std::string> empty_categories;
829 std::vector<std::string> included_categories;
830 std::vector<std::string> excluded_categories;
831
832 // Test that category filtering works.
833
834 // Include nonexistent category -> no events
835 Clear();
836 included_categories.clear();
837 included_categories.push_back("not_found823564786");
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900838 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories,
839 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900840 TRACE_EVENT_INSTANT0("cat1", "name");
841 TRACE_EVENT_INSTANT0("cat2", "name");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900842 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900843 EXPECT_TRUE(trace_parsed_.empty());
844
845 // Include existent category -> only events of that category
846 Clear();
847 included_categories.clear();
848 included_categories.push_back("inc");
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900849 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories,
850 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900851 TRACE_EVENT_INSTANT0("inc", "name");
852 TRACE_EVENT_INSTANT0("inc2", "name");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900853 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900854 EXPECT_TRUE(FindMatchingValue("cat", "inc"));
855 EXPECT_FALSE(FindNonMatchingValue("cat", "inc"));
856
857 // Include existent wildcard -> all categories matching wildcard
858 Clear();
859 included_categories.clear();
860 included_categories.push_back("inc_wildcard_*");
861 included_categories.push_back("inc_wildchar_?_end");
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900862 TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories,
863 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900864 TRACE_EVENT_INSTANT0("inc_wildcard_abc", "included");
865 TRACE_EVENT_INSTANT0("inc_wildcard_", "included");
866 TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "included");
867 TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc");
868 TRACE_EVENT_INSTANT0("cat1", "not_inc");
869 TRACE_EVENT_INSTANT0("cat2", "not_inc");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900870 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900871 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc"));
872 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_"));
873 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end"));
874 EXPECT_FALSE(FindMatchingValue("name", "not_inc"));
875
876 included_categories.clear();
877
878 // Exclude nonexistent category -> all events
879 Clear();
880 excluded_categories.clear();
881 excluded_categories.push_back("not_found823564786");
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900882 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories,
883 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900884 TRACE_EVENT_INSTANT0("cat1", "name");
885 TRACE_EVENT_INSTANT0("cat2", "name");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900886 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900887 EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
888 EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
889
890 // Exclude existent category -> only events of other categories
891 Clear();
892 excluded_categories.clear();
893 excluded_categories.push_back("inc");
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900894 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories,
895 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900896 TRACE_EVENT_INSTANT0("inc", "name");
897 TRACE_EVENT_INSTANT0("inc2", "name");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900898 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900899 EXPECT_TRUE(FindMatchingValue("cat", "inc2"));
900 EXPECT_FALSE(FindMatchingValue("cat", "inc"));
901
902 // Exclude existent wildcard -> all categories not matching wildcard
903 Clear();
904 excluded_categories.clear();
905 excluded_categories.push_back("inc_wildcard_*");
906 excluded_categories.push_back("inc_wildchar_?_end");
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +0900907 TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories,
908 TraceLog::RECORD_UNTIL_FULL);
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900909 TRACE_EVENT_INSTANT0("inc_wildcard_abc", "not_inc");
910 TRACE_EVENT_INSTANT0("inc_wildcard_", "not_inc");
911 TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "not_inc");
912 TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included");
913 TRACE_EVENT_INSTANT0("cat1", "included");
914 TRACE_EVENT_INSTANT0("cat2", "included");
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900915 EndTraceAndFlush();
jbates@chromium.org11d4c362011-09-13 07:03:41 +0900916 EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end"));
917 EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
918 EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
919 EXPECT_FALSE(FindMatchingValue("name", "not_inc"));
920}
921
jbates@chromium.orgb3cab862011-05-14 08:30:35 +0900922
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900923// Test EVENT_WATCH_NOTIFICATION
924TEST_F(TraceEventTestFixture, EventWatchNotification) {
925 ManualTestSetUp();
926
927 // Basic one occurrence.
928 BeginTrace();
929 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
930 TRACE_EVENT_INSTANT0("cat", "event");
931 EndTraceAndFlush();
932 EXPECT_EQ(event_watch_notification_, 1);
933
934 // Basic one occurrence before Set.
935 BeginTrace();
936 TRACE_EVENT_INSTANT0("cat", "event");
937 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
938 EndTraceAndFlush();
939 EXPECT_EQ(event_watch_notification_, 1);
940
941 // Auto-reset after end trace.
942 BeginTrace();
943 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
944 EndTraceAndFlush();
945 BeginTrace();
946 TRACE_EVENT_INSTANT0("cat", "event");
947 EndTraceAndFlush();
948 EXPECT_EQ(event_watch_notification_, 0);
949
950 // Multiple occurrence.
951 BeginTrace();
952 int num_occurrences = 5;
953 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
954 for (int i = 0; i < num_occurrences; ++i)
955 TRACE_EVENT_INSTANT0("cat", "event");
956 EndTraceAndFlush();
957 EXPECT_EQ(event_watch_notification_, num_occurrences);
958
959 // Wrong category.
960 BeginTrace();
961 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
962 TRACE_EVENT_INSTANT0("wrong_cat", "event");
963 EndTraceAndFlush();
964 EXPECT_EQ(event_watch_notification_, 0);
965
966 // Wrong name.
967 BeginTrace();
968 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
969 TRACE_EVENT_INSTANT0("cat", "wrong_event");
970 EndTraceAndFlush();
971 EXPECT_EQ(event_watch_notification_, 0);
972
973 // Canceled.
974 BeginTrace();
975 TraceLog::GetInstance()->SetWatchEvent("cat", "event");
976 TraceLog::GetInstance()->CancelWatchEvent();
977 TRACE_EVENT_INSTANT0("cat", "event");
978 EndTraceAndFlush();
979 EXPECT_EQ(event_watch_notification_, 0);
980}
981
jbates@chromium.org88295f92012-03-01 12:04:59 +0900982// Test ASYNC_BEGIN/END events
983TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) {
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900984 ManualTestSetUp();
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900985 BeginTrace();
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900986
987 unsigned long long id = 0xfeedbeeffeedbeefull;
jbates@chromium.org88295f92012-03-01 12:04:59 +0900988 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", id);
jbates@chromium.orgbd9d20a2012-09-11 14:56:05 +0900989 TRACE_EVENT_ASYNC_STEP0( "cat", "name1", id, "step1");
jbates@chromium.org88295f92012-03-01 12:04:59 +0900990 TRACE_EVENT_ASYNC_END0("cat", "name1", id);
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900991 TRACE_EVENT_BEGIN0( "cat", "name2");
jbates@chromium.org88295f92012-03-01 12:04:59 +0900992 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name3", 0);
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900993
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +0900994 EndTraceAndFlush();
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900995
996 EXPECT_TRUE(FindNamePhase("name1", "S"));
jbates@chromium.org88295f92012-03-01 12:04:59 +0900997 EXPECT_TRUE(FindNamePhase("name1", "T"));
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +0900998 EXPECT_TRUE(FindNamePhase("name1", "F"));
999
1000 std::string id_str;
1001 StringAppendF(&id_str, "%llx", id);
1002
1003 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str()));
jbates@chromium.org88295f92012-03-01 12:04:59 +09001004 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str()));
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001005 EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str()));
1006 EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0"));
1007
1008 // BEGIN events should not have id
1009 EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0"));
1010}
1011
jbates@chromium.org88295f92012-03-01 12:04:59 +09001012// Test ASYNC_BEGIN/END events
1013TEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) {
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001014 ManualTestSetUp();
1015
1016 void* ptr = this;
1017
1018 TraceLog::GetInstance()->SetProcessID(100);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001019 BeginTrace();
jbates@chromium.org88295f92012-03-01 12:04:59 +09001020 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", ptr);
1021 TRACE_EVENT_ASYNC_BEGIN0( "cat", "name2", ptr);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001022 EndTraceAndFlush();
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001023
1024 TraceLog::GetInstance()->SetProcessID(200);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001025 BeginTrace();
jbates@chromium.org88295f92012-03-01 12:04:59 +09001026 TRACE_EVENT_ASYNC_END0( "cat", "name1", ptr);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001027 EndTraceAndFlush();
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001028
jbates@chromium.org88295f92012-03-01 12:04:59 +09001029 DictionaryValue* async_begin = FindNamePhase("name1", "S");
1030 DictionaryValue* async_begin2 = FindNamePhase("name2", "S");
1031 DictionaryValue* async_end = FindNamePhase("name1", "F");
1032 EXPECT_TRUE(async_begin);
1033 EXPECT_TRUE(async_begin2);
1034 EXPECT_TRUE(async_end);
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001035
1036 Value* value = NULL;
jbates@chromium.org88295f92012-03-01 12:04:59 +09001037 std::string async_begin_id_str;
1038 std::string async_begin2_id_str;
1039 std::string async_end_id_str;
1040 ASSERT_TRUE(async_begin->Get("id", &value));
1041 ASSERT_TRUE(value->GetAsString(&async_begin_id_str));
1042 ASSERT_TRUE(async_begin2->Get("id", &value));
1043 ASSERT_TRUE(value->GetAsString(&async_begin2_id_str));
1044 ASSERT_TRUE(async_end->Get("id", &value));
1045 ASSERT_TRUE(value->GetAsString(&async_end_id_str));
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001046
jbates@chromium.org88295f92012-03-01 12:04:59 +09001047 EXPECT_STREQ(async_begin_id_str.c_str(), async_begin2_id_str.c_str());
1048 EXPECT_STRNE(async_begin_id_str.c_str(), async_end_id_str.c_str());
jbates@chromium.org8bb0ee62011-12-03 02:17:38 +09001049}
1050
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001051// Test that static strings are not copied.
1052TEST_F(TraceEventTestFixture, StaticStringVsString) {
1053 ManualTestSetUp();
1054 TraceLog* tracer = TraceLog::GetInstance();
1055 // Make sure old events are flushed:
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001056 EndTraceAndFlush();
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001057 EXPECT_EQ(0u, tracer->GetEventsSize());
1058
1059 {
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001060 BeginTrace();
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001061 // Test that string arguments are copied.
1062 TRACE_EVENT2("cat", "name1",
1063 "arg1", std::string("argval"), "arg2", std::string("argval"));
1064 // Test that static TRACE_STR_COPY string arguments are copied.
1065 TRACE_EVENT2("cat", "name2",
1066 "arg1", TRACE_STR_COPY("argval"),
1067 "arg2", TRACE_STR_COPY("argval"));
1068 size_t num_events = tracer->GetEventsSize();
1069 EXPECT_GT(num_events, 1u);
1070 const TraceEvent& event1 = tracer->GetEventAt(num_events - 2);
1071 const TraceEvent& event2 = tracer->GetEventAt(num_events - 1);
1072 EXPECT_STREQ("name1", event1.name());
1073 EXPECT_STREQ("name2", event2.name());
1074 EXPECT_TRUE(event1.parameter_copy_storage() != NULL);
1075 EXPECT_TRUE(event2.parameter_copy_storage() != NULL);
1076 EXPECT_GT(event1.parameter_copy_storage()->size(), 0u);
1077 EXPECT_GT(event2.parameter_copy_storage()->size(), 0u);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001078 EndTraceAndFlush();
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001079 }
1080
1081 {
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001082 BeginTrace();
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001083 // Test that static literal string arguments are not copied.
1084 TRACE_EVENT2("cat", "name1",
1085 "arg1", "argval", "arg2", "argval");
1086 // Test that static TRACE_STR_COPY NULL string arguments are not copied.
1087 const char* str1 = NULL;
1088 const char* str2 = NULL;
1089 TRACE_EVENT2("cat", "name2",
1090 "arg1", TRACE_STR_COPY(str1),
1091 "arg2", TRACE_STR_COPY(str2));
1092 size_t num_events = tracer->GetEventsSize();
1093 EXPECT_GT(num_events, 1u);
1094 const TraceEvent& event1 = tracer->GetEventAt(num_events - 2);
1095 const TraceEvent& event2 = tracer->GetEventAt(num_events - 1);
1096 EXPECT_STREQ("name1", event1.name());
1097 EXPECT_STREQ("name2", event2.name());
1098 EXPECT_TRUE(event1.parameter_copy_storage() == NULL);
1099 EXPECT_TRUE(event2.parameter_copy_storage() == NULL);
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001100 EndTraceAndFlush();
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001101 }
1102}
1103
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001104// Test that data sent from other threads is gathered
1105TEST_F(TraceEventTestFixture, DataCapturedOnThread) {
1106 ManualTestSetUp();
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001107 BeginTrace();
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001108
1109 Thread thread("1");
1110 WaitableEvent task_complete_event(false, false);
1111 thread.Start();
1112
1113 thread.message_loop()->PostTask(
jbates@chromium.org0b837e42011-10-06 01:58:20 +09001114 FROM_HERE, base::Bind(&TraceWithAllMacroVariants, &task_complete_event));
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001115 task_complete_event.Wait();
jbates@chromium.orgb84db522011-10-04 02:51:25 +09001116 thread.Stop();
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001117
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001118 EndTraceAndFlush();
jbates@chromium.org6a092d72011-10-25 01:34:08 +09001119 ValidateAllTraceMacrosCreatedData(trace_parsed_);
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001120}
1121
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001122// Test that data sent from multiple threads is gathered
1123TEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
1124 ManualTestSetUp();
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001125 BeginTrace();
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001126
1127 const int num_threads = 4;
1128 const int num_events = 4000;
1129 Thread* threads[num_threads];
1130 WaitableEvent* task_complete_events[num_threads];
1131 for (int i = 0; i < num_threads; i++) {
1132 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str());
1133 task_complete_events[i] = new WaitableEvent(false, false);
1134 threads[i]->Start();
1135 threads[i]->message_loop()->PostTask(
jbates@chromium.org0b837e42011-10-06 01:58:20 +09001136 FROM_HERE, base::Bind(&TraceManyInstantEvents,
1137 i, num_events, task_complete_events[i]));
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001138 }
1139
1140 for (int i = 0; i < num_threads; i++) {
1141 task_complete_events[i]->Wait();
1142 }
1143
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001144 for (int i = 0; i < num_threads; i++) {
1145 threads[i]->Stop();
1146 delete threads[i];
1147 delete task_complete_events[i];
1148 }
1149
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001150 EndTraceAndFlush();
jbates@chromium.orgb84db522011-10-04 02:51:25 +09001151
jbates@chromium.org6a092d72011-10-25 01:34:08 +09001152 ValidateInstantEventPresentOnEveryThread(trace_parsed_,
nduca@chromium.org6d048772011-08-10 00:16:25 +09001153 num_threads, num_events);
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001154}
1155
nduca@chromium.org6d048772011-08-10 00:16:25 +09001156// Test that thread and process names show up in the trace
1157TEST_F(TraceEventTestFixture, ThreadNames) {
1158 ManualTestSetUp();
1159
1160 // Create threads before we enable tracing to make sure
1161 // that tracelog still captures them.
1162 const int num_threads = 4;
1163 const int num_events = 10;
1164 Thread* threads[num_threads];
1165 PlatformThreadId thread_ids[num_threads];
1166 for (int i = 0; i < num_threads; i++)
1167 threads[i] = new Thread(StringPrintf("Thread %d", i).c_str());
1168
1169 // Enable tracing.
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001170 BeginTrace();
nduca@chromium.org6d048772011-08-10 00:16:25 +09001171
1172 // Now run some trace code on these threads.
1173 WaitableEvent* task_complete_events[num_threads];
1174 for (int i = 0; i < num_threads; i++) {
1175 task_complete_events[i] = new WaitableEvent(false, false);
1176 threads[i]->Start();
1177 thread_ids[i] = threads[i]->thread_id();
1178 threads[i]->message_loop()->PostTask(
jbates@chromium.org0b837e42011-10-06 01:58:20 +09001179 FROM_HERE, base::Bind(&TraceManyInstantEvents,
1180 i, num_events, task_complete_events[i]));
nduca@chromium.org6d048772011-08-10 00:16:25 +09001181 }
1182 for (int i = 0; i < num_threads; i++) {
1183 task_complete_events[i]->Wait();
1184 }
1185
1186 // Shut things down.
nduca@chromium.org6d048772011-08-10 00:16:25 +09001187 for (int i = 0; i < num_threads; i++) {
1188 threads[i]->Stop();
1189 delete threads[i];
1190 delete task_complete_events[i];
1191 }
1192
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001193 EndTraceAndFlush();
jbates@chromium.orgb84db522011-10-04 02:51:25 +09001194
nduca@chromium.org6d048772011-08-10 00:16:25 +09001195 std::string tmp;
1196 int tmp_int;
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +09001197 const DictionaryValue* item;
nduca@chromium.org6d048772011-08-10 00:16:25 +09001198
1199 // Make sure we get thread name metadata.
1200 // Note, the test suite may have created a ton of threads.
1201 // So, we'll have thread names for threads we didn't create.
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +09001202 std::vector<const DictionaryValue*> items =
nduca@chromium.org6d048772011-08-10 00:16:25 +09001203 FindTraceEntries(trace_parsed_, "thread_name");
1204 for (int i = 0; i < static_cast<int>(items.size()); i++) {
1205 item = items[i];
joth@chromium.org088ae012011-11-11 01:26:23 +09001206 ASSERT_TRUE(item);
nduca@chromium.org6d048772011-08-10 00:16:25 +09001207 EXPECT_TRUE(item->GetInteger("tid", &tmp_int));
1208
1209 // See if this thread name is one of the threads we just created
1210 for (int j = 0; j < num_threads; j++) {
1211 if(static_cast<int>(thread_ids[j]) != tmp_int)
1212 continue;
1213
jbates@chromium.org62a16662012-02-04 08:18:06 +09001214 std::string expected_name = StringPrintf("Thread %d", j);
nduca@chromium.org6d048772011-08-10 00:16:25 +09001215 EXPECT_TRUE(item->GetString("ph", &tmp) && tmp == "M");
1216 EXPECT_TRUE(item->GetInteger("pid", &tmp_int) &&
1217 tmp_int == static_cast<int>(base::GetCurrentProcId()));
jbates@chromium.org62a16662012-02-04 08:18:06 +09001218 // If the thread name changes or the tid gets reused, the name will be
1219 // a comma-separated list of thread names, so look for a substring.
nduca@chromium.org6d048772011-08-10 00:16:25 +09001220 EXPECT_TRUE(item->GetString("args.name", &tmp) &&
jbates@chromium.org62a16662012-02-04 08:18:06 +09001221 tmp.find(expected_name) != std::string::npos);
nduca@chromium.org6d048772011-08-10 00:16:25 +09001222 }
1223 }
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001224}
1225
joth@chromium.org088ae012011-11-11 01:26:23 +09001226TEST_F(TraceEventTestFixture, ThreadNameChanges) {
1227 ManualTestSetUp();
1228
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001229 BeginTrace();
joth@chromium.org088ae012011-11-11 01:26:23 +09001230
1231 PlatformThread::SetName("");
1232 TRACE_EVENT_INSTANT0("drink", "water");
1233
1234 PlatformThread::SetName("cafe");
1235 TRACE_EVENT_INSTANT0("drink", "coffee");
1236
1237 PlatformThread::SetName("shop");
1238 // No event here, so won't appear in combined name.
1239
1240 PlatformThread::SetName("pub");
1241 TRACE_EVENT_INSTANT0("drink", "beer");
1242 TRACE_EVENT_INSTANT0("drink", "wine");
1243
1244 PlatformThread::SetName(" bar");
1245 TRACE_EVENT_INSTANT0("drink", "whisky");
1246
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001247 EndTraceAndFlush();
joth@chromium.org088ae012011-11-11 01:26:23 +09001248
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +09001249 std::vector<const DictionaryValue*> items =
joth@chromium.org088ae012011-11-11 01:26:23 +09001250 FindTraceEntries(trace_parsed_, "thread_name");
1251 EXPECT_EQ(1u, items.size());
1252 ASSERT_GT(items.size(), 0u);
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +09001253 const DictionaryValue* item = items[0];
joth@chromium.org088ae012011-11-11 01:26:23 +09001254 ASSERT_TRUE(item);
1255 int tid;
1256 EXPECT_TRUE(item->GetInteger("tid", &tid));
1257 EXPECT_EQ(PlatformThread::CurrentId(), static_cast<PlatformThreadId>(tid));
1258
1259 std::string expected_name = "cafe,pub, bar";
1260 std::string tmp;
1261 EXPECT_TRUE(item->GetString("args.name", &tmp));
1262 EXPECT_EQ(expected_name, tmp);
1263}
nduca@chromium.org6d048772011-08-10 00:16:25 +09001264
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001265// Test trace calls made after tracing singleton shut down.
1266//
1267// The singleton is destroyed by our base::AtExitManager, but there can be
1268// code still executing as the C++ static objects are destroyed. This test
1269// forces the singleton to destroy early, and intentinally makes trace calls
1270// afterwards.
1271TEST_F(TraceEventTestFixture, AtExit) {
1272 // Repeat this test a few times. Besides just showing robustness, it also
1273 // allows us to test that events at shutdown do not appear with valid events
1274 // recorded after the system is started again.
1275 for (int i = 0; i < 4; i++) {
1276 // Scope to contain the then destroy the TraceLog singleton.
1277 {
1278 base::ShadowingAtExitManager exit_manager_will_destroy_singletons;
1279
1280 // Setup TraceLog singleton inside this test's exit manager scope
1281 // so that it will be destroyed when this scope closes.
1282 ManualTestSetUp();
1283
1284 TRACE_EVENT_INSTANT0("all", "not recorded; system not enabled");
1285
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001286 BeginTrace();
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001287
1288 TRACE_EVENT_INSTANT0("all", "is recorded 1; system has been enabled");
1289 // Trace calls that will cache pointers to categories; they're valid here
1290 TraceCallsWithCachedCategoryPointersPointers(
1291 "is recorded 2; system has been enabled");
1292
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001293 EndTraceAndFlush();
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001294 } // scope to destroy singleton
1295 ASSERT_FALSE(TraceLog::GetInstance());
1296
1297 // Now that singleton is destroyed, check what trace events were recorded
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +09001298 const DictionaryValue* item = NULL;
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001299 ListValue& trace_parsed = trace_parsed_;
1300 EXPECT_FIND_("is recorded 1");
1301 EXPECT_FIND_("is recorded 2");
1302 EXPECT_NOT_FIND_("not recorded");
1303
1304 // Make additional trace event calls on the shutdown system. They should
1305 // all pass cleanly, but the data not be recorded. We'll verify that next
1306 // time around the loop (the only way to flush the trace buffers).
1307 TRACE_EVENT_BEGIN_ETW("not recorded; system shutdown", 0, NULL);
1308 TRACE_EVENT_END_ETW("not recorded; system shutdown", 0, NULL);
1309 TRACE_EVENT_INSTANT_ETW("not recorded; system shutdown", 0, NULL);
1310 TRACE_EVENT0("all", "not recorded; system shutdown");
1311 TRACE_EVENT_INSTANT0("all", "not recorded; system shutdown");
1312 TRACE_EVENT_BEGIN0("all", "not recorded; system shutdown");
1313 TRACE_EVENT_END0("all", "not recorded; system shutdown");
1314
1315 TRACE_EVENT0("new category 0!", "not recorded; system shutdown");
1316 TRACE_EVENT_INSTANT0("new category 1!", "not recorded; system shutdown");
1317 TRACE_EVENT_BEGIN0("new category 2!", "not recorded; system shutdown");
1318 TRACE_EVENT_END0("new category 3!", "not recorded; system shutdown");
1319
1320 // Cached categories should be safe to check, and still disable traces
1321 TraceCallsWithCachedCategoryPointersPointers(
1322 "not recorded; system shutdown");
1323 }
1324}
1325
joth@chromium.org113de992011-07-21 21:28:59 +09001326TEST_F(TraceEventTestFixture, NormallyNoDeepCopy) {
1327 // Test that the TRACE_EVENT macros do not deep-copy their string. If they
1328 // do so it may indicate a performance regression, but more-over it would
1329 // make the DEEP_COPY overloads redundant.
1330 ManualTestSetUp();
1331
1332 std::string name_string("event name");
1333
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001334 BeginTrace();
joth@chromium.org113de992011-07-21 21:28:59 +09001335 TRACE_EVENT_INSTANT0("category", name_string.c_str());
1336
1337 // Modify the string in place (a wholesale reassignment may leave the old
1338 // string intact on the heap).
1339 name_string[0] = '@';
1340
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001341 EndTraceAndFlush();
joth@chromium.org113de992011-07-21 21:28:59 +09001342
1343 EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name"));
1344 EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str()));
1345}
1346
1347TEST_F(TraceEventTestFixture, DeepCopy) {
1348 ManualTestSetUp();
1349
1350 static const char kOriginalName1[] = "name1";
1351 static const char kOriginalName2[] = "name2";
1352 static const char kOriginalName3[] = "name3";
1353 std::string name1(kOriginalName1);
1354 std::string name2(kOriginalName2);
1355 std::string name3(kOriginalName3);
1356 std::string arg1("arg1");
1357 std::string arg2("arg2");
1358 std::string val1("val1");
1359 std::string val2("val2");
1360
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001361 BeginTrace();
joth@chromium.org113de992011-07-21 21:28:59 +09001362 TRACE_EVENT_COPY_INSTANT0("category", name1.c_str());
1363 TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(),
1364 arg1.c_str(), 5);
1365 TRACE_EVENT_COPY_END2("category", name3.c_str(),
jbates@chromium.org1f18e462011-09-07 02:56:24 +09001366 arg1.c_str(), val1,
1367 arg2.c_str(), val2);
joth@chromium.org113de992011-07-21 21:28:59 +09001368
1369 // As per NormallyNoDeepCopy, modify the strings in place.
1370 name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@';
1371
jbates@chromium.org6f1b35c2012-09-01 09:52:15 +09001372 EndTraceAndFlush();
joth@chromium.org113de992011-07-21 21:28:59 +09001373
1374 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str()));
1375 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str()));
1376 EXPECT_FALSE(FindTraceEntry(trace_parsed_, name3.c_str()));
1377
vabr@chromium.orga8ca4fd2012-08-03 17:43:37 +09001378 const DictionaryValue* entry1 = FindTraceEntry(trace_parsed_, kOriginalName1);
1379 const DictionaryValue* entry2 = FindTraceEntry(trace_parsed_, kOriginalName2);
1380 const DictionaryValue* entry3 = FindTraceEntry(trace_parsed_, kOriginalName3);
joth@chromium.org113de992011-07-21 21:28:59 +09001381 ASSERT_TRUE(entry1);
1382 ASSERT_TRUE(entry2);
1383 ASSERT_TRUE(entry3);
1384
1385 int i;
1386 EXPECT_FALSE(entry2->GetInteger("args.@rg1", &i));
1387 EXPECT_TRUE(entry2->GetInteger("args.arg1", &i));
1388 EXPECT_EQ(5, i);
1389
1390 std::string s;
1391 EXPECT_TRUE(entry3->GetString("args.arg1", &s));
1392 EXPECT_EQ("val1", s);
1393 EXPECT_TRUE(entry3->GetString("args.arg2", &s));
1394 EXPECT_EQ("val2", s);
1395}
1396
jbates@chromium.org6a092d72011-10-25 01:34:08 +09001397// Test that TraceResultBuffer outputs the correct result whether it is added
1398// in chunks or added all at once.
1399TEST_F(TraceEventTestFixture, TraceResultBuffer) {
1400 ManualTestSetUp();
1401
1402 Clear();
1403
1404 trace_buffer_.Start();
1405 trace_buffer_.AddFragment("bla1");
1406 trace_buffer_.AddFragment("bla2");
1407 trace_buffer_.AddFragment("bla3,bla4");
1408 trace_buffer_.Finish();
1409 EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]");
1410
1411 Clear();
1412
1413 trace_buffer_.Start();
1414 trace_buffer_.AddFragment("bla1,bla2,bla3,bla4");
1415 trace_buffer_.Finish();
1416 EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]");
1417}
1418
dsinclair@chromium.org1cde1592013-01-15 01:53:06 +09001419// Test that trace_event parameters are not evaluated if the tracing
1420// system is disabled.
1421TEST_F(TraceEventTestFixture, TracingIsLazy) {
1422 ManualTestSetUp();
1423 BeginTrace();
1424
1425 int a = 0;
1426 TRACE_EVENT_INSTANT1("category", "test", "a", a++);
1427 EXPECT_EQ(1, a);
1428
1429 TraceLog::GetInstance()->SetDisabled();
1430
1431 TRACE_EVENT_INSTANT1("category", "test", "a", a++);
1432 EXPECT_EQ(1, a);
1433
1434 EndTraceAndFlush();
1435}
1436
caseq@google.comedcf6262013-01-16 20:41:57 +09001437TEST_F(TraceEventTestFixture, TraceEnableDisable) {
1438 ManualTestSetUp();
1439
1440 TraceLog* trace_log = TraceLog::GetInstance();
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001441 trace_log->SetEnabled(std::string(), TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001442 EXPECT_TRUE(trace_log->IsEnabled());
1443 trace_log->SetDisabled();
1444 EXPECT_FALSE(trace_log->IsEnabled());
1445
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001446 trace_log->SetEnabled(true, TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001447 EXPECT_TRUE(trace_log->IsEnabled());
1448 const std::vector<std::string> empty;
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001449 trace_log->SetEnabled(empty, empty, TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001450 EXPECT_TRUE(trace_log->IsEnabled());
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001451 trace_log->SetEnabled(false, TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001452 EXPECT_TRUE(trace_log->IsEnabled());
1453 trace_log->SetDisabled();
1454 EXPECT_FALSE(trace_log->IsEnabled());
1455}
1456
1457TEST_F(TraceEventTestFixture, TraceCategoriesAfterNestedEnable) {
1458 ManualTestSetUp();
1459
1460 TraceLog* trace_log = TraceLog::GetInstance();
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001461 trace_log->SetEnabled(std::string("foo,bar"), TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001462 EXPECT_TRUE(*trace_log->GetCategoryEnabled("foo"));
1463 EXPECT_TRUE(*trace_log->GetCategoryEnabled("bar"));
1464 EXPECT_FALSE(*trace_log->GetCategoryEnabled("baz"));
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001465 trace_log->SetEnabled(std::string("foo2"), TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001466 EXPECT_TRUE(*trace_log->GetCategoryEnabled("foo2"));
1467 EXPECT_FALSE(*trace_log->GetCategoryEnabled("baz"));
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001468 trace_log->SetEnabled(std::string(""), TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001469 EXPECT_TRUE(*trace_log->GetCategoryEnabled("foo"));
1470 EXPECT_TRUE(*trace_log->GetCategoryEnabled("baz"));
1471 trace_log->SetDisabled();
1472 trace_log->SetDisabled();
1473 trace_log->SetDisabled();
1474 EXPECT_FALSE(*trace_log->GetCategoryEnabled("foo"));
1475 EXPECT_FALSE(*trace_log->GetCategoryEnabled("baz"));
1476
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001477 trace_log->SetEnabled(std::string("-foo,-bar"), TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001478 EXPECT_FALSE(*trace_log->GetCategoryEnabled("foo"));
1479 EXPECT_TRUE(*trace_log->GetCategoryEnabled("baz"));
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001480 trace_log->SetEnabled(std::string("moo"), TraceLog::RECORD_UNTIL_FULL);
caseq@google.comedcf6262013-01-16 20:41:57 +09001481 EXPECT_TRUE(*trace_log->GetCategoryEnabled("baz"));
1482 EXPECT_TRUE(*trace_log->GetCategoryEnabled("moo"));
1483 EXPECT_TRUE(*trace_log->GetCategoryEnabled("foo"));
1484 trace_log->SetDisabled();
1485 trace_log->SetDisabled();
1486}
1487
dsinclair@chromium.orga7fb8d62013-02-23 11:09:53 +09001488TEST_F(TraceEventTestFixture, TraceOptionsParsing) {
1489 ManualTestSetUp();
1490
1491 EXPECT_EQ(TraceLog::RECORD_UNTIL_FULL, TraceLog::TraceOptionsFromString(""));
1492
1493 EXPECT_EQ(TraceLog::RECORD_UNTIL_FULL,
1494 TraceLog::TraceOptionsFromString("record-until-full"));
1495}
1496
scottmg@chromium.orgcdd292f2013-02-26 10:39:52 +09001497TEST_F(TraceEventTestFixture, TraceSampling) {
1498 ManualTestSetUp();
1499
1500 event_watch_notification_ = 0;
1501 TraceLog::GetInstance()->SetEnabled(
1502 std::string("*"),
1503 TraceLog::Options(TraceLog::RECORD_UNTIL_FULL |
1504 TraceLog::ENABLE_SAMPLING));
1505
1506 WaitableEvent* sampled = new WaitableEvent(false, false);
1507 TraceLog::GetInstance()->InstallWaitableEventForSamplingTesting(sampled);
1508
1509 TRACE_EVENT_SAMPLE_STATE(1, "cc", "Stuff");
1510 sampled->Wait();
1511 TRACE_EVENT_SAMPLE_STATE(1, "cc", "Things");
1512 sampled->Wait();
1513
1514 EndTraceAndFlush();
1515
1516 // Make sure we hit at least once.
1517 EXPECT_TRUE(FindNamePhase("Stuff", "P"));
1518 EXPECT_TRUE(FindNamePhase("Things", "P"));
1519}
1520
scheib@chromium.org603f46e2011-05-10 11:23:58 +09001521} // namespace debug
1522} // namespace base