OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/scheduler/base/task_queue_manager.h" | 5 #include "components/scheduler/base/task_queue_manager.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/location.h" | 10 #include "base/location.h" |
| 11 #include "base/memory/ref_counted_memory.h" |
11 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
12 #include "base/single_thread_task_runner.h" | 13 #include "base/single_thread_task_runner.h" |
13 #include "base/test/simple_test_tick_clock.h" | 14 #include "base/test/simple_test_tick_clock.h" |
| 15 #include "base/test/trace_event_analyzer.h" |
14 #include "base/threading/thread.h" | 16 #include "base/threading/thread.h" |
| 17 #include "base/trace_event/blame_context.h" |
| 18 #include "base/trace_event/trace_buffer.h" |
15 #include "cc/test/ordered_simple_task_runner.h" | 19 #include "cc/test/ordered_simple_task_runner.h" |
16 #include "components/scheduler/base/real_time_domain.h" | 20 #include "components/scheduler/base/real_time_domain.h" |
17 #include "components/scheduler/base/task_queue_impl.h" | 21 #include "components/scheduler/base/task_queue_impl.h" |
18 #include "components/scheduler/base/task_queue_manager_delegate_for_test.h" | 22 #include "components/scheduler/base/task_queue_manager_delegate_for_test.h" |
19 #include "components/scheduler/base/task_queue_selector.h" | 23 #include "components/scheduler/base/task_queue_selector.h" |
20 #include "components/scheduler/base/test_always_fail_time_source.h" | 24 #include "components/scheduler/base/test_always_fail_time_source.h" |
21 #include "components/scheduler/base/test_time_source.h" | 25 #include "components/scheduler/base/test_time_source.h" |
22 #include "components/scheduler/base/virtual_time_domain.h" | 26 #include "components/scheduler/base/virtual_time_domain.h" |
23 #include "components/scheduler/base/work_queue.h" | 27 #include "components/scheduler/base/work_queue.h" |
24 #include "components/scheduler/base/work_queue_sets.h" | 28 #include "components/scheduler/base/work_queue_sets.h" |
(...skipping 1810 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1835 queue0->PostTask( | 1839 queue0->PostTask( |
1836 FROM_HERE, base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, | 1840 FROM_HERE, base::Bind(&RunloopCurrentlyExecutingTaskQueueTestTask, |
1837 message_loop_.get(), manager_.get(), &task_sources, | 1841 message_loop_.get(), manager_.get(), &task_sources, |
1838 &tasks_to_post_from_nested_loop)); | 1842 &tasks_to_post_from_nested_loop)); |
1839 | 1843 |
1840 message_loop_->RunUntilIdle(); | 1844 message_loop_->RunUntilIdle(); |
1841 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); | 1845 EXPECT_THAT(task_sources, ElementsAre(queue0, queue1, queue2, queue0)); |
1842 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); | 1846 EXPECT_EQ(nullptr, manager_->currently_executing_task_queue()); |
1843 } | 1847 } |
1844 | 1848 |
| 1849 void OnTraceDataCollected(base::Closure quit_closure, |
| 1850 base::trace_event::TraceResultBuffer* buffer, |
| 1851 const scoped_refptr<base::RefCountedString>& json, |
| 1852 bool has_more_events) { |
| 1853 buffer->AddFragment(json->data()); |
| 1854 if (!has_more_events) |
| 1855 quit_closure.Run(); |
| 1856 } |
| 1857 |
| 1858 class TaskQueueManagerTestWithTracing : public TaskQueueManagerTest { |
| 1859 public: |
| 1860 void StartTracing(); |
| 1861 void StopTracing(); |
| 1862 scoped_ptr<trace_analyzer::TraceAnalyzer> CreateTraceAnalyzer(); |
| 1863 }; |
| 1864 |
| 1865 void TaskQueueManagerTestWithTracing::StartTracing() { |
| 1866 base::trace_event::TraceLog::GetInstance()->SetEnabled( |
| 1867 base::trace_event::TraceConfig("*"), |
| 1868 base::trace_event::TraceLog::RECORDING_MODE); |
| 1869 } |
| 1870 |
| 1871 void TaskQueueManagerTestWithTracing::StopTracing() { |
| 1872 base::trace_event::TraceLog::GetInstance()->SetDisabled(); |
| 1873 } |
| 1874 |
| 1875 scoped_ptr<trace_analyzer::TraceAnalyzer> |
| 1876 TaskQueueManagerTestWithTracing::CreateTraceAnalyzer() { |
| 1877 base::trace_event::TraceResultBuffer buffer; |
| 1878 base::trace_event::TraceResultBuffer::SimpleOutput trace_output; |
| 1879 buffer.SetOutputCallback(trace_output.GetCallback()); |
| 1880 base::RunLoop run_loop; |
| 1881 buffer.Start(); |
| 1882 base::trace_event::TraceLog::GetInstance()->Flush( |
| 1883 Bind(&OnTraceDataCollected, run_loop.QuitClosure(), |
| 1884 base::Unretained(&buffer))); |
| 1885 run_loop.Run(); |
| 1886 buffer.Finish(); |
| 1887 |
| 1888 return make_scoped_ptr( |
| 1889 trace_analyzer::TraceAnalyzer::Create(trace_output.json_output)); |
| 1890 } |
| 1891 |
| 1892 TEST_F(TaskQueueManagerTestWithTracing, BlameContextAttribution) { |
| 1893 using trace_analyzer::Query; |
| 1894 |
| 1895 Initialize(1u); |
| 1896 TaskQueue* queue = runners_[0].get(); |
| 1897 |
| 1898 StartTracing(); |
| 1899 { |
| 1900 base::trace_event::BlameContext blame_context("cat", "name", "type", |
| 1901 "scope", 0, nullptr); |
| 1902 blame_context.Initialize(); |
| 1903 queue->SetBlameContext(&blame_context); |
| 1904 queue->PostTask(FROM_HERE, base::Bind(&NopTask)); |
| 1905 test_task_runner_->RunUntilIdle(); |
| 1906 } |
| 1907 StopTracing(); |
| 1908 scoped_ptr<trace_analyzer::TraceAnalyzer> analyzer = CreateTraceAnalyzer(); |
| 1909 |
| 1910 trace_analyzer::TraceEventVector events; |
| 1911 Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) || |
| 1912 Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT); |
| 1913 analyzer->FindEvents(q, &events); |
| 1914 |
| 1915 EXPECT_EQ(2u, events.size()); |
| 1916 } |
| 1917 |
1845 } // namespace scheduler | 1918 } // namespace scheduler |
OLD | NEW |