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/MPMCQueue.h>
34 #include <folly/io/async/EventBase.h>
35 #include <folly/io/async/Request.h>
37 using namespace folly;
40 using std::unique_ptr;
42 using std::chrono::milliseconds;
44 #define EXPECT_TYPE(x, T) \
45 EXPECT_TRUE((std::is_same<decltype(x), T>::value))
47 /// Simple executor that does work in another thread
48 class ThreadExecutor : public Executor {
49 folly::MPMCQueue<Func> funcs;
50 std::atomic<bool> done {false};
58 while (!funcs.isEmpty()) {
59 funcs.blockingRead(fn);
66 explicit ThreadExecutor(size_t n = 1024)
68 worker = std::thread(std::bind(&ThreadExecutor::work, this));
77 void add(Func fn) override {
78 funcs.blockingWrite(std::move(fn));
81 void waitForStartup() {
86 typedef FutureException eggs_t;
87 static eggs_t eggs("eggs");
91 TEST(Future, coreSize) {
92 // If this number goes down, it's fine!
93 // If it goes up, please seek professional advice ;-)
94 EXPECT_EQ(192, sizeof(detail::Core<void>));
99 TEST(Future, onError) {
100 bool theFlag = false;
101 auto flag = [&]{ theFlag = true; };
102 #define EXPECT_FLAG() \
104 EXPECT_TRUE(theFlag); \
108 #define EXPECT_NO_FLAG() \
110 EXPECT_FALSE(theFlag); \
116 auto f = makeFuture()
117 .then([] { throw eggs; })
118 .onError([&] (eggs_t& e) { flag(); });
120 EXPECT_NO_THROW(f.value());
124 auto f = makeFuture()
125 .then([] { throw eggs; })
126 .onError([&] (eggs_t& e) { flag(); return makeFuture(); });
128 EXPECT_NO_THROW(f.value());
133 auto f = makeFuture()
134 .then([] { throw eggs; })
135 .onError([&] (eggs_t e) { flag(); });
137 EXPECT_NO_THROW(f.value());
141 auto f = makeFuture()
142 .then([] { throw eggs; })
143 .onError([&] (eggs_t e) { flag(); return makeFuture(); });
145 EXPECT_NO_THROW(f.value());
150 auto f = makeFuture()
151 .then([] { throw eggs; })
152 .onError([&] (std::exception& e) { flag(); });
154 EXPECT_NO_THROW(f.value());
158 auto f = makeFuture()
159 .then([] { throw eggs; })
160 .onError([&] (std::exception& e) { flag(); return makeFuture(); });
162 EXPECT_NO_THROW(f.value());
167 auto f = makeFuture()
168 .then([] { throw -1; })
169 .onError([&] (int e) { flag(); });
171 EXPECT_NO_THROW(f.value());
175 auto f = makeFuture()
176 .then([] { throw -1; })
177 .onError([&] (int e) { flag(); return makeFuture(); });
179 EXPECT_NO_THROW(f.value());
184 auto f = makeFuture()
185 .then([] { throw eggs; })
186 .onError([&] (eggs_t& e) mutable { flag(); });
188 EXPECT_NO_THROW(f.value());
192 auto f = makeFuture()
193 .then([] { throw eggs; })
194 .onError([&] (eggs_t& e) mutable { flag(); return makeFuture(); });
196 EXPECT_NO_THROW(f.value());
201 auto f = makeFuture()
202 .then([] { return 42; })
203 .onError([&] (eggs_t& e) { flag(); return -1; });
205 EXPECT_EQ(42, f.value());
209 auto f = makeFuture()
210 .then([] { return 42; })
211 .onError([&] (eggs_t& e) { flag(); return makeFuture<int>(-1); });
213 EXPECT_EQ(42, f.value());
216 // Catch different exception
218 auto f = makeFuture()
219 .then([] { throw eggs; })
220 .onError([&] (std::runtime_error& e) { flag(); });
222 EXPECT_THROW(f.value(), eggs_t);
226 auto f = makeFuture()
227 .then([] { throw eggs; })
228 .onError([&] (std::runtime_error& e) { flag(); return makeFuture(); });
230 EXPECT_THROW(f.value(), eggs_t);
233 // Returned value propagates
235 auto f = makeFuture()
236 .then([] { throw eggs; return 0; })
237 .onError([&] (eggs_t& e) { return 42; });
238 EXPECT_EQ(42, f.value());
241 // Returned future propagates
243 auto f = makeFuture()
244 .then([] { throw eggs; return 0; })
245 .onError([&] (eggs_t& e) { return makeFuture<int>(42); });
246 EXPECT_EQ(42, f.value());
251 auto f = makeFuture()
252 .then([] { throw eggs; return 0; })
253 .onError([&] (eggs_t& e) { throw e; return -1; });
254 EXPECT_THROW(f.value(), eggs_t);
258 auto f = makeFuture()
259 .then([] { throw eggs; return 0; })
260 .onError([&] (eggs_t& e) { throw e; return makeFuture<int>(-1); });
261 EXPECT_THROW(f.value(), eggs_t);
264 // exception_wrapper, return Future<T>
266 auto f = makeFuture()
267 .then([] { throw eggs; })
268 .onError([&] (exception_wrapper e) { flag(); return makeFuture(); });
270 EXPECT_NO_THROW(f.value());
273 // exception_wrapper, return Future<T> but throw
275 auto f = makeFuture()
276 .then([]{ throw eggs; return 0; })
277 .onError([&] (exception_wrapper e) {
280 return makeFuture<int>(-1);
283 EXPECT_THROW(f.value(), eggs_t);
286 // exception_wrapper, return T
288 auto f = makeFuture()
289 .then([]{ throw eggs; return 0; })
290 .onError([&] (exception_wrapper e) {
295 EXPECT_EQ(-1, f.value());
298 // exception_wrapper, return T but throw
300 auto f = makeFuture()
301 .then([]{ throw eggs; return 0; })
302 .onError([&] (exception_wrapper e) {
308 EXPECT_THROW(f.value(), eggs_t);
311 // const exception_wrapper&
313 auto f = makeFuture()
314 .then([] { throw eggs; })
315 .onError([&] (const exception_wrapper& e) {
320 EXPECT_NO_THROW(f.value());
338 Try<A> t_a(std::move(a));
342 EXPECT_EQ(5, t_a.value().x());
345 TEST(Future, special) {
346 EXPECT_FALSE(std::is_copy_constructible<Future<int>>::value);
347 EXPECT_FALSE(std::is_copy_assignable<Future<int>>::value);
348 EXPECT_TRUE(std::is_move_constructible<Future<int>>::value);
349 EXPECT_TRUE(std::is_move_assignable<Future<int>>::value);
353 auto f = makeFuture<string>("0")
354 .then([](){ return makeFuture<string>("1"); })
355 .then([](Try<string>&& t) { return makeFuture(t.value() + ";2"); })
356 .then([](const Try<string>&& t) { return makeFuture(t.value() + ";3"); })
357 .then([](Try<string>& t) { return makeFuture(t.value() + ";4"); })
358 .then([](const Try<string>& t) { return makeFuture(t.value() + ";5"); })
359 .then([](Try<string> t) { return makeFuture(t.value() + ";6"); })
360 .then([](const Try<string> t) { return makeFuture(t.value() + ";7"); })
361 .then([](string&& s) { return makeFuture(s + ";8"); })
362 .then([](const string&& s) { return makeFuture(s + ";9"); })
363 .then([](string& s) { return makeFuture(s + ";10"); })
364 .then([](const string& s) { return makeFuture(s + ";11"); })
365 .then([](string s) { return makeFuture(s + ";12"); })
366 .then([](const string s) { return makeFuture(s + ";13"); })
368 EXPECT_EQ(f.value(), "1;2;3;4;5;6;7;8;9;10;11;12;13");
371 TEST(Future, thenTry) {
374 makeFuture<int>(42).then([&](Try<int>&& t) {
376 EXPECT_EQ(42, t.value());
378 EXPECT_TRUE(flag); flag = false;
381 .then([](Try<int>&& t) { return t.value(); })
382 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
383 EXPECT_TRUE(flag); flag = false;
385 makeFuture().then([&](Try<void>&& t) { flag = true; t.value(); });
386 EXPECT_TRUE(flag); flag = false;
389 auto f = p.getFuture().then([&](Try<void>&& t) { flag = true; });
391 EXPECT_FALSE(f.isReady());
394 EXPECT_TRUE(f.isReady());
397 TEST(Future, thenValue) {
399 makeFuture<int>(42).then([&](int i){
403 EXPECT_TRUE(flag); flag = false;
406 .then([](int i){ return i; })
407 .then([&](int i) { flag = true; EXPECT_EQ(42, i); });
408 EXPECT_TRUE(flag); flag = false;
410 makeFuture().then([&]{
413 EXPECT_TRUE(flag); flag = false;
415 auto f = makeFuture<int>(eggs).then([&](int i){});
416 EXPECT_THROW(f.value(), eggs_t);
418 f = makeFuture<void>(eggs).then([&]{});
419 EXPECT_THROW(f.value(), eggs_t);
422 TEST(Future, thenValueFuture) {
425 .then([](int i){ return makeFuture<int>(std::move(i)); })
426 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
427 EXPECT_TRUE(flag); flag = false;
430 .then([]{ return makeFuture(); })
431 .then([&](Try<void>&& t) { flag = true; });
432 EXPECT_TRUE(flag); flag = false;
435 static string doWorkStatic(Try<string>&& t) {
436 return t.value() + ";static";
439 TEST(Future, thenFunction) {
441 string doWork(Try<string>&& t) {
442 return t.value() + ";class";
444 static string doWorkStatic(Try<string>&& t) {
445 return t.value() + ";class-static";
449 auto f = makeFuture<string>("start")
451 .then(Worker::doWorkStatic)
452 .then(&Worker::doWork, &w);
454 EXPECT_EQ(f.value(), "start;static;class-static;class");
457 static Future<string> doWorkStaticFuture(Try<string>&& t) {
458 return makeFuture(t.value() + ";static");
461 TEST(Future, thenFunctionFuture) {
463 Future<string> doWorkFuture(Try<string>&& t) {
464 return makeFuture(t.value() + ";class");
466 static Future<string> doWorkStaticFuture(Try<string>&& t) {
467 return makeFuture(t.value() + ";class-static");
471 auto f = makeFuture<string>("start")
472 .then(doWorkStaticFuture)
473 .then(Worker::doWorkStaticFuture)
474 .then(&Worker::doWorkFuture, &w);
476 EXPECT_EQ(f.value(), "start;static;class-static;class");
479 TEST(Future, thenBind) {
481 return makeFuture("bind");
483 auto b = std::bind(l);
484 auto f = makeFuture().then(std::move(b));
485 EXPECT_EQ(f.value(), "bind");
488 TEST(Future, thenBindTry) {
489 auto l = [](Try<string>&& t) {
490 return makeFuture(t.value() + ";bind");
492 auto b = std::bind(l, std::placeholders::_1);
493 auto f = makeFuture<string>("start").then(std::move(b));
495 EXPECT_EQ(f.value(), "start;bind");
498 TEST(Future, value) {
499 auto f = makeFuture(unique_ptr<int>(new int(42)));
500 auto up = std::move(f.value());
503 EXPECT_THROW(makeFuture<int>(eggs).value(), eggs_t);
506 TEST(Future, isReady) {
508 auto f = p.getFuture();
509 EXPECT_FALSE(f.isReady());
511 EXPECT_TRUE(f.isReady());
514 TEST(Future, futureNotReady) {
516 Future<int> f = p.getFuture();
517 EXPECT_THROW(f.value(), eggs_t);
520 TEST(Future, hasException) {
521 EXPECT_TRUE(makeFuture<int>(eggs).getTry().hasException());
522 EXPECT_FALSE(makeFuture(42).getTry().hasException());
525 TEST(Future, hasValue) {
526 EXPECT_TRUE(makeFuture(42).getTry().hasValue());
527 EXPECT_FALSE(makeFuture<int>(eggs).getTry().hasValue());
530 TEST(Future, makeFuture) {
531 EXPECT_TYPE(makeFuture(42), Future<int>);
532 EXPECT_EQ(42, makeFuture(42).value());
534 EXPECT_TYPE(makeFuture<float>(42), Future<float>);
535 EXPECT_EQ(42, makeFuture<float>(42).value());
537 auto fun = [] { return 42; };
538 EXPECT_TYPE(makeFutureTry(fun), Future<int>);
539 EXPECT_EQ(42, makeFutureTry(fun).value());
541 auto failfun = []() -> int { throw eggs; };
542 EXPECT_TYPE(makeFutureTry(failfun), Future<int>);
543 EXPECT_THROW(makeFutureTry(failfun).value(), eggs_t);
545 EXPECT_TYPE(makeFuture(), Future<void>);
550 TEST(Promise, special) {
551 EXPECT_FALSE(std::is_copy_constructible<Promise<int>>::value);
552 EXPECT_FALSE(std::is_copy_assignable<Promise<int>>::value);
553 EXPECT_TRUE(std::is_move_constructible<Promise<int>>::value);
554 EXPECT_TRUE(std::is_move_assignable<Promise<int>>::value);
557 TEST(Promise, getFuture) {
559 Future<int> f = p.getFuture();
560 EXPECT_FALSE(f.isReady());
563 TEST(Promise, setValue) {
565 auto ffund = fund.getFuture();
567 EXPECT_EQ(42, ffund.value());
575 auto fpod = pod.getFuture();
576 Foo f = {"the answer", 42};
578 Foo f2 = fpod.value();
579 EXPECT_EQ(f.name, f2.name);
580 EXPECT_EQ(f.value, f2.value);
582 pod = Promise<Foo>();
583 fpod = pod.getFuture();
584 pod.setValue(std::move(f2));
585 Foo f3 = fpod.value();
586 EXPECT_EQ(f.name, f3.name);
587 EXPECT_EQ(f.value, f3.value);
589 Promise<unique_ptr<int>> mov;
590 auto fmov = mov.getFuture();
591 mov.setValue(unique_ptr<int>(new int(42)));
592 unique_ptr<int> ptr = std::move(fmov.value());
596 auto fv = v.getFuture();
598 EXPECT_TRUE(fv.isReady());
601 TEST(Promise, setException) {
604 auto f = p.getFuture();
605 p.setException(eggs);
606 EXPECT_THROW(f.value(), eggs_t);
610 auto f = p.getFuture();
614 p.setException(exception_wrapper(std::current_exception()));
616 EXPECT_THROW(f.value(), eggs_t);
620 TEST(Promise, setWith) {
623 auto f = p.getFuture();
624 p.setWith([] { return 42; });
625 EXPECT_EQ(42, f.value());
629 auto f = p.getFuture();
630 p.setWith([]() -> int { throw eggs; });
631 EXPECT_THROW(f.value(), eggs_t);
635 TEST(Future, finish) {
636 auto x = std::make_shared<int>(0);
639 auto f = p.getFuture().then([x](Try<int>&& t) { *x = t.value(); });
641 // The callback hasn't executed
644 // The callback has a reference to x
645 EXPECT_EQ(2, x.use_count());
649 // the callback has executed
652 // the callback has been destructed
653 // and has released its reference to x
654 EXPECT_EQ(1, x.use_count());
657 TEST(Future, unwrap) {
661 auto fa = a.getFuture();
662 auto fb = b.getFuture();
667 // do a, then do b, and get the result of a + b.
668 Future<int> f = fa.then([&](Try<int>&& ta) {
669 auto va = ta.value();
671 return fb.then([va, &flag2](Try<int>&& tb) {
673 return va + tb.value();
679 EXPECT_FALSE(f.isReady());
684 EXPECT_FALSE(f.isReady());
689 EXPECT_EQ(7, f.value());
692 TEST(Future, whenAll) {
693 // returns a vector variant
695 vector<Promise<int>> promises(10);
696 vector<Future<int>> futures;
698 for (auto& p : promises)
699 futures.push_back(p.getFuture());
701 auto allf = whenAll(futures.begin(), futures.end());
703 random_shuffle(promises.begin(), promises.end());
704 for (auto& p : promises) {
705 EXPECT_FALSE(allf.isReady());
709 EXPECT_TRUE(allf.isReady());
710 auto& results = allf.value();
711 for (auto& t : results) {
712 EXPECT_EQ(42, t.value());
716 // check error semantics
718 vector<Promise<int>> promises(4);
719 vector<Future<int>> futures;
721 for (auto& p : promises)
722 futures.push_back(p.getFuture());
724 auto allf = whenAll(futures.begin(), futures.end());
727 promises[0].setValue(42);
728 promises[1].setException(eggs);
730 EXPECT_FALSE(allf.isReady());
732 promises[2].setValue(42);
734 EXPECT_FALSE(allf.isReady());
736 promises[3].setException(eggs);
738 EXPECT_TRUE(allf.isReady());
739 EXPECT_FALSE(allf.getTry().hasException());
741 auto& results = allf.value();
742 EXPECT_EQ(42, results[0].value());
743 EXPECT_TRUE(results[1].hasException());
744 EXPECT_EQ(42, results[2].value());
745 EXPECT_TRUE(results[3].hasException());
748 // check that futures are ready in then()
750 vector<Promise<void>> promises(10);
751 vector<Future<void>> futures;
753 for (auto& p : promises)
754 futures.push_back(p.getFuture());
756 auto allf = whenAll(futures.begin(), futures.end())
757 .then([](Try<vector<Try<void>>>&& ts) {
758 for (auto& f : ts.value())
762 random_shuffle(promises.begin(), promises.end());
763 for (auto& p : promises)
765 EXPECT_TRUE(allf.isReady());
769 TEST(Future, collect) {
772 vector<Promise<int>> promises(10);
773 vector<Future<int>> futures;
775 for (auto& p : promises)
776 futures.push_back(p.getFuture());
778 auto allf = collect(futures.begin(), futures.end());
780 random_shuffle(promises.begin(), promises.end());
781 for (auto& p : promises) {
782 EXPECT_FALSE(allf.isReady());
786 EXPECT_TRUE(allf.isReady());
787 for (auto i : allf.value()) {
794 vector<Promise<int>> promises(10);
795 vector<Future<int>> futures;
797 for (auto& p : promises)
798 futures.push_back(p.getFuture());
800 auto allf = collect(futures.begin(), futures.end());
802 random_shuffle(promises.begin(), promises.end());
803 for (int i = 0; i < 10; i++) {
805 // everthing goes well so far...
806 EXPECT_FALSE(allf.isReady());
807 promises[i].setValue(42);
809 // short circuit with an exception
810 EXPECT_FALSE(allf.isReady());
811 promises[i].setException(eggs);
812 EXPECT_TRUE(allf.isReady());
814 // don't blow up on further values
815 EXPECT_TRUE(allf.isReady());
816 promises[i].setValue(42);
818 // don't blow up on further exceptions
819 EXPECT_TRUE(allf.isReady());
820 promises[i].setException(eggs);
824 EXPECT_THROW(allf.value(), eggs_t);
827 // void futures success case
829 vector<Promise<void>> promises(10);
830 vector<Future<void>> futures;
832 for (auto& p : promises)
833 futures.push_back(p.getFuture());
835 auto allf = collect(futures.begin(), futures.end());
837 random_shuffle(promises.begin(), promises.end());
838 for (auto& p : promises) {
839 EXPECT_FALSE(allf.isReady());
843 EXPECT_TRUE(allf.isReady());
846 // void futures failure case
848 vector<Promise<void>> promises(10);
849 vector<Future<void>> futures;
851 for (auto& p : promises)
852 futures.push_back(p.getFuture());
854 auto allf = collect(futures.begin(), futures.end());
856 random_shuffle(promises.begin(), promises.end());
857 for (int i = 0; i < 10; i++) {
859 // everthing goes well so far...
860 EXPECT_FALSE(allf.isReady());
861 promises[i].setValue();
863 // short circuit with an exception
864 EXPECT_FALSE(allf.isReady());
865 promises[i].setException(eggs);
866 EXPECT_TRUE(allf.isReady());
868 // don't blow up on further values
869 EXPECT_TRUE(allf.isReady());
870 promises[i].setValue();
872 // don't blow up on further exceptions
873 EXPECT_TRUE(allf.isReady());
874 promises[i].setException(eggs);
878 EXPECT_THROW(allf.value(), eggs_t);
882 struct NotDefaultConstructible {
883 NotDefaultConstructible() = delete;
884 NotDefaultConstructible(int arg) : i(arg) {}
888 // We have a specialized implementation for non-default-constructible objects
889 // Ensure that it works and preserves order
890 TEST(Future, collectNotDefaultConstructible) {
891 vector<Promise<NotDefaultConstructible>> promises(10);
892 vector<Future<NotDefaultConstructible>> futures;
893 vector<int> indices(10);
894 std::iota(indices.begin(), indices.end(), 0);
895 random_shuffle(indices.begin(), indices.end());
897 for (auto& p : promises)
898 futures.push_back(p.getFuture());
900 auto allf = collect(futures.begin(), futures.end());
902 for (auto i : indices) {
903 EXPECT_FALSE(allf.isReady());
904 promises[i].setValue(NotDefaultConstructible(i));
907 EXPECT_TRUE(allf.isReady());
909 for (auto val : allf.value()) {
915 TEST(Future, whenAny) {
917 vector<Promise<int>> promises(10);
918 vector<Future<int>> futures;
920 for (auto& p : promises)
921 futures.push_back(p.getFuture());
923 for (auto& f : futures) {
924 EXPECT_FALSE(f.isReady());
927 auto anyf = whenAny(futures.begin(), futures.end());
929 /* futures were moved in, so these are invalid now */
930 EXPECT_FALSE(anyf.isReady());
932 promises[7].setValue(42);
933 EXPECT_TRUE(anyf.isReady());
934 auto& idx_fut = anyf.value();
936 auto i = idx_fut.first;
939 auto& f = idx_fut.second;
940 EXPECT_EQ(42, f.value());
945 vector<Promise<void>> promises(10);
946 vector<Future<void>> futures;
948 for (auto& p : promises)
949 futures.push_back(p.getFuture());
951 for (auto& f : futures) {
952 EXPECT_FALSE(f.isReady());
955 auto anyf = whenAny(futures.begin(), futures.end());
957 EXPECT_FALSE(anyf.isReady());
959 promises[3].setException(eggs);
960 EXPECT_TRUE(anyf.isReady());
961 EXPECT_TRUE(anyf.value().second.hasException());
966 vector<Promise<int>> promises(10);
967 vector<Future<int>> futures;
969 for (auto& p : promises)
970 futures.push_back(p.getFuture());
972 auto anyf = whenAny(futures.begin(), futures.end())
973 .then([](pair<size_t, Try<int>> p) {
974 EXPECT_EQ(42, p.second.value());
977 promises[3].setValue(42);
978 EXPECT_TRUE(anyf.isReady());
983 TEST(when, already_completed) {
985 vector<Future<void>> fs;
986 for (int i = 0; i < 10; i++)
987 fs.push_back(makeFuture());
989 whenAll(fs.begin(), fs.end())
990 .then([&](vector<Try<void>> ts) {
991 EXPECT_EQ(fs.size(), ts.size());
995 vector<Future<int>> fs;
996 for (int i = 0; i < 10; i++)
997 fs.push_back(makeFuture(i));
999 whenAny(fs.begin(), fs.end())
1000 .then([&](pair<size_t, Try<int>> p) {
1001 EXPECT_EQ(p.first, p.second.value());
1007 vector<Promise<void>> promises(10);
1008 vector<Future<void>> futures;
1010 for (auto& p : promises)
1011 futures.push_back(p.getFuture());
1015 whenN(futures.begin(), futures.end(), n)
1016 .then([&](vector<pair<size_t, Try<void>>> v) {
1018 EXPECT_EQ(n, v.size());
1020 EXPECT_TRUE(tt.second.hasValue());
1023 promises[0].setValue();
1025 promises[1].setValue();
1027 promises[2].setValue();
1031 /* Ensure that we can compile when_{all,any} with folly::small_vector */
1032 TEST(when, small_vector) {
1034 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<void>),
1035 "Futures should not be trivially copyable");
1036 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<int>),
1037 "Futures should not be trivially copyable");
1039 using folly::small_vector;
1041 small_vector<Future<void>> futures;
1043 for (int i = 0; i < 10; i++)
1044 futures.push_back(makeFuture());
1046 auto anyf = whenAny(futures.begin(), futures.end());
1050 small_vector<Future<void>> futures;
1052 for (int i = 0; i < 10; i++)
1053 futures.push_back(makeFuture());
1055 auto allf = whenAll(futures.begin(), futures.end());
1059 TEST(Future, whenAllVariadic) {
1062 Future<bool> fb = pb.getFuture();
1063 Future<int> fi = pi.getFuture();
1065 whenAll(std::move(fb), std::move(fi))
1066 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
1068 EXPECT_TRUE(std::get<0>(tup).hasValue());
1069 EXPECT_EQ(std::get<0>(tup).value(), true);
1070 EXPECT_TRUE(std::get<1>(tup).hasValue());
1071 EXPECT_EQ(std::get<1>(tup).value(), 42);
1079 TEST(Future, whenAllVariadicReferences) {
1082 Future<bool> fb = pb.getFuture();
1083 Future<int> fi = pi.getFuture();
1086 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
1088 EXPECT_TRUE(std::get<0>(tup).hasValue());
1089 EXPECT_EQ(std::get<0>(tup).value(), true);
1090 EXPECT_TRUE(std::get<1>(tup).hasValue());
1091 EXPECT_EQ(std::get<1>(tup).value(), 42);
1099 TEST(Future, whenAll_none) {
1100 vector<Future<int>> fs;
1101 auto f = whenAll(fs.begin(), fs.end());
1102 EXPECT_TRUE(f.isReady());
1105 TEST(Future, throwCaughtInImmediateThen) {
1106 // Neither of these should throw "Promise already satisfied"
1108 [=](Try<void>&&) -> int { throw std::exception(); });
1110 [=](Try<void>&&) -> Future<int> { throw std::exception(); });
1113 TEST(Future, throwIfFailed) {
1114 makeFuture<void>(eggs)
1115 .then([=](Try<void>&& t) {
1116 EXPECT_THROW(t.throwIfFailed(), eggs_t);
1119 .then([=](Try<void>&& t) {
1120 EXPECT_NO_THROW(t.throwIfFailed());
1123 makeFuture<int>(eggs)
1124 .then([=](Try<int>&& t) {
1125 EXPECT_THROW(t.throwIfFailed(), eggs_t);
1128 .then([=](Try<int>&& t) {
1129 EXPECT_NO_THROW(t.throwIfFailed());
1133 TEST(Future, waitImmediate) {
1134 makeFuture().wait();
1135 auto done = makeFuture(42).wait().value();
1136 EXPECT_EQ(42, done);
1138 vector<int> v{1,2,3};
1139 auto done_v = makeFuture(v).wait().value();
1140 EXPECT_EQ(v.size(), done_v.size());
1141 EXPECT_EQ(v, done_v);
1143 vector<Future<void>> v_f;
1144 v_f.push_back(makeFuture());
1145 v_f.push_back(makeFuture());
1146 auto done_v_f = whenAll(v_f.begin(), v_f.end()).wait().value();
1147 EXPECT_EQ(2, done_v_f.size());
1149 vector<Future<bool>> v_fb;
1150 v_fb.push_back(makeFuture(true));
1151 v_fb.push_back(makeFuture(false));
1152 auto fut = whenAll(v_fb.begin(), v_fb.end());
1153 auto done_v_fb = std::move(fut.wait().value());
1154 EXPECT_EQ(2, done_v_fb.size());
1157 TEST(Future, wait) {
1159 Future<int> f = p.getFuture();
1160 std::atomic<bool> flag{false};
1161 std::atomic<int> result{1};
1162 std::atomic<std::thread::id> id;
1164 std::thread t([&](Future<int>&& tf){
1165 auto n = tf.then([&](Try<int> && t) {
1166 id = std::this_thread::get_id();
1170 result.store(n.wait().value());
1175 EXPECT_EQ(result.load(), 1);
1178 // validate that the callback ended up executing in this thread, which
1179 // is more to ensure that this test actually tests what it should
1180 EXPECT_EQ(id, std::this_thread::get_id());
1181 EXPECT_EQ(result.load(), 42);
1185 MoveFlag() = default;
1186 MoveFlag(const MoveFlag&) = delete;
1187 MoveFlag(MoveFlag&& other) noexcept {
1193 TEST(Future, waitReplacesSelf) {
1197 auto f1 = makeFuture(MoveFlag());
1199 EXPECT_FALSE(f1.value().moved);
1202 auto f2 = makeFuture(MoveFlag()).wait();
1203 EXPECT_FALSE(f2.value().moved);
1209 auto f1 = makeFuture(MoveFlag());
1210 f1.wait(milliseconds(1));
1211 EXPECT_FALSE(f1.value().moved);
1214 auto f2 = makeFuture(MoveFlag()).wait(milliseconds(1));
1215 EXPECT_FALSE(f2.value().moved);
1220 folly::EventBase eb;
1222 auto f1 = makeFuture(MoveFlag());
1224 EXPECT_FALSE(f1.value().moved);
1227 auto f2 = makeFuture(MoveFlag()).waitVia(&eb);
1228 EXPECT_FALSE(f2.value().moved);
1232 TEST(Future, waitWithDuration) {
1235 Future<int> f = p.getFuture();
1236 f.wait(milliseconds(1));
1237 EXPECT_FALSE(f.isReady());
1239 EXPECT_TRUE(f.isReady());
1243 Future<int> f = p.getFuture();
1245 f.wait(milliseconds(1));
1246 EXPECT_TRUE(f.isReady());
1249 vector<Future<bool>> v_fb;
1250 v_fb.push_back(makeFuture(true));
1251 v_fb.push_back(makeFuture(false));
1252 auto f = whenAll(v_fb.begin(), v_fb.end());
1253 f.wait(milliseconds(1));
1254 EXPECT_TRUE(f.isReady());
1255 EXPECT_EQ(2, f.value().size());
1258 vector<Future<bool>> v_fb;
1261 v_fb.push_back(p1.getFuture());
1262 v_fb.push_back(p2.getFuture());
1263 auto f = whenAll(v_fb.begin(), v_fb.end());
1264 f.wait(milliseconds(1));
1265 EXPECT_FALSE(f.isReady());
1267 EXPECT_FALSE(f.isReady());
1269 EXPECT_TRUE(f.isReady());
1272 auto f = makeFuture().wait(milliseconds(1));
1273 EXPECT_TRUE(f.isReady());
1278 auto start = std::chrono::steady_clock::now();
1279 auto f = p.getFuture().wait(milliseconds(100));
1280 auto elapsed = std::chrono::steady_clock::now() - start;
1281 EXPECT_GE(elapsed, milliseconds(100));
1282 EXPECT_FALSE(f.isReady());
1284 EXPECT_TRUE(f.isReady());
1288 // Try to trigger the race where the resultant Future is not yet complete
1289 // even if we didn't hit the timeout, and make sure we deal with it properly
1292 auto t = std::thread([&]{
1294 /* sleep override */ std::this_thread::sleep_for(milliseconds(100));
1298 auto f = p.getFuture().wait(std::chrono::seconds(3600));
1299 EXPECT_TRUE(f.isReady());
1304 class DummyDrivableExecutor : public DrivableExecutor {
1306 void add(Func f) override {}
1307 void drive() override { ran = true; }
1311 TEST(Future, getVia) {
1315 auto f = via(&x).then([]{ return true; });
1316 EXPECT_TRUE(f.getVia(&x));
1322 auto f = via(&x).then();
1327 DummyDrivableExecutor x;
1328 auto f = makeFuture(true);
1329 EXPECT_TRUE(f.getVia(&x));
1330 EXPECT_FALSE(x.ran);
1334 TEST(Future, waitVia) {
1337 auto f = via(&x).then();
1338 EXPECT_FALSE(f.isReady());
1340 EXPECT_TRUE(f.isReady());
1344 // try rvalue as well
1346 auto f = via(&x).then().waitVia(&x);
1347 EXPECT_TRUE(f.isReady());
1351 DummyDrivableExecutor x;
1352 makeFuture(true).waitVia(&x);
1353 EXPECT_FALSE(x.ran);
1357 TEST(Future, viaRaces) {
1360 auto tid = std::this_thread::get_id();
1363 std::thread t1([&] {
1366 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1367 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1368 .then([&](Try<void>&&) { done = true; });
1371 std::thread t2([&] {
1375 while (!done) x.run();
1380 TEST(Future, getFuture_after_setValue) {
1383 EXPECT_EQ(42, p.getFuture().value());
1386 TEST(Future, getFuture_after_setException) {
1388 p.setWith([]() -> void { throw std::logic_error("foo"); });
1389 EXPECT_THROW(p.getFuture().value(), std::logic_error);
1392 TEST(Future, detachRace) {
1394 // This test is designed to detect a race that was in Core::detachOne()
1395 // where detached_ was incremented and then tested, and that
1396 // allowed a race where both Promise and Future would think they were the
1397 // second and both try to delete. This showed up at scale but was very
1398 // difficult to reliably repro in a test. As it is, this only fails about
1399 // once in every 1,000 executions. Doing this 1,000 times is going to make a
1400 // slow test so I won't do that but if it ever fails, take it seriously, and
1401 // run the test binary with "--gtest_repeat=10000 --gtest_filter=*detachRace"
1402 // (Don't forget to enable ASAN)
1403 auto p = folly::make_unique<Promise<bool>>();
1404 auto f = folly::make_unique<Future<bool>>(p->getFuture());
1405 folly::Baton<> baton;
1415 class TestData : public RequestData {
1417 explicit TestData(int data) : data_(data) {}
1418 virtual ~TestData() {}
1422 TEST(Future, context) {
1424 // Start a new context
1425 RequestContext::create();
1427 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1429 // Set some test data
1430 RequestContext::get()->setContextData(
1432 std::unique_ptr<TestData>(new TestData(10)));
1436 auto future = p.getFuture().then([&]{
1437 // Check that the context followed the future
1438 EXPECT_TRUE(RequestContext::get() != nullptr);
1439 auto a = dynamic_cast<TestData*>(
1440 RequestContext::get()->getContextData("test"));
1441 auto data = a->data_;
1442 EXPECT_EQ(10, data);
1445 // Clear the context
1446 RequestContext::setContext(nullptr);
1448 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1450 // Fulfill the promise
1455 // This only fails about 1 in 1k times when the bug is present :(
1456 TEST(Future, t5506504) {
1460 auto promises = std::make_shared<vector<Promise<void>>>(4);
1461 vector<Future<void>> futures;
1463 for (auto& p : *promises) {
1464 futures.emplace_back(
1467 .then([](Try<void>&&){}));
1472 for (auto& p : *promises) p.setValue();
1475 return whenAll(futures.begin(), futures.end());
1481 // Test of handling of a circular dependency. It's never recommended
1482 // to have one because of possible memory leaks. Here we test that
1483 // we can handle freeing of the Future while it is running.
1484 TEST(Future, CircularDependencySharedPtrSelfReset) {
1485 Promise<int64_t> promise;
1486 auto ptr = std::make_shared<Future<int64_t>>(promise.getFuture());
1489 [ptr] (folly::Try<int64_t>&& uid) mutable {
1490 EXPECT_EQ(1, ptr.use_count());
1492 // Leaving no references to ourselves.
1494 EXPECT_EQ(0, ptr.use_count());
1498 EXPECT_EQ(2, ptr.use_count());
1502 promise.setWith([]{return 1l;});
1505 TEST(Future, Constructor) {
1506 auto f1 = []() -> Future<int> { return Future<int>(3); }();
1507 EXPECT_EQ(f1.value(), 3);
1508 auto f2 = []() -> Future<void> { return Future<void>(); }();
1509 EXPECT_NO_THROW(f2.value());
1512 TEST(Future, ImplicitConstructor) {
1513 auto f1 = []() -> Future<int> { return 3; }();
1514 EXPECT_EQ(f1.value(), 3);
1515 // Unfortunately, the C++ standard does not allow the
1516 // following implicit conversion to work:
1517 //auto f2 = []() -> Future<void> { }();
1520 TEST(Future, thenDynamic) {
1521 // folly::dynamic has a constructor that takes any T, this test makes
1522 // sure that we call the then lambda with folly::dynamic and not
1523 // Try<folly::dynamic> because that then fails to compile
1524 Promise<folly::dynamic> p;
1525 Future<folly::dynamic> f = p.getFuture().then(
1526 [](const folly::dynamic& d) {
1527 return folly::dynamic(d.asInt() + 3);
1531 EXPECT_EQ(f.get(), 5);
1534 TEST(Future, via_then_get_was_racy) {
1536 std::unique_ptr<int> val = folly::via(&x)
1537 .then([] { return folly::make_unique<int>(42); })
1540 EXPECT_EQ(42, *val);
1543 TEST(Future, ensure) {
1545 auto cob = [&]{ count++; };
1546 auto f = makeFuture(42)
1548 .then([](int) { throw std::runtime_error("ensure"); })
1551 EXPECT_THROW(f.get(), std::runtime_error);
1552 EXPECT_EQ(2, count);
1555 TEST(Future, willEqual) {
1556 //both p1 and p2 already fulfilled
1562 auto f1 = p1.getFuture();
1563 auto f2 = p2.getFuture();
1564 EXPECT_TRUE(f1.willEqual(f2).get());
1570 auto f1 = p1.getFuture();
1571 auto f2 = p2.getFuture();
1572 EXPECT_FALSE(f1.willEqual(f2).get());
1574 //both p1 and p2 not yet fulfilled
1578 auto f1 = p1.getFuture();
1579 auto f2 = p2.getFuture();
1580 auto f3 = f1.willEqual(f2);
1583 EXPECT_TRUE(f3.get());
1587 auto f1 = p1.getFuture();
1588 auto f2 = p2.getFuture();
1589 auto f3 = f1.willEqual(f2);
1592 EXPECT_FALSE(f3.get());
1594 //p1 already fulfilled, p2 not yet fulfilled
1599 auto f1 = p1.getFuture();
1600 auto f2 = p2.getFuture();
1601 auto f3 = f1.willEqual(f2);
1603 EXPECT_TRUE(f3.get());
1608 auto f1 = p1.getFuture();
1609 auto f2 = p2.getFuture();
1610 auto f3 = f1.willEqual(f2);
1612 EXPECT_FALSE(f3.get());
1614 //p2 already fulfilled, p1 not yet fulfilled
1619 auto f1 = p1.getFuture();
1620 auto f2 = p2.getFuture();
1621 auto f3 = f1.willEqual(f2);
1623 EXPECT_TRUE(f3.get());
1628 auto f1 = p1.getFuture();
1629 auto f2 = p2.getFuture();
1630 auto f3 = f1.willEqual(f2);
1632 EXPECT_FALSE(f3.get());
1638 // A simple scenario for the unwrap call, when the promise was fulfilled
1639 // before calling to unwrap.
1640 TEST(Future, Unwrap_SimpleScenario) {
1641 Future<int> encapsulated_future = makeFuture(5484);
1642 Future<Future<int>> future = makeFuture(std::move(encapsulated_future));
1643 EXPECT_EQ(5484, future.unwrap().value());
1646 // Makes sure that unwrap() works when chaning Future's commands.
1647 TEST(Future, Unwrap_ChainCommands) {
1648 Future<Future<int>> future = makeFuture(makeFuture(5484));
1649 auto unwrapped = future.unwrap().then([](int i){ return i; });
1650 EXPECT_EQ(5484, unwrapped.value());
1653 // Makes sure that the unwrap call also works when the promise was not yet
1654 // fulfilled, and that the returned Future<T> becomes ready once the promise
1656 TEST(Future, Unwrap_FutureNotReady) {
1657 Promise<Future<int>> p;
1658 Future<Future<int>> future = p.getFuture();
1659 Future<int> unwrapped = future.unwrap();
1660 // Sanity - should not be ready before the promise is fulfilled.
1661 ASSERT_FALSE(unwrapped.isReady());
1662 // Fulfill the promise and make sure the unwrapped future is now ready.
1663 p.setValue(makeFuture(5484));
1664 ASSERT_TRUE(unwrapped.isReady());
1665 EXPECT_EQ(5484, unwrapped.value());
1668 TEST(Reduce, Basic) {
1669 auto makeFutures = [](int count) {
1670 std::vector<Future<int>> fs;
1671 for (int i = 1; i <= count; ++i) {
1672 fs.emplace_back(makeFuture(i));
1679 auto fs = makeFutures(0);
1681 Future<double> f1 = reduce(fs.begin(), fs.end(), 1.2,
1682 [](double a, Try<int>&& b){
1683 return a + *b + 0.1;
1685 EXPECT_EQ(1.2, f1.get());
1690 auto fs = makeFutures(1);
1692 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1693 [](double a, Try<int>&& b){
1694 return a + *b + 0.1;
1696 EXPECT_EQ(1.1, f1.get());
1699 // Returning values (Try)
1701 auto fs = makeFutures(3);
1703 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1704 [](double a, Try<int>&& b){
1705 return a + *b + 0.1;
1707 EXPECT_EQ(6.3, f1.get());
1712 auto fs = makeFutures(3);
1714 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1715 [](double a, int&& b){
1718 EXPECT_EQ(6.3, f1.get());
1721 // Returning futures (Try)
1723 auto fs = makeFutures(3);
1725 Future<double> f2 = reduce(fs.begin(), fs.end(), 0.0,
1726 [](double a, Try<int>&& b){
1727 return makeFuture<double>(a + *b + 0.1);
1729 EXPECT_EQ(6.3, f2.get());
1732 // Returning futures
1734 auto fs = makeFutures(3);
1736 Future<double> f2 = reduce(fs.begin(), fs.end(), 0.0,
1737 [](double a, int&& b){
1738 return makeFuture<double>(a + b + 0.1);
1740 EXPECT_EQ(6.3, f2.get());
1749 std::vector<Future<int>> fs;
1750 fs.push_back(p1.getFuture());
1751 fs.push_back(p2.getFuture());
1752 fs.push_back(p3.getFuture());
1755 auto fs2 = futures::map(fs.begin(), fs.end(), [&](int i){
1759 // Ensure we call the callbacks as the futures complete regardless of order
1767 EXPECT_TRUE(collect(fs2.begin(), fs2.end()).isReady());