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