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