diff options
author | Vijay Pai <vpai@google.com> | 2018-09-11 17:01:19 -0700 |
---|---|---|
committer | Vijay Pai <vpai@google.com> | 2018-09-13 09:54:41 -0700 |
commit | db01bf793aeab78b8b8d85686977240afb56a536 (patch) | |
tree | 6f86588cd95dacbd0ed0bbe48f55ce26a6723fe2 /test/cpp/common | |
parent | 8bce2a643b9d49413b537933fd433c831f4d85fc (diff) |
Add callback-based alarms
Diffstat (limited to 'test/cpp/common')
-rw-r--r-- | test/cpp/common/alarm_test.cc | 106 |
1 files changed, 105 insertions, 1 deletions
diff --git a/test/cpp/common/alarm_test.cc b/test/cpp/common/alarm_test.cc index 57d958349e..e909d03658 100644 --- a/test/cpp/common/alarm_test.cc +++ b/test/cpp/common/alarm_test.cc @@ -16,9 +16,13 @@ * */ +#include <condition_variable> +#include <memory> +#include <mutex> +#include <thread> + #include <grpcpp/alarm.h> #include <grpcpp/completion_queue.h> -#include <thread> #include <gtest/gtest.h> @@ -43,6 +47,66 @@ TEST(AlarmTest, RegularExpiry) { EXPECT_EQ(junk, output_tag); } +struct Completion { + bool completed = false; + std::mutex mu; + std::condition_variable cv; +}; + +TEST(AlarmTest, CallbackRegularExpiry) { + Alarm alarm; + + auto c = std::make_shared<Completion>(); + alarm.experimental().Set( + std::chrono::system_clock::now() + std::chrono::seconds(1), [c](bool ok) { + EXPECT_TRUE(ok); + std::lock_guard<std::mutex> l(c->mu); + c->completed = true; + c->cv.notify_one(); + }); + + std::unique_lock<std::mutex> l(c->mu); + EXPECT_TRUE(c->cv.wait_until( + l, std::chrono::system_clock::now() + std::chrono::seconds(10), + [c] { return c->completed; })); +} + +TEST(AlarmTest, CallbackZeroExpiry) { + Alarm alarm; + + auto c = std::make_shared<Completion>(); + alarm.experimental().Set(grpc_timeout_seconds_to_deadline(0), [c](bool ok) { + EXPECT_TRUE(ok); + std::lock_guard<std::mutex> l(c->mu); + c->completed = true; + c->cv.notify_one(); + }); + + std::unique_lock<std::mutex> l(c->mu); + EXPECT_TRUE(c->cv.wait_until( + l, std::chrono::system_clock::now() + std::chrono::seconds(10), + [c] { return c->completed; })); +} + +TEST(AlarmTest, CallbackNegativeExpiry) { + Alarm alarm; + + auto c = std::make_shared<Completion>(); + alarm.experimental().Set( + std::chrono::system_clock::now() + std::chrono::seconds(-1), + [c](bool ok) { + EXPECT_TRUE(ok); + std::lock_guard<std::mutex> l(c->mu); + c->completed = true; + c->cv.notify_one(); + }); + + std::unique_lock<std::mutex> l(c->mu); + EXPECT_TRUE(c->cv.wait_until( + l, std::chrono::system_clock::now() + std::chrono::seconds(10), + [c] { return c->completed; })); +} + TEST(AlarmTest, MultithreadedRegularExpiry) { CompletionQueue cq; void* junk = reinterpret_cast<void*>(1618033); @@ -182,6 +246,26 @@ TEST(AlarmTest, Cancellation) { EXPECT_EQ(junk, output_tag); } +TEST(AlarmTest, CallbackCancellation) { + Alarm alarm; + + auto c = std::make_shared<Completion>(); + alarm.experimental().Set( + std::chrono::system_clock::now() + std::chrono::seconds(10), + [c](bool ok) { + EXPECT_FALSE(ok); + std::lock_guard<std::mutex> l(c->mu); + c->completed = true; + c->cv.notify_one(); + }); + alarm.Cancel(); + + std::unique_lock<std::mutex> l(c->mu); + EXPECT_TRUE(c->cv.wait_until( + l, std::chrono::system_clock::now() + std::chrono::seconds(1), + [c] { return c->completed; })); +} + TEST(AlarmTest, SetDestruction) { CompletionQueue cq; void* junk = reinterpret_cast<void*>(1618033); @@ -200,6 +284,26 @@ TEST(AlarmTest, SetDestruction) { EXPECT_EQ(junk, output_tag); } +TEST(AlarmTest, CallbackSetDestruction) { + auto c = std::make_shared<Completion>(); + { + Alarm alarm; + alarm.experimental().Set( + std::chrono::system_clock::now() + std::chrono::seconds(10), + [c](bool ok) { + EXPECT_FALSE(ok); + std::lock_guard<std::mutex> l(c->mu); + c->completed = true; + c->cv.notify_one(); + }); + } + + std::unique_lock<std::mutex> l(c->mu); + EXPECT_TRUE(c->cv.wait_until( + l, std::chrono::system_clock::now() + std::chrono::seconds(1), + [c] { return c->completed; })); +} + TEST(AlarmTest, UnsetDestruction) { CompletionQueue cq; Alarm alarm; |