Make semaphore.h a non-portable header
[folly.git] / folly / futures / test / SharedPromiseTest.cpp
1 /*
2  * Copyright 2017 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/futures/SharedPromise.h>
18 #include <folly/portability/GTest.h>
19
20 using namespace folly;
21
22 TEST(SharedPromise, setGet) {
23   SharedPromise<int> p;
24   p.setValue(1);
25   auto f1 = p.getFuture();
26   auto f2 = p.getFuture();
27   EXPECT_EQ(1, f1.value());
28   EXPECT_EQ(1, f2.value());
29 }
30 TEST(SharedPromise, getSet) {
31   SharedPromise<int> p;
32   auto f1 = p.getFuture();
33   auto f2 = p.getFuture();
34   p.setValue(1);
35   EXPECT_EQ(1, f1.value());
36   EXPECT_EQ(1, f2.value());
37 }
38
39 TEST(SharedPromise, getSetGet) {
40   SharedPromise<int> p;
41   auto f1 = p.getFuture();
42   p.setValue(1);
43   auto f2 = p.getFuture();
44   EXPECT_EQ(1, f1.value());
45   EXPECT_EQ(1, f2.value());
46 }
47
48 TEST(SharedPromise, reset) {
49   SharedPromise<int> p;
50
51   auto f1 = p.getFuture();
52   p.setValue(1);
53   EXPECT_EQ(1, f1.value());
54
55   p = SharedPromise<int>();
56   auto f2 = p.getFuture();
57   EXPECT_FALSE(f2.isReady());
58   p.setValue(2);
59   EXPECT_EQ(2, f2.value());
60 }
61
62 TEST(SharedPromise, getMoveSet) {
63   SharedPromise<int> p;
64   auto f = p.getFuture();
65   auto p2 = std::move(p);
66   p2.setValue(1);
67   EXPECT_EQ(1, f.value());
68 }
69
70 TEST(SharedPromise, setMoveGet) {
71   SharedPromise<int> p;
72   p.setValue(1);
73   auto p2 = std::move(p);
74   auto f = p2.getFuture();
75   EXPECT_EQ(1, f.value());
76 }
77
78 TEST(SharedPromise, moveSetGet) {
79   SharedPromise<int> p;
80   auto p2 = std::move(p);
81   p2.setValue(1);
82   auto f = p2.getFuture();
83   EXPECT_EQ(1, f.value());
84 }
85
86 TEST(SharedPromise, moveGetSet) {
87   SharedPromise<int> p;
88   auto p2 = std::move(p);
89   auto f = p2.getFuture();
90   p2.setValue(1);
91   EXPECT_EQ(1, f.value());
92 }
93
94 TEST(SharedPromise, moveMove) {
95   SharedPromise<std::shared_ptr<int>> p;
96   auto f1 = p.getFuture();
97   auto f2 = p.getFuture();
98   auto p2 = std::move(p);
99   p = std::move(p2);
100   p.setValue(std::make_shared<int>(1));
101 }
102
103 TEST(SharedPromise, setWith) {
104   SharedPromise<int> p;
105   p.setWith([]{ return 1; });
106   EXPECT_EQ(1, p.getFuture().value());
107 }
108
109 TEST(SharedPromise, isFulfilled) {
110   SharedPromise<int> p;
111   EXPECT_FALSE(p.isFulfilled());
112   auto p2 = std::move(p);
113   EXPECT_FALSE(p2.isFulfilled());
114   p2.setValue(1);
115   EXPECT_TRUE(p2.isFulfilled());
116   p = std::move(p2);
117   EXPECT_TRUE(p.isFulfilled());
118 }
119
120 TEST(SharedPromise, interruptHandler) {
121   SharedPromise<int> p;
122   bool flag = false;
123   p.setInterruptHandler([&](const exception_wrapper&) { flag = true; });
124   auto f = p.getFuture();
125   f.cancel();
126   EXPECT_TRUE(flag);
127 }