Add getSemiFuture to folly::SharedPromise
[folly.git] / folly / futures / test / SharedPromiseTest.cpp
index 280bb64cb2c183953340fd06ef1ad9f95ff66a14..f49bdd439f434dfd1a4606f728874a8305e8976e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 #include <folly/futures/SharedPromise.h>
-#include <gtest/gtest.h>
+#include <folly/portability/GTest.h>
 
 using namespace folly;
 
-TEST(SharedPromise, SetGet) {
+TEST(SharedPromise, setGetSemiFuture) {
+  SharedPromise<int> p;
+  p.setValue(1);
+  auto f1 = p.getSemiFuture();
+  auto f2 = p.getSemiFuture();
+  EXPECT_EQ(1, f1.value());
+  EXPECT_EQ(1, f2.value());
+}
+
+TEST(SharedPromise, setGetMixed) {
+  SharedPromise<int> p;
+  p.setValue(1);
+  auto f1 = p.getSemiFuture();
+  auto f2 = p.getFuture();
+  EXPECT_EQ(1, f1.value());
+  EXPECT_EQ(1, f2.value());
+}
+
+TEST(SharedPromise, setGet) {
   SharedPromise<int> p;
   p.setValue(1);
   auto f1 = p.getFuture();
@@ -26,7 +45,7 @@ TEST(SharedPromise, SetGet) {
   EXPECT_EQ(1, f1.value());
   EXPECT_EQ(1, f2.value());
 }
-TEST(SharedPromise, GetSet) {
+TEST(SharedPromise, getSet) {
   SharedPromise<int> p;
   auto f1 = p.getFuture();
   auto f2 = p.getFuture();
@@ -35,7 +54,7 @@ TEST(SharedPromise, GetSet) {
   EXPECT_EQ(1, f2.value());
 }
 
-TEST(SharedPromise, GetSetGet) {
+TEST(SharedPromise, getSetGet) {
   SharedPromise<int> p;
   auto f1 = p.getFuture();
   p.setValue(1);
@@ -44,7 +63,7 @@ TEST(SharedPromise, GetSetGet) {
   EXPECT_EQ(1, f2.value());
 }
 
-TEST(SharedPromise, Reset) {
+TEST(SharedPromise, reset) {
   SharedPromise<int> p;
 
   auto f1 = p.getFuture();
@@ -58,7 +77,7 @@ TEST(SharedPromise, Reset) {
   EXPECT_EQ(2, f2.value());
 }
 
-TEST(SharedPromise, GetMoveSet) {
+TEST(SharedPromise, getMoveSet) {
   SharedPromise<int> p;
   auto f = p.getFuture();
   auto p2 = std::move(p);
@@ -66,7 +85,7 @@ TEST(SharedPromise, GetMoveSet) {
   EXPECT_EQ(1, f.value());
 }
 
-TEST(SharedPromise, SetMoveGet) {
+TEST(SharedPromise, setMoveGet) {
   SharedPromise<int> p;
   p.setValue(1);
   auto p2 = std::move(p);
@@ -74,7 +93,7 @@ TEST(SharedPromise, SetMoveGet) {
   EXPECT_EQ(1, f.value());
 }
 
-TEST(SharedPromise, MoveSetGet) {
+TEST(SharedPromise, moveSetGet) {
   SharedPromise<int> p;
   auto p2 = std::move(p);
   p2.setValue(1);
@@ -82,7 +101,7 @@ TEST(SharedPromise, MoveSetGet) {
   EXPECT_EQ(1, f.value());
 }
 
-TEST(SharedPromise, MoveGetSet) {
+TEST(SharedPromise, moveGetSet) {
   SharedPromise<int> p;
   auto p2 = std::move(p);
   auto f = p2.getFuture();
@@ -90,7 +109,7 @@ TEST(SharedPromise, MoveGetSet) {
   EXPECT_EQ(1, f.value());
 }
 
-TEST(SharedPromise, MoveMove) {
+TEST(SharedPromise, moveMove) {
   SharedPromise<std::shared_ptr<int>> p;
   auto f1 = p.getFuture();
   auto f2 = p.getFuture();
@@ -98,3 +117,29 @@ TEST(SharedPromise, MoveMove) {
   p = std::move(p2);
   p.setValue(std::make_shared<int>(1));
 }
+
+TEST(SharedPromise, setWith) {
+  SharedPromise<int> p;
+  p.setWith([]{ return 1; });
+  EXPECT_EQ(1, p.getFuture().value());
+}
+
+TEST(SharedPromise, isFulfilled) {
+  SharedPromise<int> p;
+  EXPECT_FALSE(p.isFulfilled());
+  auto p2 = std::move(p);
+  EXPECT_FALSE(p2.isFulfilled());
+  p2.setValue(1);
+  EXPECT_TRUE(p2.isFulfilled());
+  p = std::move(p2);
+  EXPECT_TRUE(p.isFulfilled());
+}
+
+TEST(SharedPromise, interruptHandler) {
+  SharedPromise<int> p;
+  bool flag = false;
+  p.setInterruptHandler([&](const exception_wrapper&) { flag = true; });
+  auto f = p.getFuture();
+  f.cancel();
+  EXPECT_TRUE(flag);
+}