Chromium Code Reviews| 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 |