| // Copyright 2017 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/threading/thread_restrictions.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/bind.h" | 
 | #include "base/callback.h" | 
 | #include "base/macros.h" | 
 | #include "base/test/gtest_util.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace { | 
 |  | 
 | class ThreadRestrictionsTest : public testing::Test { | 
 |  public: | 
 |   ThreadRestrictionsTest() = default; | 
 |   ~ThreadRestrictionsTest() override { | 
 |     internal::ResetThreadRestrictionsForTesting(); | 
 |   } | 
 |  | 
 |  private: | 
 |   DISALLOW_COPY_AND_ASSIGN(ThreadRestrictionsTest); | 
 | }; | 
 |  | 
 | }  // namespace | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, BlockingAllowedByDefault) { | 
 |   AssertBlockingAllowed(); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, ScopedDisallowBlocking) { | 
 |   { | 
 |     ScopedDisallowBlocking scoped_disallow_blocking; | 
 |     EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); }); | 
 |   } | 
 |   AssertBlockingAllowed(); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, ScopedAllowBlocking) { | 
 |   ScopedDisallowBlocking scoped_disallow_blocking; | 
 |   { | 
 |     ScopedAllowBlocking scoped_allow_blocking; | 
 |     AssertBlockingAllowed(); | 
 |   } | 
 |   EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, ScopedAllowBlockingForTesting) { | 
 |   ScopedDisallowBlocking scoped_disallow_blocking; | 
 |   { | 
 |     ScopedAllowBlockingForTesting scoped_allow_blocking_for_testing; | 
 |     AssertBlockingAllowed(); | 
 |   } | 
 |   EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, BaseSyncPrimitivesAllowedByDefault) {} | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, DisallowBaseSyncPrimitives) { | 
 |   DisallowBaseSyncPrimitives(); | 
 |   EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitives) { | 
 |   DisallowBaseSyncPrimitives(); | 
 |   ScopedAllowBaseSyncPrimitives scoped_allow_base_sync_primitives; | 
 |   internal::AssertBaseSyncPrimitivesAllowed(); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitivesResetsState) { | 
 |   DisallowBaseSyncPrimitives(); | 
 |   { ScopedAllowBaseSyncPrimitives scoped_allow_base_sync_primitives; } | 
 |   EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, | 
 |        ScopedAllowBaseSyncPrimitivesWithBlockingDisallowed) { | 
 |   ScopedDisallowBlocking scoped_disallow_blocking; | 
 |   DisallowBaseSyncPrimitives(); | 
 |  | 
 |   // This should DCHECK because blocking is not allowed in this scope | 
 |   // and OutsideBlockingScope is not passed to the constructor. | 
 |   EXPECT_DCHECK_DEATH( | 
 |       { ScopedAllowBaseSyncPrimitives scoped_allow_base_sync_primitives; }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, | 
 |        ScopedAllowBaseSyncPrimitivesOutsideBlockingScope) { | 
 |   ScopedDisallowBlocking scoped_disallow_blocking; | 
 |   DisallowBaseSyncPrimitives(); | 
 |   ScopedAllowBaseSyncPrimitivesOutsideBlockingScope | 
 |       scoped_allow_base_sync_primitives; | 
 |   internal::AssertBaseSyncPrimitivesAllowed(); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, | 
 |        ScopedAllowBaseSyncPrimitivesOutsideBlockingScopeResetsState) { | 
 |   DisallowBaseSyncPrimitives(); | 
 |   { | 
 |     ScopedAllowBaseSyncPrimitivesOutsideBlockingScope | 
 |         scoped_allow_base_sync_primitives; | 
 |   } | 
 |   EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitivesForTesting) { | 
 |   DisallowBaseSyncPrimitives(); | 
 |   ScopedAllowBaseSyncPrimitivesForTesting | 
 |       scoped_allow_base_sync_primitives_for_testing; | 
 |   internal::AssertBaseSyncPrimitivesAllowed(); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, | 
 |        ScopedAllowBaseSyncPrimitivesForTestingResetsState) { | 
 |   DisallowBaseSyncPrimitives(); | 
 |   { | 
 |     ScopedAllowBaseSyncPrimitivesForTesting | 
 |         scoped_allow_base_sync_primitives_for_testing; | 
 |   } | 
 |   EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); }); | 
 | } | 
 |  | 
 | TEST_F(ThreadRestrictionsTest, | 
 |        ScopedAllowBaseSyncPrimitivesForTestingWithBlockingDisallowed) { | 
 |   ScopedDisallowBlocking scoped_disallow_blocking; | 
 |   DisallowBaseSyncPrimitives(); | 
 |   // This should not DCHECK. | 
 |   ScopedAllowBaseSyncPrimitivesForTesting | 
 |       scoped_allow_base_sync_primitives_for_testing; | 
 | } | 
 |  | 
 | }  // namespace base |