2 * Copyright 2017 Facebook, Inc.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <folly/Baton.h>
21 #include <folly/portability/GTest.h>
22 #include <folly/test/BatonTestHelpers.h>
23 #include <folly/test/DeterministicSchedule.h>
25 using namespace folly;
26 using namespace folly::test;
27 using folly::detail::EmulatedFutexAtomic;
31 TEST(Baton, basic_single_poster_blocking) {
32 run_basic_test<std::atomic, true, true>();
33 run_basic_test<EmulatedFutexAtomic, true, true>();
34 run_basic_test<DeterministicAtomic, true, true>();
37 TEST(Baton, basic_single_poster_nonblocking) {
38 run_basic_test<std::atomic, true, false>();
39 run_basic_test<EmulatedFutexAtomic, true, false>();
40 run_basic_test<DeterministicAtomic, true, false>();
43 TEST(Baton, basic_multi_poster_blocking) {
44 run_basic_test<std::atomic, false, true>();
47 TEST(Baton, basic_multi_poster_nonblocking) {
48 run_basic_test<std::atomic, false, false>();
53 TEST(Baton, pingpong_single_poster_blocking) {
54 DSched sched(DSched::uniform(0));
56 run_pingpong_test<DeterministicAtomic, true, true>(1000);
59 TEST(Baton, pingpong_single_poster_nonblocking) {
60 DSched sched(DSched::uniform(0));
62 run_pingpong_test<DeterministicAtomic, true, false>(1000);
65 TEST(Baton, pingpong_multi_poster_blocking) {
66 DSched sched(DSched::uniform(0));
68 run_pingpong_test<DeterministicAtomic, false, true>(1000);
71 TEST(Baton, pingpong_multi_poster_nonblocking) {
72 DSched sched(DSched::uniform(0));
74 run_pingpong_test<DeterministicAtomic, false, false>(1000);
77 /// Timed wait tests - Nonblocking Baton does not support timed_wait()
79 // Timed wait basic system clock tests
81 TEST(Baton, timed_wait_basic_system_clock_single_poster) {
82 run_basic_timed_wait_tests<std::atomic, std::chrono::system_clock, true>();
83 run_basic_timed_wait_tests<
85 std::chrono::system_clock,
87 run_basic_timed_wait_tests<
89 std::chrono::system_clock,
93 TEST(Baton, timed_wait_basic_system_clock_multi_poster) {
94 run_basic_timed_wait_tests<std::atomic, std::chrono::system_clock, false>();
95 run_basic_timed_wait_tests<
97 std::chrono::system_clock,
99 run_basic_timed_wait_tests<
101 std::chrono::system_clock,
105 // Timed wait timeout system clock tests
107 TEST(Baton, timed_wait_timeout_system_clock_single_poster) {
108 run_timed_wait_tmo_tests<std::atomic, std::chrono::system_clock, true>();
109 run_timed_wait_tmo_tests<
111 std::chrono::system_clock,
113 run_timed_wait_tmo_tests<
115 std::chrono::system_clock,
119 TEST(Baton, timed_wait_timeout_system_clock_multi_poster) {
120 run_timed_wait_tmo_tests<std::atomic, std::chrono::system_clock, false>();
121 run_timed_wait_tmo_tests<
123 std::chrono::system_clock,
125 run_timed_wait_tmo_tests<
127 std::chrono::system_clock,
131 // Timed wait regular system clock tests
133 TEST(Baton, timed_wait_system_clock_single_poster) {
134 run_timed_wait_regular_test<std::atomic, std::chrono::system_clock, true>();
135 run_timed_wait_regular_test<
137 std::chrono::system_clock,
139 run_timed_wait_regular_test<
141 std::chrono::system_clock,
145 TEST(Baton, timed_wait_system_clock_multi_poster) {
146 run_timed_wait_regular_test<std::atomic, std::chrono::system_clock, false>();
147 run_timed_wait_regular_test<
149 std::chrono::system_clock,
151 run_timed_wait_regular_test<
153 std::chrono::system_clock,
157 // Timed wait basic steady clock tests
159 TEST(Baton, timed_wait_basic_steady_clock_single_poster) {
160 run_basic_timed_wait_tests<std::atomic, std::chrono::steady_clock, true>();
161 run_basic_timed_wait_tests<
163 std::chrono::steady_clock,
165 run_basic_timed_wait_tests<
167 std::chrono::steady_clock,
171 TEST(Baton, timed_wait_basic_steady_clock_multi_poster) {
172 run_basic_timed_wait_tests<std::atomic, std::chrono::steady_clock, false>();
173 run_basic_timed_wait_tests<
175 std::chrono::steady_clock,
177 run_basic_timed_wait_tests<
179 std::chrono::steady_clock,
183 // Timed wait timeout steady clock tests
185 TEST(Baton, timed_wait_timeout_steady_clock_single_poster) {
186 run_timed_wait_tmo_tests<std::atomic, std::chrono::steady_clock, true>();
187 run_timed_wait_tmo_tests<
189 std::chrono::steady_clock,
191 run_timed_wait_tmo_tests<
193 std::chrono::steady_clock,
197 TEST(Baton, timed_wait_timeout_steady_clock_multi_poster) {
198 run_timed_wait_tmo_tests<std::atomic, std::chrono::steady_clock, false>();
199 run_timed_wait_tmo_tests<
201 std::chrono::steady_clock,
203 run_timed_wait_tmo_tests<
205 std::chrono::steady_clock,
209 // Timed wait regular steady clock tests
211 TEST(Baton, timed_wait_steady_clock_single_poster) {
212 run_timed_wait_regular_test<std::atomic, std::chrono::steady_clock, true>();
213 run_timed_wait_regular_test<
215 std::chrono::steady_clock,
217 run_timed_wait_regular_test<
219 std::chrono::steady_clock,
223 TEST(Baton, timed_wait_steady_clock_multi_poster) {
224 run_timed_wait_regular_test<std::atomic, std::chrono::steady_clock, false>();
225 run_timed_wait_regular_test<
227 std::chrono::steady_clock,
229 run_timed_wait_regular_test<
231 std::chrono::steady_clock,
237 TEST(Baton, try_wait_single_poster_blocking) {
238 run_try_wait_tests<std::atomic, true, true>();
239 run_try_wait_tests<EmulatedFutexAtomic, true, true>();
240 run_try_wait_tests<DeterministicAtomic, true, true>();
243 TEST(Baton, try_wait_single_poster_nonblocking) {
244 run_try_wait_tests<std::atomic, true, false>();
245 run_try_wait_tests<EmulatedFutexAtomic, true, false>();
246 run_try_wait_tests<DeterministicAtomic, true, false>();
249 TEST(Baton, try_wait_multi_poster_blocking) {
250 run_try_wait_tests<std::atomic, false, true>();
251 run_try_wait_tests<EmulatedFutexAtomic, false, true>();
252 run_try_wait_tests<DeterministicAtomic, false, true>();
255 TEST(Baton, try_wait_multi_poster_nonblocking) {
256 run_try_wait_tests<std::atomic, false, false>();
257 run_try_wait_tests<EmulatedFutexAtomic, false, false>();
258 run_try_wait_tests<DeterministicAtomic, false, false>();
261 /// Multi-producer tests
263 TEST(Baton, multi_producer_single_poster_blocking) {
264 run_try_wait_tests<std::atomic, true, true>();
265 run_try_wait_tests<EmulatedFutexAtomic, true, true>();
266 run_try_wait_tests<DeterministicAtomic, true, true>();
269 TEST(Baton, multi_producer_single_poster_nonblocking) {
270 run_try_wait_tests<std::atomic, true, false>();
271 run_try_wait_tests<EmulatedFutexAtomic, true, false>();
272 run_try_wait_tests<DeterministicAtomic, true, false>();
275 TEST(Baton, multi_producer_multi_poster_blocking) {
276 run_try_wait_tests<std::atomic, false, true>();
277 run_try_wait_tests<EmulatedFutexAtomic, false, true>();
278 run_try_wait_tests<DeterministicAtomic, false, true>();
281 TEST(Baton, multi_producer_multi_poster_nonblocking) {
282 run_try_wait_tests<std::atomic, false, false>();
283 run_try_wait_tests<EmulatedFutexAtomic, false, false>();
284 run_try_wait_tests<DeterministicAtomic, false, false>();