OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 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 "ui/gfx/shared_event.h" |
| 6 |
| 7 #include "base/threading/platform_thread.h" |
| 8 #include "base/time/time.h" |
| 9 #include "build/build_config.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" |
| 11 |
| 12 namespace gfx { |
| 13 |
| 14 TEST(SharedEventTest, Basics) { |
| 15 SharedEvent event1; |
| 16 SharedEvent event2(SharedEvent::DuplicateHandle(event1.GetHandle())); |
| 17 |
| 18 EXPECT_FALSE(event1.IsSignaled()); |
| 19 EXPECT_FALSE(event2.IsSignaled()); |
| 20 |
| 21 event1.Signal(); |
| 22 EXPECT_TRUE(event1.IsSignaled()); |
| 23 EXPECT_TRUE(event2.IsSignaled()); |
| 24 |
| 25 event1.Reset(); |
| 26 EXPECT_FALSE(event1.IsSignaled()); |
| 27 EXPECT_FALSE(event2.IsSignaled()); |
| 28 EXPECT_FALSE(event1.Wait(base::TimeDelta::FromMilliseconds(10))); |
| 29 EXPECT_FALSE(event2.Wait(base::TimeDelta::FromMilliseconds(10))); |
| 30 |
| 31 event2.Signal(); |
| 32 EXPECT_TRUE(event1.Wait(base::TimeDelta::FromMilliseconds(10))); |
| 33 EXPECT_TRUE(event2.Wait(base::TimeDelta::FromMilliseconds(10))); |
| 34 } |
| 35 |
| 36 class SharedEventSignaler : public base::PlatformThread::Delegate { |
| 37 public: |
| 38 SharedEventSignaler(base::TimeDelta delay, const SharedEventHandle& handle) |
| 39 : delay_(delay), event_(handle) {} |
| 40 |
| 41 void ThreadMain() override { |
| 42 base::PlatformThread::Sleep(delay_); |
| 43 event_.Signal(); |
| 44 } |
| 45 |
| 46 private: |
| 47 const base::TimeDelta delay_; |
| 48 SharedEvent event_; |
| 49 }; |
| 50 |
| 51 TEST(SharedEventTest, WaitAndReset) { |
| 52 SharedEvent event; |
| 53 |
| 54 SharedEventSignaler signaler(base::TimeDelta::FromMilliseconds(10), |
| 55 SharedEvent::DuplicateHandle(event.GetHandle())); |
| 56 base::PlatformThreadHandle thread; |
| 57 base::PlatformThread::Create(0, &signaler, &thread); |
| 58 |
| 59 base::TimeTicks now = base::TimeTicks::Now(); |
| 60 base::TimeTicks end = now + base::TimeDelta::FromSeconds(5); |
| 61 while (now < end) { |
| 62 if (event.Wait(end - now)) |
| 63 break; |
| 64 now = base::TimeTicks::Now(); |
| 65 } |
| 66 |
| 67 EXPECT_TRUE(event.IsSignaled()); |
| 68 event.Reset(); |
| 69 EXPECT_FALSE(event.IsSignaled()); |
| 70 event.Signal(); |
| 71 EXPECT_TRUE(event.Wait(base::TimeDelta::FromMilliseconds(10))); |
| 72 |
| 73 base::PlatformThread::Join(thread); |
| 74 } |
| 75 |
| 76 class SharedEventWaiter : public base::PlatformThread::Delegate { |
| 77 public: |
| 78 SharedEventWaiter(base::TimeDelta max_time, const SharedEventHandle& handle) |
| 79 : until_(base::TimeTicks::Now() + max_time), event_(handle) {} |
| 80 |
| 81 void ThreadMain() override { |
| 82 base::TimeTicks now = base::TimeTicks::Now(); |
| 83 while (now < until_) { |
| 84 if (event_.Wait(until_ - now)) |
| 85 break; |
| 86 now = base::TimeTicks::Now(); |
| 87 } |
| 88 EXPECT_TRUE(event_.IsSignaled()); |
| 89 } |
| 90 |
| 91 private: |
| 92 const base::TimeTicks until_; |
| 93 SharedEvent event_; |
| 94 }; |
| 95 |
| 96 // Tests that a SharedEvent can be safely be deleted before having been |
| 97 // signaled. |
| 98 TEST(SharedEventTest, SignalAndDelete) { |
| 99 std::unique_ptr<SharedEvent> event(new SharedEvent); |
| 100 |
| 101 SharedEventWaiter waiter(base::TimeDelta::FromSeconds(5), |
| 102 SharedEvent::DuplicateHandle(event->GetHandle())); |
| 103 base::PlatformThreadHandle thread; |
| 104 base::PlatformThread::Create(0, &waiter, &thread); |
| 105 |
| 106 EXPECT_FALSE(event->IsSignaled()); |
| 107 event->Signal(); |
| 108 event.reset(); |
| 109 |
| 110 base::PlatformThread::Join(thread); |
| 111 } |
| 112 |
| 113 } // namespace gfx |
OLD | NEW |