| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // This file contains intentional memory errors, some of which may lead to | 5 // This file contains intentional memory errors, some of which may lead to |
| 6 // crashes if the test is ran without special memory testing tools. We use these | 6 // crashes if the test is ran without special memory testing tools. We use these |
| 7 // errors to verify the sanity of the tools. | 7 // errors to verify the sanity of the tools. |
| 8 | 8 |
| 9 #include "base/atomicops.h" | 9 #include "base/atomicops.h" |
| 10 #include "base/debug/asan_invalid_access.h" | 10 #include "base/debug/asan_invalid_access.h" |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 | 280 |
| 281 void RunInParallel(PlatformThread::Delegate *d1, PlatformThread::Delegate *d2) { | 281 void RunInParallel(PlatformThread::Delegate *d1, PlatformThread::Delegate *d2) { |
| 282 PlatformThreadHandle a; | 282 PlatformThreadHandle a; |
| 283 PlatformThreadHandle b; | 283 PlatformThreadHandle b; |
| 284 PlatformThread::Create(0, d1, &a); | 284 PlatformThread::Create(0, d1, &a); |
| 285 PlatformThread::Create(0, d2, &b); | 285 PlatformThread::Create(0, d2, &b); |
| 286 PlatformThread::Join(a); | 286 PlatformThread::Join(a); |
| 287 PlatformThread::Join(b); | 287 PlatformThread::Join(b); |
| 288 } | 288 } |
| 289 | 289 |
| 290 } // namespace | 290 #if defined(THREAD_SANITIZER) |
| 291 | 291 void DataRace() { |
| 292 // A data race detector should report an error in this test. | |
| 293 TEST(ToolsSanityTest, DataRace) { | |
| 294 bool *shared = new bool(false); | 292 bool *shared = new bool(false); |
| 295 TOOLS_SANITY_TEST_CONCURRENT_THREAD thread1(shared), thread2(shared); | 293 TOOLS_SANITY_TEST_CONCURRENT_THREAD thread1(shared), thread2(shared); |
| 296 RunInParallel(&thread1, &thread2); | 294 RunInParallel(&thread1, &thread2); |
| 297 EXPECT_TRUE(*shared); | 295 EXPECT_TRUE(*shared); |
| 298 delete shared; | 296 delete shared; |
| 297 // We're in a death test - crash. |
| 298 CHECK(0); |
| 299 } | 299 } |
| 300 #endif |
| 301 |
| 302 } // namespace |
| 303 |
| 304 #if defined(THREAD_SANITIZER) |
| 305 // A data race detector should report an error in this test. |
| 306 TEST(ToolsSanityTest, DataRace) { |
| 307 // The suppression regexp must match that in base/debug/tsan_suppressions.cc. |
| 308 EXPECT_DEATH(DataRace(), "1 race:base/tools_sanity_unittest.cc"); |
| 309 } |
| 310 #endif |
| 300 | 311 |
| 301 TEST(ToolsSanityTest, AnnotateBenignRace) { | 312 TEST(ToolsSanityTest, AnnotateBenignRace) { |
| 302 bool shared = false; | 313 bool shared = false; |
| 303 ANNOTATE_BENIGN_RACE(&shared, "Intentional race - make sure doesn't show up"); | 314 ANNOTATE_BENIGN_RACE(&shared, "Intentional race - make sure doesn't show up"); |
| 304 TOOLS_SANITY_TEST_CONCURRENT_THREAD thread1(&shared), thread2(&shared); | 315 TOOLS_SANITY_TEST_CONCURRENT_THREAD thread1(&shared), thread2(&shared); |
| 305 RunInParallel(&thread1, &thread2); | 316 RunInParallel(&thread1, &thread2); |
| 306 EXPECT_TRUE(shared); | 317 EXPECT_TRUE(shared); |
| 307 } | 318 } |
| 308 | 319 |
| 309 TEST(ToolsSanityTest, AtomicsAreIgnored) { | 320 TEST(ToolsSanityTest, AtomicsAreIgnored) { |
| 310 base::subtle::Atomic32 shared = 0; | 321 base::subtle::Atomic32 shared = 0; |
| 311 ReleaseStoreThread thread1(&shared); | 322 ReleaseStoreThread thread1(&shared); |
| 312 AcquireLoadThread thread2(&shared); | 323 AcquireLoadThread thread2(&shared); |
| 313 RunInParallel(&thread1, &thread2); | 324 RunInParallel(&thread1, &thread2); |
| 314 EXPECT_EQ(kMagicValue, shared); | 325 EXPECT_EQ(kMagicValue, shared); |
| 315 } | 326 } |
| 316 | 327 |
| 317 } // namespace base | 328 } // namespace base |
| OLD | NEW |