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