2 * Copyright 2014 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.
19 #include <folly/small_vector.h>
20 #include <gtest/gtest.h>
24 #include <type_traits>
26 #include <folly/Memory.h>
27 #include <folly/Executor.h>
28 #include <folly/futures/Future.h>
29 #include <folly/futures/ManualExecutor.h>
30 #include <folly/futures/DrivableExecutor.h>
31 #include <folly/MPMCQueue.h>
33 #include <folly/io/async/EventBase.h>
34 #include <folly/io/async/Request.h>
36 using namespace folly;
39 using std::unique_ptr;
41 using std::chrono::milliseconds;
43 #define EXPECT_TYPE(x, T) \
44 EXPECT_TRUE((std::is_same<decltype(x), T>::value))
46 /// Simple executor that does work in another thread
47 class ThreadExecutor : public Executor {
48 folly::MPMCQueue<Func> funcs;
49 std::atomic<bool> done {false};
57 while (!funcs.isEmpty()) {
58 funcs.blockingRead(fn);
65 explicit ThreadExecutor(size_t n = 1024)
66 : funcs(n), worker(std::bind(&ThreadExecutor::work, this)) {}
74 void add(Func fn) override {
75 funcs.blockingWrite(std::move(fn));
78 void waitForStartup() {
83 typedef FutureException eggs_t;
84 static eggs_t eggs("eggs");
88 TEST(Future, coreSize) {
89 // If this number goes down, it's fine!
90 // If it goes up, please seek professional advice ;-)
92 if (sizeof(folly::exception_wrapper) == 80) {
93 // it contains strings, which can be bigger for -fb builds (e.g. fbstring)
96 EXPECT_EQ(size, sizeof(detail::Core<void>));
101 TEST(Future, onError) {
102 bool theFlag = false;
103 auto flag = [&]{ theFlag = true; };
104 #define EXPECT_FLAG() \
106 EXPECT_TRUE(theFlag); \
110 #define EXPECT_NO_FLAG() \
112 EXPECT_FALSE(theFlag); \
118 auto f = makeFuture()
119 .then([] { throw eggs; })
120 .onError([&] (eggs_t& e) { flag(); });
122 EXPECT_NO_THROW(f.value());
126 auto f = makeFuture()
127 .then([] { throw eggs; })
128 .onError([&] (eggs_t& e) { flag(); return makeFuture(); });
130 EXPECT_NO_THROW(f.value());
135 auto f = makeFuture()
136 .then([] { throw eggs; })
137 .onError([&] (eggs_t e) { flag(); });
139 EXPECT_NO_THROW(f.value());
143 auto f = makeFuture()
144 .then([] { throw eggs; })
145 .onError([&] (eggs_t e) { flag(); return makeFuture(); });
147 EXPECT_NO_THROW(f.value());
152 auto f = makeFuture()
153 .then([] { throw eggs; })
154 .onError([&] (std::exception& e) { flag(); });
156 EXPECT_NO_THROW(f.value());
160 auto f = makeFuture()
161 .then([] { throw eggs; })
162 .onError([&] (std::exception& e) { flag(); return makeFuture(); });
164 EXPECT_NO_THROW(f.value());
169 auto f = makeFuture()
170 .then([] { throw -1; })
171 .onError([&] (int e) { flag(); });
173 EXPECT_NO_THROW(f.value());
177 auto f = makeFuture()
178 .then([] { throw -1; })
179 .onError([&] (int e) { flag(); return makeFuture(); });
181 EXPECT_NO_THROW(f.value());
186 auto f = makeFuture()
187 .then([] { throw eggs; })
188 .onError([&] (eggs_t& e) mutable { flag(); });
190 EXPECT_NO_THROW(f.value());
194 auto f = makeFuture()
195 .then([] { throw eggs; })
196 .onError([&] (eggs_t& e) mutable { flag(); return makeFuture(); });
198 EXPECT_NO_THROW(f.value());
203 auto f = makeFuture()
204 .then([] { return 42; })
205 .onError([&] (eggs_t& e) { flag(); return -1; });
207 EXPECT_EQ(42, f.value());
211 auto f = makeFuture()
212 .then([] { return 42; })
213 .onError([&] (eggs_t& e) { flag(); return makeFuture<int>(-1); });
215 EXPECT_EQ(42, f.value());
218 // Catch different exception
220 auto f = makeFuture()
221 .then([] { throw eggs; })
222 .onError([&] (std::runtime_error& e) { flag(); });
224 EXPECT_THROW(f.value(), eggs_t);
228 auto f = makeFuture()
229 .then([] { throw eggs; })
230 .onError([&] (std::runtime_error& e) { flag(); return makeFuture(); });
232 EXPECT_THROW(f.value(), eggs_t);
235 // Returned value propagates
237 auto f = makeFuture()
238 .then([] { throw eggs; return 0; })
239 .onError([&] (eggs_t& e) { return 42; });
240 EXPECT_EQ(42, f.value());
243 // Returned future propagates
245 auto f = makeFuture()
246 .then([] { throw eggs; return 0; })
247 .onError([&] (eggs_t& e) { return makeFuture<int>(42); });
248 EXPECT_EQ(42, f.value());
253 auto f = makeFuture()
254 .then([] { throw eggs; return 0; })
255 .onError([&] (eggs_t& e) { throw e; return -1; });
256 EXPECT_THROW(f.value(), eggs_t);
260 auto f = makeFuture()
261 .then([] { throw eggs; return 0; })
262 .onError([&] (eggs_t& e) { throw e; return makeFuture<int>(-1); });
263 EXPECT_THROW(f.value(), eggs_t);
280 Try<A> t_a(std::move(a));
284 EXPECT_EQ(5, t_a.value().x());
287 TEST(Future, special) {
288 EXPECT_FALSE(std::is_copy_constructible<Future<int>>::value);
289 EXPECT_FALSE(std::is_copy_assignable<Future<int>>::value);
290 EXPECT_TRUE(std::is_move_constructible<Future<int>>::value);
291 EXPECT_TRUE(std::is_move_assignable<Future<int>>::value);
295 auto f = makeFuture<string>("0")
296 .then([](){ return makeFuture<string>("1"); })
297 .then([](Try<string>&& t) { return makeFuture(t.value() + ";2"); })
298 .then([](const Try<string>&& t) { return makeFuture(t.value() + ";3"); })
299 .then([](Try<string>& t) { return makeFuture(t.value() + ";4"); })
300 .then([](const Try<string>& t) { return makeFuture(t.value() + ";5"); })
301 .then([](Try<string> t) { return makeFuture(t.value() + ";6"); })
302 .then([](const Try<string> t) { return makeFuture(t.value() + ";7"); })
303 .then([](string&& s) { return makeFuture(s + ";8"); })
304 .then([](const string&& s) { return makeFuture(s + ";9"); })
305 .then([](string& s) { return makeFuture(s + ";10"); })
306 .then([](const string& s) { return makeFuture(s + ";11"); })
307 .then([](string s) { return makeFuture(s + ";12"); })
308 .then([](const string s) { return makeFuture(s + ";13"); })
310 EXPECT_EQ(f.value(), "1;2;3;4;5;6;7;8;9;10;11;12;13");
313 TEST(Future, thenTry) {
316 makeFuture<int>(42).then([&](Try<int>&& t) {
318 EXPECT_EQ(42, t.value());
320 EXPECT_TRUE(flag); flag = false;
323 .then([](Try<int>&& t) { return t.value(); })
324 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
325 EXPECT_TRUE(flag); flag = false;
327 makeFuture().then([&](Try<void>&& t) { flag = true; t.value(); });
328 EXPECT_TRUE(flag); flag = false;
331 auto f = p.getFuture().then([&](Try<void>&& t) { flag = true; });
333 EXPECT_FALSE(f.isReady());
336 EXPECT_TRUE(f.isReady());
339 TEST(Future, thenValue) {
341 makeFuture<int>(42).then([&](int i){
345 EXPECT_TRUE(flag); flag = false;
348 .then([](int i){ return i; })
349 .then([&](int i) { flag = true; EXPECT_EQ(42, i); });
350 EXPECT_TRUE(flag); flag = false;
352 makeFuture().then([&]{
355 EXPECT_TRUE(flag); flag = false;
357 auto f = makeFuture<int>(eggs).then([&](int i){});
358 EXPECT_THROW(f.value(), eggs_t);
360 f = makeFuture<void>(eggs).then([&]{});
361 EXPECT_THROW(f.value(), eggs_t);
364 TEST(Future, thenValueFuture) {
367 .then([](int i){ return makeFuture<int>(std::move(i)); })
368 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
369 EXPECT_TRUE(flag); flag = false;
372 .then([]{ return makeFuture(); })
373 .then([&](Try<void>&& t) { flag = true; });
374 EXPECT_TRUE(flag); flag = false;
377 static string doWorkStatic(Try<string>&& t) {
378 return t.value() + ";static";
381 TEST(Future, thenFunction) {
383 string doWork(Try<string>&& t) {
384 return t.value() + ";class";
386 static string doWorkStatic(Try<string>&& t) {
387 return t.value() + ";class-static";
391 auto f = makeFuture<string>("start")
393 .then(Worker::doWorkStatic)
394 .then(&Worker::doWork, &w);
396 EXPECT_EQ(f.value(), "start;static;class-static;class");
399 static Future<string> doWorkStaticFuture(Try<string>&& t) {
400 return makeFuture(t.value() + ";static");
403 TEST(Future, thenFunctionFuture) {
405 Future<string> doWorkFuture(Try<string>&& t) {
406 return makeFuture(t.value() + ";class");
408 static Future<string> doWorkStaticFuture(Try<string>&& t) {
409 return makeFuture(t.value() + ";class-static");
413 auto f = makeFuture<string>("start")
414 .then(doWorkStaticFuture)
415 .then(Worker::doWorkStaticFuture)
416 .then(&Worker::doWorkFuture, &w);
418 EXPECT_EQ(f.value(), "start;static;class-static;class");
421 TEST(Future, thenBind) {
423 return makeFuture("bind");
425 auto b = std::bind(l);
426 auto f = makeFuture().then(std::move(b));
427 EXPECT_EQ(f.value(), "bind");
430 TEST(Future, thenBindTry) {
431 auto l = [](Try<string>&& t) {
432 return makeFuture(t.value() + ";bind");
434 auto b = std::bind(l, std::placeholders::_1);
435 auto f = makeFuture<string>("start").then(std::move(b));
437 EXPECT_EQ(f.value(), "start;bind");
440 TEST(Future, value) {
441 auto f = makeFuture(unique_ptr<int>(new int(42)));
442 auto up = std::move(f.value());
445 EXPECT_THROW(makeFuture<int>(eggs).value(), eggs_t);
448 TEST(Future, isReady) {
450 auto f = p.getFuture();
451 EXPECT_FALSE(f.isReady());
453 EXPECT_TRUE(f.isReady());
456 TEST(Future, futureNotReady) {
458 Future<int> f = p.getFuture();
459 EXPECT_THROW(f.value(), eggs_t);
462 TEST(Future, hasException) {
463 EXPECT_TRUE(makeFuture<int>(eggs).getTry().hasException());
464 EXPECT_FALSE(makeFuture(42).getTry().hasException());
467 TEST(Future, hasValue) {
468 EXPECT_TRUE(makeFuture(42).getTry().hasValue());
469 EXPECT_FALSE(makeFuture<int>(eggs).getTry().hasValue());
472 TEST(Future, makeFuture) {
473 EXPECT_TYPE(makeFuture(42), Future<int>);
474 EXPECT_EQ(42, makeFuture(42).value());
476 EXPECT_TYPE(makeFuture<float>(42), Future<float>);
477 EXPECT_EQ(42, makeFuture<float>(42).value());
479 auto fun = [] { return 42; };
480 EXPECT_TYPE(makeFutureTry(fun), Future<int>);
481 EXPECT_EQ(42, makeFutureTry(fun).value());
483 auto failfun = []() -> int { throw eggs; };
484 EXPECT_TYPE(makeFutureTry(failfun), Future<int>);
485 EXPECT_THROW(makeFutureTry(failfun).value(), eggs_t);
487 EXPECT_TYPE(makeFuture(), Future<void>);
492 TEST(Promise, special) {
493 EXPECT_FALSE(std::is_copy_constructible<Promise<int>>::value);
494 EXPECT_FALSE(std::is_copy_assignable<Promise<int>>::value);
495 EXPECT_TRUE(std::is_move_constructible<Promise<int>>::value);
496 EXPECT_TRUE(std::is_move_assignable<Promise<int>>::value);
499 TEST(Promise, getFuture) {
501 Future<int> f = p.getFuture();
502 EXPECT_FALSE(f.isReady());
505 TEST(Promise, setValue) {
507 auto ffund = fund.getFuture();
509 EXPECT_EQ(42, ffund.value());
517 auto fpod = pod.getFuture();
518 Foo f = {"the answer", 42};
520 Foo f2 = fpod.value();
521 EXPECT_EQ(f.name, f2.name);
522 EXPECT_EQ(f.value, f2.value);
524 pod = Promise<Foo>();
525 fpod = pod.getFuture();
526 pod.setValue(std::move(f2));
527 Foo f3 = fpod.value();
528 EXPECT_EQ(f.name, f3.name);
529 EXPECT_EQ(f.value, f3.value);
531 Promise<unique_ptr<int>> mov;
532 auto fmov = mov.getFuture();
533 mov.setValue(unique_ptr<int>(new int(42)));
534 unique_ptr<int> ptr = std::move(fmov.value());
538 auto fv = v.getFuture();
540 EXPECT_TRUE(fv.isReady());
543 TEST(Promise, setException) {
546 auto f = p.getFuture();
547 p.setException(eggs);
548 EXPECT_THROW(f.value(), eggs_t);
552 auto f = p.getFuture();
556 p.setException(exception_wrapper(std::current_exception()));
558 EXPECT_THROW(f.value(), eggs_t);
562 TEST(Promise, fulfil) {
565 auto f = p.getFuture();
566 p.fulfil([] { return 42; });
567 EXPECT_EQ(42, f.value());
571 auto f = p.getFuture();
572 p.fulfil([]() -> int { throw eggs; });
573 EXPECT_THROW(f.value(), eggs_t);
577 TEST(Future, finish) {
578 auto x = std::make_shared<int>(0);
581 auto f = p.getFuture().then([x](Try<int>&& t) { *x = t.value(); });
583 // The callback hasn't executed
586 // The callback has a reference to x
587 EXPECT_EQ(2, x.use_count());
591 // the callback has executed
594 // the callback has been destructed
595 // and has released its reference to x
596 EXPECT_EQ(1, x.use_count());
599 TEST(Future, unwrap) {
603 auto fa = a.getFuture();
604 auto fb = b.getFuture();
609 // do a, then do b, and get the result of a + b.
610 Future<int> f = fa.then([&](Try<int>&& ta) {
611 auto va = ta.value();
613 return fb.then([va, &flag2](Try<int>&& tb) {
615 return va + tb.value();
621 EXPECT_FALSE(f.isReady());
626 EXPECT_FALSE(f.isReady());
631 EXPECT_EQ(7, f.value());
634 TEST(Future, whenAll) {
635 // returns a vector variant
637 vector<Promise<int>> promises(10);
638 vector<Future<int>> futures;
640 for (auto& p : promises)
641 futures.push_back(p.getFuture());
643 auto allf = whenAll(futures.begin(), futures.end());
645 random_shuffle(promises.begin(), promises.end());
646 for (auto& p : promises) {
647 EXPECT_FALSE(allf.isReady());
651 EXPECT_TRUE(allf.isReady());
652 auto& results = allf.value();
653 for (auto& t : results) {
654 EXPECT_EQ(42, t.value());
658 // check error semantics
660 vector<Promise<int>> promises(4);
661 vector<Future<int>> futures;
663 for (auto& p : promises)
664 futures.push_back(p.getFuture());
666 auto allf = whenAll(futures.begin(), futures.end());
669 promises[0].setValue(42);
670 promises[1].setException(eggs);
672 EXPECT_FALSE(allf.isReady());
674 promises[2].setValue(42);
676 EXPECT_FALSE(allf.isReady());
678 promises[3].setException(eggs);
680 EXPECT_TRUE(allf.isReady());
681 EXPECT_FALSE(allf.getTry().hasException());
683 auto& results = allf.value();
684 EXPECT_EQ(42, results[0].value());
685 EXPECT_TRUE(results[1].hasException());
686 EXPECT_EQ(42, results[2].value());
687 EXPECT_TRUE(results[3].hasException());
690 // check that futures are ready in then()
692 vector<Promise<void>> promises(10);
693 vector<Future<void>> futures;
695 for (auto& p : promises)
696 futures.push_back(p.getFuture());
698 auto allf = whenAll(futures.begin(), futures.end())
699 .then([](Try<vector<Try<void>>>&& ts) {
700 for (auto& f : ts.value())
704 random_shuffle(promises.begin(), promises.end());
705 for (auto& p : promises)
707 EXPECT_TRUE(allf.isReady());
712 TEST(Future, whenAny) {
714 vector<Promise<int>> promises(10);
715 vector<Future<int>> futures;
717 for (auto& p : promises)
718 futures.push_back(p.getFuture());
720 for (auto& f : futures) {
721 EXPECT_FALSE(f.isReady());
724 auto anyf = whenAny(futures.begin(), futures.end());
726 /* futures were moved in, so these are invalid now */
727 EXPECT_FALSE(anyf.isReady());
729 promises[7].setValue(42);
730 EXPECT_TRUE(anyf.isReady());
731 auto& idx_fut = anyf.value();
733 auto i = idx_fut.first;
736 auto& f = idx_fut.second;
737 EXPECT_EQ(42, f.value());
742 vector<Promise<void>> promises(10);
743 vector<Future<void>> futures;
745 for (auto& p : promises)
746 futures.push_back(p.getFuture());
748 for (auto& f : futures) {
749 EXPECT_FALSE(f.isReady());
752 auto anyf = whenAny(futures.begin(), futures.end());
754 EXPECT_FALSE(anyf.isReady());
756 promises[3].setException(eggs);
757 EXPECT_TRUE(anyf.isReady());
758 EXPECT_TRUE(anyf.value().second.hasException());
763 vector<Promise<int>> promises(10);
764 vector<Future<int>> futures;
766 for (auto& p : promises)
767 futures.push_back(p.getFuture());
769 auto anyf = whenAny(futures.begin(), futures.end())
770 .then([](pair<size_t, Try<int>> p) {
771 EXPECT_EQ(42, p.second.value());
774 promises[3].setValue(42);
775 EXPECT_TRUE(anyf.isReady());
780 TEST(when, already_completed) {
782 vector<Future<void>> fs;
783 for (int i = 0; i < 10; i++)
784 fs.push_back(makeFuture());
786 whenAll(fs.begin(), fs.end())
787 .then([&](vector<Try<void>> ts) {
788 EXPECT_EQ(fs.size(), ts.size());
792 vector<Future<int>> fs;
793 for (int i = 0; i < 10; i++)
794 fs.push_back(makeFuture(i));
796 whenAny(fs.begin(), fs.end())
797 .then([&](pair<size_t, Try<int>> p) {
798 EXPECT_EQ(p.first, p.second.value());
804 vector<Promise<void>> promises(10);
805 vector<Future<void>> futures;
807 for (auto& p : promises)
808 futures.push_back(p.getFuture());
812 whenN(futures.begin(), futures.end(), n)
813 .then([&](vector<pair<size_t, Try<void>>> v) {
815 EXPECT_EQ(n, v.size());
817 EXPECT_TRUE(tt.second.hasValue());
820 promises[0].setValue();
822 promises[1].setValue();
824 promises[2].setValue();
828 /* Ensure that we can compile when_{all,any} with folly::small_vector */
829 TEST(when, small_vector) {
831 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<void>),
832 "Futures should not be trivially copyable");
833 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<int>),
834 "Futures should not be trivially copyable");
836 using folly::small_vector;
838 small_vector<Future<void>> futures;
840 for (int i = 0; i < 10; i++)
841 futures.push_back(makeFuture());
843 auto anyf = whenAny(futures.begin(), futures.end());
847 small_vector<Future<void>> futures;
849 for (int i = 0; i < 10; i++)
850 futures.push_back(makeFuture());
852 auto allf = whenAll(futures.begin(), futures.end());
856 TEST(Future, whenAllVariadic) {
859 Future<bool> fb = pb.getFuture();
860 Future<int> fi = pi.getFuture();
862 whenAll(std::move(fb), std::move(fi))
863 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
865 EXPECT_TRUE(std::get<0>(tup).hasValue());
866 EXPECT_EQ(std::get<0>(tup).value(), true);
867 EXPECT_TRUE(std::get<1>(tup).hasValue());
868 EXPECT_EQ(std::get<1>(tup).value(), 42);
876 TEST(Future, whenAllVariadicReferences) {
879 Future<bool> fb = pb.getFuture();
880 Future<int> fi = pi.getFuture();
883 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
885 EXPECT_TRUE(std::get<0>(tup).hasValue());
886 EXPECT_EQ(std::get<0>(tup).value(), true);
887 EXPECT_TRUE(std::get<1>(tup).hasValue());
888 EXPECT_EQ(std::get<1>(tup).value(), 42);
896 TEST(Future, whenAll_none) {
897 vector<Future<int>> fs;
898 auto f = whenAll(fs.begin(), fs.end());
899 EXPECT_TRUE(f.isReady());
902 TEST(Future, throwCaughtInImmediateThen) {
903 // Neither of these should throw "Promise already satisfied"
905 [=](Try<void>&&) -> int { throw std::exception(); });
907 [=](Try<void>&&) -> Future<int> { throw std::exception(); });
910 TEST(Future, throwIfFailed) {
911 makeFuture<void>(eggs)
912 .then([=](Try<void>&& t) {
913 EXPECT_THROW(t.throwIfFailed(), eggs_t);
916 .then([=](Try<void>&& t) {
917 EXPECT_NO_THROW(t.throwIfFailed());
920 makeFuture<int>(eggs)
921 .then([=](Try<int>&& t) {
922 EXPECT_THROW(t.throwIfFailed(), eggs_t);
925 .then([=](Try<int>&& t) {
926 EXPECT_NO_THROW(t.throwIfFailed());
930 TEST(Future, waitImmediate) {
932 auto done = makeFuture(42).wait().value();
935 vector<int> v{1,2,3};
936 auto done_v = makeFuture(v).wait().value();
937 EXPECT_EQ(v.size(), done_v.size());
938 EXPECT_EQ(v, done_v);
940 vector<Future<void>> v_f;
941 v_f.push_back(makeFuture());
942 v_f.push_back(makeFuture());
943 auto done_v_f = whenAll(v_f.begin(), v_f.end()).wait().value();
944 EXPECT_EQ(2, done_v_f.size());
946 vector<Future<bool>> v_fb;
947 v_fb.push_back(makeFuture(true));
948 v_fb.push_back(makeFuture(false));
949 auto fut = whenAll(v_fb.begin(), v_fb.end());
950 auto done_v_fb = std::move(fut.wait().value());
951 EXPECT_EQ(2, done_v_fb.size());
956 Future<int> f = p.getFuture();
957 std::atomic<bool> flag{false};
958 std::atomic<int> result{1};
959 std::atomic<std::thread::id> id;
961 std::thread t([&](Future<int>&& tf){
962 auto n = tf.then([&](Try<int> && t) {
963 id = std::this_thread::get_id();
967 result.store(n.wait().value());
972 EXPECT_EQ(result.load(), 1);
975 // validate that the callback ended up executing in this thread, which
976 // is more to ensure that this test actually tests what it should
977 EXPECT_EQ(id, std::this_thread::get_id());
978 EXPECT_EQ(result.load(), 42);
982 MoveFlag() = default;
983 MoveFlag(const MoveFlag&) = delete;
984 MoveFlag(MoveFlag&& other) noexcept {
990 TEST(Future, waitReplacesSelf) {
994 auto f1 = makeFuture(MoveFlag());
996 EXPECT_FALSE(f1.value().moved);
999 auto f2 = makeFuture(MoveFlag()).wait();
1000 EXPECT_FALSE(f2.value().moved);
1006 auto f1 = makeFuture(MoveFlag());
1007 f1.wait(milliseconds(1));
1008 EXPECT_FALSE(f1.value().moved);
1011 auto f2 = makeFuture(MoveFlag()).wait(milliseconds(1));
1012 EXPECT_FALSE(f2.value().moved);
1017 folly::EventBase eb;
1019 auto f1 = makeFuture(MoveFlag());
1021 EXPECT_FALSE(f1.value().moved);
1024 auto f2 = makeFuture(MoveFlag()).waitVia(&eb);
1025 EXPECT_FALSE(f2.value().moved);
1029 TEST(Future, waitWithDuration) {
1032 Future<int> f = p.getFuture();
1033 f.wait(milliseconds(1));
1034 EXPECT_FALSE(f.isReady());
1036 EXPECT_TRUE(f.isReady());
1040 Future<int> f = p.getFuture();
1042 f.wait(milliseconds(1));
1043 EXPECT_TRUE(f.isReady());
1046 vector<Future<bool>> v_fb;
1047 v_fb.push_back(makeFuture(true));
1048 v_fb.push_back(makeFuture(false));
1049 auto f = whenAll(v_fb.begin(), v_fb.end());
1050 f.wait(milliseconds(1));
1051 EXPECT_TRUE(f.isReady());
1052 EXPECT_EQ(2, f.value().size());
1055 vector<Future<bool>> v_fb;
1058 v_fb.push_back(p1.getFuture());
1059 v_fb.push_back(p2.getFuture());
1060 auto f = whenAll(v_fb.begin(), v_fb.end());
1061 f.wait(milliseconds(1));
1062 EXPECT_FALSE(f.isReady());
1064 EXPECT_FALSE(f.isReady());
1066 EXPECT_TRUE(f.isReady());
1069 auto f = makeFuture().wait(milliseconds(1));
1070 EXPECT_TRUE(f.isReady());
1075 auto start = std::chrono::steady_clock::now();
1076 auto f = p.getFuture().wait(milliseconds(100));
1077 auto elapsed = std::chrono::steady_clock::now() - start;
1078 EXPECT_GE(elapsed, milliseconds(100));
1079 EXPECT_FALSE(f.isReady());
1081 EXPECT_TRUE(f.isReady());
1085 // Try to trigger the race where the resultant Future is not yet complete
1086 // even if we didn't hit the timeout, and make sure we deal with it properly
1089 auto t = std::thread([&]{
1091 /* sleep override */ std::this_thread::sleep_for(milliseconds(100));
1095 auto f = p.getFuture().wait(std::chrono::seconds(3600));
1096 EXPECT_TRUE(f.isReady());
1101 class DummyDrivableExecutor : public DrivableExecutor {
1103 void add(Func f) override {}
1104 void drive() override { ran = true; }
1108 TEST(Future, getVia) {
1112 auto f = via(&x).then([]{ return true; });
1113 EXPECT_TRUE(f.getVia(&x));
1119 auto f = via(&x).then();
1124 DummyDrivableExecutor x;
1125 auto f = makeFuture(true);
1126 EXPECT_TRUE(f.getVia(&x));
1127 EXPECT_FALSE(x.ran);
1131 TEST(Future, waitVia) {
1134 auto f = via(&x).then();
1135 EXPECT_FALSE(f.isReady());
1137 EXPECT_TRUE(f.isReady());
1141 // try rvalue as well
1143 auto f = via(&x).activate().then().waitVia(&x);
1144 EXPECT_TRUE(f.isReady());
1148 DummyDrivableExecutor x;
1149 makeFuture(true).waitVia(&x);
1150 EXPECT_FALSE(x.ran);
1154 TEST(Future, callbackAfterActivate) {
1156 auto f = p.getFuture();
1160 f.then([&](Try<void>&&) { count++; });
1163 EXPECT_EQ(0, count);
1166 EXPECT_EQ(1, count);
1169 TEST(Future, activateOnDestruct) {
1170 auto f = std::make_shared<Future<void>>(makeFuture());
1174 f->then([&](Try<void>&&) { count++; });
1175 EXPECT_EQ(0, count);
1178 EXPECT_EQ(1, count);
1181 TEST(Future, viaActsCold) {
1186 fv.then([&](Try<void>&&) { count++; });
1188 EXPECT_EQ(0, count);
1192 EXPECT_EQ(1, x.run());
1193 EXPECT_EQ(1, count);
1196 TEST(Future, viaIsCold) {
1198 EXPECT_FALSE(via(&x).isActive());
1201 TEST(Future, viaRaces) {
1204 auto tid = std::this_thread::get_id();
1207 std::thread t1([&] {
1210 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1211 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1212 .then([&](Try<void>&&) { done = true; });
1215 std::thread t2([&] {
1219 while (!done) x.run();
1225 TEST(Future, viaRaces_2stage) {
1228 auto tid = std::this_thread::get_id();
1231 std::thread t1([&] {
1232 auto f2 = p.getFuture().via(&x);
1233 f2.then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1234 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1235 .then([&](Try<void>&&) { done = true; });
1237 // the bug was in the promise being fulfilled before f2 is reactivated. we
1238 // could sleep, but yielding should cause this to fail with reasonable
1240 std::this_thread::yield();
1244 std::thread t2([&] {
1248 while (!done) x.run();
1253 TEST(Future, getFuture_after_setValue) {
1256 EXPECT_EQ(42, p.getFuture().value());
1259 TEST(Future, getFuture_after_setException) {
1261 p.fulfil([]() -> void { throw std::logic_error("foo"); });
1262 EXPECT_THROW(p.getFuture().value(), std::logic_error);
1265 TEST(Future, detachRace) {
1267 // This test is designed to detect a race that was in Core::detachOne()
1268 // where detached_ was incremented and then tested, and that
1269 // allowed a race where both Promise and Future would think they were the
1270 // second and both try to delete. This showed up at scale but was very
1271 // difficult to reliably repro in a test. As it is, this only fails about
1272 // once in every 1,000 executions. Doing this 1,000 times is going to make a
1273 // slow test so I won't do that but if it ever fails, take it seriously, and
1274 // run the test binary with "--gtest_repeat=10000 --gtest_filter=*detachRace"
1275 // (Don't forget to enable ASAN)
1276 auto p = folly::make_unique<Promise<bool>>();
1277 auto f = folly::make_unique<Future<bool>>(p->getFuture());
1278 folly::Baton<> baton;
1288 class TestData : public RequestData {
1290 explicit TestData(int data) : data_(data) {}
1291 virtual ~TestData() {}
1295 TEST(Future, context) {
1297 // Start a new context
1298 RequestContext::create();
1300 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1302 // Set some test data
1303 RequestContext::get()->setContextData(
1305 std::unique_ptr<TestData>(new TestData(10)));
1309 auto future = p.getFuture().then([&]{
1310 // Check that the context followed the future
1311 EXPECT_TRUE(RequestContext::get() != nullptr);
1312 auto a = dynamic_cast<TestData*>(
1313 RequestContext::get()->getContextData("test"));
1314 auto data = a->data_;
1315 EXPECT_EQ(10, data);
1318 // Clear the context
1319 RequestContext::setContext(nullptr);
1321 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1323 // Fulfil the promise
1328 // This only fails about 1 in 1k times when the bug is present :(
1329 TEST(Future, t5506504) {
1333 auto promises = std::make_shared<vector<Promise<void>>>(4);
1334 vector<Future<void>> futures;
1336 for (auto& p : *promises) {
1337 futures.emplace_back(
1340 .then([](Try<void>&&){}));
1345 for (auto& p : *promises) p.setValue();
1348 return whenAll(futures.begin(), futures.end());
1354 // Test of handling of a circular dependency. It's never recommended
1355 // to have one because of possible memory leaks. Here we test that
1356 // we can handle freeing of the Future while it is running.
1357 TEST(Future, CircularDependencySharedPtrSelfReset) {
1358 Promise<int64_t> promise;
1359 auto ptr = std::make_shared<Future<int64_t>>(promise.getFuture());
1362 [ptr] (folly::Try<int64_t>&& uid) mutable {
1363 EXPECT_EQ(1, ptr.use_count());
1365 // Leaving no references to ourselves.
1367 EXPECT_EQ(0, ptr.use_count());
1371 EXPECT_EQ(2, ptr.use_count());
1375 promise.fulfil([]{return 1l;});
1378 TEST(Future, Constructor) {
1379 auto f1 = []() -> Future<int> { return Future<int>(3); }();
1380 EXPECT_EQ(f1.value(), 3);
1381 auto f2 = []() -> Future<void> { return Future<void>(); }();
1382 EXPECT_NO_THROW(f2.value());
1385 TEST(Future, ImplicitConstructor) {
1386 auto f1 = []() -> Future<int> { return 3; }();
1387 EXPECT_EQ(f1.value(), 3);
1388 // Unfortunately, the C++ standard does not allow the
1389 // following implicit conversion to work:
1390 //auto f2 = []() -> Future<void> { }();