2 * Copyright 2017 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.
17 #include <folly/executors/ThreadedExecutor.h>
19 #include <gtest/gtest.h>
21 #include <folly/Conv.h>
22 #include <folly/futures/Future.h>
23 #include <folly/gen/Base.h>
27 class ThreadedExecutorTest : public testing::Test {};
30 TEST_F(ThreadedExecutorTest, example) {
31 folly::ThreadedExecutor x;
32 auto ret = folly::via(&x)
33 .then([&] { return 42; })
34 .then([&](int n) { return folly::to<std::string>(n); })
40 TEST_F(ThreadedExecutorTest, dtor_waits) {
41 constexpr auto kDelay = std::chrono::milliseconds(100);
42 auto x = std::make_unique<folly::ThreadedExecutor>();
43 auto fut = folly::via(&*x, [&] { /* sleep override */
44 std::this_thread::sleep_for(kDelay);
48 EXPECT_TRUE(fut.isReady());
51 TEST_F(ThreadedExecutorTest, many) {
52 constexpr auto kNumTasks = 1024;
53 folly::ThreadedExecutor x;
56 folly::gen::range<size_t>(0, kNumTasks) |
57 folly::gen::map([&](size_t i) {
58 return folly::via(&x).then([=] { return i; }).then([](size_t k) {
59 return folly::to<std::string>(k);
62 folly::gen::as<std::vector>())
65 EXPECT_EQ("42", rets[42]);
68 TEST_F(ThreadedExecutorTest, many_sleeping_constant_time) {
69 constexpr auto kNumTasks = 256;
70 constexpr auto kDelay = std::chrono::milliseconds(100);
71 folly::ThreadedExecutor x;
74 folly::gen::range<size_t>(0, kNumTasks) |
75 folly::gen::map([&](size_t i) {
78 /* sleep override */ std::this_thread::sleep_for(kDelay);
80 .then([=] { return i; })
81 .then([](size_t k) { return folly::to<std::string>(k); });
83 folly::gen::as<std::vector>())
86 EXPECT_EQ("42", rets[42]);
89 TEST_F(ThreadedExecutorTest, many_sleeping_decreasing_time) {
90 constexpr auto kNumTasks = 256;
91 constexpr auto kDelay = std::chrono::milliseconds(100);
92 folly::ThreadedExecutor x;
95 folly::gen::range<size_t>(0, kNumTasks) |
96 folly::gen::map([&](size_t i) {
99 auto delay = kDelay * (kNumTasks - i) / kNumTasks;
100 /* sleep override */ std::this_thread::sleep_for(delay);
102 .then([=] { return i; })
103 .then([](size_t k) { return folly::to<std::string>(k); });
105 folly::gen::as<std::vector>())
108 EXPECT_EQ("42", rets[42]);