blob: 17f50dc2d1562d7c3be2adcd6e97054612219edf [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:261/*
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 04:47:3111#include "rtc_base/event.h"
Yves Gerey3e707812018-11-28 15:47:4912
Markus Handell2cfc1af2022-08-19 08:16:4813#include "api/units/time_delta.h"
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3814#include "rtc_base/platform_thread.h"
Markus Handell1d5be492022-08-18 13:49:0915#include "system_wrappers/include/clock.h"
Yves Gerey3e707812018-11-28 15:47:4916#include "test/gtest.h"
henrike@webrtc.orgf0488722014-05-13 18:00:2617
18namespace rtc {
19
20TEST(EventTest, InitiallySignaled) {
21 Event event(false, true);
Markus Handell2cfc1af2022-08-19 08:16:4822 ASSERT_TRUE(event.Wait(webrtc::TimeDelta::Zero()));
henrike@webrtc.orgf0488722014-05-13 18:00:2623}
24
25TEST(EventTest, ManualReset) {
26 Event event(true, false);
Markus Handell2cfc1af2022-08-19 08:16:4827 ASSERT_FALSE(event.Wait(webrtc::TimeDelta::Zero()));
henrike@webrtc.orgf0488722014-05-13 18:00:2628
29 event.Set();
Markus Handell2cfc1af2022-08-19 08:16:4830 ASSERT_TRUE(event.Wait(webrtc::TimeDelta::Zero()));
31 ASSERT_TRUE(event.Wait(webrtc::TimeDelta::Zero()));
henrike@webrtc.orgf0488722014-05-13 18:00:2632
33 event.Reset();
Markus Handell2cfc1af2022-08-19 08:16:4834 ASSERT_FALSE(event.Wait(webrtc::TimeDelta::Zero()));
henrike@webrtc.orgf0488722014-05-13 18:00:2635}
36
37TEST(EventTest, AutoReset) {
Niels Möllerc572ff32018-11-07 07:43:5038 Event event;
Markus Handell2cfc1af2022-08-19 08:16:4839 ASSERT_FALSE(event.Wait(webrtc::TimeDelta::Zero()));
henrike@webrtc.orgf0488722014-05-13 18:00:2640
41 event.Set();
Markus Handell2cfc1af2022-08-19 08:16:4842 ASSERT_TRUE(event.Wait(webrtc::TimeDelta::Zero()));
43 ASSERT_FALSE(event.Wait(webrtc::TimeDelta::Zero()));
henrike@webrtc.orgf0488722014-05-13 18:00:2644}
45
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3846class SignalerThread {
Yves Gerey665174f2018-06-19 13:03:0547 public:
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3848 void Start(Event* writer, Event* reader) {
49 writer_ = writer;
50 reader_ = reader;
Markus Handellad5037b2021-05-07 13:02:3651 thread_ = PlatformThread::SpawnJoinable(
52 [this] {
Markus Handell2cfc1af2022-08-19 08:16:4853 while (!stop_event_.Wait(webrtc::TimeDelta::Zero())) {
Markus Handellad5037b2021-05-07 13:02:3654 writer_->Set();
55 reader_->Wait(Event::kForever);
56 }
57 },
58 "EventPerf");
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3859 }
60 void Stop() {
61 stop_event_.Set();
Markus Handellad5037b2021-05-07 13:02:3662 thread_.Finalize();
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3863 }
Niels Möllerc572ff32018-11-07 07:43:5064 Event stop_event_;
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3865 Event* writer_;
66 Event* reader_;
67 PlatformThread thread_;
68};
69
Markus Handell1d5be492022-08-18 13:49:0970TEST(EventTest, UnsignaledWaitDoesNotReturnBeforeTimeout) {
71 constexpr webrtc::TimeDelta kDuration = webrtc::TimeDelta::Micros(10'499);
72 Event event;
73 auto begin = webrtc::Clock::GetRealTimeClock()->CurrentTime();
74 EXPECT_FALSE(event.Wait(kDuration));
75 EXPECT_GE(webrtc::Clock::GetRealTimeClock()->CurrentTime(),
76 begin + kDuration);
77}
78
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3879// These tests are disabled by default and only intended to be run manually.
Kári Tristan Helgasonce15cd32017-11-27 12:18:1880TEST(EventTest, DISABLED_PerformanceSingleThread) {
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3881 static const int kNumIterations = 10000000;
Niels Möllerc572ff32018-11-07 07:43:5082 Event event;
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3883 for (int i = 0; i < kNumIterations; ++i) {
84 event.Set();
Markus Handell2cfc1af2022-08-19 08:16:4885 event.Wait(webrtc::TimeDelta::Zero());
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3886 }
87}
88
Kári Tristan Helgasonce15cd32017-11-27 12:18:1889TEST(EventTest, DISABLED_PerformanceMultiThread) {
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3890 static const int kNumIterations = 10000;
Niels Möllerc572ff32018-11-07 07:43:5091 Event read;
92 Event write;
Kári Tristan Helgasonc5975bf2017-11-20 14:31:3893 SignalerThread thread;
94 thread.Start(&read, &write);
95
96 for (int i = 0; i < kNumIterations; ++i) {
97 write.Set();
98 read.Wait(Event::kForever);
99 }
100 write.Set();
101
102 thread.Stop();
103}
104
Tommi2fc37572022-10-24 07:22:16105#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
106// Tests that we crash if we attempt to call rtc::Event::Wait while we're
107// not allowed to (as per `RTC_DISALLOW_WAIT()`).
108TEST(EventTestDeathTest, DisallowEventWait) {
109 Event event;
110 RTC_DISALLOW_WAIT();
111 EXPECT_DEATH(event.Wait(Event::kForever), "");
112}
113#endif // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
114
henrike@webrtc.orgf0488722014-05-13 18:00:26115} // namespace rtc