• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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