OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 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/sequence_checker.h" | |
Lei Zhang
2015/11/25 00:55:04
I remember the rule being: for unit tests, they st
danakj
2015/11/25 01:01:45
I don't remember it being any other way since I st
| |
6 | |
7 #include <utility> | |
8 | |
5 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
6 #include "base/bind.h" | 10 #include "base/bind.h" |
7 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
8 #include "base/location.h" | 12 #include "base/location.h" |
9 #include "base/logging.h" | 13 #include "base/logging.h" |
10 #include "base/memory/ref_counted.h" | 14 #include "base/memory/ref_counted.h" |
11 #include "base/memory/scoped_ptr.h" | 15 #include "base/memory/scoped_ptr.h" |
12 #include "base/sequence_checker.h" | |
13 #include "base/single_thread_task_runner.h" | 16 #include "base/single_thread_task_runner.h" |
14 #include "base/test/sequenced_worker_pool_owner.h" | 17 #include "base/test/sequenced_worker_pool_owner.h" |
15 #include "base/threading/thread.h" | 18 #include "base/threading/thread.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
17 | 20 |
18 // Duplicated from base/sequence_checker.h so that we can be good citizens | 21 // Duplicated from base/sequence_checker.h so that we can be good citizens |
19 // there and undef the macro. | 22 // there and undef the macro. |
20 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) | 23 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) |
21 #define ENABLE_SEQUENCE_CHECKER 1 | 24 #define ENABLE_SEQUENCE_CHECKER 1 |
22 #else | 25 #else |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
123 | 126 |
124 // Verify that the destructor doesn't assert. | 127 // Verify that the destructor doesn't assert. |
125 sequence_checked_object.reset(); | 128 sequence_checked_object.reset(); |
126 } | 129 } |
127 | 130 |
128 TEST_F(SequenceCheckerTest, DestructorAllowedOnDifferentThread) { | 131 TEST_F(SequenceCheckerTest, DestructorAllowedOnDifferentThread) { |
129 scoped_ptr<SequenceCheckedObject> sequence_checked_object( | 132 scoped_ptr<SequenceCheckedObject> sequence_checked_object( |
130 new SequenceCheckedObject); | 133 new SequenceCheckedObject); |
131 | 134 |
132 // Verify the destructor doesn't assert when called on a different thread. | 135 // Verify the destructor doesn't assert when called on a different thread. |
133 PostDeleteToOtherThread(sequence_checked_object.Pass()); | 136 PostDeleteToOtherThread(std::move(sequence_checked_object)); |
134 other_thread()->Stop(); | 137 other_thread()->Stop(); |
135 } | 138 } |
136 | 139 |
137 TEST_F(SequenceCheckerTest, DetachFromSequence) { | 140 TEST_F(SequenceCheckerTest, DetachFromSequence) { |
138 scoped_ptr<SequenceCheckedObject> sequence_checked_object( | 141 scoped_ptr<SequenceCheckedObject> sequence_checked_object( |
139 new SequenceCheckedObject); | 142 new SequenceCheckedObject); |
140 | 143 |
141 // Verify that DoStuff doesn't assert when called on a different thread after | 144 // Verify that DoStuff doesn't assert when called on a different thread after |
142 // a call to DetachFromSequence. | 145 // a call to DetachFromSequence. |
143 sequence_checked_object->DetachFromSequence(); | 146 sequence_checked_object->DetachFromSequence(); |
144 | 147 |
145 PostDoStuffToOtherThread(sequence_checked_object.get()); | 148 PostDoStuffToOtherThread(sequence_checked_object.get()); |
146 other_thread()->Stop(); | 149 other_thread()->Stop(); |
147 } | 150 } |
148 | 151 |
149 TEST_F(SequenceCheckerTest, SameSequenceTokenValid) { | 152 TEST_F(SequenceCheckerTest, SameSequenceTokenValid) { |
150 scoped_ptr<SequenceCheckedObject> sequence_checked_object( | 153 scoped_ptr<SequenceCheckedObject> sequence_checked_object( |
151 new SequenceCheckedObject); | 154 new SequenceCheckedObject); |
152 | 155 |
153 sequence_checked_object->DetachFromSequence(); | 156 sequence_checked_object->DetachFromSequence(); |
154 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 157 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
155 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 158 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
156 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 159 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
157 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 160 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
158 pool()->FlushForTesting(); | 161 pool()->FlushForTesting(); |
159 | 162 |
160 PostDeleteToOtherThread(sequence_checked_object.Pass()); | 163 PostDeleteToOtherThread(std::move(sequence_checked_object)); |
161 other_thread()->Stop(); | 164 other_thread()->Stop(); |
162 } | 165 } |
163 | 166 |
164 TEST_F(SequenceCheckerTest, DetachSequenceTokenValid) { | 167 TEST_F(SequenceCheckerTest, DetachSequenceTokenValid) { |
165 scoped_ptr<SequenceCheckedObject> sequence_checked_object( | 168 scoped_ptr<SequenceCheckedObject> sequence_checked_object( |
166 new SequenceCheckedObject); | 169 new SequenceCheckedObject); |
167 | 170 |
168 sequence_checked_object->DetachFromSequence(); | 171 sequence_checked_object->DetachFromSequence(); |
169 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 172 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
170 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 173 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
171 pool()->FlushForTesting(); | 174 pool()->FlushForTesting(); |
172 | 175 |
173 sequence_checked_object->DetachFromSequence(); | 176 sequence_checked_object->DetachFromSequence(); |
174 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); | 177 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); |
175 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); | 178 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); |
176 pool()->FlushForTesting(); | 179 pool()->FlushForTesting(); |
177 | 180 |
178 PostDeleteToOtherThread(sequence_checked_object.Pass()); | 181 PostDeleteToOtherThread(std::move(sequence_checked_object)); |
179 other_thread()->Stop(); | 182 other_thread()->Stop(); |
180 } | 183 } |
181 | 184 |
182 #if GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER | 185 #if GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER |
183 | 186 |
184 void SequenceCheckerTest::MethodOnDifferentThreadDeathTest() { | 187 void SequenceCheckerTest::MethodOnDifferentThreadDeathTest() { |
185 scoped_ptr<SequenceCheckedObject> sequence_checked_object( | 188 scoped_ptr<SequenceCheckedObject> sequence_checked_object( |
186 new SequenceCheckedObject); | 189 new SequenceCheckedObject); |
187 | 190 |
188 // DoStuff should assert in debug builds only when called on a | 191 // DoStuff should assert in debug builds only when called on a |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
238 scoped_ptr<SequenceCheckedObject> sequence_checked_object( | 241 scoped_ptr<SequenceCheckedObject> sequence_checked_object( |
239 new SequenceCheckedObject); | 242 new SequenceCheckedObject); |
240 | 243 |
241 sequence_checked_object->DetachFromSequence(); | 244 sequence_checked_object->DetachFromSequence(); |
242 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 245 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
243 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); | 246 PostDoStuffToWorkerPool(sequence_checked_object.get(), "A"); |
244 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); | 247 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); |
245 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); | 248 PostDoStuffToWorkerPool(sequence_checked_object.get(), "B"); |
246 pool()->FlushForTesting(); | 249 pool()->FlushForTesting(); |
247 | 250 |
248 PostDeleteToOtherThread(sequence_checked_object.Pass()); | 251 PostDeleteToOtherThread(std::move(sequence_checked_object)); |
249 other_thread()->Stop(); | 252 other_thread()->Stop(); |
250 } | 253 } |
251 | 254 |
252 #if ENABLE_SEQUENCE_CHECKER | 255 #if ENABLE_SEQUENCE_CHECKER |
253 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) { | 256 TEST_F(SequenceCheckerTest, DifferentSequenceTokensDeathTestInDebug) { |
254 // The default style "fast" does not support multi-threaded tests. | 257 // The default style "fast" does not support multi-threaded tests. |
255 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; | 258 ::testing::FLAGS_gtest_death_test_style = "threadsafe"; |
256 ASSERT_DEATH({ | 259 ASSERT_DEATH({ |
257 DifferentSequenceTokensDeathTest(); | 260 DifferentSequenceTokensDeathTest(); |
258 }, ""); | 261 }, ""); |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
324 #endif // ENABLE_SEQUENCE_CHECKER | 327 #endif // ENABLE_SEQUENCE_CHECKER |
325 | 328 |
326 #endif // GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER | 329 #endif // GTEST_HAS_DEATH_TEST || !ENABLE_SEQUENCE_CHECKER |
327 | 330 |
328 } // namespace | 331 } // namespace |
329 | 332 |
330 } // namespace base | 333 } // namespace base |
331 | 334 |
332 // Just in case we ever get lumped together with other compilation units. | 335 // Just in case we ever get lumped together with other compilation units. |
333 #undef ENABLE_SEQUENCE_CHECKER | 336 #undef ENABLE_SEQUENCE_CHECKER |
OLD | NEW |