1 // Copyright 2016 The Chromium Embedded Framework Authors. Portions copyright
2 // 2012 The Chromium Authors. All rights reserved. Use of this source code is
3 // governed by a BSD-style license that can be found in the LICENSE file.
4
5 #include "include/base/cef_callback.h"
6 #include "include/cef_thread.h"
7 #include "include/cef_waitable_event.h"
8 #include "include/wrapper/cef_closure_task.h"
9 #include "tests/gtest/include/gtest/gtest.h"
10
11 // Test manual reset.
TEST(WaitableEventTest,ManualReset)12 TEST(WaitableEventTest, ManualReset) {
13 CefRefPtr<CefWaitableEvent> event =
14 CefWaitableEvent::CreateWaitableEvent(false, false);
15
16 EXPECT_FALSE(event->IsSignaled());
17
18 event->Signal();
19 EXPECT_TRUE(event->IsSignaled());
20 EXPECT_TRUE(event->IsSignaled());
21
22 event->Reset();
23 EXPECT_FALSE(event->IsSignaled());
24 EXPECT_FALSE(event->TimedWait(10));
25
26 event->Signal();
27 event->Wait();
28 EXPECT_TRUE(event->TimedWait(10));
29 }
30
31 // Test automatic reset.
TEST(WaitableEventTest,AutomaticReset)32 TEST(WaitableEventTest, AutomaticReset) {
33 CefRefPtr<CefWaitableEvent> event =
34 CefWaitableEvent::CreateWaitableEvent(true, false);
35
36 EXPECT_FALSE(event->IsSignaled());
37
38 event->Signal();
39 EXPECT_TRUE(event->IsSignaled());
40 EXPECT_FALSE(event->IsSignaled());
41
42 event->Reset();
43 EXPECT_FALSE(event->IsSignaled());
44 EXPECT_FALSE(event->TimedWait(10));
45
46 event->Signal();
47 event->Wait();
48 EXPECT_FALSE(event->TimedWait(10));
49
50 event->Signal();
51 EXPECT_TRUE(event->TimedWait(10));
52 }
53
54 namespace {
55
SignalEvent(CefWaitableEvent * event)56 void SignalEvent(CefWaitableEvent* event) {
57 event->Signal();
58 }
59
60 } // namespace
61
62 // Tests that a WaitableEvent can be safely deleted when |Wait| is done without
63 // additional synchronization.
TEST(WaitableEventTest,WaitAndDelete)64 TEST(WaitableEventTest, WaitAndDelete) {
65 CefRefPtr<CefWaitableEvent> event =
66 CefWaitableEvent::CreateWaitableEvent(true, false);
67
68 CefRefPtr<CefThread> thread = CefThread::CreateThread("waitable_event_test");
69 thread->GetTaskRunner()->PostDelayedTask(
70 CefCreateClosureTask(
71 base::BindOnce(SignalEvent, base::Unretained(event.get()))),
72 10);
73
74 event->Wait();
75 event = nullptr;
76
77 thread->Stop();
78 thread = nullptr;
79 }
80