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 ;-)
91 EXPECT_EQ(128, sizeof(detail::Core<void>));
96 TEST(Future, onError) {
98 auto flag = [&]{ theFlag = true; };
99 #define EXPECT_FLAG() \
101 EXPECT_TRUE(theFlag); \
105 #define EXPECT_NO_FLAG() \
107 EXPECT_FALSE(theFlag); \
113 auto f = makeFuture()
114 .then([] { throw eggs; })
115 .onError([&] (eggs_t& e) { flag(); });
117 EXPECT_NO_THROW(f.value());
121 auto f = makeFuture()
122 .then([] { throw eggs; })
123 .onError([&] (eggs_t& e) { flag(); return makeFuture(); });
125 EXPECT_NO_THROW(f.value());
130 auto f = makeFuture()
131 .then([] { throw eggs; })
132 .onError([&] (eggs_t e) { flag(); });
134 EXPECT_NO_THROW(f.value());
138 auto f = makeFuture()
139 .then([] { throw eggs; })
140 .onError([&] (eggs_t e) { flag(); return makeFuture(); });
142 EXPECT_NO_THROW(f.value());
147 auto f = makeFuture()
148 .then([] { throw eggs; })
149 .onError([&] (std::exception& e) { flag(); });
151 EXPECT_NO_THROW(f.value());
155 auto f = makeFuture()
156 .then([] { throw eggs; })
157 .onError([&] (std::exception& e) { flag(); return makeFuture(); });
159 EXPECT_NO_THROW(f.value());
164 auto f = makeFuture()
165 .then([] { throw -1; })
166 .onError([&] (int e) { flag(); });
168 EXPECT_NO_THROW(f.value());
172 auto f = makeFuture()
173 .then([] { throw -1; })
174 .onError([&] (int e) { flag(); return makeFuture(); });
176 EXPECT_NO_THROW(f.value());
181 auto f = makeFuture()
182 .then([] { throw eggs; })
183 .onError([&] (eggs_t& e) mutable { flag(); });
185 EXPECT_NO_THROW(f.value());
189 auto f = makeFuture()
190 .then([] { throw eggs; })
191 .onError([&] (eggs_t& e) mutable { flag(); return makeFuture(); });
193 EXPECT_NO_THROW(f.value());
198 auto f = makeFuture()
199 .then([] { return 42; })
200 .onError([&] (eggs_t& e) { flag(); return -1; });
202 EXPECT_EQ(42, f.value());
206 auto f = makeFuture()
207 .then([] { return 42; })
208 .onError([&] (eggs_t& e) { flag(); return makeFuture<int>(-1); });
210 EXPECT_EQ(42, f.value());
213 // Catch different exception
215 auto f = makeFuture()
216 .then([] { throw eggs; })
217 .onError([&] (std::runtime_error& e) { flag(); });
219 EXPECT_THROW(f.value(), eggs_t);
223 auto f = makeFuture()
224 .then([] { throw eggs; })
225 .onError([&] (std::runtime_error& e) { flag(); return makeFuture(); });
227 EXPECT_THROW(f.value(), eggs_t);
230 // Returned value propagates
232 auto f = makeFuture()
233 .then([] { throw eggs; return 0; })
234 .onError([&] (eggs_t& e) { return 42; });
235 EXPECT_EQ(42, f.value());
238 // Returned future propagates
240 auto f = makeFuture()
241 .then([] { throw eggs; return 0; })
242 .onError([&] (eggs_t& e) { return makeFuture<int>(42); });
243 EXPECT_EQ(42, f.value());
248 auto f = makeFuture()
249 .then([] { throw eggs; return 0; })
250 .onError([&] (eggs_t& e) { throw e; return -1; });
251 EXPECT_THROW(f.value(), eggs_t);
255 auto f = makeFuture()
256 .then([] { throw eggs; return 0; })
257 .onError([&] (eggs_t& e) { throw e; return makeFuture<int>(-1); });
258 EXPECT_THROW(f.value(), eggs_t);
275 Try<A> t_a(std::move(a));
279 EXPECT_EQ(5, t_a.value().x());
282 TEST(Future, special) {
283 EXPECT_FALSE(std::is_copy_constructible<Future<int>>::value);
284 EXPECT_FALSE(std::is_copy_assignable<Future<int>>::value);
285 EXPECT_TRUE(std::is_move_constructible<Future<int>>::value);
286 EXPECT_TRUE(std::is_move_assignable<Future<int>>::value);
290 auto f = makeFuture<string>("0")
291 .then([](){ return makeFuture<string>("1"); })
292 .then([](Try<string>&& t) { return makeFuture(t.value() + ";2"); })
293 .then([](const Try<string>&& t) { return makeFuture(t.value() + ";3"); })
294 .then([](Try<string>& t) { return makeFuture(t.value() + ";4"); })
295 .then([](const Try<string>& t) { return makeFuture(t.value() + ";5"); })
296 .then([](Try<string> t) { return makeFuture(t.value() + ";6"); })
297 .then([](const Try<string> t) { return makeFuture(t.value() + ";7"); })
298 .then([](string&& s) { return makeFuture(s + ";8"); })
299 .then([](const string&& s) { return makeFuture(s + ";9"); })
300 .then([](string& s) { return makeFuture(s + ";10"); })
301 .then([](const string& s) { return makeFuture(s + ";11"); })
302 .then([](string s) { return makeFuture(s + ";12"); })
303 .then([](const string s) { return makeFuture(s + ";13"); })
305 EXPECT_EQ(f.value(), "1;2;3;4;5;6;7;8;9;10;11;12;13");
308 TEST(Future, thenTry) {
311 makeFuture<int>(42).then([&](Try<int>&& t) {
313 EXPECT_EQ(42, t.value());
315 EXPECT_TRUE(flag); flag = false;
318 .then([](Try<int>&& t) { return t.value(); })
319 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
320 EXPECT_TRUE(flag); flag = false;
322 makeFuture().then([&](Try<void>&& t) { flag = true; t.value(); });
323 EXPECT_TRUE(flag); flag = false;
326 auto f = p.getFuture().then([&](Try<void>&& t) { flag = true; });
328 EXPECT_FALSE(f.isReady());
331 EXPECT_TRUE(f.isReady());
334 TEST(Future, thenValue) {
336 makeFuture<int>(42).then([&](int i){
340 EXPECT_TRUE(flag); flag = false;
343 .then([](int i){ return i; })
344 .then([&](int i) { flag = true; EXPECT_EQ(42, i); });
345 EXPECT_TRUE(flag); flag = false;
347 makeFuture().then([&]{
350 EXPECT_TRUE(flag); flag = false;
352 auto f = makeFuture<int>(eggs).then([&](int i){});
353 EXPECT_THROW(f.value(), eggs_t);
355 f = makeFuture<void>(eggs).then([&]{});
356 EXPECT_THROW(f.value(), eggs_t);
359 TEST(Future, thenValueFuture) {
362 .then([](int i){ return makeFuture<int>(std::move(i)); })
363 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
364 EXPECT_TRUE(flag); flag = false;
367 .then([]{ return makeFuture(); })
368 .then([&](Try<void>&& t) { flag = true; });
369 EXPECT_TRUE(flag); flag = false;
372 static string doWorkStatic(Try<string>&& t) {
373 return t.value() + ";static";
376 TEST(Future, thenFunction) {
378 string doWork(Try<string>&& t) {
379 return t.value() + ";class";
381 static string doWorkStatic(Try<string>&& t) {
382 return t.value() + ";class-static";
386 auto f = makeFuture<string>("start")
388 .then(Worker::doWorkStatic)
389 .then(&Worker::doWork, &w);
391 EXPECT_EQ(f.value(), "start;static;class-static;class");
394 static Future<string> doWorkStaticFuture(Try<string>&& t) {
395 return makeFuture(t.value() + ";static");
398 TEST(Future, thenFunctionFuture) {
400 Future<string> doWorkFuture(Try<string>&& t) {
401 return makeFuture(t.value() + ";class");
403 static Future<string> doWorkStaticFuture(Try<string>&& t) {
404 return makeFuture(t.value() + ";class-static");
408 auto f = makeFuture<string>("start")
409 .then(doWorkStaticFuture)
410 .then(Worker::doWorkStaticFuture)
411 .then(&Worker::doWorkFuture, &w);
413 EXPECT_EQ(f.value(), "start;static;class-static;class");
416 TEST(Future, thenBind) {
418 return makeFuture("bind");
420 auto b = std::bind(l);
421 auto f = makeFuture().then(std::move(b));
422 EXPECT_EQ(f.value(), "bind");
425 TEST(Future, thenBindTry) {
426 auto l = [](Try<string>&& t) {
427 return makeFuture(t.value() + ";bind");
429 auto b = std::bind(l, std::placeholders::_1);
430 auto f = makeFuture<string>("start").then(std::move(b));
432 EXPECT_EQ(f.value(), "start;bind");
435 TEST(Future, value) {
436 auto f = makeFuture(unique_ptr<int>(new int(42)));
437 auto up = std::move(f.value());
440 EXPECT_THROW(makeFuture<int>(eggs).value(), eggs_t);
443 TEST(Future, isReady) {
445 auto f = p.getFuture();
446 EXPECT_FALSE(f.isReady());
448 EXPECT_TRUE(f.isReady());
451 TEST(Future, futureNotReady) {
453 Future<int> f = p.getFuture();
454 EXPECT_THROW(f.value(), eggs_t);
457 TEST(Future, hasException) {
458 EXPECT_TRUE(makeFuture<int>(eggs).getTry().hasException());
459 EXPECT_FALSE(makeFuture(42).getTry().hasException());
462 TEST(Future, hasValue) {
463 EXPECT_TRUE(makeFuture(42).getTry().hasValue());
464 EXPECT_FALSE(makeFuture<int>(eggs).getTry().hasValue());
467 TEST(Future, makeFuture) {
468 EXPECT_TYPE(makeFuture(42), Future<int>);
469 EXPECT_EQ(42, makeFuture(42).value());
471 EXPECT_TYPE(makeFuture<float>(42), Future<float>);
472 EXPECT_EQ(42, makeFuture<float>(42).value());
474 auto fun = [] { return 42; };
475 EXPECT_TYPE(makeFutureTry(fun), Future<int>);
476 EXPECT_EQ(42, makeFutureTry(fun).value());
478 auto failfun = []() -> int { throw eggs; };
479 EXPECT_TYPE(makeFutureTry(failfun), Future<int>);
480 EXPECT_THROW(makeFutureTry(failfun).value(), eggs_t);
482 EXPECT_TYPE(makeFuture(), Future<void>);
487 TEST(Promise, special) {
488 EXPECT_FALSE(std::is_copy_constructible<Promise<int>>::value);
489 EXPECT_FALSE(std::is_copy_assignable<Promise<int>>::value);
490 EXPECT_TRUE(std::is_move_constructible<Promise<int>>::value);
491 EXPECT_TRUE(std::is_move_assignable<Promise<int>>::value);
494 TEST(Promise, getFuture) {
496 Future<int> f = p.getFuture();
497 EXPECT_FALSE(f.isReady());
500 TEST(Promise, setValue) {
502 auto ffund = fund.getFuture();
504 EXPECT_EQ(42, ffund.value());
512 auto fpod = pod.getFuture();
513 Foo f = {"the answer", 42};
515 Foo f2 = fpod.value();
516 EXPECT_EQ(f.name, f2.name);
517 EXPECT_EQ(f.value, f2.value);
519 pod = Promise<Foo>();
520 fpod = pod.getFuture();
521 pod.setValue(std::move(f2));
522 Foo f3 = fpod.value();
523 EXPECT_EQ(f.name, f3.name);
524 EXPECT_EQ(f.value, f3.value);
526 Promise<unique_ptr<int>> mov;
527 auto fmov = mov.getFuture();
528 mov.setValue(unique_ptr<int>(new int(42)));
529 unique_ptr<int> ptr = std::move(fmov.value());
533 auto fv = v.getFuture();
535 EXPECT_TRUE(fv.isReady());
538 TEST(Promise, setException) {
541 auto f = p.getFuture();
542 p.setException(eggs);
543 EXPECT_THROW(f.value(), eggs_t);
547 auto f = p.getFuture();
551 p.setException(exception_wrapper(std::current_exception()));
553 EXPECT_THROW(f.value(), eggs_t);
557 TEST(Promise, fulfil) {
560 auto f = p.getFuture();
561 p.fulfil([] { return 42; });
562 EXPECT_EQ(42, f.value());
566 auto f = p.getFuture();
567 p.fulfil([]() -> int { throw eggs; });
568 EXPECT_THROW(f.value(), eggs_t);
572 TEST(Future, finish) {
573 auto x = std::make_shared<int>(0);
576 auto f = p.getFuture().then([x](Try<int>&& t) { *x = t.value(); });
578 // The callback hasn't executed
581 // The callback has a reference to x
582 EXPECT_EQ(2, x.use_count());
586 // the callback has executed
589 // the callback has been destructed
590 // and has released its reference to x
591 EXPECT_EQ(1, x.use_count());
594 TEST(Future, unwrap) {
598 auto fa = a.getFuture();
599 auto fb = b.getFuture();
604 // do a, then do b, and get the result of a + b.
605 Future<int> f = fa.then([&](Try<int>&& ta) {
606 auto va = ta.value();
608 return fb.then([va, &flag2](Try<int>&& tb) {
610 return va + tb.value();
616 EXPECT_FALSE(f.isReady());
621 EXPECT_FALSE(f.isReady());
626 EXPECT_EQ(7, f.value());
629 TEST(Future, whenAll) {
630 // returns a vector variant
632 vector<Promise<int>> promises(10);
633 vector<Future<int>> futures;
635 for (auto& p : promises)
636 futures.push_back(p.getFuture());
638 auto allf = whenAll(futures.begin(), futures.end());
640 random_shuffle(promises.begin(), promises.end());
641 for (auto& p : promises) {
642 EXPECT_FALSE(allf.isReady());
646 EXPECT_TRUE(allf.isReady());
647 auto& results = allf.value();
648 for (auto& t : results) {
649 EXPECT_EQ(42, t.value());
653 // check error semantics
655 vector<Promise<int>> promises(4);
656 vector<Future<int>> futures;
658 for (auto& p : promises)
659 futures.push_back(p.getFuture());
661 auto allf = whenAll(futures.begin(), futures.end());
664 promises[0].setValue(42);
665 promises[1].setException(eggs);
667 EXPECT_FALSE(allf.isReady());
669 promises[2].setValue(42);
671 EXPECT_FALSE(allf.isReady());
673 promises[3].setException(eggs);
675 EXPECT_TRUE(allf.isReady());
676 EXPECT_FALSE(allf.getTry().hasException());
678 auto& results = allf.value();
679 EXPECT_EQ(42, results[0].value());
680 EXPECT_TRUE(results[1].hasException());
681 EXPECT_EQ(42, results[2].value());
682 EXPECT_TRUE(results[3].hasException());
685 // check that futures are ready in then()
687 vector<Promise<void>> promises(10);
688 vector<Future<void>> futures;
690 for (auto& p : promises)
691 futures.push_back(p.getFuture());
693 auto allf = whenAll(futures.begin(), futures.end())
694 .then([](Try<vector<Try<void>>>&& ts) {
695 for (auto& f : ts.value())
699 random_shuffle(promises.begin(), promises.end());
700 for (auto& p : promises)
702 EXPECT_TRUE(allf.isReady());
707 TEST(Future, whenAny) {
709 vector<Promise<int>> promises(10);
710 vector<Future<int>> futures;
712 for (auto& p : promises)
713 futures.push_back(p.getFuture());
715 for (auto& f : futures) {
716 EXPECT_FALSE(f.isReady());
719 auto anyf = whenAny(futures.begin(), futures.end());
721 /* futures were moved in, so these are invalid now */
722 EXPECT_FALSE(anyf.isReady());
724 promises[7].setValue(42);
725 EXPECT_TRUE(anyf.isReady());
726 auto& idx_fut = anyf.value();
728 auto i = idx_fut.first;
731 auto& f = idx_fut.second;
732 EXPECT_EQ(42, f.value());
737 vector<Promise<void>> promises(10);
738 vector<Future<void>> futures;
740 for (auto& p : promises)
741 futures.push_back(p.getFuture());
743 for (auto& f : futures) {
744 EXPECT_FALSE(f.isReady());
747 auto anyf = whenAny(futures.begin(), futures.end());
749 EXPECT_FALSE(anyf.isReady());
751 promises[3].setException(eggs);
752 EXPECT_TRUE(anyf.isReady());
753 EXPECT_TRUE(anyf.value().second.hasException());
758 vector<Promise<int>> promises(10);
759 vector<Future<int>> futures;
761 for (auto& p : promises)
762 futures.push_back(p.getFuture());
764 auto anyf = whenAny(futures.begin(), futures.end())
765 .then([](pair<size_t, Try<int>> p) {
766 EXPECT_EQ(42, p.second.value());
769 promises[3].setValue(42);
770 EXPECT_TRUE(anyf.isReady());
775 TEST(when, already_completed) {
777 vector<Future<void>> fs;
778 for (int i = 0; i < 10; i++)
779 fs.push_back(makeFuture());
781 whenAll(fs.begin(), fs.end())
782 .then([&](vector<Try<void>> ts) {
783 EXPECT_EQ(fs.size(), ts.size());
787 vector<Future<int>> fs;
788 for (int i = 0; i < 10; i++)
789 fs.push_back(makeFuture(i));
791 whenAny(fs.begin(), fs.end())
792 .then([&](pair<size_t, Try<int>> p) {
793 EXPECT_EQ(p.first, p.second.value());
799 vector<Promise<void>> promises(10);
800 vector<Future<void>> futures;
802 for (auto& p : promises)
803 futures.push_back(p.getFuture());
807 whenN(futures.begin(), futures.end(), n)
808 .then([&](vector<pair<size_t, Try<void>>> v) {
810 EXPECT_EQ(n, v.size());
812 EXPECT_TRUE(tt.second.hasValue());
815 promises[0].setValue();
817 promises[1].setValue();
819 promises[2].setValue();
823 /* Ensure that we can compile when_{all,any} with folly::small_vector */
824 TEST(when, small_vector) {
826 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<void>),
827 "Futures should not be trivially copyable");
828 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<int>),
829 "Futures should not be trivially copyable");
831 using folly::small_vector;
833 small_vector<Future<void>> futures;
835 for (int i = 0; i < 10; i++)
836 futures.push_back(makeFuture());
838 auto anyf = whenAny(futures.begin(), futures.end());
842 small_vector<Future<void>> futures;
844 for (int i = 0; i < 10; i++)
845 futures.push_back(makeFuture());
847 auto allf = whenAll(futures.begin(), futures.end());
851 TEST(Future, whenAllVariadic) {
854 Future<bool> fb = pb.getFuture();
855 Future<int> fi = pi.getFuture();
857 whenAll(std::move(fb), std::move(fi))
858 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
860 EXPECT_TRUE(std::get<0>(tup).hasValue());
861 EXPECT_EQ(std::get<0>(tup).value(), true);
862 EXPECT_TRUE(std::get<1>(tup).hasValue());
863 EXPECT_EQ(std::get<1>(tup).value(), 42);
871 TEST(Future, whenAllVariadicReferences) {
874 Future<bool> fb = pb.getFuture();
875 Future<int> fi = pi.getFuture();
878 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
880 EXPECT_TRUE(std::get<0>(tup).hasValue());
881 EXPECT_EQ(std::get<0>(tup).value(), true);
882 EXPECT_TRUE(std::get<1>(tup).hasValue());
883 EXPECT_EQ(std::get<1>(tup).value(), 42);
891 TEST(Future, whenAll_none) {
892 vector<Future<int>> fs;
893 auto f = whenAll(fs.begin(), fs.end());
894 EXPECT_TRUE(f.isReady());
897 TEST(Future, throwCaughtInImmediateThen) {
898 // Neither of these should throw "Promise already satisfied"
900 [=](Try<void>&&) -> int { throw std::exception(); });
902 [=](Try<void>&&) -> Future<int> { throw std::exception(); });
905 TEST(Future, throwIfFailed) {
906 makeFuture<void>(eggs)
907 .then([=](Try<void>&& t) {
908 EXPECT_THROW(t.throwIfFailed(), eggs_t);
911 .then([=](Try<void>&& t) {
912 EXPECT_NO_THROW(t.throwIfFailed());
915 makeFuture<int>(eggs)
916 .then([=](Try<int>&& t) {
917 EXPECT_THROW(t.throwIfFailed(), eggs_t);
920 .then([=](Try<int>&& t) {
921 EXPECT_NO_THROW(t.throwIfFailed());
925 TEST(Future, waitImmediate) {
927 auto done = makeFuture(42).wait().value();
930 vector<int> v{1,2,3};
931 auto done_v = makeFuture(v).wait().value();
932 EXPECT_EQ(v.size(), done_v.size());
933 EXPECT_EQ(v, done_v);
935 vector<Future<void>> v_f;
936 v_f.push_back(makeFuture());
937 v_f.push_back(makeFuture());
938 auto done_v_f = whenAll(v_f.begin(), v_f.end()).wait().value();
939 EXPECT_EQ(2, done_v_f.size());
941 vector<Future<bool>> v_fb;
942 v_fb.push_back(makeFuture(true));
943 v_fb.push_back(makeFuture(false));
944 auto fut = whenAll(v_fb.begin(), v_fb.end());
945 auto done_v_fb = std::move(fut.wait().value());
946 EXPECT_EQ(2, done_v_fb.size());
951 Future<int> f = p.getFuture();
952 std::atomic<bool> flag{false};
953 std::atomic<int> result{1};
954 std::atomic<std::thread::id> id;
956 std::thread t([&](Future<int>&& tf){
957 auto n = tf.then([&](Try<int> && t) {
958 id = std::this_thread::get_id();
962 result.store(n.wait().value());
967 EXPECT_EQ(result.load(), 1);
970 // validate that the callback ended up executing in this thread, which
971 // is more to ensure that this test actually tests what it should
972 EXPECT_EQ(id, std::this_thread::get_id());
973 EXPECT_EQ(result.load(), 42);
977 MoveFlag() = default;
978 MoveFlag(const MoveFlag&) = delete;
979 MoveFlag(MoveFlag&& other) noexcept {
985 TEST(Future, waitReplacesSelf) {
989 auto f1 = makeFuture(MoveFlag());
991 EXPECT_FALSE(f1.value().moved);
994 auto f2 = makeFuture(MoveFlag()).wait();
995 EXPECT_FALSE(f2.value().moved);
1001 auto f1 = makeFuture(MoveFlag());
1002 f1.wait(milliseconds(1));
1003 EXPECT_FALSE(f1.value().moved);
1006 auto f2 = makeFuture(MoveFlag()).wait(milliseconds(1));
1007 EXPECT_FALSE(f2.value().moved);
1012 folly::EventBase eb;
1014 auto f1 = makeFuture(MoveFlag());
1016 EXPECT_FALSE(f1.value().moved);
1019 auto f2 = makeFuture(MoveFlag()).waitVia(&eb);
1020 EXPECT_FALSE(f2.value().moved);
1024 TEST(Future, waitWithDuration) {
1027 Future<int> f = p.getFuture();
1028 f.wait(milliseconds(1));
1029 EXPECT_FALSE(f.isReady());
1031 EXPECT_TRUE(f.isReady());
1035 Future<int> f = p.getFuture();
1037 f.wait(milliseconds(1));
1038 EXPECT_TRUE(f.isReady());
1041 vector<Future<bool>> v_fb;
1042 v_fb.push_back(makeFuture(true));
1043 v_fb.push_back(makeFuture(false));
1044 auto f = whenAll(v_fb.begin(), v_fb.end());
1045 f.wait(milliseconds(1));
1046 EXPECT_TRUE(f.isReady());
1047 EXPECT_EQ(2, f.value().size());
1050 vector<Future<bool>> v_fb;
1053 v_fb.push_back(p1.getFuture());
1054 v_fb.push_back(p2.getFuture());
1055 auto f = whenAll(v_fb.begin(), v_fb.end());
1056 f.wait(milliseconds(1));
1057 EXPECT_FALSE(f.isReady());
1059 EXPECT_FALSE(f.isReady());
1061 EXPECT_TRUE(f.isReady());
1064 auto f = makeFuture().wait(milliseconds(1));
1065 EXPECT_TRUE(f.isReady());
1070 auto start = std::chrono::steady_clock::now();
1071 auto f = p.getFuture().wait(milliseconds(100));
1072 auto elapsed = std::chrono::steady_clock::now() - start;
1073 EXPECT_GE(elapsed, milliseconds(100));
1074 EXPECT_FALSE(f.isReady());
1076 EXPECT_TRUE(f.isReady());
1080 // Try to trigger the race where the resultant Future is not yet complete
1081 // even if we didn't hit the timeout, and make sure we deal with it properly
1084 auto t = std::thread([&]{
1086 /* sleep override */ std::this_thread::sleep_for(milliseconds(100));
1090 auto f = p.getFuture().wait(std::chrono::seconds(3600));
1091 EXPECT_TRUE(f.isReady());
1096 class DummyDrivableExecutor : public DrivableExecutor {
1098 void add(Func f) override {}
1099 void drive() override { ran = true; }
1103 TEST(Future, getVia) {
1107 auto f = via(&x).then([]{ return true; });
1108 EXPECT_TRUE(f.getVia(&x));
1114 auto f = via(&x).then();
1119 DummyDrivableExecutor x;
1120 auto f = makeFuture(true);
1121 EXPECT_TRUE(f.getVia(&x));
1122 EXPECT_FALSE(x.ran);
1126 TEST(Future, waitVia) {
1129 auto f = via(&x).then();
1130 EXPECT_FALSE(f.isReady());
1132 EXPECT_TRUE(f.isReady());
1136 // try rvalue as well
1138 auto f = via(&x).then().waitVia(&x);
1139 EXPECT_TRUE(f.isReady());
1143 DummyDrivableExecutor x;
1144 makeFuture(true).waitVia(&x);
1145 EXPECT_FALSE(x.ran);
1149 TEST(Future, viaRaces) {
1152 auto tid = std::this_thread::get_id();
1155 std::thread t1([&] {
1158 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1159 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1160 .then([&](Try<void>&&) { done = true; });
1163 std::thread t2([&] {
1167 while (!done) x.run();
1172 TEST(Future, getFuture_after_setValue) {
1175 EXPECT_EQ(42, p.getFuture().value());
1178 TEST(Future, getFuture_after_setException) {
1180 p.fulfil([]() -> void { throw std::logic_error("foo"); });
1181 EXPECT_THROW(p.getFuture().value(), std::logic_error);
1184 TEST(Future, detachRace) {
1186 // This test is designed to detect a race that was in Core::detachOne()
1187 // where detached_ was incremented and then tested, and that
1188 // allowed a race where both Promise and Future would think they were the
1189 // second and both try to delete. This showed up at scale but was very
1190 // difficult to reliably repro in a test. As it is, this only fails about
1191 // once in every 1,000 executions. Doing this 1,000 times is going to make a
1192 // slow test so I won't do that but if it ever fails, take it seriously, and
1193 // run the test binary with "--gtest_repeat=10000 --gtest_filter=*detachRace"
1194 // (Don't forget to enable ASAN)
1195 auto p = folly::make_unique<Promise<bool>>();
1196 auto f = folly::make_unique<Future<bool>>(p->getFuture());
1197 folly::Baton<> baton;
1207 class TestData : public RequestData {
1209 explicit TestData(int data) : data_(data) {}
1210 virtual ~TestData() {}
1214 TEST(Future, context) {
1216 // Start a new context
1217 RequestContext::create();
1219 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1221 // Set some test data
1222 RequestContext::get()->setContextData(
1224 std::unique_ptr<TestData>(new TestData(10)));
1228 auto future = p.getFuture().then([&]{
1229 // Check that the context followed the future
1230 EXPECT_TRUE(RequestContext::get() != nullptr);
1231 auto a = dynamic_cast<TestData*>(
1232 RequestContext::get()->getContextData("test"));
1233 auto data = a->data_;
1234 EXPECT_EQ(10, data);
1237 // Clear the context
1238 RequestContext::setContext(nullptr);
1240 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1242 // Fulfil the promise
1247 // This only fails about 1 in 1k times when the bug is present :(
1248 TEST(Future, t5506504) {
1252 auto promises = std::make_shared<vector<Promise<void>>>(4);
1253 vector<Future<void>> futures;
1255 for (auto& p : *promises) {
1256 futures.emplace_back(
1259 .then([](Try<void>&&){}));
1264 for (auto& p : *promises) p.setValue();
1267 return whenAll(futures.begin(), futures.end());
1273 // Test of handling of a circular dependency. It's never recommended
1274 // to have one because of possible memory leaks. Here we test that
1275 // we can handle freeing of the Future while it is running.
1276 TEST(Future, CircularDependencySharedPtrSelfReset) {
1277 Promise<int64_t> promise;
1278 auto ptr = std::make_shared<Future<int64_t>>(promise.getFuture());
1281 [ptr] (folly::Try<int64_t>&& uid) mutable {
1282 EXPECT_EQ(1, ptr.use_count());
1284 // Leaving no references to ourselves.
1286 EXPECT_EQ(0, ptr.use_count());
1290 EXPECT_EQ(2, ptr.use_count());
1294 promise.fulfil([]{return 1l;});
1297 TEST(Future, Constructor) {
1298 auto f1 = []() -> Future<int> { return Future<int>(3); }();
1299 EXPECT_EQ(f1.value(), 3);
1300 auto f2 = []() -> Future<void> { return Future<void>(); }();
1301 EXPECT_NO_THROW(f2.value());
1304 TEST(Future, ImplicitConstructor) {
1305 auto f1 = []() -> Future<int> { return 3; }();
1306 EXPECT_EQ(f1.value(), 3);
1307 // Unfortunately, the C++ standard does not allow the
1308 // following implicit conversion to work:
1309 //auto f2 = []() -> Future<void> { }();