waitable_event_unittest.cc 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (c) 2012 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. #include "butil/synchronization/waitable_event.h"
  5. #include "butil/compiler_specific.h"
  6. #include "butil/threading/platform_thread.h"
  7. #include "butil/time/time.h"
  8. #include <gtest/gtest.h>
  9. namespace butil {
  10. TEST(WaitableEventTest, ManualBasics) {
  11. WaitableEvent event(true, false);
  12. EXPECT_FALSE(event.IsSignaled());
  13. event.Signal();
  14. EXPECT_TRUE(event.IsSignaled());
  15. EXPECT_TRUE(event.IsSignaled());
  16. event.Reset();
  17. EXPECT_FALSE(event.IsSignaled());
  18. EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
  19. event.Signal();
  20. event.Wait();
  21. EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
  22. }
  23. TEST(WaitableEventTest, AutoBasics) {
  24. WaitableEvent event(false, false);
  25. EXPECT_FALSE(event.IsSignaled());
  26. event.Signal();
  27. EXPECT_TRUE(event.IsSignaled());
  28. EXPECT_FALSE(event.IsSignaled());
  29. event.Reset();
  30. EXPECT_FALSE(event.IsSignaled());
  31. EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
  32. event.Signal();
  33. event.Wait();
  34. EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
  35. event.Signal();
  36. EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
  37. }
  38. TEST(WaitableEventTest, WaitManyShortcut) {
  39. WaitableEvent* ev[5];
  40. for (unsigned i = 0; i < 5; ++i)
  41. ev[i] = new WaitableEvent(false, false);
  42. ev[3]->Signal();
  43. EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u);
  44. ev[3]->Signal();
  45. EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u);
  46. ev[4]->Signal();
  47. EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 4u);
  48. ev[0]->Signal();
  49. EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 0u);
  50. for (unsigned i = 0; i < 5; ++i)
  51. delete ev[i];
  52. }
  53. class WaitableEventSignaler : public PlatformThread::Delegate {
  54. public:
  55. WaitableEventSignaler(double seconds, WaitableEvent* ev)
  56. : seconds_(seconds),
  57. ev_(ev) {
  58. }
  59. virtual void ThreadMain() OVERRIDE {
  60. PlatformThread::Sleep(TimeDelta::FromSeconds(static_cast<int>(seconds_)));
  61. ev_->Signal();
  62. }
  63. private:
  64. const double seconds_;
  65. WaitableEvent *const ev_;
  66. };
  67. TEST(WaitableEventTest, WaitMany) {
  68. WaitableEvent* ev[5];
  69. for (unsigned i = 0; i < 5; ++i)
  70. ev[i] = new WaitableEvent(false, false);
  71. WaitableEventSignaler signaler(0.1, ev[2]);
  72. PlatformThreadHandle thread;
  73. PlatformThread::Create(0, &signaler, &thread);
  74. EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 2u);
  75. PlatformThread::Join(thread);
  76. for (unsigned i = 0; i < 5; ++i)
  77. delete ev[i];
  78. }
  79. } // namespace butil