OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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 "base/deferred_sequenced_task_runner.h" | 5 #include "base/deferred_sequenced_task_runner.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| 11 #include "base/run_loop.h" |
11 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
12 #include "base/threading/non_thread_safe.h" | 13 #include "base/threading/non_thread_safe.h" |
13 #include "base/threading/thread.h" | 14 #include "base/threading/thread.h" |
14 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 | 17 |
17 namespace { | 18 namespace { |
18 | 19 |
19 class DeferredSequencedTaskRunnerTest : public testing::Test, | 20 class DeferredSequencedTaskRunnerTest : public testing::Test, |
20 public base::NonThreadSafe { | 21 public base::NonThreadSafe { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 runner_(new base::DeferredSequencedTaskRunner(loop_.task_runner())) {} | 63 runner_(new base::DeferredSequencedTaskRunner(loop_.task_runner())) {} |
63 | 64 |
64 base::MessageLoop loop_; | 65 base::MessageLoop loop_; |
65 scoped_refptr<base::DeferredSequencedTaskRunner> runner_; | 66 scoped_refptr<base::DeferredSequencedTaskRunner> runner_; |
66 mutable base::Lock lock_; | 67 mutable base::Lock lock_; |
67 std::vector<int> executed_task_ids_; | 68 std::vector<int> executed_task_ids_; |
68 }; | 69 }; |
69 | 70 |
70 TEST_F(DeferredSequencedTaskRunnerTest, Stopped) { | 71 TEST_F(DeferredSequencedTaskRunnerTest, Stopped) { |
71 PostExecuteTask(1); | 72 PostExecuteTask(1); |
72 loop_.RunUntilIdle(); | 73 base::RunLoop().RunUntilIdle(); |
73 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); | 74 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); |
74 } | 75 } |
75 | 76 |
76 TEST_F(DeferredSequencedTaskRunnerTest, Start) { | 77 TEST_F(DeferredSequencedTaskRunnerTest, Start) { |
77 StartRunner(); | 78 StartRunner(); |
78 PostExecuteTask(1); | 79 PostExecuteTask(1); |
79 loop_.RunUntilIdle(); | 80 base::RunLoop().RunUntilIdle(); |
80 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); | 81 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); |
81 } | 82 } |
82 | 83 |
83 TEST_F(DeferredSequencedTaskRunnerTest, StartWithMultipleElements) { | 84 TEST_F(DeferredSequencedTaskRunnerTest, StartWithMultipleElements) { |
84 StartRunner(); | 85 StartRunner(); |
85 for (int i = 1; i < 5; ++i) | 86 for (int i = 1; i < 5; ++i) |
86 PostExecuteTask(i); | 87 PostExecuteTask(i); |
87 | 88 |
88 loop_.RunUntilIdle(); | 89 base::RunLoop().RunUntilIdle(); |
89 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4)); | 90 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4)); |
90 } | 91 } |
91 | 92 |
92 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStart) { | 93 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStart) { |
93 PostExecuteTask(1); | 94 PostExecuteTask(1); |
94 loop_.RunUntilIdle(); | 95 base::RunLoop().RunUntilIdle(); |
95 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); | 96 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); |
96 | 97 |
97 StartRunner(); | 98 StartRunner(); |
98 loop_.RunUntilIdle(); | 99 base::RunLoop().RunUntilIdle(); |
99 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); | 100 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1)); |
100 | 101 |
101 PostExecuteTask(2); | 102 PostExecuteTask(2); |
102 loop_.RunUntilIdle(); | 103 base::RunLoop().RunUntilIdle(); |
103 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2)); | 104 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2)); |
104 } | 105 } |
105 | 106 |
106 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleElements) { | 107 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleElements) { |
107 for (int i = 1; i < 5; ++i) | 108 for (int i = 1; i < 5; ++i) |
108 PostExecuteTask(i); | 109 PostExecuteTask(i); |
109 loop_.RunUntilIdle(); | 110 base::RunLoop().RunUntilIdle(); |
110 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); | 111 EXPECT_THAT(executed_task_ids_, testing::ElementsAre()); |
111 | 112 |
112 StartRunner(); | 113 StartRunner(); |
113 for (int i = 5; i < 9; ++i) | 114 for (int i = 5; i < 9; ++i) |
114 PostExecuteTask(i); | 115 PostExecuteTask(i); |
115 loop_.RunUntilIdle(); | 116 base::RunLoop().RunUntilIdle(); |
116 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4, 5, 6, 7, 8)); | 117 EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4, 5, 6, 7, 8)); |
117 } | 118 } |
118 | 119 |
119 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleThreads) { | 120 TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleThreads) { |
120 { | 121 { |
121 base::Thread thread1("DeferredSequencedTaskRunnerTestThread1"); | 122 base::Thread thread1("DeferredSequencedTaskRunnerTestThread1"); |
122 base::Thread thread2("DeferredSequencedTaskRunnerTestThread2"); | 123 base::Thread thread2("DeferredSequencedTaskRunnerTestThread2"); |
123 thread1.Start(); | 124 thread1.Start(); |
124 thread2.Start(); | 125 thread2.Start(); |
125 for (int i = 0; i < 5; ++i) { | 126 for (int i = 0; i < 5; ++i) { |
126 thread1.task_runner()->PostTask( | 127 thread1.task_runner()->PostTask( |
127 FROM_HERE, | 128 FROM_HERE, |
128 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, | 129 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, |
129 base::Unretained(this), 2 * i)); | 130 base::Unretained(this), 2 * i)); |
130 thread2.task_runner()->PostTask( | 131 thread2.task_runner()->PostTask( |
131 FROM_HERE, | 132 FROM_HERE, |
132 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, | 133 base::Bind(&DeferredSequencedTaskRunnerTest::PostExecuteTask, |
133 base::Unretained(this), 2 * i + 1)); | 134 base::Unretained(this), 2 * i + 1)); |
134 if (i == 2) { | 135 if (i == 2) { |
135 thread1.task_runner()->PostTask( | 136 thread1.task_runner()->PostTask( |
136 FROM_HERE, base::Bind(&DeferredSequencedTaskRunnerTest::StartRunner, | 137 FROM_HERE, base::Bind(&DeferredSequencedTaskRunnerTest::StartRunner, |
137 base::Unretained(this))); | 138 base::Unretained(this))); |
138 } | 139 } |
139 } | 140 } |
140 } | 141 } |
141 | 142 |
142 loop_.RunUntilIdle(); | 143 base::RunLoop().RunUntilIdle(); |
143 EXPECT_THAT(executed_task_ids_, | 144 EXPECT_THAT(executed_task_ids_, |
144 testing::WhenSorted(testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))); | 145 testing::WhenSorted(testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9))); |
145 } | 146 } |
146 | 147 |
147 TEST_F(DeferredSequencedTaskRunnerTest, ObjectDestructionOrder) { | 148 TEST_F(DeferredSequencedTaskRunnerTest, ObjectDestructionOrder) { |
148 { | 149 { |
149 base::Thread thread("DeferredSequencedTaskRunnerTestThread"); | 150 base::Thread thread("DeferredSequencedTaskRunnerTestThread"); |
150 thread.Start(); | 151 thread.Start(); |
151 runner_ = new base::DeferredSequencedTaskRunner(thread.task_runner()); | 152 runner_ = new base::DeferredSequencedTaskRunner(thread.task_runner()); |
152 for (int i = 0; i < 5; ++i) { | 153 for (int i = 0; i < 5; ++i) { |
(...skipping 14 matching lines...) Expand all Loading... |
167 StartRunner(); | 168 StartRunner(); |
168 } | 169 } |
169 | 170 |
170 // All |short_lived_object| with id |2 * i| are destroyed before the task | 171 // All |short_lived_object| with id |2 * i| are destroyed before the task |
171 // |2 * i + 1| is executed. | 172 // |2 * i + 1| is executed. |
172 EXPECT_THAT(executed_task_ids_, | 173 EXPECT_THAT(executed_task_ids_, |
173 testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); | 174 testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); |
174 } | 175 } |
175 | 176 |
176 } // namespace | 177 } // namespace |
OLD | NEW |