1 /*
2  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "rtc_base/event.h"
12 
13 #include "rtc_base/platform_thread.h"
14 #include "test/gtest.h"
15 
16 namespace rtc {
17 
TEST(EventTest,InitiallySignaled)18 TEST(EventTest, InitiallySignaled) {
19   Event event(false, true);
20   ASSERT_TRUE(event.Wait(0));
21 }
22 
TEST(EventTest,ManualReset)23 TEST(EventTest, ManualReset) {
24   Event event(true, false);
25   ASSERT_FALSE(event.Wait(0));
26 
27   event.Set();
28   ASSERT_TRUE(event.Wait(0));
29   ASSERT_TRUE(event.Wait(0));
30 
31   event.Reset();
32   ASSERT_FALSE(event.Wait(0));
33 }
34 
TEST(EventTest,AutoReset)35 TEST(EventTest, AutoReset) {
36   Event event;
37   ASSERT_FALSE(event.Wait(0));
38 
39   event.Set();
40   ASSERT_TRUE(event.Wait(0));
41   ASSERT_FALSE(event.Wait(0));
42 }
43 
44 class SignalerThread {
45  public:
SignalerThread()46   SignalerThread() : thread_(&ThreadFn, this, "EventPerf") {}
Start(Event * writer,Event * reader)47   void Start(Event* writer, Event* reader) {
48     writer_ = writer;
49     reader_ = reader;
50     thread_.Start();
51   }
Stop()52   void Stop() {
53     stop_event_.Set();
54     thread_.Stop();
55   }
ThreadFn(void * param)56   static void ThreadFn(void* param) {
57     auto* me = static_cast<SignalerThread*>(param);
58     while (!me->stop_event_.Wait(0)) {
59       me->writer_->Set();
60       me->reader_->Wait(Event::kForever);
61     }
62   }
63   Event stop_event_;
64   Event* writer_;
65   Event* reader_;
66   PlatformThread thread_;
67 };
68 
69 // These tests are disabled by default and only intended to be run manually.
TEST(EventTest,DISABLED_PerformanceSingleThread)70 TEST(EventTest, DISABLED_PerformanceSingleThread) {
71   static const int kNumIterations = 10000000;
72   Event event;
73   for (int i = 0; i < kNumIterations; ++i) {
74     event.Set();
75     event.Wait(0);
76   }
77 }
78 
TEST(EventTest,DISABLED_PerformanceMultiThread)79 TEST(EventTest, DISABLED_PerformanceMultiThread) {
80   static const int kNumIterations = 10000;
81   Event read;
82   Event write;
83   SignalerThread thread;
84   thread.Start(&read, &write);
85 
86   for (int i = 0; i < kNumIterations; ++i) {
87     write.Set();
88     read.Wait(Event::kForever);
89   }
90   write.Set();
91 
92   thread.Stop();
93 }
94 
95 }  // namespace rtc
96