1/*
2 * Copyright 2015-present 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
20using namespace folly;
21
22TEST(SharedPromise, setGetSemiFuture) {
23 SharedPromise<int> p;
24 p.setValue(1);
25 auto f1 = p.getSemiFuture();
26 auto f2 = p.getSemiFuture();
27 EXPECT_EQ(1, f1.value());
28 EXPECT_EQ(1, f2.value());
29}
30
31TEST(SharedPromise, setGetMixed) {
32 SharedPromise<int> p;
33 p.setValue(1);
34 auto f1 = p.getSemiFuture();
35 auto f2 = p.getFuture();
36 EXPECT_EQ(1, f1.value());
37 EXPECT_EQ(1, f2.value());
38}
39
40TEST(SharedPromise, setGet) {
41 SharedPromise<int> p;
42 p.setValue(1);
43 auto f1 = p.getFuture();
44 auto f2 = p.getFuture();
45 EXPECT_EQ(1, f1.value());
46 EXPECT_EQ(1, f2.value());
47}
48TEST(SharedPromise, getSet) {
49 SharedPromise<int> p;
50 auto f1 = p.getFuture();
51 auto f2 = p.getFuture();
52 p.setValue(1);
53 EXPECT_EQ(1, f1.value());
54 EXPECT_EQ(1, f2.value());
55}
56
57TEST(SharedPromise, getSetGet) {
58 SharedPromise<int> p;
59 auto f1 = p.getFuture();
60 p.setValue(1);
61 auto f2 = p.getFuture();
62 EXPECT_EQ(1, f1.value());
63 EXPECT_EQ(1, f2.value());
64}
65
66TEST(SharedPromise, reset) {
67 SharedPromise<int> p;
68
69 auto f1 = p.getFuture();
70 p.setValue(1);
71 EXPECT_EQ(1, f1.value());
72
73 p = SharedPromise<int>();
74 auto f2 = p.getFuture();
75 EXPECT_FALSE(f2.isReady());
76 p.setValue(2);
77 EXPECT_EQ(2, f2.value());
78}
79
80TEST(SharedPromise, getMoveSet) {
81 SharedPromise<int> p;
82 auto f = p.getFuture();
83 auto p2 = std::move(p);
84 p2.setValue(1);
85 EXPECT_EQ(1, f.value());
86}
87
88TEST(SharedPromise, setMoveGet) {
89 SharedPromise<int> p;
90 p.setValue(1);
91 auto p2 = std::move(p);
92 auto f = p2.getFuture();
93 EXPECT_EQ(1, f.value());
94}
95
96TEST(SharedPromise, moveSetGet) {
97 SharedPromise<int> p;
98 auto p2 = std::move(p);
99 p2.setValue(1);
100 auto f = p2.getFuture();
101 EXPECT_EQ(1, f.value());
102}
103
104TEST(SharedPromise, moveGetSet) {
105 SharedPromise<int> p;
106 auto p2 = std::move(p);
107 auto f = p2.getFuture();
108 p2.setValue(1);
109 EXPECT_EQ(1, f.value());
110}
111
112TEST(SharedPromise, moveMove) {
113 SharedPromise<std::shared_ptr<int>> p;
114 auto f1 = p.getFuture();
115 auto f2 = p.getFuture();
116 auto p2 = std::move(p);
117 EXPECT_EQ(2, p2.size());
118 p = std::move(p2);
119 EXPECT_EQ(0, p2.size());
120 p.setValue(std::make_shared<int>(1));
121}
122
123TEST(SharedPromise, setWith) {
124 SharedPromise<int> p;
125 p.setWith([] { return 1; });
126 EXPECT_EQ(1, p.getFuture().value());
127}
128
129TEST(SharedPromise, isFulfilled) {
130 SharedPromise<int> p;
131 EXPECT_FALSE(p.isFulfilled());
132 auto p2 = std::move(p);
133 EXPECT_FALSE(p2.isFulfilled());
134 p2.setValue(1);
135 EXPECT_TRUE(p2.isFulfilled());
136 p = std::move(p2);
137 EXPECT_TRUE(p.isFulfilled());
138 EXPECT_FALSE(p2.isFulfilled());
139}
140
141TEST(SharedPromise, interruptHandler) {
142 SharedPromise<int> p;
143 bool flag = false;
144 p.setInterruptHandler([&](const exception_wrapper&) { flag = true; });
145 auto f = p.getFuture();
146 f.cancel();
147 EXPECT_TRUE(flag);
148}
149