Index: components/scheduler/base/task_queue_manager_unittest.cc |
diff --git a/components/scheduler/base/task_queue_manager_unittest.cc b/components/scheduler/base/task_queue_manager_unittest.cc |
index 161b02b06e8e69c9b3ce0d46a96f6c86d3ba81fc..cc4e268423616df06c411e6914269337f85b1de7 100644 |
--- a/components/scheduler/base/task_queue_manager_unittest.cc |
+++ b/components/scheduler/base/task_queue_manager_unittest.cc |
@@ -8,10 +8,14 @@ |
#include <utility> |
#include "base/location.h" |
+#include "base/memory/ref_counted_memory.h" |
#include "base/run_loop.h" |
#include "base/single_thread_task_runner.h" |
#include "base/test/simple_test_tick_clock.h" |
+#include "base/test/trace_event_analyzer.h" |
#include "base/threading/thread.h" |
+#include "base/trace_event/blame_context.h" |
+#include "base/trace_event/trace_buffer.h" |
#include "cc/test/ordered_simple_task_runner.h" |
#include "components/scheduler/base/real_time_domain.h" |
#include "components/scheduler/base/task_queue_impl.h" |
@@ -1842,4 +1846,73 @@ TEST_F(TaskQueueManagerTest, CurrentlyExecutingTaskQueue_NestedLoop) { |
EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
} |
+void OnTraceDataCollected(base::Closure quit_closure, |
+ base::trace_event::TraceResultBuffer* buffer, |
+ const scoped_refptr<base::RefCountedString>& json, |
+ bool has_more_events) { |
+ buffer->AddFragment(json->data()); |
+ if (!has_more_events) |
+ quit_closure.Run(); |
+} |
+ |
+class TaskQueueManagerTestWithTracing : public TaskQueueManagerTest { |
+ public: |
+ void StartTracing(); |
+ void StopTracing(); |
+ scoped_ptr<trace_analyzer::TraceAnalyzer> CreateTraceAnalyzer(); |
+}; |
+ |
+void TaskQueueManagerTestWithTracing::StartTracing() { |
+ base::trace_event::TraceLog::GetInstance()->SetEnabled( |
+ base::trace_event::TraceConfig("*"), |
+ base::trace_event::TraceLog::RECORDING_MODE); |
+} |
+ |
+void TaskQueueManagerTestWithTracing::StopTracing() { |
+ base::trace_event::TraceLog::GetInstance()->SetDisabled(); |
+} |
+ |
+scoped_ptr<trace_analyzer::TraceAnalyzer> |
+TaskQueueManagerTestWithTracing::CreateTraceAnalyzer() { |
+ base::trace_event::TraceResultBuffer buffer; |
+ base::trace_event::TraceResultBuffer::SimpleOutput trace_output; |
+ buffer.SetOutputCallback(trace_output.GetCallback()); |
+ base::RunLoop run_loop; |
+ buffer.Start(); |
+ base::trace_event::TraceLog::GetInstance()->Flush( |
+ Bind(&OnTraceDataCollected, run_loop.QuitClosure(), |
+ base::Unretained(&buffer))); |
+ run_loop.Run(); |
+ buffer.Finish(); |
+ |
+ return make_scoped_ptr( |
+ trace_analyzer::TraceAnalyzer::Create(trace_output.json_output)); |
+} |
+ |
+TEST_F(TaskQueueManagerTestWithTracing, BlameContextAttribution) { |
+ using trace_analyzer::Query; |
+ |
+ Initialize(1u); |
+ TaskQueue* queue = runners_[0].get(); |
+ |
+ StartTracing(); |
+ { |
+ base::trace_event::BlameContext blame_context("cat", "name", "type", |
+ "scope", 0, nullptr); |
+ blame_context.Initialize(); |
+ queue->SetBlameContext(&blame_context); |
+ queue->PostTask(FROM_HERE, base::Bind(&NopTask)); |
+ test_task_runner_->RunUntilIdle(); |
+ } |
+ StopTracing(); |
+ scoped_ptr<trace_analyzer::TraceAnalyzer> analyzer = CreateTraceAnalyzer(); |
+ |
+ trace_analyzer::TraceEventVector events; |
+ Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || |
+ Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); |
+ analyzer->FindEvents(q, &events); |
+ |
+ EXPECT_EQ(2u, events.size()); |
+} |
+ |
} // namespace scheduler |