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/futures/FutureSplitter.h>
18 #include <folly/portability/GTest.h>
20 using namespace folly;
22 TEST(FutureSplitter, splitFutureSuccess) {
24 FutureSplitter<int> sp(p.getFuture());
25 auto f1 = sp.getFuture();
26 EXPECT_FALSE(f1.isReady());
28 EXPECT_TRUE(f1.isReady());
29 EXPECT_TRUE(f1.hasValue());
30 auto f2 = sp.getFuture();
31 EXPECT_TRUE(f2.isReady());
32 EXPECT_TRUE(f2.hasValue());
35 TEST(FutureSplitter, splitFutureCopyable) {
37 FutureSplitter<int> sp1(p.getFuture());
38 FutureSplitter<int> sp2(sp1);
39 auto f1 = sp1.getFuture();
40 EXPECT_FALSE(f1.isReady());
42 EXPECT_TRUE(f1.isReady());
43 EXPECT_TRUE(f1.hasValue());
44 auto f2 = sp2.getFuture();
45 EXPECT_TRUE(f2.isReady());
46 EXPECT_TRUE(f2.hasValue());
47 FutureSplitter<int> sp3(sp1);
48 auto f3 = sp3.getFuture();
49 EXPECT_TRUE(f3.isReady());
50 EXPECT_TRUE(f3.hasValue());
53 TEST(FutureSplitter, splitFutureMovable) {
55 FutureSplitter<int> sp1(p.getFuture());
56 auto f1 = sp1.getFuture();
57 FutureSplitter<int> sp2(std::move(sp1));
58 EXPECT_FALSE(f1.isReady());
60 EXPECT_TRUE(f1.isReady());
61 EXPECT_TRUE(f1.hasValue());
62 auto f2 = sp2.getFuture();
63 EXPECT_TRUE(f2.isReady());
64 EXPECT_TRUE(f2.hasValue());
65 FutureSplitter<int> sp3(std::move(sp2));
66 auto f3 = sp3.getFuture();
67 EXPECT_TRUE(f3.isReady());
68 EXPECT_TRUE(f3.hasValue());
71 TEST(FutureSplitter, splitFutureCopyAssignable) {
73 FutureSplitter<int> sp1(p.getFuture());
74 FutureSplitter<int> sp2{};
76 auto f1 = sp1.getFuture();
77 EXPECT_FALSE(f1.isReady());
79 EXPECT_TRUE(f1.isReady());
80 EXPECT_TRUE(f1.hasValue());
81 auto f2 = sp2.getFuture();
82 EXPECT_TRUE(f2.isReady());
83 EXPECT_TRUE(f2.hasValue());
84 FutureSplitter<int> sp3(sp1);
85 auto f3 = sp3.getFuture();
86 EXPECT_TRUE(f3.isReady());
87 EXPECT_TRUE(f3.hasValue());
90 TEST(FutureSplitter, splitFutureMoveAssignable) {
92 FutureSplitter<int> sp1(p.getFuture());
93 auto f1 = sp1.getFuture();
94 FutureSplitter<int> sp2{};
96 EXPECT_FALSE(f1.isReady());
98 EXPECT_TRUE(f1.isReady());
99 EXPECT_TRUE(f1.hasValue());
100 auto f2 = sp2.getFuture();
101 EXPECT_TRUE(f2.isReady());
102 EXPECT_TRUE(f2.hasValue());
103 FutureSplitter<int> sp3(std::move(sp2));
104 auto f3 = sp3.getFuture();
105 EXPECT_TRUE(f3.isReady());
106 EXPECT_TRUE(f3.hasValue());
109 TEST(FutureSplitter, splitFutureScope) {
111 auto pSP = std::make_unique<FutureSplitter<int>>(p.getFuture());
112 auto f1 = pSP->getFuture();
113 EXPECT_FALSE(f1.isReady());
115 EXPECT_NO_THROW(EXPECT_FALSE(f1.isReady()));
117 EXPECT_TRUE(f1.isReady());
118 EXPECT_TRUE(f1.hasValue());
119 EXPECT_EQ(1, f1.get());
122 TEST(FutureSplitter, splitFutureFailure) {
124 FutureSplitter<int> sp(p.getFuture());
125 auto f1 = sp.getFuture();
126 EXPECT_FALSE(f1.isReady());
128 throw std::runtime_error("Oops");
129 } catch (std::exception& e) {
130 p.setException(exception_wrapper(std::current_exception(), e));
132 EXPECT_TRUE(f1.isReady());
133 EXPECT_TRUE(f1.hasException());
134 auto f2 = sp.getFuture();
135 EXPECT_TRUE(f2.isReady());
136 EXPECT_TRUE(f2.hasException());