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>
18 #include <folly/test/BatonTestHelpers.h>
19 #include <folly/test/DeterministicSchedule.h>
20 #include <folly/portability/GTest.h>
24 using namespace folly;
25 using namespace folly::test;
26 using folly::detail::EmulatedFutexAtomic;
30 TEST(Baton, basic_single_poster_blocking) {
31 run_basic_test<std::atomic, true, true>();
32 run_basic_test<EmulatedFutexAtomic, true, true>();
33 run_basic_test<DeterministicAtomic, true, true>();
36 TEST(Baton, basic_single_poster_nonblocking) {
37 run_basic_test<std::atomic, true, false>();
38 run_basic_test<EmulatedFutexAtomic, true, false>();
39 run_basic_test<DeterministicAtomic, true, false>();
42 TEST(Baton, basic_multi_poster_blocking) {
43 run_basic_test<std::atomic, false, true>();
46 TEST(Baton, basic_multi_poster_nonblocking) {
47 run_basic_test<std::atomic, false, false>();
52 TEST(Baton, pingpong_single_poster_blocking) {
53 DSched sched(DSched::uniform(0));
55 run_pingpong_test<DeterministicAtomic, true, true>(1000);
58 TEST(Baton, pingpong_single_poster_nonblocking) {
59 DSched sched(DSched::uniform(0));
61 run_pingpong_test<DeterministicAtomic, true, false>(1000);
64 TEST(Baton, pingpong_multi_poster_blocking) {
65 DSched sched(DSched::uniform(0));
67 run_pingpong_test<DeterministicAtomic, false, true>(1000);
70 TEST(Baton, pingpong_multi_poster_nonblocking) {
71 DSched sched(DSched::uniform(0));
73 run_pingpong_test<DeterministicAtomic, false, false>(1000);
76 /// Timed wait tests - Nonblocking Baton does not support timed_wait()
78 // Timed wait basic system clock tests
80 TEST(Baton, timed_wait_basic_system_clock_single_poster) {
81 run_basic_timed_wait_tests<std::atomic, std::chrono::system_clock, true>();
82 run_basic_timed_wait_tests<
84 std::chrono::system_clock,
86 run_basic_timed_wait_tests<
88 std::chrono::system_clock,
92 TEST(Baton, timed_wait_basic_system_clock_multi_poster) {
93 run_basic_timed_wait_tests<std::atomic, std::chrono::system_clock, false>();
94 run_basic_timed_wait_tests<
96 std::chrono::system_clock,
98 run_basic_timed_wait_tests<
100 std::chrono::system_clock,
104 // Timed wait timeout system clock tests
106 TEST(Baton, timed_wait_timeout_system_clock_single_poster) {
107 run_timed_wait_tmo_tests<std::atomic, std::chrono::system_clock, true>();
108 run_timed_wait_tmo_tests<
110 std::chrono::system_clock,
112 run_timed_wait_tmo_tests<
114 std::chrono::system_clock,
118 TEST(Baton, timed_wait_timeout_system_clock_multi_poster) {
119 run_timed_wait_tmo_tests<std::atomic, std::chrono::system_clock, false>();
120 run_timed_wait_tmo_tests<
122 std::chrono::system_clock,
124 run_timed_wait_tmo_tests<
126 std::chrono::system_clock,
130 // Timed wait regular system clock tests
132 TEST(Baton, timed_wait_system_clock_single_poster) {
133 run_timed_wait_regular_test<std::atomic, std::chrono::system_clock, true>();
134 run_timed_wait_regular_test<
136 std::chrono::system_clock,
138 run_timed_wait_regular_test<
140 std::chrono::system_clock,
144 TEST(Baton, timed_wait_system_clock_multi_poster) {
145 run_timed_wait_regular_test<std::atomic, std::chrono::system_clock, false>();
146 run_timed_wait_regular_test<
148 std::chrono::system_clock,
150 run_timed_wait_regular_test<
152 std::chrono::system_clock,
156 // Timed wait basic steady clock tests
158 TEST(Baton, timed_wait_basic_steady_clock_single_poster) {
159 run_basic_timed_wait_tests<std::atomic, std::chrono::steady_clock, true>();
160 run_basic_timed_wait_tests<
162 std::chrono::steady_clock,
164 run_basic_timed_wait_tests<
166 std::chrono::steady_clock,
170 TEST(Baton, timed_wait_basic_steady_clock_multi_poster) {
171 run_basic_timed_wait_tests<std::atomic, std::chrono::steady_clock, false>();
172 run_basic_timed_wait_tests<
174 std::chrono::steady_clock,
176 run_basic_timed_wait_tests<
178 std::chrono::steady_clock,
182 // Timed wait timeout steady clock tests
184 TEST(Baton, timed_wait_timeout_steady_clock_single_poster) {
185 run_timed_wait_tmo_tests<std::atomic, std::chrono::steady_clock, true>();
186 run_timed_wait_tmo_tests<
188 std::chrono::steady_clock,
190 run_timed_wait_tmo_tests<
192 std::chrono::steady_clock,
196 TEST(Baton, timed_wait_timeout_steady_clock_multi_poster) {
197 run_timed_wait_tmo_tests<std::atomic, std::chrono::steady_clock, false>();
198 run_timed_wait_tmo_tests<
200 std::chrono::steady_clock,
202 run_timed_wait_tmo_tests<
204 std::chrono::steady_clock,
208 // Timed wait regular steady clock tests
210 TEST(Baton, timed_wait_steady_clock_single_poster) {
211 run_timed_wait_regular_test<std::atomic, std::chrono::steady_clock, true>();
212 run_timed_wait_regular_test<
214 std::chrono::steady_clock,
216 run_timed_wait_regular_test<
218 std::chrono::steady_clock,
222 TEST(Baton, timed_wait_steady_clock_multi_poster) {
223 run_timed_wait_regular_test<std::atomic, std::chrono::steady_clock, false>();
224 run_timed_wait_regular_test<
226 std::chrono::steady_clock,
228 run_timed_wait_regular_test<
230 std::chrono::steady_clock,
236 TEST(Baton, try_wait_single_poster_blocking) {
237 run_try_wait_tests<std::atomic, true, true>();
238 run_try_wait_tests<EmulatedFutexAtomic, true, true>();
239 run_try_wait_tests<DeterministicAtomic, true, true>();
242 TEST(Baton, try_wait_single_poster_nonblocking) {
243 run_try_wait_tests<std::atomic, true, false>();
244 run_try_wait_tests<EmulatedFutexAtomic, true, false>();
245 run_try_wait_tests<DeterministicAtomic, true, false>();
248 TEST(Baton, try_wait_multi_poster_blocking) {
249 run_try_wait_tests<std::atomic, false, true>();
250 run_try_wait_tests<EmulatedFutexAtomic, false, true>();
251 run_try_wait_tests<DeterministicAtomic, false, true>();
254 TEST(Baton, try_wait_multi_poster_nonblocking) {
255 run_try_wait_tests<std::atomic, false, false>();
256 run_try_wait_tests<EmulatedFutexAtomic, false, false>();
257 run_try_wait_tests<DeterministicAtomic, false, false>();
260 /// Multi-producer tests
262 TEST(Baton, multi_producer_single_poster_blocking) {
263 run_try_wait_tests<std::atomic, true, true>();
264 run_try_wait_tests<EmulatedFutexAtomic, true, true>();
265 run_try_wait_tests<DeterministicAtomic, true, true>();
268 TEST(Baton, multi_producer_single_poster_nonblocking) {
269 run_try_wait_tests<std::atomic, true, false>();
270 run_try_wait_tests<EmulatedFutexAtomic, true, false>();
271 run_try_wait_tests<DeterministicAtomic, true, false>();
274 TEST(Baton, multi_producer_multi_poster_blocking) {
275 run_try_wait_tests<std::atomic, false, true>();
276 run_try_wait_tests<EmulatedFutexAtomic, false, true>();
277 run_try_wait_tests<DeterministicAtomic, false, true>();
280 TEST(Baton, multi_producer_multi_poster_nonblocking) {
281 run_try_wait_tests<std::atomic, false, false>();
282 run_try_wait_tests<EmulatedFutexAtomic, false, false>();
283 run_try_wait_tests<DeterministicAtomic, false, false>();