| Index: sandbox/linux/services/thread_helpers_unittests.cc
 | 
| diff --git a/sandbox/linux/services/thread_helpers_unittests.cc b/sandbox/linux/services/thread_helpers_unittests.cc
 | 
| index a36fd2975f81da18dc32f53ae221da9475f65483..7f99aaf2a16898ad198b33633974bcfde5d8a6e0 100644
 | 
| --- a/sandbox/linux/services/thread_helpers_unittests.cc
 | 
| +++ b/sandbox/linux/services/thread_helpers_unittests.cc
 | 
| @@ -27,6 +27,9 @@ namespace sandbox {
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| +// These tests fail under ThreadSanitizer, see http://crbug.com/342305
 | 
| +#if !defined(THREAD_SANITIZER)
 | 
| +
 | 
|  int GetRaceTestIterations() {
 | 
|    if (IsRunningOnValgrind()) {
 | 
|      return 2;
 | 
| @@ -51,31 +54,29 @@ class ScopedProcSelfTask {
 | 
|    DISALLOW_COPY_AND_ASSIGN(ScopedProcSelfTask);
 | 
|  };
 | 
|  
 | 
| -#if defined(THREAD_SANITIZER)
 | 
| -// These tests fail under ThreadSanitizer, see http://crbug.com/342305
 | 
| -#define MAYBE_IsSingleThreadedBasic DISABLED_IsSingleThreadedBasic
 | 
| -#define MAYBE_IsSingleThreadedIterated DISABLED_IsSingleThreadedIterated
 | 
| -#define MAYBE_IsSingleThreadedStartAndStop DISABLED_IsSingleThreadedStartAndStop
 | 
| -#else
 | 
| -#define MAYBE_IsSingleThreadedBasic IsSingleThreadedBasic
 | 
| -#define MAYBE_IsSingleThreadedIterated IsSingleThreadedIterated
 | 
| -#define MAYBE_IsSingleThreadedStartAndStop IsSingleThreadedStartAndStop
 | 
| -#endif
 | 
| -
 | 
| -TEST(ThreadHelpers, MAYBE_IsSingleThreadedBasic) {
 | 
| +TEST(ThreadHelpers, IsSingleThreadedBasic) {
 | 
|    ScopedProcSelfTask task;
 | 
|    ASSERT_TRUE(ThreadHelpers::IsSingleThreaded(task.fd()));
 | 
| -  ASSERT_TRUE(ThreadHelpers::IsSingleThreaded(-1));
 | 
| +  ASSERT_TRUE(ThreadHelpers::IsSingleThreaded());
 | 
|  
 | 
|    base::Thread thread("sandbox_tests");
 | 
|    ASSERT_TRUE(thread.Start());
 | 
|    ASSERT_FALSE(ThreadHelpers::IsSingleThreaded(task.fd()));
 | 
| -  ASSERT_FALSE(ThreadHelpers::IsSingleThreaded(-1));
 | 
| +  ASSERT_FALSE(ThreadHelpers::IsSingleThreaded());
 | 
|    // Explicitly stop the thread here to not pollute the next test.
 | 
|    ASSERT_TRUE(ThreadHelpers::StopThreadAndWatchProcFS(task.fd(), &thread));
 | 
|  }
 | 
|  
 | 
| -TEST(ThreadHelpers, MAYBE_IsSingleThreadedIterated) {
 | 
| +SANDBOX_TEST(ThreadHelpers, AssertSingleThreaded) {
 | 
| +  ScopedProcSelfTask task;
 | 
| +  SANDBOX_ASSERT(ThreadHelpers::IsSingleThreaded(task.fd()));
 | 
| +  SANDBOX_ASSERT(ThreadHelpers::IsSingleThreaded());
 | 
| +
 | 
| +  ThreadHelpers::AssertSingleThreaded(task.fd());
 | 
| +  ThreadHelpers::AssertSingleThreaded();
 | 
| +}
 | 
| +
 | 
| +TEST(ThreadHelpers, IsSingleThreadedIterated) {
 | 
|    ScopedProcSelfTask task;
 | 
|    ASSERT_TRUE(ThreadHelpers::IsSingleThreaded(task.fd()));
 | 
|  
 | 
| @@ -89,7 +90,7 @@ TEST(ThreadHelpers, MAYBE_IsSingleThreadedIterated) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -TEST(ThreadHelpers, MAYBE_IsSingleThreadedStartAndStop) {
 | 
| +TEST(ThreadHelpers, IsSingleThreadedStartAndStop) {
 | 
|    ScopedProcSelfTask task;
 | 
|    ASSERT_TRUE(ThreadHelpers::IsSingleThreaded(task.fd()));
 | 
|  
 | 
| @@ -106,6 +107,42 @@ TEST(ThreadHelpers, MAYBE_IsSingleThreadedStartAndStop) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +SANDBOX_TEST(ThreadHelpers, AssertSingleThreadedAfterThreadStopped) {
 | 
| +  SANDBOX_ASSERT(ThreadHelpers::IsSingleThreaded());
 | 
| +
 | 
| +  base::Thread thread1("sandbox_tests");
 | 
| +  base::Thread thread2("sandbox_tests");
 | 
| +
 | 
| +  for (int i = 0; i < GetRaceTestIterations(); ++i) {
 | 
| +    SANDBOX_ASSERT(thread1.Start());
 | 
| +    SANDBOX_ASSERT(thread2.Start());
 | 
| +    SANDBOX_ASSERT(!ThreadHelpers::IsSingleThreaded());
 | 
| +
 | 
| +    thread1.Stop();
 | 
| +    thread2.Stop();
 | 
| +    // This will wait on /proc/ to reflect the state of threads in the
 | 
| +    // process.
 | 
| +    ThreadHelpers::AssertSingleThreaded();
 | 
| +    SANDBOX_ASSERT(ThreadHelpers::IsSingleThreaded());
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +// Only run this test in Debug mode, where AssertSingleThreaded() will return
 | 
| +// in less than 64ms.
 | 
| +#if !defined(NDEBUG)
 | 
| +SANDBOX_DEATH_TEST(
 | 
| +    ThreadHelpers,
 | 
| +    AssertSingleThreadedDies,
 | 
| +    DEATH_MESSAGE(
 | 
| +        ThreadHelpers::GetAssertSingleThreadedErrorMessageForTests())) {
 | 
| +  base::Thread thread1("sandbox_tests");
 | 
| +  SANDBOX_ASSERT(thread1.Start());
 | 
| +  ThreadHelpers::AssertSingleThreaded();
 | 
| +}
 | 
| +#endif  // !defined(NDEBUG)
 | 
| +
 | 
| +#endif  // !defined(THREAD_SANITIZER)
 | 
| +
 | 
|  }  // namespace
 | 
|  
 | 
|  }  // namespace sandbox
 | 
| 
 |