xref: /aosp_15_r20/external/cronet/base/test/test_waitable_event_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2020 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/test/test_waitable_event.h"
6 
7 #include "base/functional/bind.h"
8 #include "base/task/thread_pool.h"
9 #include "base/test/task_environment.h"
10 #include "base/threading/scoped_blocking_call_internal.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 namespace base {
14 
15 class NoInvokeBlockingObserver : public internal::BlockingObserver {
16  public:
BlockingStarted(BlockingType blocking_type)17   void BlockingStarted(BlockingType blocking_type) override { ADD_FAILURE(); }
BlockingTypeUpgraded()18   void BlockingTypeUpgraded() override { ADD_FAILURE(); }
BlockingEnded()19   void BlockingEnded() override { ADD_FAILURE(); }
20 };
21 
TEST(TestWaitableEvent,NoBlockingCall)22 TEST(TestWaitableEvent, NoBlockingCall) {
23   test::TaskEnvironment task_environment;
24 
25   NoInvokeBlockingObserver test_observer;
26   internal::SetBlockingObserverForCurrentThread(&test_observer);
27 
28   TestWaitableEvent test_waitable_event;
29   ThreadPool::PostTask(
30       FROM_HERE, {},
31       BindOnce(&WaitableEvent::Signal, Unretained(&test_waitable_event)));
32   test_waitable_event.Wait();
33 
34   internal::ClearBlockingObserverForCurrentThread();
35 }
36 
TEST(TestWaitableEvent,WaitingInPoolDoesntRequireAllowance)37 TEST(TestWaitableEvent, WaitingInPoolDoesntRequireAllowance) {
38   test::TaskEnvironment task_environment;
39 
40   TestWaitableEvent test_waitable_event;
41   // MayBlock()/WithBaseSyncPrimitives()/ScopedAllowBaseSyncPrimitivesForTesting
42   // are required to Wait() on a TestWaitableEvent.
43   ThreadPool::PostTask(
44       FROM_HERE, {},
45       BindOnce(&WaitableEvent::Wait, Unretained(&test_waitable_event)));
46   test_waitable_event.Signal();
47 
48   task_environment.RunUntilIdle();
49 }
50 
51 // Binding &WaitableEvent::Signal or &TestWaitableEvent::Signal is equivalent.
TEST(TestWaitableEvent,CanBindEitherType)52 TEST(TestWaitableEvent, CanBindEitherType) {
53   test::TaskEnvironment task_environment;
54   TestWaitableEvent test_waitable_event(WaitableEvent::ResetPolicy::AUTOMATIC);
55 
56   ThreadPool::PostTask(
57       FROM_HERE, {},
58       BindOnce(&WaitableEvent::Signal, Unretained(&test_waitable_event)));
59   test_waitable_event.Wait();
60 
61   ThreadPool::PostTask(
62       FROM_HERE, {},
63       BindOnce(&TestWaitableEvent::Signal, Unretained(&test_waitable_event)));
64   test_waitable_event.Wait();
65 }
66 
67 }  // namespace base
68