2 * Copyright 2015 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/dynamic.h>
32 #include <folly/Baton.h>
33 #include <folly/MPMCQueue.h>
35 #include <folly/io/async/EventBase.h>
36 #include <folly/io/async/Request.h>
38 using namespace folly;
41 using std::unique_ptr;
43 using std::chrono::milliseconds;
45 #define EXPECT_TYPE(x, T) \
46 EXPECT_TRUE((std::is_same<decltype(x), T>::value))
48 /// Simple executor that does work in another thread
49 class ThreadExecutor : public Executor {
50 folly::MPMCQueue<Func> funcs;
51 std::atomic<bool> done {false};
59 while (!funcs.isEmpty()) {
60 funcs.blockingRead(fn);
67 explicit ThreadExecutor(size_t n = 1024)
69 worker = std::thread(std::bind(&ThreadExecutor::work, this));
78 void add(Func fn) override {
79 funcs.blockingWrite(std::move(fn));
82 void waitForStartup() {
87 typedef FutureException eggs_t;
88 static eggs_t eggs("eggs");
92 TEST(Future, coreSize) {
93 // If this number goes down, it's fine!
94 // If it goes up, please seek professional advice ;-)
95 EXPECT_EQ(192, sizeof(detail::Core<void>));
100 TEST(Future, onError) {
101 bool theFlag = false;
102 auto flag = [&]{ theFlag = true; };
103 #define EXPECT_FLAG() \
105 EXPECT_TRUE(theFlag); \
109 #define EXPECT_NO_FLAG() \
111 EXPECT_FALSE(theFlag); \
117 auto f = makeFuture()
118 .then([] { throw eggs; })
119 .onError([&] (eggs_t& e) { flag(); });
121 EXPECT_NO_THROW(f.value());
125 auto f = makeFuture()
126 .then([] { throw eggs; })
127 .onError([&] (eggs_t& e) { flag(); return makeFuture(); });
129 EXPECT_NO_THROW(f.value());
134 auto f = makeFuture()
135 .then([] { throw eggs; })
136 .onError([&] (eggs_t e) { flag(); });
138 EXPECT_NO_THROW(f.value());
142 auto f = makeFuture()
143 .then([] { throw eggs; })
144 .onError([&] (eggs_t e) { flag(); return makeFuture(); });
146 EXPECT_NO_THROW(f.value());
151 auto f = makeFuture()
152 .then([] { throw eggs; })
153 .onError([&] (std::exception& e) { flag(); });
155 EXPECT_NO_THROW(f.value());
159 auto f = makeFuture()
160 .then([] { throw eggs; })
161 .onError([&] (std::exception& e) { flag(); return makeFuture(); });
163 EXPECT_NO_THROW(f.value());
168 auto f = makeFuture()
169 .then([] { throw -1; })
170 .onError([&] (int e) { flag(); });
172 EXPECT_NO_THROW(f.value());
176 auto f = makeFuture()
177 .then([] { throw -1; })
178 .onError([&] (int e) { flag(); return makeFuture(); });
180 EXPECT_NO_THROW(f.value());
185 auto f = makeFuture()
186 .then([] { throw eggs; })
187 .onError([&] (eggs_t& e) mutable { flag(); });
189 EXPECT_NO_THROW(f.value());
193 auto f = makeFuture()
194 .then([] { throw eggs; })
195 .onError([&] (eggs_t& e) mutable { flag(); return makeFuture(); });
197 EXPECT_NO_THROW(f.value());
202 auto f = makeFuture()
203 .then([] { return 42; })
204 .onError([&] (eggs_t& e) { flag(); return -1; });
206 EXPECT_EQ(42, f.value());
210 auto f = makeFuture()
211 .then([] { return 42; })
212 .onError([&] (eggs_t& e) { flag(); return makeFuture<int>(-1); });
214 EXPECT_EQ(42, f.value());
217 // Catch different exception
219 auto f = makeFuture()
220 .then([] { throw eggs; })
221 .onError([&] (std::runtime_error& e) { flag(); });
223 EXPECT_THROW(f.value(), eggs_t);
227 auto f = makeFuture()
228 .then([] { throw eggs; })
229 .onError([&] (std::runtime_error& e) { flag(); return makeFuture(); });
231 EXPECT_THROW(f.value(), eggs_t);
234 // Returned value propagates
236 auto f = makeFuture()
237 .then([] { throw eggs; return 0; })
238 .onError([&] (eggs_t& e) { return 42; });
239 EXPECT_EQ(42, f.value());
242 // Returned future propagates
244 auto f = makeFuture()
245 .then([] { throw eggs; return 0; })
246 .onError([&] (eggs_t& e) { return makeFuture<int>(42); });
247 EXPECT_EQ(42, f.value());
252 auto f = makeFuture()
253 .then([] { throw eggs; return 0; })
254 .onError([&] (eggs_t& e) { throw e; return -1; });
255 EXPECT_THROW(f.value(), eggs_t);
259 auto f = makeFuture()
260 .then([] { throw eggs; return 0; })
261 .onError([&] (eggs_t& e) { throw e; return makeFuture<int>(-1); });
262 EXPECT_THROW(f.value(), eggs_t);
265 // exception_wrapper, return Future<T>
267 auto f = makeFuture()
268 .then([] { throw eggs; })
269 .onError([&] (exception_wrapper e) { flag(); return makeFuture(); });
271 EXPECT_NO_THROW(f.value());
274 // exception_wrapper, return Future<T> but throw
276 auto f = makeFuture()
277 .then([]{ throw eggs; return 0; })
278 .onError([&] (exception_wrapper e) {
281 return makeFuture<int>(-1);
284 EXPECT_THROW(f.value(), eggs_t);
287 // exception_wrapper, return T
289 auto f = makeFuture()
290 .then([]{ throw eggs; return 0; })
291 .onError([&] (exception_wrapper e) {
296 EXPECT_EQ(-1, f.value());
299 // exception_wrapper, return T but throw
301 auto f = makeFuture()
302 .then([]{ throw eggs; return 0; })
303 .onError([&] (exception_wrapper e) {
309 EXPECT_THROW(f.value(), eggs_t);
312 // const exception_wrapper&
314 auto f = makeFuture()
315 .then([] { throw eggs; })
316 .onError([&] (const exception_wrapper& e) {
321 EXPECT_NO_THROW(f.value());
339 Try<A> t_a(std::move(a));
343 EXPECT_EQ(5, t_a.value().x());
346 TEST(Future, special) {
347 EXPECT_FALSE(std::is_copy_constructible<Future<int>>::value);
348 EXPECT_FALSE(std::is_copy_assignable<Future<int>>::value);
349 EXPECT_TRUE(std::is_move_constructible<Future<int>>::value);
350 EXPECT_TRUE(std::is_move_assignable<Future<int>>::value);
354 auto f = makeFuture<string>("0")
355 .then([](){ return makeFuture<string>("1"); })
356 .then([](Try<string>&& t) { return makeFuture(t.value() + ";2"); })
357 .then([](const Try<string>&& t) { return makeFuture(t.value() + ";3"); })
358 .then([](Try<string>& t) { return makeFuture(t.value() + ";4"); })
359 .then([](const Try<string>& t) { return makeFuture(t.value() + ";5"); })
360 .then([](Try<string> t) { return makeFuture(t.value() + ";6"); })
361 .then([](const Try<string> t) { return makeFuture(t.value() + ";7"); })
362 .then([](string&& s) { return makeFuture(s + ";8"); })
363 .then([](const string&& s) { return makeFuture(s + ";9"); })
364 .then([](string& s) { return makeFuture(s + ";10"); })
365 .then([](const string& s) { return makeFuture(s + ";11"); })
366 .then([](string s) { return makeFuture(s + ";12"); })
367 .then([](const string s) { return makeFuture(s + ";13"); })
369 EXPECT_EQ(f.value(), "1;2;3;4;5;6;7;8;9;10;11;12;13");
372 TEST(Future, thenTry) {
375 makeFuture<int>(42).then([&](Try<int>&& t) {
377 EXPECT_EQ(42, t.value());
379 EXPECT_TRUE(flag); flag = false;
382 .then([](Try<int>&& t) { return t.value(); })
383 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
384 EXPECT_TRUE(flag); flag = false;
386 makeFuture().then([&](Try<void>&& t) { flag = true; t.value(); });
387 EXPECT_TRUE(flag); flag = false;
390 auto f = p.getFuture().then([&](Try<void>&& t) { flag = true; });
392 EXPECT_FALSE(f.isReady());
395 EXPECT_TRUE(f.isReady());
398 TEST(Future, thenValue) {
400 makeFuture<int>(42).then([&](int i){
404 EXPECT_TRUE(flag); flag = false;
407 .then([](int i){ return i; })
408 .then([&](int i) { flag = true; EXPECT_EQ(42, i); });
409 EXPECT_TRUE(flag); flag = false;
411 makeFuture().then([&]{
414 EXPECT_TRUE(flag); flag = false;
416 auto f = makeFuture<int>(eggs).then([&](int i){});
417 EXPECT_THROW(f.value(), eggs_t);
419 f = makeFuture<void>(eggs).then([&]{});
420 EXPECT_THROW(f.value(), eggs_t);
423 TEST(Future, thenValueFuture) {
426 .then([](int i){ return makeFuture<int>(std::move(i)); })
427 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
428 EXPECT_TRUE(flag); flag = false;
431 .then([]{ return makeFuture(); })
432 .then([&](Try<void>&& t) { flag = true; });
433 EXPECT_TRUE(flag); flag = false;
436 static string doWorkStatic(Try<string>&& t) {
437 return t.value() + ";static";
440 TEST(Future, thenFunction) {
442 string doWork(Try<string>&& t) {
443 return t.value() + ";class";
445 static string doWorkStatic(Try<string>&& t) {
446 return t.value() + ";class-static";
450 auto f = makeFuture<string>("start")
452 .then(Worker::doWorkStatic)
453 .then(&Worker::doWork, &w);
455 EXPECT_EQ(f.value(), "start;static;class-static;class");
458 static Future<string> doWorkStaticFuture(Try<string>&& t) {
459 return makeFuture(t.value() + ";static");
462 TEST(Future, thenFunctionFuture) {
464 Future<string> doWorkFuture(Try<string>&& t) {
465 return makeFuture(t.value() + ";class");
467 static Future<string> doWorkStaticFuture(Try<string>&& t) {
468 return makeFuture(t.value() + ";class-static");
472 auto f = makeFuture<string>("start")
473 .then(doWorkStaticFuture)
474 .then(Worker::doWorkStaticFuture)
475 .then(&Worker::doWorkFuture, &w);
477 EXPECT_EQ(f.value(), "start;static;class-static;class");
480 TEST(Future, thenBind) {
482 return makeFuture("bind");
484 auto b = std::bind(l);
485 auto f = makeFuture().then(std::move(b));
486 EXPECT_EQ(f.value(), "bind");
489 TEST(Future, thenBindTry) {
490 auto l = [](Try<string>&& t) {
491 return makeFuture(t.value() + ";bind");
493 auto b = std::bind(l, std::placeholders::_1);
494 auto f = makeFuture<string>("start").then(std::move(b));
496 EXPECT_EQ(f.value(), "start;bind");
499 TEST(Future, value) {
500 auto f = makeFuture(unique_ptr<int>(new int(42)));
501 auto up = std::move(f.value());
504 EXPECT_THROW(makeFuture<int>(eggs).value(), eggs_t);
507 TEST(Future, isReady) {
509 auto f = p.getFuture();
510 EXPECT_FALSE(f.isReady());
512 EXPECT_TRUE(f.isReady());
515 TEST(Future, futureNotReady) {
517 Future<int> f = p.getFuture();
518 EXPECT_THROW(f.value(), eggs_t);
521 TEST(Future, hasException) {
522 EXPECT_TRUE(makeFuture<int>(eggs).getTry().hasException());
523 EXPECT_FALSE(makeFuture(42).getTry().hasException());
526 TEST(Future, hasValue) {
527 EXPECT_TRUE(makeFuture(42).getTry().hasValue());
528 EXPECT_FALSE(makeFuture<int>(eggs).getTry().hasValue());
531 TEST(Future, makeFuture) {
532 EXPECT_TYPE(makeFuture(42), Future<int>);
533 EXPECT_EQ(42, makeFuture(42).value());
535 EXPECT_TYPE(makeFuture<float>(42), Future<float>);
536 EXPECT_EQ(42, makeFuture<float>(42).value());
538 auto fun = [] { return 42; };
539 EXPECT_TYPE(makeFutureWith(fun), Future<int>);
540 EXPECT_EQ(42, makeFutureWith(fun).value());
542 auto failfun = []() -> int { throw eggs; };
543 EXPECT_TYPE(makeFutureWith(failfun), Future<int>);
544 EXPECT_THROW(makeFutureWith(failfun).value(), eggs_t);
546 EXPECT_TYPE(makeFuture(), Future<void>);
551 TEST(Promise, special) {
552 EXPECT_FALSE(std::is_copy_constructible<Promise<int>>::value);
553 EXPECT_FALSE(std::is_copy_assignable<Promise<int>>::value);
554 EXPECT_TRUE(std::is_move_constructible<Promise<int>>::value);
555 EXPECT_TRUE(std::is_move_assignable<Promise<int>>::value);
558 TEST(Promise, getFuture) {
560 Future<int> f = p.getFuture();
561 EXPECT_FALSE(f.isReady());
564 TEST(Promise, setValue) {
566 auto ffund = fund.getFuture();
568 EXPECT_EQ(42, ffund.value());
576 auto fpod = pod.getFuture();
577 Foo f = {"the answer", 42};
579 Foo f2 = fpod.value();
580 EXPECT_EQ(f.name, f2.name);
581 EXPECT_EQ(f.value, f2.value);
583 pod = Promise<Foo>();
584 fpod = pod.getFuture();
585 pod.setValue(std::move(f2));
586 Foo f3 = fpod.value();
587 EXPECT_EQ(f.name, f3.name);
588 EXPECT_EQ(f.value, f3.value);
590 Promise<unique_ptr<int>> mov;
591 auto fmov = mov.getFuture();
592 mov.setValue(unique_ptr<int>(new int(42)));
593 unique_ptr<int> ptr = std::move(fmov.value());
597 auto fv = v.getFuture();
599 EXPECT_TRUE(fv.isReady());
602 TEST(Promise, setException) {
605 auto f = p.getFuture();
606 p.setException(eggs);
607 EXPECT_THROW(f.value(), eggs_t);
611 auto f = p.getFuture();
615 p.setException(exception_wrapper(std::current_exception()));
617 EXPECT_THROW(f.value(), eggs_t);
621 TEST(Promise, setWith) {
624 auto f = p.getFuture();
625 p.setWith([] { return 42; });
626 EXPECT_EQ(42, f.value());
630 auto f = p.getFuture();
631 p.setWith([]() -> int { throw eggs; });
632 EXPECT_THROW(f.value(), eggs_t);
636 TEST(Future, finish) {
637 auto x = std::make_shared<int>(0);
640 auto f = p.getFuture().then([x](Try<int>&& t) { *x = t.value(); });
642 // The callback hasn't executed
645 // The callback has a reference to x
646 EXPECT_EQ(2, x.use_count());
650 // the callback has executed
653 // the callback has been destructed
654 // and has released its reference to x
655 EXPECT_EQ(1, x.use_count());
658 TEST(Future, unwrap) {
662 auto fa = a.getFuture();
663 auto fb = b.getFuture();
668 // do a, then do b, and get the result of a + b.
669 Future<int> f = fa.then([&](Try<int>&& ta) {
670 auto va = ta.value();
672 return fb.then([va, &flag2](Try<int>&& tb) {
674 return va + tb.value();
680 EXPECT_FALSE(f.isReady());
685 EXPECT_FALSE(f.isReady());
690 EXPECT_EQ(7, f.value());
693 TEST(Future, window) {
694 // int -> Future<int>
695 auto fn = [](vector<int> input, size_t window_size, size_t expect) {
699 [](int i) { return makeFuture(i); },
702 [](int sum, const Try<int>& b) {
705 EXPECT_EQ(expect, res);
708 // 2 in-flight at a time
709 vector<int> input = {1, 2, 3};
713 // 4 in-flight at a time
714 vector<int> input = {1, 2, 3};
723 // int -> Future<void>
726 std::vector<int>({1, 2, 3}),
727 [](int i) { return makeFuture(); },
730 [](int sum, const Try<void>& b) {
731 EXPECT_TRUE(b.hasValue());
737 // string -> return Future<int>
740 std::vector<std::string>{"1", "2", "3"},
741 [](std::string s) { return makeFuture<int>(folly::to<int>(s)); },
744 [](int sum, const Try<int>& b) {
751 TEST(Future, collectAll) {
752 // returns a vector variant
754 vector<Promise<int>> promises(10);
755 vector<Future<int>> futures;
757 for (auto& p : promises)
758 futures.push_back(p.getFuture());
760 auto allf = collectAll(futures);
762 random_shuffle(promises.begin(), promises.end());
763 for (auto& p : promises) {
764 EXPECT_FALSE(allf.isReady());
768 EXPECT_TRUE(allf.isReady());
769 auto& results = allf.value();
770 for (auto& t : results) {
771 EXPECT_EQ(42, t.value());
775 // check error semantics
777 vector<Promise<int>> promises(4);
778 vector<Future<int>> futures;
780 for (auto& p : promises)
781 futures.push_back(p.getFuture());
783 auto allf = collectAll(futures);
786 promises[0].setValue(42);
787 promises[1].setException(eggs);
789 EXPECT_FALSE(allf.isReady());
791 promises[2].setValue(42);
793 EXPECT_FALSE(allf.isReady());
795 promises[3].setException(eggs);
797 EXPECT_TRUE(allf.isReady());
798 EXPECT_FALSE(allf.getTry().hasException());
800 auto& results = allf.value();
801 EXPECT_EQ(42, results[0].value());
802 EXPECT_TRUE(results[1].hasException());
803 EXPECT_EQ(42, results[2].value());
804 EXPECT_TRUE(results[3].hasException());
807 // check that futures are ready in then()
809 vector<Promise<void>> promises(10);
810 vector<Future<void>> futures;
812 for (auto& p : promises)
813 futures.push_back(p.getFuture());
815 auto allf = collectAll(futures)
816 .then([](Try<vector<Try<void>>>&& ts) {
817 for (auto& f : ts.value())
821 random_shuffle(promises.begin(), promises.end());
822 for (auto& p : promises)
824 EXPECT_TRUE(allf.isReady());
828 TEST(Future, collect) {
831 vector<Promise<int>> promises(10);
832 vector<Future<int>> futures;
834 for (auto& p : promises)
835 futures.push_back(p.getFuture());
837 auto allf = collect(futures);
839 random_shuffle(promises.begin(), promises.end());
840 for (auto& p : promises) {
841 EXPECT_FALSE(allf.isReady());
845 EXPECT_TRUE(allf.isReady());
846 for (auto i : allf.value()) {
853 vector<Promise<int>> promises(10);
854 vector<Future<int>> futures;
856 for (auto& p : promises)
857 futures.push_back(p.getFuture());
859 auto allf = collect(futures);
861 random_shuffle(promises.begin(), promises.end());
862 for (int i = 0; i < 10; i++) {
864 // everthing goes well so far...
865 EXPECT_FALSE(allf.isReady());
866 promises[i].setValue(42);
868 // short circuit with an exception
869 EXPECT_FALSE(allf.isReady());
870 promises[i].setException(eggs);
871 EXPECT_TRUE(allf.isReady());
873 // don't blow up on further values
874 EXPECT_TRUE(allf.isReady());
875 promises[i].setValue(42);
877 // don't blow up on further exceptions
878 EXPECT_TRUE(allf.isReady());
879 promises[i].setException(eggs);
883 EXPECT_THROW(allf.value(), eggs_t);
886 // void futures success case
888 vector<Promise<void>> promises(10);
889 vector<Future<void>> futures;
891 for (auto& p : promises)
892 futures.push_back(p.getFuture());
894 auto allf = collect(futures);
896 random_shuffle(promises.begin(), promises.end());
897 for (auto& p : promises) {
898 EXPECT_FALSE(allf.isReady());
902 EXPECT_TRUE(allf.isReady());
905 // void futures failure case
907 vector<Promise<void>> promises(10);
908 vector<Future<void>> futures;
910 for (auto& p : promises)
911 futures.push_back(p.getFuture());
913 auto allf = collect(futures);
915 random_shuffle(promises.begin(), promises.end());
916 for (int i = 0; i < 10; i++) {
918 // everthing goes well so far...
919 EXPECT_FALSE(allf.isReady());
920 promises[i].setValue();
922 // short circuit with an exception
923 EXPECT_FALSE(allf.isReady());
924 promises[i].setException(eggs);
925 EXPECT_TRUE(allf.isReady());
927 // don't blow up on further values
928 EXPECT_TRUE(allf.isReady());
929 promises[i].setValue();
931 // don't blow up on further exceptions
932 EXPECT_TRUE(allf.isReady());
933 promises[i].setException(eggs);
937 EXPECT_THROW(allf.value(), eggs_t);
940 // move only compiles
942 vector<Promise<unique_ptr<int>>> promises(10);
943 vector<Future<unique_ptr<int>>> futures;
945 for (auto& p : promises)
946 futures.push_back(p.getFuture());
953 struct NotDefaultConstructible {
954 NotDefaultConstructible() = delete;
955 NotDefaultConstructible(int arg) : i(arg) {}
959 // We have a specialized implementation for non-default-constructible objects
960 // Ensure that it works and preserves order
961 TEST(Future, collectNotDefaultConstructible) {
962 vector<Promise<NotDefaultConstructible>> promises(10);
963 vector<Future<NotDefaultConstructible>> futures;
964 vector<int> indices(10);
965 std::iota(indices.begin(), indices.end(), 0);
966 random_shuffle(indices.begin(), indices.end());
968 for (auto& p : promises)
969 futures.push_back(p.getFuture());
971 auto allf = collect(futures);
973 for (auto i : indices) {
974 EXPECT_FALSE(allf.isReady());
975 promises[i].setValue(NotDefaultConstructible(i));
978 EXPECT_TRUE(allf.isReady());
980 for (auto val : allf.value()) {
986 TEST(Future, collectAny) {
988 vector<Promise<int>> promises(10);
989 vector<Future<int>> futures;
991 for (auto& p : promises)
992 futures.push_back(p.getFuture());
994 for (auto& f : futures) {
995 EXPECT_FALSE(f.isReady());
998 auto anyf = collectAny(futures);
1000 /* futures were moved in, so these are invalid now */
1001 EXPECT_FALSE(anyf.isReady());
1003 promises[7].setValue(42);
1004 EXPECT_TRUE(anyf.isReady());
1005 auto& idx_fut = anyf.value();
1007 auto i = idx_fut.first;
1010 auto& f = idx_fut.second;
1011 EXPECT_EQ(42, f.value());
1016 vector<Promise<void>> promises(10);
1017 vector<Future<void>> futures;
1019 for (auto& p : promises)
1020 futures.push_back(p.getFuture());
1022 for (auto& f : futures) {
1023 EXPECT_FALSE(f.isReady());
1026 auto anyf = collectAny(futures);
1028 EXPECT_FALSE(anyf.isReady());
1030 promises[3].setException(eggs);
1031 EXPECT_TRUE(anyf.isReady());
1032 EXPECT_TRUE(anyf.value().second.hasException());
1037 vector<Promise<int>> promises(10);
1038 vector<Future<int>> futures;
1040 for (auto& p : promises)
1041 futures.push_back(p.getFuture());
1043 auto anyf = collectAny(futures)
1044 .then([](pair<size_t, Try<int>> p) {
1045 EXPECT_EQ(42, p.second.value());
1048 promises[3].setValue(42);
1049 EXPECT_TRUE(anyf.isReady());
1054 TEST(when, already_completed) {
1056 vector<Future<void>> fs;
1057 for (int i = 0; i < 10; i++)
1058 fs.push_back(makeFuture());
1061 .then([&](vector<Try<void>> ts) {
1062 EXPECT_EQ(fs.size(), ts.size());
1066 vector<Future<int>> fs;
1067 for (int i = 0; i < 10; i++)
1068 fs.push_back(makeFuture(i));
1071 .then([&](pair<size_t, Try<int>> p) {
1072 EXPECT_EQ(p.first, p.second.value());
1077 TEST(when, collectN) {
1078 vector<Promise<void>> promises(10);
1079 vector<Future<void>> futures;
1081 for (auto& p : promises)
1082 futures.push_back(p.getFuture());
1086 collectN(futures, n)
1087 .then([&](vector<pair<size_t, Try<void>>> v) {
1089 EXPECT_EQ(n, v.size());
1091 EXPECT_TRUE(tt.second.hasValue());
1094 promises[0].setValue();
1096 promises[1].setValue();
1098 promises[2].setValue();
1102 /* Ensure that we can compile when_{all,any} with folly::small_vector */
1103 TEST(when, small_vector) {
1105 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<void>),
1106 "Futures should not be trivially copyable");
1107 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<int>),
1108 "Futures should not be trivially copyable");
1110 using folly::small_vector;
1112 small_vector<Future<void>> futures;
1114 for (int i = 0; i < 10; i++)
1115 futures.push_back(makeFuture());
1117 auto anyf = collectAny(futures);
1121 small_vector<Future<void>> futures;
1123 for (int i = 0; i < 10; i++)
1124 futures.push_back(makeFuture());
1126 auto allf = collectAll(futures);
1130 TEST(Future, collectAllVariadic) {
1133 Future<bool> fb = pb.getFuture();
1134 Future<int> fi = pi.getFuture();
1136 collectAll(std::move(fb), std::move(fi))
1137 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
1139 EXPECT_TRUE(std::get<0>(tup).hasValue());
1140 EXPECT_EQ(std::get<0>(tup).value(), true);
1141 EXPECT_TRUE(std::get<1>(tup).hasValue());
1142 EXPECT_EQ(std::get<1>(tup).value(), 42);
1150 TEST(Future, collectAllVariadicReferences) {
1153 Future<bool> fb = pb.getFuture();
1154 Future<int> fi = pi.getFuture();
1157 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
1159 EXPECT_TRUE(std::get<0>(tup).hasValue());
1160 EXPECT_EQ(std::get<0>(tup).value(), true);
1161 EXPECT_TRUE(std::get<1>(tup).hasValue());
1162 EXPECT_EQ(std::get<1>(tup).value(), 42);
1170 TEST(Future, collectAll_none) {
1171 vector<Future<int>> fs;
1172 auto f = collectAll(fs);
1173 EXPECT_TRUE(f.isReady());
1176 TEST(Future, throwCaughtInImmediateThen) {
1177 // Neither of these should throw "Promise already satisfied"
1179 [=](Try<void>&&) -> int { throw std::exception(); });
1181 [=](Try<void>&&) -> Future<int> { throw std::exception(); });
1184 TEST(Future, throwIfFailed) {
1185 makeFuture<void>(eggs)
1186 .then([=](Try<void>&& t) {
1187 EXPECT_THROW(t.throwIfFailed(), eggs_t);
1190 .then([=](Try<void>&& t) {
1191 EXPECT_NO_THROW(t.throwIfFailed());
1194 makeFuture<int>(eggs)
1195 .then([=](Try<int>&& t) {
1196 EXPECT_THROW(t.throwIfFailed(), eggs_t);
1199 .then([=](Try<int>&& t) {
1200 EXPECT_NO_THROW(t.throwIfFailed());
1204 TEST(Future, waitImmediate) {
1205 makeFuture().wait();
1206 auto done = makeFuture(42).wait().value();
1207 EXPECT_EQ(42, done);
1209 vector<int> v{1,2,3};
1210 auto done_v = makeFuture(v).wait().value();
1211 EXPECT_EQ(v.size(), done_v.size());
1212 EXPECT_EQ(v, done_v);
1214 vector<Future<void>> v_f;
1215 v_f.push_back(makeFuture());
1216 v_f.push_back(makeFuture());
1217 auto done_v_f = collectAll(v_f).wait().value();
1218 EXPECT_EQ(2, done_v_f.size());
1220 vector<Future<bool>> v_fb;
1221 v_fb.push_back(makeFuture(true));
1222 v_fb.push_back(makeFuture(false));
1223 auto fut = collectAll(v_fb);
1224 auto done_v_fb = std::move(fut.wait().value());
1225 EXPECT_EQ(2, done_v_fb.size());
1228 TEST(Future, wait) {
1230 Future<int> f = p.getFuture();
1231 std::atomic<bool> flag{false};
1232 std::atomic<int> result{1};
1233 std::atomic<std::thread::id> id;
1235 std::thread t([&](Future<int>&& tf){
1236 auto n = tf.then([&](Try<int> && t) {
1237 id = std::this_thread::get_id();
1241 result.store(n.wait().value());
1246 EXPECT_EQ(result.load(), 1);
1249 // validate that the callback ended up executing in this thread, which
1250 // is more to ensure that this test actually tests what it should
1251 EXPECT_EQ(id, std::this_thread::get_id());
1252 EXPECT_EQ(result.load(), 42);
1256 MoveFlag() = default;
1257 MoveFlag(const MoveFlag&) = delete;
1258 MoveFlag(MoveFlag&& other) noexcept {
1264 TEST(Future, waitReplacesSelf) {
1268 auto f1 = makeFuture(MoveFlag());
1270 EXPECT_FALSE(f1.value().moved);
1273 auto f2 = makeFuture(MoveFlag()).wait();
1274 EXPECT_FALSE(f2.value().moved);
1280 auto f1 = makeFuture(MoveFlag());
1281 f1.wait(milliseconds(1));
1282 EXPECT_FALSE(f1.value().moved);
1285 auto f2 = makeFuture(MoveFlag()).wait(milliseconds(1));
1286 EXPECT_FALSE(f2.value().moved);
1291 folly::EventBase eb;
1293 auto f1 = makeFuture(MoveFlag());
1295 EXPECT_FALSE(f1.value().moved);
1298 auto f2 = makeFuture(MoveFlag()).waitVia(&eb);
1299 EXPECT_FALSE(f2.value().moved);
1303 TEST(Future, waitWithDuration) {
1306 Future<int> f = p.getFuture();
1307 f.wait(milliseconds(1));
1308 EXPECT_FALSE(f.isReady());
1310 EXPECT_TRUE(f.isReady());
1314 Future<int> f = p.getFuture();
1316 f.wait(milliseconds(1));
1317 EXPECT_TRUE(f.isReady());
1320 vector<Future<bool>> v_fb;
1321 v_fb.push_back(makeFuture(true));
1322 v_fb.push_back(makeFuture(false));
1323 auto f = collectAll(v_fb);
1324 f.wait(milliseconds(1));
1325 EXPECT_TRUE(f.isReady());
1326 EXPECT_EQ(2, f.value().size());
1329 vector<Future<bool>> v_fb;
1332 v_fb.push_back(p1.getFuture());
1333 v_fb.push_back(p2.getFuture());
1334 auto f = collectAll(v_fb);
1335 f.wait(milliseconds(1));
1336 EXPECT_FALSE(f.isReady());
1338 EXPECT_FALSE(f.isReady());
1340 EXPECT_TRUE(f.isReady());
1343 auto f = makeFuture().wait(milliseconds(1));
1344 EXPECT_TRUE(f.isReady());
1349 auto start = std::chrono::steady_clock::now();
1350 auto f = p.getFuture().wait(milliseconds(100));
1351 auto elapsed = std::chrono::steady_clock::now() - start;
1352 EXPECT_GE(elapsed, milliseconds(100));
1353 EXPECT_FALSE(f.isReady());
1355 EXPECT_TRUE(f.isReady());
1359 // Try to trigger the race where the resultant Future is not yet complete
1360 // even if we didn't hit the timeout, and make sure we deal with it properly
1363 auto t = std::thread([&]{
1365 /* sleep override */ std::this_thread::sleep_for(milliseconds(100));
1369 auto f = p.getFuture().wait(std::chrono::seconds(3600));
1370 EXPECT_TRUE(f.isReady());
1375 class DummyDrivableExecutor : public DrivableExecutor {
1377 void add(Func f) override {}
1378 void drive() override { ran = true; }
1382 TEST(Future, getVia) {
1386 auto f = via(&x).then([]{ return true; });
1387 EXPECT_TRUE(f.getVia(&x));
1393 auto f = via(&x).then();
1398 DummyDrivableExecutor x;
1399 auto f = makeFuture(true);
1400 EXPECT_TRUE(f.getVia(&x));
1401 EXPECT_FALSE(x.ran);
1405 TEST(Future, waitVia) {
1408 auto f = via(&x).then();
1409 EXPECT_FALSE(f.isReady());
1411 EXPECT_TRUE(f.isReady());
1415 // try rvalue as well
1417 auto f = via(&x).then().waitVia(&x);
1418 EXPECT_TRUE(f.isReady());
1422 DummyDrivableExecutor x;
1423 makeFuture(true).waitVia(&x);
1424 EXPECT_FALSE(x.ran);
1428 TEST(Future, viaRaces) {
1431 auto tid = std::this_thread::get_id();
1434 std::thread t1([&] {
1437 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1438 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1439 .then([&](Try<void>&&) { done = true; });
1442 std::thread t2([&] {
1446 while (!done) x.run();
1451 TEST(Future, getFuture_after_setValue) {
1454 EXPECT_EQ(42, p.getFuture().value());
1457 TEST(Future, getFuture_after_setException) {
1459 p.setWith([]() -> void { throw std::logic_error("foo"); });
1460 EXPECT_THROW(p.getFuture().value(), std::logic_error);
1463 TEST(Future, detachRace) {
1465 // This test is designed to detect a race that was in Core::detachOne()
1466 // where detached_ was incremented and then tested, and that
1467 // allowed a race where both Promise and Future would think they were the
1468 // second and both try to delete. This showed up at scale but was very
1469 // difficult to reliably repro in a test. As it is, this only fails about
1470 // once in every 1,000 executions. Doing this 1,000 times is going to make a
1471 // slow test so I won't do that but if it ever fails, take it seriously, and
1472 // run the test binary with "--gtest_repeat=10000 --gtest_filter=*detachRace"
1473 // (Don't forget to enable ASAN)
1474 auto p = folly::make_unique<Promise<bool>>();
1475 auto f = folly::make_unique<Future<bool>>(p->getFuture());
1476 folly::Baton<> baton;
1486 class TestData : public RequestData {
1488 explicit TestData(int data) : data_(data) {}
1489 virtual ~TestData() {}
1493 TEST(Future, context) {
1495 // Start a new context
1496 RequestContext::create();
1498 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1500 // Set some test data
1501 RequestContext::get()->setContextData(
1503 std::unique_ptr<TestData>(new TestData(10)));
1507 auto future = p.getFuture().then([&]{
1508 // Check that the context followed the future
1509 EXPECT_TRUE(RequestContext::get() != nullptr);
1510 auto a = dynamic_cast<TestData*>(
1511 RequestContext::get()->getContextData("test"));
1512 auto data = a->data_;
1513 EXPECT_EQ(10, data);
1516 // Clear the context
1517 RequestContext::setContext(nullptr);
1519 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1521 // Fulfill the promise
1526 // This only fails about 1 in 1k times when the bug is present :(
1527 TEST(Future, t5506504) {
1531 auto promises = std::make_shared<vector<Promise<void>>>(4);
1532 vector<Future<void>> futures;
1534 for (auto& p : *promises) {
1535 futures.emplace_back(
1538 .then([](Try<void>&&){}));
1543 for (auto& p : *promises) p.setValue();
1546 return collectAll(futures);
1552 // Test of handling of a circular dependency. It's never recommended
1553 // to have one because of possible memory leaks. Here we test that
1554 // we can handle freeing of the Future while it is running.
1555 TEST(Future, CircularDependencySharedPtrSelfReset) {
1556 Promise<int64_t> promise;
1557 auto ptr = std::make_shared<Future<int64_t>>(promise.getFuture());
1560 [ptr] (folly::Try<int64_t>&& uid) mutable {
1561 EXPECT_EQ(1, ptr.use_count());
1563 // Leaving no references to ourselves.
1565 EXPECT_EQ(0, ptr.use_count());
1569 EXPECT_EQ(2, ptr.use_count());
1573 promise.setWith([]{return 1l;});
1576 TEST(Future, Constructor) {
1577 auto f1 = []() -> Future<int> { return Future<int>(3); }();
1578 EXPECT_EQ(f1.value(), 3);
1579 auto f2 = []() -> Future<void> { return Future<void>(); }();
1580 EXPECT_NO_THROW(f2.value());
1583 TEST(Future, ImplicitConstructor) {
1584 auto f1 = []() -> Future<int> { return 3; }();
1585 EXPECT_EQ(f1.value(), 3);
1586 // Unfortunately, the C++ standard does not allow the
1587 // following implicit conversion to work:
1588 //auto f2 = []() -> Future<void> { }();
1591 TEST(Future, thenDynamic) {
1592 // folly::dynamic has a constructor that takes any T, this test makes
1593 // sure that we call the then lambda with folly::dynamic and not
1594 // Try<folly::dynamic> because that then fails to compile
1595 Promise<folly::dynamic> p;
1596 Future<folly::dynamic> f = p.getFuture().then(
1597 [](const folly::dynamic& d) {
1598 return folly::dynamic(d.asInt() + 3);
1602 EXPECT_EQ(f.get(), 5);
1605 TEST(Future, via_then_get_was_racy) {
1607 std::unique_ptr<int> val = folly::via(&x)
1608 .then([] { return folly::make_unique<int>(42); })
1611 EXPECT_EQ(42, *val);
1614 TEST(Future, ensure) {
1616 auto cob = [&]{ count++; };
1617 auto f = makeFuture(42)
1619 .then([](int) { throw std::runtime_error("ensure"); })
1622 EXPECT_THROW(f.get(), std::runtime_error);
1623 EXPECT_EQ(2, count);
1626 TEST(Future, willEqual) {
1627 //both p1 and p2 already fulfilled
1633 auto f1 = p1.getFuture();
1634 auto f2 = p2.getFuture();
1635 EXPECT_TRUE(f1.willEqual(f2).get());
1641 auto f1 = p1.getFuture();
1642 auto f2 = p2.getFuture();
1643 EXPECT_FALSE(f1.willEqual(f2).get());
1645 //both p1 and p2 not yet fulfilled
1649 auto f1 = p1.getFuture();
1650 auto f2 = p2.getFuture();
1651 auto f3 = f1.willEqual(f2);
1654 EXPECT_TRUE(f3.get());
1658 auto f1 = p1.getFuture();
1659 auto f2 = p2.getFuture();
1660 auto f3 = f1.willEqual(f2);
1663 EXPECT_FALSE(f3.get());
1665 //p1 already fulfilled, p2 not yet fulfilled
1670 auto f1 = p1.getFuture();
1671 auto f2 = p2.getFuture();
1672 auto f3 = f1.willEqual(f2);
1674 EXPECT_TRUE(f3.get());
1679 auto f1 = p1.getFuture();
1680 auto f2 = p2.getFuture();
1681 auto f3 = f1.willEqual(f2);
1683 EXPECT_FALSE(f3.get());
1685 //p2 already fulfilled, p1 not yet fulfilled
1690 auto f1 = p1.getFuture();
1691 auto f2 = p2.getFuture();
1692 auto f3 = f1.willEqual(f2);
1694 EXPECT_TRUE(f3.get());
1699 auto f1 = p1.getFuture();
1700 auto f2 = p2.getFuture();
1701 auto f3 = f1.willEqual(f2);
1703 EXPECT_FALSE(f3.get());
1709 // A simple scenario for the unwrap call, when the promise was fulfilled
1710 // before calling to unwrap.
1711 TEST(Future, Unwrap_SimpleScenario) {
1712 Future<int> encapsulated_future = makeFuture(5484);
1713 Future<Future<int>> future = makeFuture(std::move(encapsulated_future));
1714 EXPECT_EQ(5484, future.unwrap().value());
1717 // Makes sure that unwrap() works when chaning Future's commands.
1718 TEST(Future, Unwrap_ChainCommands) {
1719 Future<Future<int>> future = makeFuture(makeFuture(5484));
1720 auto unwrapped = future.unwrap().then([](int i){ return i; });
1721 EXPECT_EQ(5484, unwrapped.value());
1724 // Makes sure that the unwrap call also works when the promise was not yet
1725 // fulfilled, and that the returned Future<T> becomes ready once the promise
1727 TEST(Future, Unwrap_FutureNotReady) {
1728 Promise<Future<int>> p;
1729 Future<Future<int>> future = p.getFuture();
1730 Future<int> unwrapped = future.unwrap();
1731 // Sanity - should not be ready before the promise is fulfilled.
1732 ASSERT_FALSE(unwrapped.isReady());
1733 // Fulfill the promise and make sure the unwrapped future is now ready.
1734 p.setValue(makeFuture(5484));
1735 ASSERT_TRUE(unwrapped.isReady());
1736 EXPECT_EQ(5484, unwrapped.value());
1739 TEST(Reduce, Basic) {
1740 auto makeFutures = [](int count) {
1741 std::vector<Future<int>> fs;
1742 for (int i = 1; i <= count; ++i) {
1743 fs.emplace_back(makeFuture(i));
1750 auto fs = makeFutures(0);
1752 Future<double> f1 = reduce(fs, 1.2,
1753 [](double a, Try<int>&& b){
1754 return a + *b + 0.1;
1756 EXPECT_EQ(1.2, f1.get());
1761 auto fs = makeFutures(1);
1763 Future<double> f1 = reduce(fs, 0.0,
1764 [](double a, Try<int>&& b){
1765 return a + *b + 0.1;
1767 EXPECT_EQ(1.1, f1.get());
1770 // Returning values (Try)
1772 auto fs = makeFutures(3);
1774 Future<double> f1 = reduce(fs, 0.0,
1775 [](double a, Try<int>&& b){
1776 return a + *b + 0.1;
1778 EXPECT_EQ(6.3, f1.get());
1783 auto fs = makeFutures(3);
1785 Future<double> f1 = reduce(fs, 0.0,
1786 [](double a, int&& b){
1789 EXPECT_EQ(6.3, f1.get());
1792 // Returning futures (Try)
1794 auto fs = makeFutures(3);
1796 Future<double> f2 = reduce(fs, 0.0,
1797 [](double a, Try<int>&& b){
1798 return makeFuture<double>(a + *b + 0.1);
1800 EXPECT_EQ(6.3, f2.get());
1803 // Returning futures
1805 auto fs = makeFutures(3);
1807 Future<double> f2 = reduce(fs, 0.0,
1808 [](double a, int&& b){
1809 return makeFuture<double>(a + b + 0.1);
1811 EXPECT_EQ(6.3, f2.get());
1815 TEST(Reduce, Chain) {
1816 auto makeFutures = [](int count) {
1817 std::vector<Future<int>> fs;
1818 for (int i = 1; i <= count; ++i) {
1819 fs.emplace_back(makeFuture(i));
1825 auto f = collectAll(makeFutures(3)).reduce(0, [](int a, Try<int>&& b){
1828 EXPECT_EQ(6, f.get());
1831 auto f = collect(makeFutures(3)).reduce(0, [](int a, int&& b){
1834 EXPECT_EQ(6, f.get());
1838 TEST(Reduce, UnorderedReduce) {
1840 std::vector<Future<int>> fs;
1841 fs.push_back(makeFuture(1));
1842 fs.push_back(makeFuture(2));
1843 fs.push_back(makeFuture(3));
1845 Future<double> f = unorderedReduce(fs.begin(), fs.end(), 0.0,
1846 [](double a, int&& b){
1849 EXPECT_EQ(3.0, f.get());
1856 std::vector<Future<int>> fs;
1857 fs.push_back(p1.getFuture());
1858 fs.push_back(p2.getFuture());
1859 fs.push_back(p3.getFuture());
1861 Future<double> f = unorderedReduce(fs.begin(), fs.end(), 0.0,
1862 [](double a, int&& b){
1868 EXPECT_EQ(1.0, f.get());
1872 TEST(Reduce, UnorderedReduceException) {
1877 std::vector<Future<int>> fs;
1878 fs.push_back(p1.getFuture());
1879 fs.push_back(p2.getFuture());
1880 fs.push_back(p3.getFuture());
1882 Future<double> f = unorderedReduce(fs.begin(), fs.end(), 0.0,
1883 [](double a, int&& b){
1887 p2.setException(exception_wrapper(std::runtime_error("blah")));
1889 EXPECT_THROW(f.get(), std::runtime_error);
1897 std::vector<Future<int>> fs;
1898 fs.push_back(p1.getFuture());
1899 fs.push_back(p2.getFuture());
1900 fs.push_back(p3.getFuture());
1903 std::vector<Future<void>> fs2 = futures::map(fs, [&](int i){
1907 // Ensure we call the callbacks as the futures complete regardless of order
1915 EXPECT_TRUE(collect(fs2).isReady());
1918 TEST(Promise, isFulfilled) {
1921 EXPECT_FALSE(p.isFulfilled());
1923 EXPECT_TRUE(p.isFulfilled());
1926 TEST(Promise, isFulfilledWithFuture) {
1928 auto f = p.getFuture(); // so core_ will become null
1930 EXPECT_FALSE(p.isFulfilled());
1931 p.setValue(42); // after here
1932 EXPECT_TRUE(p.isFulfilled());