| Index: base/debug/trace_event_unittest.cc
|
| diff --git a/base/debug/trace_event_unittest.cc b/base/debug/trace_event_unittest.cc
|
| index f806cf1928e870dd1ba637f3cb14ba05e13cb160..1f358fb6e72fc9ce9f0ce5d149431c14e557d63c 100644
|
| --- a/base/debug/trace_event_unittest.cc
|
| +++ b/base/debug/trace_event_unittest.cc
|
| @@ -46,6 +46,10 @@ class TraceEventTestFixture : public testing::Test {
|
| void ManualTestSetUp();
|
| void OnTraceDataCollected(
|
| const scoped_refptr<base::RefCountedString>& events_str);
|
| + void OnTraceNotification(int notification) {
|
| + if (notification & TraceLog::EVENT_WATCH_NOTIFICATION)
|
| + ++event_watch_notification_;
|
| + }
|
| DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values);
|
| DictionaryValue* FindNamePhase(const char* name, const char* phase);
|
| DictionaryValue* FindNamePhaseKeyValue(const char* name,
|
| @@ -61,6 +65,18 @@ class TraceEventTestFixture : public testing::Test {
|
| json_output_.json_output.clear();
|
| }
|
|
|
| + void BeginTrace() {
|
| + event_watch_notification_ = 0;
|
| + TraceLog::GetInstance()->SetEnabled("*");
|
| + }
|
| +
|
| + void EndTraceAndFlush() {
|
| + TraceLog::GetInstance()->SetDisabled();
|
| + TraceLog::GetInstance()->Flush(
|
| + base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| virtual void SetUp() OVERRIDE {
|
| old_thread_name_ = PlatformThread::GetName();
|
| }
|
| @@ -74,6 +90,7 @@ class TraceEventTestFixture : public testing::Test {
|
| ListValue trace_parsed_;
|
| base::debug::TraceResultBuffer trace_buffer_;
|
| base::debug::TraceResultBuffer::SimpleOutput json_output_;
|
| + int event_watch_notification_;
|
|
|
| private:
|
| // We want our singleton torn down after each test.
|
| @@ -87,8 +104,8 @@ void TraceEventTestFixture::ManualTestSetUp() {
|
| TraceLog* tracelog = TraceLog::GetInstance();
|
| ASSERT_TRUE(tracelog);
|
| ASSERT_FALSE(tracelog->IsEnabled());
|
| - tracelog->SetOutputCallback(
|
| - base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
|
| + tracelog->SetNotificationCallback(
|
| + base::Bind(&TraceEventTestFixture::OnTraceNotification,
|
| base::Unretained(this)));
|
| trace_buffer_.SetOutputCallback(json_output_.GetCallback());
|
| }
|
| @@ -650,7 +667,7 @@ TEST_F(TraceEventTestFixture, DataCaptured) {
|
|
|
| TraceWithAllMacroVariants(NULL);
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| ValidateAllTraceMacrosCreatedData(trace_parsed_);
|
| }
|
| @@ -741,10 +758,10 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| // enabled or disabled when the trace event was encountered.
|
| TRACE_EVENT_INSTANT0("c1", "name");
|
| TRACE_EVENT_INSTANT0("c2", "name");
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
| TRACE_EVENT_INSTANT0("c3", "name");
|
| TRACE_EVENT_INSTANT0("c4", "name");
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
| std::vector<std::string> cats;
|
| TraceLog::GetInstance()->GetKnownCategories(&cats);
|
| EXPECT_TRUE(std::find(cats.begin(), cats.end(), "c1") != cats.end());
|
| @@ -765,7 +782,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories);
|
| TRACE_EVENT_INSTANT0("cat1", "name");
|
| TRACE_EVENT_INSTANT0("cat2", "name");
|
| - TraceLog::GetInstance()->SetDisabled();
|
| + EndTraceAndFlush();
|
| EXPECT_TRUE(trace_parsed_.empty());
|
|
|
| // Include existent category -> only events of that category
|
| @@ -775,7 +792,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| TraceLog::GetInstance()->SetEnabled(included_categories, empty_categories);
|
| TRACE_EVENT_INSTANT0("inc", "name");
|
| TRACE_EVENT_INSTANT0("inc2", "name");
|
| - TraceLog::GetInstance()->SetDisabled();
|
| + EndTraceAndFlush();
|
| EXPECT_TRUE(FindMatchingValue("cat", "inc"));
|
| EXPECT_FALSE(FindNonMatchingValue("cat", "inc"));
|
|
|
| @@ -791,7 +808,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc");
|
| TRACE_EVENT_INSTANT0("cat1", "not_inc");
|
| TRACE_EVENT_INSTANT0("cat2", "not_inc");
|
| - TraceLog::GetInstance()->SetDisabled();
|
| + EndTraceAndFlush();
|
| EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc"));
|
| EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_"));
|
| EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end"));
|
| @@ -806,7 +823,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories);
|
| TRACE_EVENT_INSTANT0("cat1", "name");
|
| TRACE_EVENT_INSTANT0("cat2", "name");
|
| - TraceLog::GetInstance()->SetDisabled();
|
| + EndTraceAndFlush();
|
| EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
|
| EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
|
|
|
| @@ -817,7 +834,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| TraceLog::GetInstance()->SetEnabled(empty_categories, excluded_categories);
|
| TRACE_EVENT_INSTANT0("inc", "name");
|
| TRACE_EVENT_INSTANT0("inc2", "name");
|
| - TraceLog::GetInstance()->SetDisabled();
|
| + EndTraceAndFlush();
|
| EXPECT_TRUE(FindMatchingValue("cat", "inc2"));
|
| EXPECT_FALSE(FindMatchingValue("cat", "inc"));
|
|
|
| @@ -833,7 +850,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included");
|
| TRACE_EVENT_INSTANT0("cat1", "included");
|
| TRACE_EVENT_INSTANT0("cat2", "included");
|
| - TraceLog::GetInstance()->SetDisabled();
|
| + EndTraceAndFlush();
|
| EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end"));
|
| EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
|
| EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
|
| @@ -843,7 +860,7 @@ TEST_F(TraceEventTestFixture, Categories) {
|
| // Simple Test for time threshold events.
|
| TEST_F(TraceEventTestFixture, DataCapturedThreshold) {
|
| ManualTestSetUp();
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| // Test that events at the same level are properly filtered by threshold.
|
| {
|
| @@ -910,7 +927,7 @@ TEST_F(TraceEventTestFixture, DataCapturedThreshold) {
|
| }
|
| }
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| #define EXPECT_FIND_BE_(str) \
|
| EXPECT_TRUE(FindNamePhase(str, "B")); \
|
| @@ -943,10 +960,69 @@ TEST_F(TraceEventTestFixture, DataCapturedThreshold) {
|
| EXPECT_NOT_FIND_BE_("4thresholdlong2");
|
| }
|
|
|
| +// Test EVENT_WATCH_NOTIFICATION
|
| +TEST_F(TraceEventTestFixture, EventWatchNotification) {
|
| + ManualTestSetUp();
|
| +
|
| + // Basic one occurrence.
|
| + BeginTrace();
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + TRACE_EVENT_INSTANT0("cat", "event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, 1);
|
| +
|
| + // Basic one occurrence before Set.
|
| + BeginTrace();
|
| + TRACE_EVENT_INSTANT0("cat", "event");
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, 1);
|
| +
|
| + // Auto-reset after end trace.
|
| + BeginTrace();
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + EndTraceAndFlush();
|
| + BeginTrace();
|
| + TRACE_EVENT_INSTANT0("cat", "event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, 0);
|
| +
|
| + // Multiple occurrence.
|
| + BeginTrace();
|
| + int num_occurrences = 5;
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + for (int i = 0; i < num_occurrences; ++i)
|
| + TRACE_EVENT_INSTANT0("cat", "event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, num_occurrences);
|
| +
|
| + // Wrong category.
|
| + BeginTrace();
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + TRACE_EVENT_INSTANT0("wrong_cat", "event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, 0);
|
| +
|
| + // Wrong name.
|
| + BeginTrace();
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + TRACE_EVENT_INSTANT0("cat", "wrong_event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, 0);
|
| +
|
| + // Canceled.
|
| + BeginTrace();
|
| + TraceLog::GetInstance()->SetWatchEvent("cat", "event");
|
| + TraceLog::GetInstance()->CancelWatchEvent();
|
| + TRACE_EVENT_INSTANT0("cat", "event");
|
| + EndTraceAndFlush();
|
| + EXPECT_EQ(event_watch_notification_, 0);
|
| +}
|
| +
|
| // Test ASYNC_BEGIN/END events
|
| TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) {
|
| ManualTestSetUp();
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| unsigned long long id = 0xfeedbeeffeedbeefull;
|
| TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", id);
|
| @@ -955,7 +1031,7 @@ TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) {
|
| TRACE_EVENT_BEGIN0( "cat", "name2");
|
| TRACE_EVENT_ASYNC_BEGIN0( "cat", "name3", 0);
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| EXPECT_TRUE(FindNamePhase("name1", "S"));
|
| EXPECT_TRUE(FindNamePhase("name1", "T"));
|
| @@ -980,15 +1056,15 @@ TEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) {
|
| void* ptr = this;
|
|
|
| TraceLog::GetInstance()->SetProcessID(100);
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
| TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", ptr);
|
| TRACE_EVENT_ASYNC_BEGIN0( "cat", "name2", ptr);
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| TraceLog::GetInstance()->SetProcessID(200);
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
| TRACE_EVENT_ASYNC_END0( "cat", "name1", ptr);
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| DictionaryValue* async_begin = FindNamePhase("name1", "S");
|
| DictionaryValue* async_begin2 = FindNamePhase("name2", "S");
|
| @@ -1017,11 +1093,11 @@ TEST_F(TraceEventTestFixture, StaticStringVsString) {
|
| ManualTestSetUp();
|
| TraceLog* tracer = TraceLog::GetInstance();
|
| // Make sure old events are flushed:
|
| - tracer->SetEnabled(false);
|
| + EndTraceAndFlush();
|
| EXPECT_EQ(0u, tracer->GetEventsSize());
|
|
|
| {
|
| - tracer->SetEnabled(true);
|
| + BeginTrace();
|
| // Test that string arguments are copied.
|
| TRACE_EVENT2("cat", "name1",
|
| "arg1", std::string("argval"), "arg2", std::string("argval"));
|
| @@ -1039,11 +1115,11 @@ TEST_F(TraceEventTestFixture, StaticStringVsString) {
|
| EXPECT_TRUE(event2.parameter_copy_storage() != NULL);
|
| EXPECT_GT(event1.parameter_copy_storage()->size(), 0u);
|
| EXPECT_GT(event2.parameter_copy_storage()->size(), 0u);
|
| - tracer->SetEnabled(false);
|
| + EndTraceAndFlush();
|
| }
|
|
|
| {
|
| - tracer->SetEnabled(true);
|
| + BeginTrace();
|
| // Test that static literal string arguments are not copied.
|
| TRACE_EVENT2("cat", "name1",
|
| "arg1", "argval", "arg2", "argval");
|
| @@ -1061,14 +1137,14 @@ TEST_F(TraceEventTestFixture, StaticStringVsString) {
|
| EXPECT_STREQ("name2", event2.name());
|
| EXPECT_TRUE(event1.parameter_copy_storage() == NULL);
|
| EXPECT_TRUE(event2.parameter_copy_storage() == NULL);
|
| - tracer->SetEnabled(false);
|
| + EndTraceAndFlush();
|
| }
|
| }
|
|
|
| // Test that data sent from other threads is gathered
|
| TEST_F(TraceEventTestFixture, DataCapturedOnThread) {
|
| ManualTestSetUp();
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| Thread thread("1");
|
| WaitableEvent task_complete_event(false, false);
|
| @@ -1079,14 +1155,14 @@ TEST_F(TraceEventTestFixture, DataCapturedOnThread) {
|
| task_complete_event.Wait();
|
| thread.Stop();
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
| ValidateAllTraceMacrosCreatedData(trace_parsed_);
|
| }
|
|
|
| // Test that data sent from multiple threads is gathered
|
| TEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
|
| ManualTestSetUp();
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| const int num_threads = 4;
|
| const int num_events = 4000;
|
| @@ -1111,7 +1187,7 @@ TEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
|
| delete task_complete_events[i];
|
| }
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| ValidateInstantEventPresentOnEveryThread(trace_parsed_,
|
| num_threads, num_events);
|
| @@ -1131,7 +1207,7 @@ TEST_F(TraceEventTestFixture, ThreadNames) {
|
| threads[i] = new Thread(StringPrintf("Thread %d", i).c_str());
|
|
|
| // Enable tracing.
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| // Now run some trace code on these threads.
|
| WaitableEvent* task_complete_events[num_threads];
|
| @@ -1154,7 +1230,7 @@ TEST_F(TraceEventTestFixture, ThreadNames) {
|
| delete task_complete_events[i];
|
| }
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| std::string tmp;
|
| int tmp_int;
|
| @@ -1190,7 +1266,7 @@ TEST_F(TraceEventTestFixture, ThreadNames) {
|
| TEST_F(TraceEventTestFixture, ThreadNameChanges) {
|
| ManualTestSetUp();
|
|
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| PlatformThread::SetName("");
|
| TRACE_EVENT_INSTANT0("drink", "water");
|
| @@ -1208,7 +1284,7 @@ TEST_F(TraceEventTestFixture, ThreadNameChanges) {
|
| PlatformThread::SetName(" bar");
|
| TRACE_EVENT_INSTANT0("drink", "whisky");
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| std::vector<const DictionaryValue*> items =
|
| FindTraceEntries(trace_parsed_, "thread_name");
|
| @@ -1247,14 +1323,14 @@ TEST_F(TraceEventTestFixture, AtExit) {
|
|
|
| TRACE_EVENT_INSTANT0("all", "not recorded; system not enabled");
|
|
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
|
|
| TRACE_EVENT_INSTANT0("all", "is recorded 1; system has been enabled");
|
| // Trace calls that will cache pointers to categories; they're valid here
|
| TraceCallsWithCachedCategoryPointersPointers(
|
| "is recorded 2; system has been enabled");
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
| } // scope to destroy singleton
|
| ASSERT_FALSE(TraceLog::GetInstance());
|
|
|
| @@ -1295,14 +1371,14 @@ TEST_F(TraceEventTestFixture, NormallyNoDeepCopy) {
|
|
|
| std::string name_string("event name");
|
|
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
| TRACE_EVENT_INSTANT0("category", name_string.c_str());
|
|
|
| // Modify the string in place (a wholesale reassignment may leave the old
|
| // string intact on the heap).
|
| name_string[0] = '@';
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name"));
|
| EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str()));
|
| @@ -1322,7 +1398,7 @@ TEST_F(TraceEventTestFixture, DeepCopy) {
|
| std::string val1("val1");
|
| std::string val2("val2");
|
|
|
| - TraceLog::GetInstance()->SetEnabled(true);
|
| + BeginTrace();
|
| TRACE_EVENT_COPY_INSTANT0("category", name1.c_str());
|
| TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(),
|
| arg1.c_str(), 5);
|
| @@ -1333,7 +1409,7 @@ TEST_F(TraceEventTestFixture, DeepCopy) {
|
| // As per NormallyNoDeepCopy, modify the strings in place.
|
| name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@';
|
|
|
| - TraceLog::GetInstance()->SetEnabled(false);
|
| + EndTraceAndFlush();
|
|
|
| EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str()));
|
| EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str()));
|
|
|