EXPECT_TRUE(FakeDataSrcClientsBuilder::thread_waited);
}
+TEST(DataSrcClientsMgrTest, shutdownWithUncaughtException) {
+ // Emulating the case when the builder exists on exception. shutdown()
+ // will encounter UncaughtException exception and catch it.
+ TestDataSrcClientsMgr mgr;
+ FakeDataSrcClientsBuilder::thread_throw_on_wait =
+ FakeDataSrcClientsBuilder::THROW_UNCAUGHT_EX;
+ EXPECT_NO_THROW(mgr.shutdown());
+}
TEST(DataSrcClientsMgrTest, shutdownWithException) {
TestDataSrcClientsMgr mgr;
- FakeDataSrcClientsBuilder::thread_throw_on_wait = true;
+ FakeDataSrcClientsBuilder::thread_throw_on_wait =
+ FakeDataSrcClientsBuilder::THROW_OTHER;
EXPECT_THROW(mgr.shutdown(), isc::Unexpected);
}
// possible compromise.
class FakeDataSrcClientsBuilder {
public:
- FakeDataSrcClientsBuilder(std::list<internal::Command>* command_queue,
- internal::TestCondVar* cond,
- internal::TestMutex* queue_mutex)
- {
- FakeDataSrcClientsBuilder::started = false;
- FakeDataSrcClientsBuilder::command_queue = command_queue;
- FakeDataSrcClientsBuilder::cond = cond;
- FakeDataSrcClientsBuilder::queue_mutex = queue_mutex;
- FakeDataSrcClientsBuilder::thread_waited = false;
- FakeDataSrcClientsBuilder::thread_throw_on_wait = false;
- }
- void run() {
- FakeDataSrcClientsBuilder::started = true;
- }
-
// true iff a builder has started.
static bool started;
// If set to true by a test, TestThread::wait() throws an exception
// exception.
- static bool thread_throw_on_wait;
+ enum ExceptionFromWait { NOTHROW, THROW_UNCAUGHT_EX, THROW_OTHER };
+ static ExceptionFromWait thread_throw_on_wait;
+
+ FakeDataSrcClientsBuilder(std::list<internal::Command>* command_queue,
+ internal::TestCondVar* cond,
+ internal::TestMutex* queue_mutex)
+ {
+ FakeDataSrcClientsBuilder::started = false;
+ FakeDataSrcClientsBuilder::command_queue = command_queue;
+ FakeDataSrcClientsBuilder::cond = cond;
+ FakeDataSrcClientsBuilder::queue_mutex = queue_mutex;
+ FakeDataSrcClientsBuilder::thread_waited = false;
+ FakeDataSrcClientsBuilder::thread_throw_on_wait = NOTHROW;
+ }
+ void run() {
+ FakeDataSrcClientsBuilder::started = true;
+ }
};
class TestThread {
}
void wait() {
FakeDataSrcClientsBuilder::thread_waited = true;
- if (FakeDataSrcClientsBuilder::thread_throw_on_wait) {
+ switch (FakeDataSrcClientsBuilder::thread_throw_on_wait) {
+ case FakeDataSrcClientsBuilder::NOTHROW:
+ break;
+ case FakeDataSrcClientsBuilder::THROW_UNCAUGHT_EX:
+ isc_throw(util::thread::Thread::UncaughtException, "for test");
+ case FakeDataSrcClientsBuilder::THROW_OTHER:
isc_throw(Unexpected, "for test");
}
}