eaeb5ad69a2c768ab4624fb08cb11d03d05b7547
[folly.git] / folly / test / BatonTest.cpp
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
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
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 #include <folly/Baton.h>
18 #include <folly/test/BatonTestHelpers.h>
19 #include <folly/test/DeterministicSchedule.h>
20 #include <thread>
21 #include <semaphore.h>
22 #include <gtest/gtest.h>
23
24 using namespace folly;
25 using namespace folly::test;
26 using folly::detail::EmulatedFutexAtomic;
27
28 TEST(Baton, basic) {
29   Baton<> b;
30   b.post();
31   b.wait();
32 }
33
34 TEST(Baton, pingpong) {
35   DSched sched(DSched::uniform(0));
36
37   run_pingpong_test<DeterministicAtomic>(1000);
38 }
39
40 TEST(Baton, timed_wait_basic_system_clock) {
41   run_basic_timed_wait_tests<std::atomic, std::chrono::system_clock>();
42   run_basic_timed_wait_tests<EmulatedFutexAtomic, std::chrono::system_clock>();
43   run_basic_timed_wait_tests<DeterministicAtomic, std::chrono::system_clock>();
44 }
45
46 TEST(Baton, timed_wait_timeout_system_clock) {
47   run_timed_wait_tmo_tests<std::atomic, std::chrono::system_clock>();
48   run_timed_wait_tmo_tests<EmulatedFutexAtomic, std::chrono::system_clock>();
49   run_timed_wait_tmo_tests<DeterministicAtomic, std::chrono::system_clock>();
50 }
51
52 TEST(Baton, timed_wait_system_clock) {
53   run_timed_wait_regular_test<std::atomic, std::chrono::system_clock>();
54   run_timed_wait_regular_test<EmulatedFutexAtomic, std::chrono::system_clock>();
55   run_timed_wait_regular_test<DeterministicAtomic, std::chrono::system_clock>();
56 }
57
58 TEST(Baton, timed_wait_basic_steady_clock) {
59   run_basic_timed_wait_tests<std::atomic, std::chrono::steady_clock>();
60   run_basic_timed_wait_tests<EmulatedFutexAtomic, std::chrono::steady_clock>();
61   run_basic_timed_wait_tests<DeterministicAtomic, std::chrono::steady_clock>();
62 }
63
64 TEST(Baton, timed_wait_timeout_steady_clock) {
65   run_timed_wait_tmo_tests<std::atomic, std::chrono::steady_clock>();
66   run_timed_wait_tmo_tests<EmulatedFutexAtomic, std::chrono::steady_clock>();
67   run_timed_wait_tmo_tests<DeterministicAtomic, std::chrono::steady_clock>();
68 }
69
70 TEST(Baton, timed_wait_steady_clock) {
71   run_timed_wait_regular_test<std::atomic, std::chrono::steady_clock>();
72   run_timed_wait_regular_test<EmulatedFutexAtomic, std::chrono::steady_clock>();
73   run_timed_wait_regular_test<DeterministicAtomic, std::chrono::steady_clock>();
74 }
75
76 TEST(Baton, try_wait) {
77   run_try_wait_tests<std::atomic>();
78   run_try_wait_tests<EmulatedFutexAtomic>();
79   run_try_wait_tests<DeterministicAtomic>();
80 }