Index: base/debug/trace_event_unittest.cc |
diff --git a/base/debug/trace_event_unittest.cc b/base/debug/trace_event_unittest.cc |
index a7e6293f76baf633f4aced8e1bec0044592c8132..4aca18088dfa9ab3d1c310a253919fa4e08b90ff 100644 |
--- a/base/debug/trace_event_unittest.cc |
+++ b/base/debug/trace_event_unittest.cc |
@@ -104,8 +104,7 @@ class TraceEventTestFixture : public testing::Test { |
} |
void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) { |
- while (TraceLog::GetInstance()->IsEnabled()) |
- TraceLog::GetInstance()->SetDisabled(); |
+ TraceLog::GetInstance()->SetDisabled(); |
TraceLog::GetInstance()->Flush( |
base::Bind(&TraceEventTestFixture::OnTraceDataCollected, |
base::Unretained(static_cast<TraceEventTestFixture*>(this)), |
@@ -915,7 +914,7 @@ TEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnSecondEnable) { |
TraceLog::GetInstance()->SetDisabled(); |
} |
-TEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnNestedDisable) { |
+TEST_F(TraceEventTestFixture, EnabledObserverFiresOnFirstDisable) { |
CategoryFilter cf_inc_all("*"); |
TraceLog::GetInstance()->SetEnabled(cf_inc_all, TraceLog::RECORD_UNTIL_FULL); |
TraceLog::GetInstance()->SetEnabled(cf_inc_all, TraceLog::RECORD_UNTIL_FULL); |
@@ -926,7 +925,7 @@ TEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnNestedDisable) { |
EXPECT_CALL(observer, OnTraceLogEnabled()) |
.Times(0); |
EXPECT_CALL(observer, OnTraceLogDisabled()) |
- .Times(0); |
+ .Times(1); |
TraceLog::GetInstance()->SetDisabled(); |
testing::Mock::VerifyAndClear(&observer); |
@@ -1681,7 +1680,7 @@ TEST_F(TraceEventTestFixture, TraceEnableDisable) { |
trace_log->SetEnabled(CategoryFilter(""), TraceLog::RECORD_UNTIL_FULL); |
EXPECT_TRUE(trace_log->IsEnabled()); |
trace_log->SetDisabled(); |
- EXPECT_TRUE(trace_log->IsEnabled()); |
+ EXPECT_FALSE(trace_log->IsEnabled()); |
trace_log->SetDisabled(); |
EXPECT_FALSE(trace_log->IsEnabled()); |
} |
@@ -1977,22 +1976,49 @@ class TraceEventCallbackTest : public TraceEventTestFixture { |
s_instance = this; |
} |
virtual void TearDown() OVERRIDE { |
- while (TraceLog::GetInstance()->IsEnabled()) |
- TraceLog::GetInstance()->SetDisabled(); |
+ TraceLog::GetInstance()->SetDisabled(); |
ASSERT_TRUE(!!s_instance); |
s_instance = NULL; |
TraceEventTestFixture::TearDown(); |
} |
protected: |
- std::vector<std::string> collected_events_; |
- std::vector<unsigned char> collected_event_phases_; |
+ // For TraceEventCallbackAndRecordingX tests. |
+ void VerifyCallbackAndRecordedEvents(size_t expected_callback_count, |
+ size_t expected_recorded_count) { |
+ // Callback events. |
+ EXPECT_EQ(expected_callback_count, collected_events_names_.size()); |
+ for (size_t i = 0; i < collected_events_names_.size(); ++i) { |
+ EXPECT_EQ("callback", collected_events_categories_[i]); |
+ EXPECT_EQ("yes", collected_events_names_[i]); |
+ } |
+ |
+ // Recorded events. |
+ EXPECT_EQ(expected_recorded_count, trace_parsed_.GetSize()); |
+ EXPECT_TRUE(FindTraceEntry(trace_parsed_, "recording")); |
+ EXPECT_FALSE(FindTraceEntry(trace_parsed_, "callback")); |
+ EXPECT_TRUE(FindTraceEntry(trace_parsed_, "yes")); |
+ EXPECT_FALSE(FindTraceEntry(trace_parsed_, "no")); |
+ } |
+ |
+ void VerifyCollectedEvent(size_t i, |
+ unsigned phase, |
+ const std::string& category, |
+ const std::string& name) { |
+ EXPECT_EQ(phase, collected_events_phases_[i]); |
+ EXPECT_EQ(category, collected_events_categories_[i]); |
+ EXPECT_EQ(name, collected_events_names_[i]); |
+ } |
+ |
+ std::vector<std::string> collected_events_categories_; |
+ std::vector<std::string> collected_events_names_; |
+ std::vector<unsigned char> collected_events_phases_; |
std::vector<TimeTicks> collected_events_timestamps_; |
static TraceEventCallbackTest* s_instance; |
static void Callback(TimeTicks timestamp, |
char phase, |
- const unsigned char* category_enabled, |
+ const unsigned char* category_group_enabled, |
const char* name, |
unsigned long long id, |
int num_args, |
@@ -2000,8 +2026,10 @@ class TraceEventCallbackTest : public TraceEventTestFixture { |
const unsigned char arg_types[], |
const unsigned long long arg_values[], |
unsigned char flags) { |
- s_instance->collected_events_.push_back(name); |
- s_instance->collected_event_phases_.push_back(phase); |
+ s_instance->collected_events_phases_.push_back(phase); |
+ s_instance->collected_events_categories_.push_back( |
+ TraceLog::GetCategoryGroupName(category_group_enabled)); |
+ s_instance->collected_events_names_.push_back(name); |
s_instance->collected_events_timestamps_.push_back(timestamp); |
} |
}; |
@@ -2010,30 +2038,28 @@ TraceEventCallbackTest* TraceEventCallbackTest::s_instance; |
TEST_F(TraceEventCallbackTest, TraceEventCallback) { |
TRACE_EVENT_INSTANT0("all", "before enable", TRACE_EVENT_SCOPE_THREAD); |
- TraceLog::GetInstance()->SetEnabled(CategoryFilter("*"), |
- TraceLog::RECORD_UNTIL_FULL); |
- TRACE_EVENT_INSTANT0("all", "before callback set", TRACE_EVENT_SCOPE_THREAD); |
- TraceLog::GetInstance()->SetEventCallback(Callback); |
+ TraceLog::GetInstance()->SetEventCallbackEnabled( |
+ CategoryFilter("*"), Callback); |
TRACE_EVENT_INSTANT0("all", "event1", TRACE_EVENT_SCOPE_GLOBAL); |
TRACE_EVENT_INSTANT0("all", "event2", TRACE_EVENT_SCOPE_GLOBAL); |
{ |
TRACE_EVENT0("all", "duration"); |
TRACE_EVENT_INSTANT0("all", "event3", TRACE_EVENT_SCOPE_GLOBAL); |
} |
- TraceLog::GetInstance()->SetEventCallback(NULL); |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
TRACE_EVENT_INSTANT0("all", "after callback removed", |
TRACE_EVENT_SCOPE_GLOBAL); |
- ASSERT_EQ(5u, collected_events_.size()); |
- EXPECT_EQ("event1", collected_events_[0]); |
- EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_event_phases_[0]); |
- EXPECT_EQ("event2", collected_events_[1]); |
- EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_event_phases_[1]); |
- EXPECT_EQ("duration", collected_events_[2]); |
- EXPECT_EQ(TRACE_EVENT_PHASE_BEGIN, collected_event_phases_[2]); |
- EXPECT_EQ("event3", collected_events_[3]); |
- EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_event_phases_[3]); |
- EXPECT_EQ("duration", collected_events_[4]); |
- EXPECT_EQ(TRACE_EVENT_PHASE_END, collected_event_phases_[4]); |
+ ASSERT_EQ(5u, collected_events_names_.size()); |
+ EXPECT_EQ("event1", collected_events_names_[0]); |
+ EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[0]); |
+ EXPECT_EQ("event2", collected_events_names_[1]); |
+ EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[1]); |
+ EXPECT_EQ("duration", collected_events_names_[2]); |
+ EXPECT_EQ(TRACE_EVENT_PHASE_BEGIN, collected_events_phases_[2]); |
+ EXPECT_EQ("event3", collected_events_names_[3]); |
+ EXPECT_EQ(TRACE_EVENT_PHASE_INSTANT, collected_events_phases_[3]); |
+ EXPECT_EQ("duration", collected_events_names_[4]); |
+ EXPECT_EQ(TRACE_EVENT_PHASE_END, collected_events_phases_[4]); |
for (size_t i = 1; i < collected_events_timestamps_.size(); i++) { |
EXPECT_LE(collected_events_timestamps_[i - 1], |
collected_events_timestamps_[i]); |
@@ -2046,11 +2072,122 @@ TEST_F(TraceEventCallbackTest, TraceEventCallbackWhileFull) { |
do { |
TRACE_EVENT_INSTANT0("all", "badger badger", TRACE_EVENT_SCOPE_GLOBAL); |
} while ((notifications_received_ & TraceLog::TRACE_BUFFER_FULL) == 0); |
- TraceLog::GetInstance()->SetEventCallback(Callback); |
+ TraceLog::GetInstance()->SetEventCallbackEnabled(CategoryFilter("*"), |
+ Callback); |
TRACE_EVENT_INSTANT0("all", "a snake", TRACE_EVENT_SCOPE_GLOBAL); |
- TraceLog::GetInstance()->SetEventCallback(NULL); |
- ASSERT_EQ(1u, collected_events_.size()); |
- EXPECT_EQ("a snake", collected_events_[0]); |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
+ ASSERT_EQ(1u, collected_events_names_.size()); |
+ EXPECT_EQ("a snake", collected_events_names_[0]); |
+} |
+ |
+// 1: Enable callback, enable recording, disable callback, disable recording. |
+TEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording1) { |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackEnabled(CategoryFilter("callback"), |
+ Callback); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEnabled( |
+ CategoryFilter("recording"), TraceLog::RECORD_UNTIL_FULL); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ EndTraceAndFlush(); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ |
+ VerifyCallbackAndRecordedEvents(2, 2); |
+} |
+ |
+// 2: Enable callback, enable recording, disable recording, disable callback. |
+TEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording2) { |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackEnabled(CategoryFilter("callback"), |
+ Callback); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEnabled( |
+ CategoryFilter("recording"), TraceLog::RECORD_UNTIL_FULL); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ EndTraceAndFlush(); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ |
+ VerifyCallbackAndRecordedEvents(3, 1); |
+} |
+ |
+// 3: Enable recording, enable callback, disable callback, disable recording. |
+TEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording3) { |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEnabled( |
+ CategoryFilter("recording"), TraceLog::RECORD_UNTIL_FULL); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackEnabled(CategoryFilter("callback"), |
+ Callback); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ EndTraceAndFlush(); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ |
+ VerifyCallbackAndRecordedEvents(1, 3); |
+} |
+ |
+// 4: Enable recording, enable callback, disable recording, disable callback. |
+TEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecording4) { |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEnabled( |
+ CategoryFilter("recording"), TraceLog::RECORD_UNTIL_FULL); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackEnabled(CategoryFilter("callback"), |
+ Callback); |
+ TRACE_EVENT_INSTANT0("recording", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ EndTraceAndFlush(); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "yes", TRACE_EVENT_SCOPE_GLOBAL); |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
+ TRACE_EVENT_INSTANT0("recording", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ TRACE_EVENT_INSTANT0("callback", "no", TRACE_EVENT_SCOPE_GLOBAL); |
+ |
+ VerifyCallbackAndRecordedEvents(2, 2); |
+} |
+ |
+TEST_F(TraceEventCallbackTest, TraceEventCallbackAndRecordingDuration) { |
+ TraceLog::GetInstance()->SetEventCallbackEnabled(CategoryFilter("*"), |
+ Callback); |
+ { |
+ TRACE_EVENT0("callback", "duration1"); |
+ TraceLog::GetInstance()->SetEnabled( |
+ CategoryFilter("*"), TraceLog::RECORD_UNTIL_FULL); |
+ TRACE_EVENT0("callback", "duration2"); |
+ EndTraceAndFlush(); |
+ TRACE_EVENT0("callback", "duration3"); |
+ } |
+ TraceLog::GetInstance()->SetEventCallbackDisabled(); |
+ |
+ ASSERT_EQ(6u, collected_events_names_.size()); |
+ VerifyCollectedEvent(0, TRACE_EVENT_PHASE_BEGIN, "callback", "duration1"); |
+ VerifyCollectedEvent(1, TRACE_EVENT_PHASE_BEGIN, "callback", "duration2"); |
+ VerifyCollectedEvent(2, TRACE_EVENT_PHASE_BEGIN, "callback", "duration3"); |
+ VerifyCollectedEvent(3, TRACE_EVENT_PHASE_END, "callback", "duration3"); |
+ VerifyCollectedEvent(4, TRACE_EVENT_PHASE_END, "callback", "duration2"); |
+ VerifyCollectedEvent(5, TRACE_EVENT_PHASE_END, "callback", "duration1"); |
} |
TEST_F(TraceEventTestFixture, TraceBufferRingBufferGetReturnChunk) { |