global executors with weak_ptr semantics
[folly.git] / folly / wangle / concurrent / test / GlobalExecutorTest.cpp
index a601b0c191b6f42c97ce175d349e97384b8ac427..4539bd268f972ff99e75cb11921eb610b4bc3c67 100644 (file)
 
 using namespace folly::wangle;
 
+TEST(GlobalExecutorTest, GlobalCPUExecutor) {
+  class DummyExecutor : public folly::Executor {
+   public:
+    void add(folly::Func f) override {
+      f();
+      count++;
+    }
+    int count{0};
+  };
+
+  // The default CPU executor is a synchronous inline executor, lets verify
+  // that work we add is executed
+  auto count = 0;
+  auto f = [&](){ count++; };
+
+  // Don't explode, we should create the default global CPUExecutor lazily here.
+  getCPUExecutor()->add(f);
+  EXPECT_EQ(1, count);
+
+  {
+    auto dummy = std::make_shared<DummyExecutor>();
+    setCPUExecutor(dummy);
+    getCPUExecutor()->add(f);
+    // Make sure we were properly installed.
+    EXPECT_EQ(1, dummy->count);
+    EXPECT_EQ(2, count);
+  }
+
+  // Don't explode, we should restore the default global CPUExecutor because our
+  // weak reference to dummy has expired
+  getCPUExecutor()->add(f);
+  EXPECT_EQ(3, count);
+}
+
 TEST(GlobalExecutorTest, GlobalIOExecutor) {
   class DummyExecutor : public IOExecutor {
    public:
@@ -38,14 +72,14 @@ TEST(GlobalExecutorTest, GlobalIOExecutor) {
   getIOExecutor()->add(f);
 
   {
-    DummyExecutor dummy;
-    setIOExecutor(&dummy);
+    auto dummy = std::make_shared<DummyExecutor>();
+    setIOExecutor(dummy);
     getIOExecutor()->add(f);
     // Make sure we were properly installed.
-    EXPECT_EQ(1, dummy.count);
+    EXPECT_EQ(1, dummy->count);
   }
 
-  // Don't explode, we should restore the default global IOExecutor when dummy
-  // is destructed.
+  // Don't explode, we should restore the default global IOExecutor because our
+  // weak reference to dummy has expired
   getIOExecutor()->add(f);
 }