| 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) {
|
|
|