blob: 099665abd8c00c8c6b692fb6a48c33f88833a21a [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "rtc_base/event.h"
Yves Gerey3e707812018-11-28 16:47:49 +010012
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010013#include "rtc_base/platform_thread.h"
Markus Handell1d5be492022-08-18 13:49:09 +000014#include "system_wrappers/include/clock.h"
Yves Gerey3e707812018-11-28 16:47:49 +010015#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000016
17namespace rtc {
18
19TEST(EventTest, InitiallySignaled) {
20 Event event(false, true);
21 ASSERT_TRUE(event.Wait(0));
22}
23
24TEST(EventTest, ManualReset) {
25 Event event(true, false);
26 ASSERT_FALSE(event.Wait(0));
27
28 event.Set();
29 ASSERT_TRUE(event.Wait(0));
30 ASSERT_TRUE(event.Wait(0));
31
32 event.Reset();
33 ASSERT_FALSE(event.Wait(0));
34}
35
36TEST(EventTest, AutoReset) {
Niels Möllerc572ff32018-11-07 08:43:50 +010037 Event event;
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000038 ASSERT_FALSE(event.Wait(0));
39
40 event.Set();
41 ASSERT_TRUE(event.Wait(0));
42 ASSERT_FALSE(event.Wait(0));
43}
44
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010045class SignalerThread {
Yves Gerey665174f2018-06-19 15:03:05 +020046 public:
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010047 void Start(Event* writer, Event* reader) {
48 writer_ = writer;
49 reader_ = reader;
Markus Handellad5037b2021-05-07 15:02:36 +020050 thread_ = PlatformThread::SpawnJoinable(
51 [this] {
52 while (!stop_event_.Wait(0)) {
53 writer_->Set();
54 reader_->Wait(Event::kForever);
55 }
56 },
57 "EventPerf");
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010058 }
59 void Stop() {
60 stop_event_.Set();
Markus Handellad5037b2021-05-07 15:02:36 +020061 thread_.Finalize();
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010062 }
Niels Möllerc572ff32018-11-07 08:43:50 +010063 Event stop_event_;
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010064 Event* writer_;
65 Event* reader_;
66 PlatformThread thread_;
67};
68
Markus Handell1d5be492022-08-18 13:49:09 +000069TEST(EventTest, UnsignaledWaitDoesNotReturnBeforeTimeout) {
70 constexpr webrtc::TimeDelta kDuration = webrtc::TimeDelta::Micros(10'499);
71 Event event;
72 auto begin = webrtc::Clock::GetRealTimeClock()->CurrentTime();
73 EXPECT_FALSE(event.Wait(kDuration));
74 EXPECT_GE(webrtc::Clock::GetRealTimeClock()->CurrentTime(),
75 begin + kDuration);
76}
77
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010078// These tests are disabled by default and only intended to be run manually.
Kári Tristan Helgasonce15cd32017-11-27 13:18:18 +010079TEST(EventTest, DISABLED_PerformanceSingleThread) {
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010080 static const int kNumIterations = 10000000;
Niels Möllerc572ff32018-11-07 08:43:50 +010081 Event event;
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010082 for (int i = 0; i < kNumIterations; ++i) {
83 event.Set();
84 event.Wait(0);
85 }
86}
87
Kári Tristan Helgasonce15cd32017-11-27 13:18:18 +010088TEST(EventTest, DISABLED_PerformanceMultiThread) {
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010089 static const int kNumIterations = 10000;
Niels Möllerc572ff32018-11-07 08:43:50 +010090 Event read;
91 Event write;
Kári Tristan Helgasonc5975bf2017-11-20 15:31:38 +010092 SignalerThread thread;
93 thread.Start(&read, &write);
94
95 for (int i = 0; i < kNumIterations; ++i) {
96 write.Set();
97 read.Wait(Event::kForever);
98 }
99 write.Set();
100
101 thread.Stop();
102}
103
henrike@webrtc.orgf0488722014-05-13 18:00:26 +0000104} // namespace rtc