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/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)
67 worker = std::thread(std::bind(&ThreadExecutor::work, this));
76 void add(Func fn) override {
77 funcs.blockingWrite(std::move(fn));
80 void waitForStartup() {
85 typedef FutureException eggs_t;
86 static eggs_t eggs("eggs");
90 TEST(Future, coreSize) {
91 // If this number goes down, it's fine!
92 // If it goes up, please seek professional advice ;-)
93 EXPECT_EQ(192, sizeof(detail::Core<void>));
98 TEST(Future, onError) {
100 auto flag = [&]{ theFlag = true; };
101 #define EXPECT_FLAG() \
103 EXPECT_TRUE(theFlag); \
107 #define EXPECT_NO_FLAG() \
109 EXPECT_FALSE(theFlag); \
115 auto f = makeFuture()
116 .then([] { throw eggs; })
117 .onError([&] (eggs_t& e) { flag(); });
119 EXPECT_NO_THROW(f.value());
123 auto f = makeFuture()
124 .then([] { throw eggs; })
125 .onError([&] (eggs_t& e) { flag(); return makeFuture(); });
127 EXPECT_NO_THROW(f.value());
132 auto f = makeFuture()
133 .then([] { throw eggs; })
134 .onError([&] (eggs_t e) { flag(); });
136 EXPECT_NO_THROW(f.value());
140 auto f = makeFuture()
141 .then([] { throw eggs; })
142 .onError([&] (eggs_t e) { flag(); return makeFuture(); });
144 EXPECT_NO_THROW(f.value());
149 auto f = makeFuture()
150 .then([] { throw eggs; })
151 .onError([&] (std::exception& e) { flag(); });
153 EXPECT_NO_THROW(f.value());
157 auto f = makeFuture()
158 .then([] { throw eggs; })
159 .onError([&] (std::exception& e) { flag(); return makeFuture(); });
161 EXPECT_NO_THROW(f.value());
166 auto f = makeFuture()
167 .then([] { throw -1; })
168 .onError([&] (int e) { flag(); });
170 EXPECT_NO_THROW(f.value());
174 auto f = makeFuture()
175 .then([] { throw -1; })
176 .onError([&] (int e) { flag(); return makeFuture(); });
178 EXPECT_NO_THROW(f.value());
183 auto f = makeFuture()
184 .then([] { throw eggs; })
185 .onError([&] (eggs_t& e) mutable { flag(); });
187 EXPECT_NO_THROW(f.value());
191 auto f = makeFuture()
192 .then([] { throw eggs; })
193 .onError([&] (eggs_t& e) mutable { flag(); return makeFuture(); });
195 EXPECT_NO_THROW(f.value());
200 auto f = makeFuture()
201 .then([] { return 42; })
202 .onError([&] (eggs_t& e) { flag(); return -1; });
204 EXPECT_EQ(42, f.value());
208 auto f = makeFuture()
209 .then([] { return 42; })
210 .onError([&] (eggs_t& e) { flag(); return makeFuture<int>(-1); });
212 EXPECT_EQ(42, f.value());
215 // Catch different exception
217 auto f = makeFuture()
218 .then([] { throw eggs; })
219 .onError([&] (std::runtime_error& e) { flag(); });
221 EXPECT_THROW(f.value(), eggs_t);
225 auto f = makeFuture()
226 .then([] { throw eggs; })
227 .onError([&] (std::runtime_error& e) { flag(); return makeFuture(); });
229 EXPECT_THROW(f.value(), eggs_t);
232 // Returned value propagates
234 auto f = makeFuture()
235 .then([] { throw eggs; return 0; })
236 .onError([&] (eggs_t& e) { return 42; });
237 EXPECT_EQ(42, f.value());
240 // Returned future propagates
242 auto f = makeFuture()
243 .then([] { throw eggs; return 0; })
244 .onError([&] (eggs_t& e) { return makeFuture<int>(42); });
245 EXPECT_EQ(42, f.value());
250 auto f = makeFuture()
251 .then([] { throw eggs; return 0; })
252 .onError([&] (eggs_t& e) { throw e; return -1; });
253 EXPECT_THROW(f.value(), eggs_t);
257 auto f = makeFuture()
258 .then([] { throw eggs; return 0; })
259 .onError([&] (eggs_t& e) { throw e; return makeFuture<int>(-1); });
260 EXPECT_THROW(f.value(), eggs_t);
277 Try<A> t_a(std::move(a));
281 EXPECT_EQ(5, t_a.value().x());
284 TEST(Future, special) {
285 EXPECT_FALSE(std::is_copy_constructible<Future<int>>::value);
286 EXPECT_FALSE(std::is_copy_assignable<Future<int>>::value);
287 EXPECT_TRUE(std::is_move_constructible<Future<int>>::value);
288 EXPECT_TRUE(std::is_move_assignable<Future<int>>::value);
292 auto f = makeFuture<string>("0")
293 .then([](){ return makeFuture<string>("1"); })
294 .then([](Try<string>&& t) { return makeFuture(t.value() + ";2"); })
295 .then([](const Try<string>&& t) { return makeFuture(t.value() + ";3"); })
296 .then([](Try<string>& t) { return makeFuture(t.value() + ";4"); })
297 .then([](const Try<string>& t) { return makeFuture(t.value() + ";5"); })
298 .then([](Try<string> t) { return makeFuture(t.value() + ";6"); })
299 .then([](const Try<string> t) { return makeFuture(t.value() + ";7"); })
300 .then([](string&& s) { return makeFuture(s + ";8"); })
301 .then([](const string&& s) { return makeFuture(s + ";9"); })
302 .then([](string& s) { return makeFuture(s + ";10"); })
303 .then([](const string& s) { return makeFuture(s + ";11"); })
304 .then([](string s) { return makeFuture(s + ";12"); })
305 .then([](const string s) { return makeFuture(s + ";13"); })
307 EXPECT_EQ(f.value(), "1;2;3;4;5;6;7;8;9;10;11;12;13");
310 TEST(Future, thenTry) {
313 makeFuture<int>(42).then([&](Try<int>&& t) {
315 EXPECT_EQ(42, t.value());
317 EXPECT_TRUE(flag); flag = false;
320 .then([](Try<int>&& t) { return t.value(); })
321 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
322 EXPECT_TRUE(flag); flag = false;
324 makeFuture().then([&](Try<void>&& t) { flag = true; t.value(); });
325 EXPECT_TRUE(flag); flag = false;
328 auto f = p.getFuture().then([&](Try<void>&& t) { flag = true; });
330 EXPECT_FALSE(f.isReady());
333 EXPECT_TRUE(f.isReady());
336 TEST(Future, thenValue) {
338 makeFuture<int>(42).then([&](int i){
342 EXPECT_TRUE(flag); flag = false;
345 .then([](int i){ return i; })
346 .then([&](int i) { flag = true; EXPECT_EQ(42, i); });
347 EXPECT_TRUE(flag); flag = false;
349 makeFuture().then([&]{
352 EXPECT_TRUE(flag); flag = false;
354 auto f = makeFuture<int>(eggs).then([&](int i){});
355 EXPECT_THROW(f.value(), eggs_t);
357 f = makeFuture<void>(eggs).then([&]{});
358 EXPECT_THROW(f.value(), eggs_t);
361 TEST(Future, thenValueFuture) {
364 .then([](int i){ return makeFuture<int>(std::move(i)); })
365 .then([&](Try<int>&& t) { flag = true; EXPECT_EQ(42, t.value()); });
366 EXPECT_TRUE(flag); flag = false;
369 .then([]{ return makeFuture(); })
370 .then([&](Try<void>&& t) { flag = true; });
371 EXPECT_TRUE(flag); flag = false;
374 static string doWorkStatic(Try<string>&& t) {
375 return t.value() + ";static";
378 TEST(Future, thenFunction) {
380 string doWork(Try<string>&& t) {
381 return t.value() + ";class";
383 static string doWorkStatic(Try<string>&& t) {
384 return t.value() + ";class-static";
388 auto f = makeFuture<string>("start")
390 .then(Worker::doWorkStatic)
391 .then(&Worker::doWork, &w);
393 EXPECT_EQ(f.value(), "start;static;class-static;class");
396 static Future<string> doWorkStaticFuture(Try<string>&& t) {
397 return makeFuture(t.value() + ";static");
400 TEST(Future, thenFunctionFuture) {
402 Future<string> doWorkFuture(Try<string>&& t) {
403 return makeFuture(t.value() + ";class");
405 static Future<string> doWorkStaticFuture(Try<string>&& t) {
406 return makeFuture(t.value() + ";class-static");
410 auto f = makeFuture<string>("start")
411 .then(doWorkStaticFuture)
412 .then(Worker::doWorkStaticFuture)
413 .then(&Worker::doWorkFuture, &w);
415 EXPECT_EQ(f.value(), "start;static;class-static;class");
418 TEST(Future, thenBind) {
420 return makeFuture("bind");
422 auto b = std::bind(l);
423 auto f = makeFuture().then(std::move(b));
424 EXPECT_EQ(f.value(), "bind");
427 TEST(Future, thenBindTry) {
428 auto l = [](Try<string>&& t) {
429 return makeFuture(t.value() + ";bind");
431 auto b = std::bind(l, std::placeholders::_1);
432 auto f = makeFuture<string>("start").then(std::move(b));
434 EXPECT_EQ(f.value(), "start;bind");
437 TEST(Future, value) {
438 auto f = makeFuture(unique_ptr<int>(new int(42)));
439 auto up = std::move(f.value());
442 EXPECT_THROW(makeFuture<int>(eggs).value(), eggs_t);
445 TEST(Future, isReady) {
447 auto f = p.getFuture();
448 EXPECT_FALSE(f.isReady());
450 EXPECT_TRUE(f.isReady());
453 TEST(Future, futureNotReady) {
455 Future<int> f = p.getFuture();
456 EXPECT_THROW(f.value(), eggs_t);
459 TEST(Future, hasException) {
460 EXPECT_TRUE(makeFuture<int>(eggs).getTry().hasException());
461 EXPECT_FALSE(makeFuture(42).getTry().hasException());
464 TEST(Future, hasValue) {
465 EXPECT_TRUE(makeFuture(42).getTry().hasValue());
466 EXPECT_FALSE(makeFuture<int>(eggs).getTry().hasValue());
469 TEST(Future, makeFuture) {
470 EXPECT_TYPE(makeFuture(42), Future<int>);
471 EXPECT_EQ(42, makeFuture(42).value());
473 EXPECT_TYPE(makeFuture<float>(42), Future<float>);
474 EXPECT_EQ(42, makeFuture<float>(42).value());
476 auto fun = [] { return 42; };
477 EXPECT_TYPE(makeFutureTry(fun), Future<int>);
478 EXPECT_EQ(42, makeFutureTry(fun).value());
480 auto failfun = []() -> int { throw eggs; };
481 EXPECT_TYPE(makeFutureTry(failfun), Future<int>);
482 EXPECT_THROW(makeFutureTry(failfun).value(), eggs_t);
484 EXPECT_TYPE(makeFuture(), Future<void>);
489 TEST(Promise, special) {
490 EXPECT_FALSE(std::is_copy_constructible<Promise<int>>::value);
491 EXPECT_FALSE(std::is_copy_assignable<Promise<int>>::value);
492 EXPECT_TRUE(std::is_move_constructible<Promise<int>>::value);
493 EXPECT_TRUE(std::is_move_assignable<Promise<int>>::value);
496 TEST(Promise, getFuture) {
498 Future<int> f = p.getFuture();
499 EXPECT_FALSE(f.isReady());
502 TEST(Promise, setValue) {
504 auto ffund = fund.getFuture();
506 EXPECT_EQ(42, ffund.value());
514 auto fpod = pod.getFuture();
515 Foo f = {"the answer", 42};
517 Foo f2 = fpod.value();
518 EXPECT_EQ(f.name, f2.name);
519 EXPECT_EQ(f.value, f2.value);
521 pod = Promise<Foo>();
522 fpod = pod.getFuture();
523 pod.setValue(std::move(f2));
524 Foo f3 = fpod.value();
525 EXPECT_EQ(f.name, f3.name);
526 EXPECT_EQ(f.value, f3.value);
528 Promise<unique_ptr<int>> mov;
529 auto fmov = mov.getFuture();
530 mov.setValue(unique_ptr<int>(new int(42)));
531 unique_ptr<int> ptr = std::move(fmov.value());
535 auto fv = v.getFuture();
537 EXPECT_TRUE(fv.isReady());
540 TEST(Promise, setException) {
543 auto f = p.getFuture();
544 p.setException(eggs);
545 EXPECT_THROW(f.value(), eggs_t);
549 auto f = p.getFuture();
553 p.setException(exception_wrapper(std::current_exception()));
555 EXPECT_THROW(f.value(), eggs_t);
559 TEST(Promise, fulfil) {
562 auto f = p.getFuture();
563 p.fulfil([] { return 42; });
564 EXPECT_EQ(42, f.value());
568 auto f = p.getFuture();
569 p.fulfil([]() -> int { throw eggs; });
570 EXPECT_THROW(f.value(), eggs_t);
574 TEST(Future, finish) {
575 auto x = std::make_shared<int>(0);
578 auto f = p.getFuture().then([x](Try<int>&& t) { *x = t.value(); });
580 // The callback hasn't executed
583 // The callback has a reference to x
584 EXPECT_EQ(2, x.use_count());
588 // the callback has executed
591 // the callback has been destructed
592 // and has released its reference to x
593 EXPECT_EQ(1, x.use_count());
596 TEST(Future, unwrap) {
600 auto fa = a.getFuture();
601 auto fb = b.getFuture();
606 // do a, then do b, and get the result of a + b.
607 Future<int> f = fa.then([&](Try<int>&& ta) {
608 auto va = ta.value();
610 return fb.then([va, &flag2](Try<int>&& tb) {
612 return va + tb.value();
618 EXPECT_FALSE(f.isReady());
623 EXPECT_FALSE(f.isReady());
628 EXPECT_EQ(7, f.value());
631 TEST(Future, whenAll) {
632 // returns a vector variant
634 vector<Promise<int>> promises(10);
635 vector<Future<int>> futures;
637 for (auto& p : promises)
638 futures.push_back(p.getFuture());
640 auto allf = whenAll(futures.begin(), futures.end());
642 random_shuffle(promises.begin(), promises.end());
643 for (auto& p : promises) {
644 EXPECT_FALSE(allf.isReady());
648 EXPECT_TRUE(allf.isReady());
649 auto& results = allf.value();
650 for (auto& t : results) {
651 EXPECT_EQ(42, t.value());
655 // check error semantics
657 vector<Promise<int>> promises(4);
658 vector<Future<int>> futures;
660 for (auto& p : promises)
661 futures.push_back(p.getFuture());
663 auto allf = whenAll(futures.begin(), futures.end());
666 promises[0].setValue(42);
667 promises[1].setException(eggs);
669 EXPECT_FALSE(allf.isReady());
671 promises[2].setValue(42);
673 EXPECT_FALSE(allf.isReady());
675 promises[3].setException(eggs);
677 EXPECT_TRUE(allf.isReady());
678 EXPECT_FALSE(allf.getTry().hasException());
680 auto& results = allf.value();
681 EXPECT_EQ(42, results[0].value());
682 EXPECT_TRUE(results[1].hasException());
683 EXPECT_EQ(42, results[2].value());
684 EXPECT_TRUE(results[3].hasException());
687 // check that futures are ready in then()
689 vector<Promise<void>> promises(10);
690 vector<Future<void>> futures;
692 for (auto& p : promises)
693 futures.push_back(p.getFuture());
695 auto allf = whenAll(futures.begin(), futures.end())
696 .then([](Try<vector<Try<void>>>&& ts) {
697 for (auto& f : ts.value())
701 random_shuffle(promises.begin(), promises.end());
702 for (auto& p : promises)
704 EXPECT_TRUE(allf.isReady());
709 TEST(Future, whenAny) {
711 vector<Promise<int>> promises(10);
712 vector<Future<int>> futures;
714 for (auto& p : promises)
715 futures.push_back(p.getFuture());
717 for (auto& f : futures) {
718 EXPECT_FALSE(f.isReady());
721 auto anyf = whenAny(futures.begin(), futures.end());
723 /* futures were moved in, so these are invalid now */
724 EXPECT_FALSE(anyf.isReady());
726 promises[7].setValue(42);
727 EXPECT_TRUE(anyf.isReady());
728 auto& idx_fut = anyf.value();
730 auto i = idx_fut.first;
733 auto& f = idx_fut.second;
734 EXPECT_EQ(42, f.value());
739 vector<Promise<void>> promises(10);
740 vector<Future<void>> futures;
742 for (auto& p : promises)
743 futures.push_back(p.getFuture());
745 for (auto& f : futures) {
746 EXPECT_FALSE(f.isReady());
749 auto anyf = whenAny(futures.begin(), futures.end());
751 EXPECT_FALSE(anyf.isReady());
753 promises[3].setException(eggs);
754 EXPECT_TRUE(anyf.isReady());
755 EXPECT_TRUE(anyf.value().second.hasException());
760 vector<Promise<int>> promises(10);
761 vector<Future<int>> futures;
763 for (auto& p : promises)
764 futures.push_back(p.getFuture());
766 auto anyf = whenAny(futures.begin(), futures.end())
767 .then([](pair<size_t, Try<int>> p) {
768 EXPECT_EQ(42, p.second.value());
771 promises[3].setValue(42);
772 EXPECT_TRUE(anyf.isReady());
777 TEST(when, already_completed) {
779 vector<Future<void>> fs;
780 for (int i = 0; i < 10; i++)
781 fs.push_back(makeFuture());
783 whenAll(fs.begin(), fs.end())
784 .then([&](vector<Try<void>> ts) {
785 EXPECT_EQ(fs.size(), ts.size());
789 vector<Future<int>> fs;
790 for (int i = 0; i < 10; i++)
791 fs.push_back(makeFuture(i));
793 whenAny(fs.begin(), fs.end())
794 .then([&](pair<size_t, Try<int>> p) {
795 EXPECT_EQ(p.first, p.second.value());
801 vector<Promise<void>> promises(10);
802 vector<Future<void>> futures;
804 for (auto& p : promises)
805 futures.push_back(p.getFuture());
809 whenN(futures.begin(), futures.end(), n)
810 .then([&](vector<pair<size_t, Try<void>>> v) {
812 EXPECT_EQ(n, v.size());
814 EXPECT_TRUE(tt.second.hasValue());
817 promises[0].setValue();
819 promises[1].setValue();
821 promises[2].setValue();
825 /* Ensure that we can compile when_{all,any} with folly::small_vector */
826 TEST(when, small_vector) {
828 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<void>),
829 "Futures should not be trivially copyable");
830 static_assert(!FOLLY_IS_TRIVIALLY_COPYABLE(Future<int>),
831 "Futures should not be trivially copyable");
833 using folly::small_vector;
835 small_vector<Future<void>> futures;
837 for (int i = 0; i < 10; i++)
838 futures.push_back(makeFuture());
840 auto anyf = whenAny(futures.begin(), futures.end());
844 small_vector<Future<void>> futures;
846 for (int i = 0; i < 10; i++)
847 futures.push_back(makeFuture());
849 auto allf = whenAll(futures.begin(), futures.end());
853 TEST(Future, whenAllVariadic) {
856 Future<bool> fb = pb.getFuture();
857 Future<int> fi = pi.getFuture();
859 whenAll(std::move(fb), std::move(fi))
860 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
862 EXPECT_TRUE(std::get<0>(tup).hasValue());
863 EXPECT_EQ(std::get<0>(tup).value(), true);
864 EXPECT_TRUE(std::get<1>(tup).hasValue());
865 EXPECT_EQ(std::get<1>(tup).value(), 42);
873 TEST(Future, whenAllVariadicReferences) {
876 Future<bool> fb = pb.getFuture();
877 Future<int> fi = pi.getFuture();
880 .then([&](std::tuple<Try<bool>, Try<int>> tup) {
882 EXPECT_TRUE(std::get<0>(tup).hasValue());
883 EXPECT_EQ(std::get<0>(tup).value(), true);
884 EXPECT_TRUE(std::get<1>(tup).hasValue());
885 EXPECT_EQ(std::get<1>(tup).value(), 42);
893 TEST(Future, whenAll_none) {
894 vector<Future<int>> fs;
895 auto f = whenAll(fs.begin(), fs.end());
896 EXPECT_TRUE(f.isReady());
899 TEST(Future, throwCaughtInImmediateThen) {
900 // Neither of these should throw "Promise already satisfied"
902 [=](Try<void>&&) -> int { throw std::exception(); });
904 [=](Try<void>&&) -> Future<int> { throw std::exception(); });
907 TEST(Future, throwIfFailed) {
908 makeFuture<void>(eggs)
909 .then([=](Try<void>&& t) {
910 EXPECT_THROW(t.throwIfFailed(), eggs_t);
913 .then([=](Try<void>&& t) {
914 EXPECT_NO_THROW(t.throwIfFailed());
917 makeFuture<int>(eggs)
918 .then([=](Try<int>&& t) {
919 EXPECT_THROW(t.throwIfFailed(), eggs_t);
922 .then([=](Try<int>&& t) {
923 EXPECT_NO_THROW(t.throwIfFailed());
927 TEST(Future, waitImmediate) {
929 auto done = makeFuture(42).wait().value();
932 vector<int> v{1,2,3};
933 auto done_v = makeFuture(v).wait().value();
934 EXPECT_EQ(v.size(), done_v.size());
935 EXPECT_EQ(v, done_v);
937 vector<Future<void>> v_f;
938 v_f.push_back(makeFuture());
939 v_f.push_back(makeFuture());
940 auto done_v_f = whenAll(v_f.begin(), v_f.end()).wait().value();
941 EXPECT_EQ(2, done_v_f.size());
943 vector<Future<bool>> v_fb;
944 v_fb.push_back(makeFuture(true));
945 v_fb.push_back(makeFuture(false));
946 auto fut = whenAll(v_fb.begin(), v_fb.end());
947 auto done_v_fb = std::move(fut.wait().value());
948 EXPECT_EQ(2, done_v_fb.size());
953 Future<int> f = p.getFuture();
954 std::atomic<bool> flag{false};
955 std::atomic<int> result{1};
956 std::atomic<std::thread::id> id;
958 std::thread t([&](Future<int>&& tf){
959 auto n = tf.then([&](Try<int> && t) {
960 id = std::this_thread::get_id();
964 result.store(n.wait().value());
969 EXPECT_EQ(result.load(), 1);
972 // validate that the callback ended up executing in this thread, which
973 // is more to ensure that this test actually tests what it should
974 EXPECT_EQ(id, std::this_thread::get_id());
975 EXPECT_EQ(result.load(), 42);
979 MoveFlag() = default;
980 MoveFlag(const MoveFlag&) = delete;
981 MoveFlag(MoveFlag&& other) noexcept {
987 TEST(Future, waitReplacesSelf) {
991 auto f1 = makeFuture(MoveFlag());
993 EXPECT_FALSE(f1.value().moved);
996 auto f2 = makeFuture(MoveFlag()).wait();
997 EXPECT_FALSE(f2.value().moved);
1003 auto f1 = makeFuture(MoveFlag());
1004 f1.wait(milliseconds(1));
1005 EXPECT_FALSE(f1.value().moved);
1008 auto f2 = makeFuture(MoveFlag()).wait(milliseconds(1));
1009 EXPECT_FALSE(f2.value().moved);
1014 folly::EventBase eb;
1016 auto f1 = makeFuture(MoveFlag());
1018 EXPECT_FALSE(f1.value().moved);
1021 auto f2 = makeFuture(MoveFlag()).waitVia(&eb);
1022 EXPECT_FALSE(f2.value().moved);
1026 TEST(Future, waitWithDuration) {
1029 Future<int> f = p.getFuture();
1030 f.wait(milliseconds(1));
1031 EXPECT_FALSE(f.isReady());
1033 EXPECT_TRUE(f.isReady());
1037 Future<int> f = p.getFuture();
1039 f.wait(milliseconds(1));
1040 EXPECT_TRUE(f.isReady());
1043 vector<Future<bool>> v_fb;
1044 v_fb.push_back(makeFuture(true));
1045 v_fb.push_back(makeFuture(false));
1046 auto f = whenAll(v_fb.begin(), v_fb.end());
1047 f.wait(milliseconds(1));
1048 EXPECT_TRUE(f.isReady());
1049 EXPECT_EQ(2, f.value().size());
1052 vector<Future<bool>> v_fb;
1055 v_fb.push_back(p1.getFuture());
1056 v_fb.push_back(p2.getFuture());
1057 auto f = whenAll(v_fb.begin(), v_fb.end());
1058 f.wait(milliseconds(1));
1059 EXPECT_FALSE(f.isReady());
1061 EXPECT_FALSE(f.isReady());
1063 EXPECT_TRUE(f.isReady());
1066 auto f = makeFuture().wait(milliseconds(1));
1067 EXPECT_TRUE(f.isReady());
1072 auto start = std::chrono::steady_clock::now();
1073 auto f = p.getFuture().wait(milliseconds(100));
1074 auto elapsed = std::chrono::steady_clock::now() - start;
1075 EXPECT_GE(elapsed, milliseconds(100));
1076 EXPECT_FALSE(f.isReady());
1078 EXPECT_TRUE(f.isReady());
1082 // Try to trigger the race where the resultant Future is not yet complete
1083 // even if we didn't hit the timeout, and make sure we deal with it properly
1086 auto t = std::thread([&]{
1088 /* sleep override */ std::this_thread::sleep_for(milliseconds(100));
1092 auto f = p.getFuture().wait(std::chrono::seconds(3600));
1093 EXPECT_TRUE(f.isReady());
1098 class DummyDrivableExecutor : public DrivableExecutor {
1100 void add(Func f) override {}
1101 void drive() override { ran = true; }
1105 TEST(Future, getVia) {
1109 auto f = via(&x).then([]{ return true; });
1110 EXPECT_TRUE(f.getVia(&x));
1116 auto f = via(&x).then();
1121 DummyDrivableExecutor x;
1122 auto f = makeFuture(true);
1123 EXPECT_TRUE(f.getVia(&x));
1124 EXPECT_FALSE(x.ran);
1128 TEST(Future, waitVia) {
1131 auto f = via(&x).then();
1132 EXPECT_FALSE(f.isReady());
1134 EXPECT_TRUE(f.isReady());
1138 // try rvalue as well
1140 auto f = via(&x).then().waitVia(&x);
1141 EXPECT_TRUE(f.isReady());
1145 DummyDrivableExecutor x;
1146 makeFuture(true).waitVia(&x);
1147 EXPECT_FALSE(x.ran);
1151 TEST(Future, viaRaces) {
1154 auto tid = std::this_thread::get_id();
1157 std::thread t1([&] {
1160 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1161 .then([&](Try<void>&&) { EXPECT_EQ(tid, std::this_thread::get_id()); })
1162 .then([&](Try<void>&&) { done = true; });
1165 std::thread t2([&] {
1169 while (!done) x.run();
1174 TEST(Future, getFuture_after_setValue) {
1177 EXPECT_EQ(42, p.getFuture().value());
1180 TEST(Future, getFuture_after_setException) {
1182 p.fulfil([]() -> void { throw std::logic_error("foo"); });
1183 EXPECT_THROW(p.getFuture().value(), std::logic_error);
1186 TEST(Future, detachRace) {
1188 // This test is designed to detect a race that was in Core::detachOne()
1189 // where detached_ was incremented and then tested, and that
1190 // allowed a race where both Promise and Future would think they were the
1191 // second and both try to delete. This showed up at scale but was very
1192 // difficult to reliably repro in a test. As it is, this only fails about
1193 // once in every 1,000 executions. Doing this 1,000 times is going to make a
1194 // slow test so I won't do that but if it ever fails, take it seriously, and
1195 // run the test binary with "--gtest_repeat=10000 --gtest_filter=*detachRace"
1196 // (Don't forget to enable ASAN)
1197 auto p = folly::make_unique<Promise<bool>>();
1198 auto f = folly::make_unique<Future<bool>>(p->getFuture());
1199 folly::Baton<> baton;
1209 class TestData : public RequestData {
1211 explicit TestData(int data) : data_(data) {}
1212 virtual ~TestData() {}
1216 TEST(Future, context) {
1218 // Start a new context
1219 RequestContext::create();
1221 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1223 // Set some test data
1224 RequestContext::get()->setContextData(
1226 std::unique_ptr<TestData>(new TestData(10)));
1230 auto future = p.getFuture().then([&]{
1231 // Check that the context followed the future
1232 EXPECT_TRUE(RequestContext::get() != nullptr);
1233 auto a = dynamic_cast<TestData*>(
1234 RequestContext::get()->getContextData("test"));
1235 auto data = a->data_;
1236 EXPECT_EQ(10, data);
1239 // Clear the context
1240 RequestContext::setContext(nullptr);
1242 EXPECT_EQ(nullptr, RequestContext::get()->getContextData("test"));
1244 // Fulfil the promise
1249 // This only fails about 1 in 1k times when the bug is present :(
1250 TEST(Future, t5506504) {
1254 auto promises = std::make_shared<vector<Promise<void>>>(4);
1255 vector<Future<void>> futures;
1257 for (auto& p : *promises) {
1258 futures.emplace_back(
1261 .then([](Try<void>&&){}));
1266 for (auto& p : *promises) p.setValue();
1269 return whenAll(futures.begin(), futures.end());
1275 // Test of handling of a circular dependency. It's never recommended
1276 // to have one because of possible memory leaks. Here we test that
1277 // we can handle freeing of the Future while it is running.
1278 TEST(Future, CircularDependencySharedPtrSelfReset) {
1279 Promise<int64_t> promise;
1280 auto ptr = std::make_shared<Future<int64_t>>(promise.getFuture());
1283 [ptr] (folly::Try<int64_t>&& uid) mutable {
1284 EXPECT_EQ(1, ptr.use_count());
1286 // Leaving no references to ourselves.
1288 EXPECT_EQ(0, ptr.use_count());
1292 EXPECT_EQ(2, ptr.use_count());
1296 promise.fulfil([]{return 1l;});
1299 TEST(Future, Constructor) {
1300 auto f1 = []() -> Future<int> { return Future<int>(3); }();
1301 EXPECT_EQ(f1.value(), 3);
1302 auto f2 = []() -> Future<void> { return Future<void>(); }();
1303 EXPECT_NO_THROW(f2.value());
1306 TEST(Future, ImplicitConstructor) {
1307 auto f1 = []() -> Future<int> { return 3; }();
1308 EXPECT_EQ(f1.value(), 3);
1309 // Unfortunately, the C++ standard does not allow the
1310 // following implicit conversion to work:
1311 //auto f2 = []() -> Future<void> { }();
1314 TEST(Future, via_then_get_was_racy) {
1316 std::unique_ptr<int> val = folly::via(&x)
1317 .then([] { return folly::make_unique<int>(42); })
1320 EXPECT_EQ(42, *val);
1323 TEST(Future, ensure) {
1325 auto cob = [&]{ count++; };
1326 auto f = makeFuture(42)
1328 .then([](int) { throw std::runtime_error("ensure"); })
1331 EXPECT_THROW(f.get(), std::runtime_error);
1332 EXPECT_EQ(2, count);
1335 TEST(Future, willEqual) {
1336 //both p1 and p2 already fulfilled
1342 auto f1 = p1.getFuture();
1343 auto f2 = p2.getFuture();
1344 EXPECT_TRUE(f1.willEqual(f2).get());
1350 auto f1 = p1.getFuture();
1351 auto f2 = p2.getFuture();
1352 EXPECT_FALSE(f1.willEqual(f2).get());
1354 //both p1 and p2 not yet fulfilled
1358 auto f1 = p1.getFuture();
1359 auto f2 = p2.getFuture();
1360 auto f3 = f1.willEqual(f2);
1363 EXPECT_TRUE(f3.get());
1367 auto f1 = p1.getFuture();
1368 auto f2 = p2.getFuture();
1369 auto f3 = f1.willEqual(f2);
1372 EXPECT_FALSE(f3.get());
1374 //p1 already fulfilled, p2 not yet fulfilled
1379 auto f1 = p1.getFuture();
1380 auto f2 = p2.getFuture();
1381 auto f3 = f1.willEqual(f2);
1383 EXPECT_TRUE(f3.get());
1388 auto f1 = p1.getFuture();
1389 auto f2 = p2.getFuture();
1390 auto f3 = f1.willEqual(f2);
1392 EXPECT_FALSE(f3.get());
1394 //p2 already fulfilled, p1 not yet fulfilled
1399 auto f1 = p1.getFuture();
1400 auto f2 = p2.getFuture();
1401 auto f3 = f1.willEqual(f2);
1403 EXPECT_TRUE(f3.get());
1408 auto f1 = p1.getFuture();
1409 auto f2 = p2.getFuture();
1410 auto f3 = f1.willEqual(f2);
1412 EXPECT_FALSE(f3.get());
1418 // A simple scenario for the unwrap call, when the promise was fulfilled
1419 // before calling to unwrap.
1420 TEST(Future, Unwrap_SimpleScenario) {
1421 Future<int> encapsulated_future = makeFuture(5484);
1422 Future<Future<int>> future = makeFuture(std::move(encapsulated_future));
1423 EXPECT_EQ(5484, future.unwrap().value());
1426 // Makes sure that unwrap() works when chaning Future's commands.
1427 TEST(Future, Unwrap_ChainCommands) {
1428 Future<Future<int>> future = makeFuture(makeFuture(5484));
1429 auto unwrapped = future.unwrap().then([](int i){ return i; });
1430 EXPECT_EQ(5484, unwrapped.value());
1433 // Makes sure that the unwrap call also works when the promise was not yet
1434 // fulfilled, and that the returned Future<T> becomes ready once the promise
1436 TEST(Future, Unwrap_FutureNotReady) {
1437 Promise<Future<int>> p;
1438 Future<Future<int>> future = p.getFuture();
1439 Future<int> unwrapped = future.unwrap();
1440 // Sanity - should not be ready before the promise is fulfilled.
1441 ASSERT_FALSE(unwrapped.isReady());
1442 // Fulfill the promise and make sure the unwrapped future is now ready.
1443 p.setValue(makeFuture(5484));
1444 ASSERT_TRUE(unwrapped.isReady());
1445 EXPECT_EQ(5484, unwrapped.value());
1448 TEST(Reduce, Basic) {
1449 auto makeFutures = [](int count) {
1450 std::vector<Future<int>> fs;
1451 for (int i = 1; i <= count; ++i) {
1452 fs.emplace_back(makeFuture(i));
1459 auto fs = makeFutures(0);
1461 Future<double> f1 = reduce(fs.begin(), fs.end(), 1.2,
1462 [](double a, Try<int>&& b){
1463 return a + *b + 0.1;
1465 EXPECT_EQ(1.2, f1.get());
1470 auto fs = makeFutures(1);
1472 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1473 [](double a, Try<int>&& b){
1474 return a + *b + 0.1;
1476 EXPECT_EQ(1.1, f1.get());
1479 // Returning values (Try)
1481 auto fs = makeFutures(3);
1483 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1484 [](double a, Try<int>&& b){
1485 return a + *b + 0.1;
1487 EXPECT_EQ(6.3, f1.get());
1492 auto fs = makeFutures(3);
1494 Future<double> f1 = reduce(fs.begin(), fs.end(), 0.0,
1495 [](double a, int&& b){
1498 EXPECT_EQ(6.3, f1.get());
1501 // Returning futures (Try)
1503 auto fs = makeFutures(3);
1505 Future<double> f2 = reduce(fs.begin(), fs.end(), 0.0,
1506 [](double a, Try<int>&& b){
1507 return makeFuture<double>(a + *b + 0.1);
1509 EXPECT_EQ(6.3, f2.get());
1512 // Returning futures
1514 auto fs = makeFutures(3);
1516 Future<double> f2 = reduce(fs.begin(), fs.end(), 0.0,
1517 [](double a, int&& b){
1518 return makeFuture<double>(a + b + 0.1);
1520 EXPECT_EQ(6.3, f2.get());