1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include "util/thread_pool.h"
#include <glog/logging.h>
#include <gtest/gtest.h>
#include <atomic>
#include <memory>
#include "base/notification.h"
#include "util/sync_task.h"
#include "util/testing.h"
namespace cert_trans {
using std::chrono::milliseconds;
using std::chrono::system_clock;
using std::unique_ptr;
using util::SyncTask;
class ThreadPoolTest : public ::testing::Test {
public:
ThreadPoolTest() : pool_of_one_(1) {
}
protected:
ThreadPool pool_of_one_;
};
typedef class ThreadPoolTest ThreadPoolDeathTest;
TEST_F(ThreadPoolTest, Delay) {
SyncTask task(&pool_of_one_);
pool_of_one_.Delay(milliseconds(200), task.task());
EXPECT_FALSE(task.IsDone());
task.Wait();
}
TEST_F(ThreadPoolDeathTest, AddingMoreTasksAfterClosedGoesBang) {
unique_ptr<ThreadPool> my_pool_of_one(new ThreadPool(1));
SyncTask task(my_pool_of_one.get());
my_pool_of_one->Delay(milliseconds(200), task.task());
EXPECT_DEATH(my_pool_of_one.reset(), "queue_\\.empty()");
task.Wait();
}
TEST_F(ThreadPoolTest, DelayDoesNotBlockAThread) {
SyncTask delay_task(&pool_of_one_);
pool_of_one_.Delay(milliseconds(200), delay_task.task());
Notification inner_done;
pool_of_one_.Add([&inner_done]() {
LOG(WARNING) << "Inner running";
inner_done.Notify();
});
inner_done.WaitForNotification();
EXPECT_FALSE(delay_task.IsDone());
delay_task.Wait();
}
TEST_F(ThreadPoolTest, NaturalOrderingPreserved) {
SyncTask task1(&pool_of_one_);
SyncTask task2(&pool_of_one_);
pool_of_one_.Delay(milliseconds(200), task2.task());
pool_of_one_.Delay(milliseconds(100), task1.task());
task1.Wait();
EXPECT_FALSE(task2.IsDone());
task2.Wait();
}
TEST_F(ThreadPoolTest, CancelsDelayTasks) {
unique_ptr<ThreadPool> pool(new ThreadPool(1));
SyncTask task1(&pool_of_one_);
pool->Delay(milliseconds(500), task1.task());
pool.reset();
task1.Wait();
EXPECT_EQ(util::Status::CANCELLED, task1.status());
}
} // namespace cert_trans
int main(int argc, char** argv) {
cert_trans::test::InitTesting(argv[0], &argc, &argv, true);
::testing::FLAGS_gtest_death_test_style = "threadsafe";
return RUN_ALL_TESTS();
}
|