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);
278 Try<A> t_a(std::move(a));
282 EXPECT_EQ(5, t_a.value().x());
285 TEST(Future, special) {
286 EXPECT_FALSE(std::is_copy_constructible<Future<int>>::value);
287 EXPECT_FALSE(std::is_copy_assignable<Future<int>>::value);
288 EXPECT_TRUE(std::is_move_constructible<Future<int>>::value);
289 EXPECT_TRUE(std::is_move_assignable<Future<int>>::value);
293 auto f = makeFuture<string>("0")
294 .then([](){ return makeFuture<string>("1"); })
295 .then([](Try<string>&& t) { return makeFuture(t.value() + ";2"); })
296 .then([](const Try<string>&& t) { return makeFuture(t.value() + ";3"); })
297 .then([](Try<string>& t) { return makeFuture(t.value() + ";4"); })
298 .then([](const Try<string>& t) { return makeFuture(t.value() + ";5"); })
299 .then([](Try<string> t) { return makeFuture(t.value() + ";6"); })
300 .then([](const Try<string> t) { return makeFuture(t.value() + ";7"); })
301 .then([](string&& s) { return makeFuture(s + ";8"); })
302 .then([](const string&& s) { return makeFuture(s + ";9"); })
303 .then([](string& s) { return makeFuture(s + ";10"); })
304 .then([](const string& s) { return makeFuture(s + ";11"); })
305 .then([](string s) { return makeFuture(s + ";12"); })
306 .then([](const string s) { return makeFuture(s + ";13"); })
308 EXPECT_EQ(f.value(), "1;2;3;4;5;6;7;8;9;10;11;12;13");
311 TEST(Future, thenTry) {
314 makeFuture<int>(42).then([&](Try<int>&& t) {
316 EXPECT_EQ(42, t.value());
318 EXPECT_TRUE(flag); flag = false;
321 .then([](Try<int>&& t) { return t.value(); })
322 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
323 EXPECT_TRUE(flag); flag = false;
325 makeFuture().then([&](Try<void>&& t) { flag = true; t.value(); });
326 EXPECT_TRUE(flag); flag = false;
329 auto f = p.getFuture().then([&](Try<void>&& t) { flag = true; });
331 EXPECT_FALSE(f.isReady());
334 EXPECT_TRUE(f.isReady());
337 TEST(Future, thenValue) {
339 makeFuture<int>(42).then([&](int i){
343 EXPECT_TRUE(flag); flag = false;
346 .then([](int i){ return i; })
347 .then([&](int i) { flag = true; EXPECT_EQ(42, i); });
348 EXPECT_TRUE(flag); flag = false;
350 makeFuture().then([&]{
353 EXPECT_TRUE(flag); flag = false;
355 auto f = makeFuture<int>(eggs).then([&](int i){});
356 EXPECT_THROW(f.value(), eggs_t);
358 f = makeFuture<void>(eggs).then([&]{});
359 EXPECT_THROW(f.value(), eggs_t);
362 TEST(Future, thenValueFuture) {
365 .then([](int i){ return makeFuture<int>(std::move(i)); })
366 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
367 EXPECT_TRUE(flag); flag = false;
370 .then([]{ return makeFuture(); })
371 .then([&](Try<void>&& t) { flag = true; });
372 EXPECT_TRUE(flag); flag = false;
375 static string doWorkStatic(Try<string>&& t) {
376 return t.value() + ";static";
379 TEST(Future, thenFunction) {
381 string doWork(Try<string>&& t) {
382 return t.value() + ";class";
384 static string doWorkStatic(Try<string>&& t) {
385 return t.value() + ";class-static";
389 auto f = makeFuture<string>("start")
391 .then(Worker::doWorkStatic)
392 .then(&Worker::doWork, &w);
394 EXPECT_EQ(f.value(), "start;static;class-static;class");
397 static Future<string> doWorkStaticFuture(Try<string>&& t) {
398 return makeFuture(t.value() + ";static");
401 TEST(Future, thenFunctionFuture) {
403 Future<string> doWorkFuture(Try<string>&& t) {
404 return makeFuture(t.value() + ";class");
406 static Future<string> doWorkStaticFuture(Try<string>&& t) {
407 return makeFuture(t.value() + ";class-static");
411 auto f = makeFuture<string>("start")
412 .then(doWorkStaticFuture)
413 .then(Worker::doWorkStaticFuture)
414 .then(&Worker::doWorkFuture, &w);
416 EXPECT_EQ(f.value(), "start;static;class-static;class");
419 TEST(Future, thenBind) {
421 return makeFuture("bind");
423 auto b = std::bind(l);
424 auto f = makeFuture().then(std::move(b));
425 EXPECT_EQ(f.value(), "bind");
428 TEST(Future, thenBindTry) {
429 auto l = [](Try<string>&& t) {
430 return makeFuture(t.value() + ";bind");
432 auto b = std::bind(l, std::placeholders::_1);
433 auto f = makeFuture<string>("start").then(std::move(b));
435 EXPECT_EQ(f.value(), "start;bind");
438 TEST(Future, value) {
439 auto f = makeFuture(unique_ptr<int>(new int(42)));
440 auto up = std::move(f.value());
443 EXPECT_THROW(makeFuture<int>(eggs).value(), eggs_t);
446 TEST(Future, isReady) {
448 auto f = p.getFuture();
449 EXPECT_FALSE(f.isReady());
451 EXPECT_TRUE(f.isReady());
454 TEST(Future, futureNotReady) {
456 Future<int> f = p.getFuture();
457 EXPECT_THROW(f.value(), eggs_t);
460 TEST(Future, hasException) {
461 EXPECT_TRUE(makeFuture<int>(eggs).getTry().hasException());
462 EXPECT_FALSE(makeFuture(42).getTry().hasException());
465 TEST(Future, hasValue) {
466 EXPECT_TRUE(makeFuture(42).getTry().hasValue());
467 EXPECT_FALSE(makeFuture<int>(eggs).getTry().hasValue());
470 TEST(Future, makeFuture) {
471 EXPECT_TYPE(makeFuture(42), Future<int>);
472 EXPECT_EQ(42, makeFuture(42).value());
474 EXPECT_TYPE(makeFuture<float>(42), Future<float>);
475 EXPECT_EQ(42, makeFuture<float>(42).value());
477 auto fun = [] { return 42; };
478 EXPECT_TYPE(makeFutureTry(fun), Future<int>);
479 EXPECT_EQ(42, makeFutureTry(fun).value());
481 auto failfun = []() -> int { throw eggs; };
482 EXPECT_TYPE(makeFutureTry(failfun), Future<int>);
483 EXPECT_THROW(makeFutureTry(failfun).value(), eggs_t);
485 EXPECT_TYPE(makeFuture(), Future<void>);
490 TEST(Promise, special) {
491 EXPECT_FALSE(std::is_copy_constructible<Promise<int>>::value);
492 EXPECT_FALSE(std::is_copy_assignable<Promise<int>>::value);
493 EXPECT_TRUE(std::is_move_constructible<Promise<int>>::value);
494 EXPECT_TRUE(std::is_move_assignable<Promise<int>>::value);
497 TEST(Promise, getFuture) {
499 Future<int> f = p.getFuture();
500 EXPECT_FALSE(f.isReady());
503 TEST(Promise, setValue) {
505 auto ffund = fund.getFuture();
507 EXPECT_EQ(42, ffund.value());
515 auto fpod = pod.getFuture();
516 Foo f = {"the answer", 42};
518 Foo f2 = fpod.value();
519 EXPECT_EQ(f.name, f2.name);
520 EXPECT_EQ(f.value, f2.value);
522 pod = Promise<Foo>();
523 fpod = pod.getFuture();
524 pod.setValue(std::move(f2));
525 Foo f3 = fpod.value();
526 EXPECT_EQ(f.name, f3.name);
527 EXPECT_EQ(f.value, f3.value);
529 Promise<unique_ptr<int>> mov;
530 auto fmov = mov.getFuture();
531 mov.setValue(unique_ptr<int>(new int(42)));
532 unique_ptr<int> ptr = std::move(fmov.value());
536 auto fv = v.getFuture();
538 EXPECT_TRUE(fv.isReady());
541 TEST(Promise, setException) {
544 auto f = p.getFuture();
545 p.setException(eggs);
546 EXPECT_THROW(f.value(), eggs_t);
550 auto f = p.getFuture();
554 p.setException(exception_wrapper(std::current_exception()));
556 EXPECT_THROW(f.value(), eggs_t);
560 TEST(Promise, fulfil) {
563 auto f = p.getFuture();
564 p.fulfil([] { return 42; });
565 EXPECT_EQ(42, f.value());
569 auto f = p.getFuture();
570 p.fulfil([]() -> int { throw eggs; });
571 EXPECT_THROW(f.value(), eggs_t);
575 TEST(Future, finish) {
576 auto x = std::make_shared<int>(0);
579 auto f = p.getFuture().then([x](Try<int>&& t) { *x = t.value(); });
581 // The callback hasn't executed
584 // The callback has a reference to x
585 EXPECT_EQ(2, x.use_count());
589 // the callback has executed
592 // the callback has been destructed
593 // and has released its reference to x
594 EXPECT_EQ(1, x.use_count());
597 TEST(Future, unwrap) {
601 auto fa = a.getFuture();
602 auto fb = b.getFuture();
607 // do a, then do b, and get the result of a + b.
608 Future<int> f = fa.then([&](Try<int>&& ta) {
609 auto va = ta.value();
611 return fb.then([va, &flag2](Try<int>&& tb) {
613 return va + tb.value();
619 EXPECT_FALSE(f.isReady());
624 EXPECT_FALSE(f.isReady());
629 EXPECT_EQ(7, f.value());
632 TEST(Future, whenAll) {
633 // returns a vector variant
635 vector<Promise<int>> promises(10);
636 vector<Future<int>> futures;
638 for (auto& p : promises)
639 futures.push_back(p.getFuture());
641 auto allf = whenAll(futures.begin(), futures.end());
643 random_shuffle(promises.begin(), promises.end());
644 for (auto& p : promises) {
645 EXPECT_FALSE(allf.isReady());
649 EXPECT_TRUE(allf.isReady());
650 auto& results = allf.value();
651 for (auto& t : results) {
652 EXPECT_EQ(42, t.value());
656 // check error semantics
658 vector<Promise<int>> promises(4);
659 vector<Future<int>> futures;
661 for (auto& p : promises)
662 futures.push_back(p.getFuture());
664 auto allf = whenAll(futures.begin(), futures.end());
667 promises[0].setValue(42);
668 promises[1].setException(eggs);
670 EXPECT_FALSE(allf.isReady());
672 promises[2].setValue(42);
674 EXPECT_FALSE(allf.isReady());
676 promises[3].setException(eggs);
678 EXPECT_TRUE(allf.isReady());
679 EXPECT_FALSE(allf.getTry().hasException());
681 auto& results = allf.value();
682 EXPECT_EQ(42, results[0].value());
683 EXPECT_TRUE(results[1].hasException());
684 EXPECT_EQ(42, results[2].value());
685 EXPECT_TRUE(results[3].hasException());
688 // check that futures are ready in then()
690 vector<Promise<void>> promises(10);
691 vector<Future<void>> futures;
693 for (auto& p : promises)
694 futures.push_back(p.getFuture());
696 auto allf = whenAll(futures.begin(), futures.end())
697 .then([](Try<vector<Try<void>>>&& ts) {
698 for (auto& f : ts.value())
702 random_shuffle(promises.begin(), promises.end());
703 for (auto& p : promises)
705 EXPECT_TRUE(allf.isReady());
710 TEST(Future, whenAny) {
712 vector<Promise<int>> promises(10);
713 vector<Future<int>> futures;
715 for (auto& p : promises)
716 futures.push_back(p.getFuture());
718 for (auto& f : futures) {
719 EXPECT_FALSE(f.isReady());
722 auto anyf = whenAny(futures.begin(), futures.end());
724 /* futures were moved in, so these are invalid now */
725 EXPECT_FALSE(anyf.isReady());
727 promises[7].setValue(42);
728 EXPECT_TRUE(anyf.isReady());
729 auto& idx_fut = anyf.value();
731 auto i = idx_fut.first;
734 auto& f = idx_fut.second;
735 EXPECT_EQ(42, f.value());
740 vector<Promise<void>> promises(10);
741 vector<Future<void>> futures;
743 for (auto& p : promises)
744 futures.push_back(p.getFuture());
746 for (auto& f : futures) {
747 EXPECT_FALSE(f.isReady());
750 auto anyf = whenAny(futures.begin(), futures.end());
752 EXPECT_FALSE(anyf.isReady());
754 promises[3].setException(eggs);
755 EXPECT_TRUE(anyf.isReady());
756 EXPECT_TRUE(anyf.value().second.hasException());
761 vector<Promise<int>> promises(10);
762 vector<Future<int>> futures;
764 for (auto& p : promises)
765 futures.push_back(p.getFuture());
767 auto anyf = whenAny(futures.begin(), futures.end())
768 .then([](pair<size_t, Try<int>> p) {
769 EXPECT_EQ(42, p.second.value());
772 promises[3].setValue(42);
773 EXPECT_TRUE(anyf.isReady());
778 TEST(when, already_completed) {
780 vector<Future<void>> fs;
781 for (int i = 0; i < 10; i++)
782 fs.push_back(makeFuture());
784 whenAll(fs.begin(), fs.end())
785 .then([&](vector<Try<void>> ts) {
786 EXPECT_EQ(fs.size(), ts.size());
790 vector<Future<int>> fs;
791 for (int i = 0; i < 10; i++)
792 fs.push_back(makeFuture(i));
794 whenAny(fs.begin(), fs.end())
795 .then([&](pair<size_t, Try<int>> p) {
796 EXPECT_EQ(p.first, p.second.value());
802 vector<Promise<void>> promises(10);
803 vector<Future<void>> futures;
805 for (auto& p : promises)
806 futures.push_back(p.getFuture());
810 whenN(futures.begin(), futures.end(), n)
811 .then([&](vector<pair<size_t, Try<void>>> v) {
813 EXPECT_EQ(n, v.size());
815 EXPECT_TRUE(tt.second.hasValue());
818 promises[0].setValue();
820 promises[1].setValue();
822 promises[2].setValue();
826 /* Ensure that we can compile when_{all,any} with folly::small_vector */
827 TEST(when, small_vector) {
829 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<void>),
830 "Futures should not be trivially copyable");
831 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<int>),
832 "Futures should not be trivially copyable");
834 using folly::small_vector;
836 small_vector<Future<void>> futures;
838 for (int i = 0; i < 10; i++)
839 futures.push_back(makeFuture());
841 auto anyf = whenAny(futures.begin(), futures.end());
845 small_vector<Future<void>> futures;
847 for (int i = 0; i < 10; i++)
848 futures.push_back(makeFuture());
850 auto allf = whenAll(futures.begin(), futures.end());
854 TEST(Future, whenAllVariadic) {
857 Future<bool> fb = pb.getFuture();
858 Future<int> fi = pi.getFuture();
860 whenAll(std::move(fb), std::move(fi))
861 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
863 EXPECT_TRUE(std::get<0>(tup).hasValue());
864 EXPECT_EQ(std::get<0>(tup).value(), true);
865 EXPECT_TRUE(std::get<1>(tup).hasValue());
866 EXPECT_EQ(std::get<1>(tup).value(), 42);
874 TEST(Future, whenAllVariadicReferences) {
877 Future<bool> fb = pb.getFuture();
878 Future<int> fi = pi.getFuture();
881 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
883 EXPECT_TRUE(std::get<0>(tup).hasValue());
884 EXPECT_EQ(std::get<0>(tup).value(), true);
885 EXPECT_TRUE(std::get<1>(tup).hasValue());
886 EXPECT_EQ(std::get<1>(tup).value(), 42);
894 TEST(Future, whenAll_none) {
895 vector<Future<int>> fs;
896 auto f = whenAll(fs.begin(), fs.end());
897 EXPECT_TRUE(f.isReady());
900 TEST(Future, throwCaughtInImmediateThen) {
901 // Neither of these should throw "Promise already satisfied"
903 [=](Try<void>&&) -> int { throw std::exception(); });
905 [=](Try<void>&&) -> Future<int> { throw std::exception(); });
908 TEST(Future, throwIfFailed) {
909 makeFuture<void>(eggs)
910 .then([=](Try<void>&& t) {
911 EXPECT_THROW(t.throwIfFailed(), eggs_t);
914 .then([=](Try<void>&& t) {
915 EXPECT_NO_THROW(t.throwIfFailed());
918 makeFuture<int>(eggs)
919 .then([=](Try<int>&& t) {
920 EXPECT_THROW(t.throwIfFailed(), eggs_t);
923 .then([=](Try<int>&& t) {
924 EXPECT_NO_THROW(t.throwIfFailed());
928 TEST(Future, waitImmediate) {
930 auto done = makeFuture(42).wait().value();
933 vector<int> v{1,2,3};
934 auto done_v = makeFuture(v).wait().value();
935 EXPECT_EQ(v.size(), done_v.size());
936 EXPECT_EQ(v, done_v);
938 vector<Future<void>> v_f;
939 v_f.push_back(makeFuture());
940 v_f.push_back(makeFuture());
941 auto done_v_f = whenAll(v_f.begin(), v_f.end()).wait().value();
942 EXPECT_EQ(2, done_v_f.size());
944 vector<Future<bool>> v_fb;
945 v_fb.push_back(makeFuture(true));
946 v_fb.push_back(makeFuture(false));
947 auto fut = whenAll(v_fb.begin(), v_fb.end());
948 auto done_v_fb = std::move(fut.wait().value());
949 EXPECT_EQ(2, done_v_fb.size());
954 Future<int> f = p.getFuture();
955 std::atomic<bool> flag{false};
956 std::atomic<int> result{1};
957 std::atomic<std::thread::id> id;
959 std::thread t([&](Future<int>&& tf){
960 auto n = tf.then([&](Try<int> && t) {
961 id = std::this_thread::get_id();
965 result.store(n.wait().value());
970 EXPECT_EQ(result.load(), 1);
973 // validate that the callback ended up executing in this thread, which
974 // is more to ensure that this test actually tests what it should
975 EXPECT_EQ(id, std::this_thread::get_id());
976 EXPECT_EQ(result.load(), 42);
980 MoveFlag() = default;
981 MoveFlag(const MoveFlag&) = delete;
982 MoveFlag(MoveFlag&& other) noexcept {
988 TEST(Future, waitReplacesSelf) {
992 auto f1 = makeFuture(MoveFlag());
994 EXPECT_FALSE(f1.value().moved);
997 auto f2 = makeFuture(MoveFlag()).wait();
998 EXPECT_FALSE(f2.value().moved);
1004 auto f1 = makeFuture(MoveFlag());
1005 f1.wait(milliseconds(1));
1006 EXPECT_FALSE(f1.value().moved);
1009 auto f2 = makeFuture(MoveFlag()).wait(milliseconds(1));
1010 EXPECT_FALSE(f2.value().moved);
1015 folly::EventBase eb;
1017 auto f1 = makeFuture(MoveFlag());
1019 EXPECT_FALSE(f1.value().moved);
1022 auto f2 = makeFuture(MoveFlag()).waitVia(&eb);
1023 EXPECT_FALSE(f2.value().moved);
1027 TEST(Future, waitWithDuration) {
1030 Future<int> f = p.getFuture();
1031 f.wait(milliseconds(1));
1032 EXPECT_FALSE(f.isReady());
1034 EXPECT_TRUE(f.isReady());
1038 Future<int> f = p.getFuture();
1040 f.wait(milliseconds(1));
1041 EXPECT_TRUE(f.isReady());
1044 vector<Future<bool>> v_fb;
1045 v_fb.push_back(makeFuture(true));
1046 v_fb.push_back(makeFuture(false));
1047 auto f = whenAll(v_fb.begin(), v_fb.end());
1048 f.wait(milliseconds(1));
1049 EXPECT_TRUE(f.isReady());
1050 EXPECT_EQ(2, f.value().size());
1053 vector<Future<bool>> v_fb;
1056 v_fb.push_back(p1.getFuture());
1057 v_fb.push_back(p2.getFuture());
1058 auto f = whenAll(v_fb.begin(), v_fb.end());
1059 f.wait(milliseconds(1));
1060 EXPECT_FALSE(f.isReady());
1062 EXPECT_FALSE(f.isReady());
1064 EXPECT_TRUE(f.isReady());
1067 auto f = makeFuture().wait(milliseconds(1));
1068 EXPECT_TRUE(f.isReady());
1073 auto start = std::chrono::steady_clock::now();
1074 auto f = p.getFuture().wait(milliseconds(100));
1075 auto elapsed = std::chrono::steady_clock::now() - start;
1076 EXPECT_GE(elapsed, milliseconds(100));
1077 EXPECT_FALSE(f.isReady());
1079 EXPECT_TRUE(f.isReady());
1083 // Try to trigger the race where the resultant Future is not yet complete
1084 // even if we didn't hit the timeout, and make sure we deal with it properly
1087 auto t = std::thread([&]{
1089 /* sleep override */ std::this_thread::sleep_for(milliseconds(100));
1093 auto f = p.getFuture().wait(std::chrono::seconds(3600));
1094 EXPECT_TRUE(f.isReady());
1099 class DummyDrivableExecutor : public DrivableExecutor {
1101 void add(Func f) override {}
1102 void drive() override { ran = true; }
1106 TEST(Future, getVia) {
1110 auto f = via(&x).then([]{ return true; });
1111 EXPECT_TRUE(f.getVia(&x));
1117 auto f = via(&x).then();
1122 DummyDrivableExecutor x;
1123 auto f = makeFuture(true);
1124 EXPECT_TRUE(f.getVia(&x));
1125 EXPECT_FALSE(x.ran);
1129 TEST(Future, waitVia) {
1132 auto f = via(&x).then();
1133 EXPECT_FALSE(f.isReady());
1135 EXPECT_TRUE(f.isReady());
1139 // try rvalue as well
1141 auto f = via(&x).then().waitVia(&x);
1142 EXPECT_TRUE(f.isReady());
1146 DummyDrivableExecutor x;
1147 makeFuture(true).waitVia(&x);
1148 EXPECT_FALSE(x.ran);
1152 TEST(Future, viaRaces) {
1155 auto tid = std::this_thread::get_id();
1158 std::thread t1([&] {
1161 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1162 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1163 .then([&](Try<void>&&) { done = true; });
1166 std::thread t2([&] {
1170 while (!done) x.run();
1175 TEST(Future, getFuture_after_setValue) {
1178 EXPECT_EQ(42, p.getFuture().value());
1181 TEST(Future, getFuture_after_setException) {
1183 p.fulfil([]() -> void { throw std::logic_error("foo"); });
1184 EXPECT_THROW(p.getFuture().value(), std::logic_error);
1187 TEST(Future, detachRace) {
1189 // This test is designed to detect a race that was in Core::detachOne()
1190 // where detached_ was incremented and then tested, and that
1191 // allowed a race where both Promise and Future would think they were the
1192 // second and both try to delete. This showed up at scale but was very
1193 // difficult to reliably repro in a test. As it is, this only fails about
1194 // once in every 1,000 executions. Doing this 1,000 times is going to make a
1195 // slow test so I won't do that but if it ever fails, take it seriously, and
1196 // run the test binary with "--gtest_repeat=10000 --gtest_filter=*detachRace"
1197 // (Don't forget to enable ASAN)
1198 auto p = folly::make_unique<Promise<bool>>();
1199 auto f = folly::make_unique<Future<bool>>(p->getFuture());
1200 folly::Baton<> baton;
1210 class TestData : public RequestData {
1212 explicit TestData(int data) : data_(data) {}
1213 virtual ~TestData() {}
1217 TEST(Future, context) {
1219 // Start a new context
1220 RequestContext::create();
1222 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1224 // Set some test data
1225 RequestContext::get()->setContextData(
1227 std::unique_ptr<TestData>(new TestData(10)));
1231 auto future = p.getFuture().then([&]{
1232 // Check that the context followed the future
1233 EXPECT_TRUE(RequestContext::get() != nullptr);
1234 auto a = dynamic_cast<TestData*>(
1235 RequestContext::get()->getContextData("test"));
1236 auto data = a->data_;
1237 EXPECT_EQ(10, data);
1240 // Clear the context
1241 RequestContext::setContext(nullptr);
1243 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1245 // Fulfil the promise
1250 // This only fails about 1 in 1k times when the bug is present :(
1251 TEST(Future, t5506504) {
1255 auto promises = std::make_shared<vector<Promise<void>>>(4);
1256 vector<Future<void>> futures;
1258 for (auto& p : *promises) {
1259 futures.emplace_back(
1262 .then([](Try<void>&&){}));
1267 for (auto& p : *promises) p.setValue();
1270 return whenAll(futures.begin(), futures.end());
1276 // Test of handling of a circular dependency. It's never recommended
1277 // to have one because of possible memory leaks. Here we test that
1278 // we can handle freeing of the Future while it is running.
1279 TEST(Future, CircularDependencySharedPtrSelfReset) {
1280 Promise<int64_t> promise;
1281 auto ptr = std::make_shared<Future<int64_t>>(promise.getFuture());
1284 [ptr] (folly::Try<int64_t>&& uid) mutable {
1285 EXPECT_EQ(1, ptr.use_count());
1287 // Leaving no references to ourselves.
1289 EXPECT_EQ(0, ptr.use_count());
1293 EXPECT_EQ(2, ptr.use_count());
1297 promise.fulfil([]{return 1l;});
1300 TEST(Future, Constructor) {
1301 auto f1 = []() -> Future<int> { return Future<int>(3); }();
1302 EXPECT_EQ(f1.value(), 3);
1303 auto f2 = []() -> Future<void> { return Future<void>(); }();
1304 EXPECT_NO_THROW(f2.value());
1307 TEST(Future, ImplicitConstructor) {
1308 auto f1 = []() -> Future<int> { return 3; }();
1309 EXPECT_EQ(f1.value(), 3);
1310 // Unfortunately, the C++ standard does not allow the
1311 // following implicit conversion to work:
1312 //auto f2 = []() -> Future<void> { }();
1315 TEST(Future, thenDynamic) {
1316 // folly::dynamic has a constructor that takes any T, this test makes
1317 // sure that we call the then lambda with folly::dynamic and not
1318 // Try<folly::dynamic> because that then fails to compile
1319 Promise<folly::dynamic> p;
1320 Future<folly::dynamic> f = p.getFuture().then(
1321 [](const folly::dynamic& d) {
1322 return folly::dynamic(d.asInt() + 3);
1326 EXPECT_EQ(f.get(), 5);
1329 TEST(Future, via_then_get_was_racy) {
1331 std::unique_ptr<int> val = folly::via(&x)
1332 .then([] { return folly::make_unique<int>(42); })
1335 EXPECT_EQ(42, *val);
1338 TEST(Future, ensure) {
1340 auto cob = [&]{ count++; };
1341 auto f = makeFuture(42)
1343 .then([](int) { throw std::runtime_error("ensure"); })
1346 EXPECT_THROW(f.get(), std::runtime_error);
1347 EXPECT_EQ(2, count);
1350 TEST(Future, willEqual) {
1351 //both p1 and p2 already fulfilled
1357 auto f1 = p1.getFuture();
1358 auto f2 = p2.getFuture();
1359 EXPECT_TRUE(f1.willEqual(f2).get());
1365 auto f1 = p1.getFuture();
1366 auto f2 = p2.getFuture();
1367 EXPECT_FALSE(f1.willEqual(f2).get());
1369 //both p1 and p2 not yet fulfilled
1373 auto f1 = p1.getFuture();
1374 auto f2 = p2.getFuture();
1375 auto f3 = f1.willEqual(f2);
1378 EXPECT_TRUE(f3.get());
1382 auto f1 = p1.getFuture();
1383 auto f2 = p2.getFuture();
1384 auto f3 = f1.willEqual(f2);
1387 EXPECT_FALSE(f3.get());
1389 //p1 already fulfilled, p2 not yet fulfilled
1394 auto f1 = p1.getFuture();
1395 auto f2 = p2.getFuture();
1396 auto f3 = f1.willEqual(f2);
1398 EXPECT_TRUE(f3.get());
1403 auto f1 = p1.getFuture();
1404 auto f2 = p2.getFuture();
1405 auto f3 = f1.willEqual(f2);
1407 EXPECT_FALSE(f3.get());
1409 //p2 already fulfilled, p1 not yet fulfilled
1414 auto f1 = p1.getFuture();
1415 auto f2 = p2.getFuture();
1416 auto f3 = f1.willEqual(f2);
1418 EXPECT_TRUE(f3.get());
1423 auto f1 = p1.getFuture();
1424 auto f2 = p2.getFuture();
1425 auto f3 = f1.willEqual(f2);
1427 EXPECT_FALSE(f3.get());
1433 // A simple scenario for the unwrap call, when the promise was fulfilled
1434 // before calling to unwrap.
1435 TEST(Future, Unwrap_SimpleScenario) {
1436 Future<int> encapsulated_future = makeFuture(5484);
1437 Future<Future<int>> future = makeFuture(std::move(encapsulated_future));
1438 EXPECT_EQ(5484, future.unwrap().value());
1441 // Makes sure that unwrap() works when chaning Future's commands.
1442 TEST(Future, Unwrap_ChainCommands) {
1443 Future<Future<int>> future = makeFuture(makeFuture(5484));
1444 auto unwrapped = future.unwrap().then([](int i){ return i; });
1445 EXPECT_EQ(5484, unwrapped.value());
1448 // Makes sure that the unwrap call also works when the promise was not yet
1449 // fulfilled, and that the returned Future<T> becomes ready once the promise
1451 TEST(Future, Unwrap_FutureNotReady) {
1452 Promise<Future<int>> p;
1453 Future<Future<int>> future = p.getFuture();
1454 Future<int> unwrapped = future.unwrap();
1455 // Sanity - should not be ready before the promise is fulfilled.
1456 ASSERT_FALSE(unwrapped.isReady());
1457 // Fulfill the promise and make sure the unwrapped future is now ready.
1458 p.setValue(makeFuture(5484));
1459 ASSERT_TRUE(unwrapped.isReady());
1460 EXPECT_EQ(5484, unwrapped.value());
1463 TEST(Reduce, Basic) {
1464 auto makeFutures = [](int count) {
1465 std::vector<Future<int>> fs;
1466 for (int i = 1; i <= count; ++i) {
1467 fs.emplace_back(makeFuture(i));
1474 auto fs = makeFutures(0);
1476 Future<double> f1 = reduce(fs.begin(), fs.end(), 1.2,
1477 [](double a, Try<int>&& b){
1478 return a + *b + 0.1;
1480 EXPECT_EQ(1.2, f1.get());
1485 auto fs = makeFutures(1);
1487 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1488 [](double a, Try<int>&& b){
1489 return a + *b + 0.1;
1491 EXPECT_EQ(1.1, f1.get());
1494 // Returning values (Try)
1496 auto fs = makeFutures(3);
1498 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1499 [](double a, Try<int>&& b){
1500 return a + *b + 0.1;
1502 EXPECT_EQ(6.3, f1.get());
1507 auto fs = makeFutures(3);
1509 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1510 [](double a, int&& b){
1513 EXPECT_EQ(6.3, f1.get());
1516 // Returning futures (Try)
1518 auto fs = makeFutures(3);
1520 Future<double> f2 = reduce(fs.begin(), fs.end(), 0.0,
1521 [](double a, Try<int>&& b){
1522 return makeFuture<double>(a + *b + 0.1);
1524 EXPECT_EQ(6.3, f2.get());
1527 // Returning futures
1529 auto fs = makeFutures(3);
1531 Future<double> f2 = reduce(fs.begin(), fs.end(), 0.0,
1532 [](double a, int&& b){
1533 return makeFuture<double>(a + b + 0.1);
1535 EXPECT_EQ(6.3, f2.get());