123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- #ifndef TEST_DATASRC_CLIENTS_MGR_H
- #define TEST_DATASRC_CLIENTS_MGR_H 1
- #include <exceptions/exceptions.h>
- #include <auth/datasrc_clients_mgr.h>
- #include <datasrc/datasrc_config.h>
- #include <asiolink/io_service.h>
- #include <boost/function.hpp>
- #include <list>
- namespace isc {
- namespace auth {
- namespace datasrc_clientmgr_internal {
- class TestMutex {
- public:
-
-
-
-
-
- enum ExceptionFromNoop { NONE, EXCLASS, INTEGER, INTERNAL };
- TestMutex() : lock_count(0), unlock_count(0), noop_count(0),
- throw_from_noop(NONE)
- {}
- class Locker {
- public:
- Locker(TestMutex& mutex) : mutex_(mutex) {
- if (mutex.lock_count != mutex.unlock_count) {
- isc_throw(Unexpected,
- "attempt of duplicate lock acquisition");
- }
- ++mutex.lock_count;
- if (mutex.lock_count > 100) {
- isc_throw(Unexpected,
- "too many test mutex count, likely a bug in test");
- }
- }
- ~Locker() {
- ++mutex_.unlock_count;
- }
- private:
- TestMutex& mutex_;
- };
- size_t lock_count;
- size_t unlock_count;
- size_t noop_count;
- ExceptionFromNoop throw_from_noop;
- };
- class TestCondVar {
- public:
- TestCondVar() : wait_count(0), signal_count(0), command_queue_(NULL),
- delayed_command_queue_(NULL)
- {}
- TestCondVar(std::list<Command>& command_queue,
- std::list<Command>& delayed_command_queue) :
- wait_count(0),
- signal_count(0),
- command_queue_(&command_queue),
- delayed_command_queue_(&delayed_command_queue)
- {
- }
- void wait(TestMutex& mutex) {
-
- ++mutex.unlock_count;
- ++wait_count;
- ++mutex.lock_count;
- if (wait_count > 100) {
- isc_throw(Unexpected,
- "too many cond wait count, likely a bug in test");
- }
-
- command_queue_->splice(command_queue_->end(), *delayed_command_queue_);
- }
- void signal() {
- ++signal_count;
- }
- size_t wait_count;
- size_t signal_count;
- private:
- std::list<Command>* command_queue_;
- std::list<Command>* delayed_command_queue_;
- };
- typedef DataSrcClientsBuilderBase<TestMutex, TestCondVar>
- TestDataSrcClientsBuilder;
- template<>
- void
- TestDataSrcClientsBuilder::doNoop();
- class FakeDataSrcClientsBuilder {
- public:
-
- static bool started;
-
-
-
- static std::list<Command>* command_queue;
- static std::list<FinishedCallback>* callback_queue;
- static TestCondVar* cond;
- static TestMutex* queue_mutex;
- static int wakeup_fd;
- static isc::datasrc::ClientListMapPtr* clients_map;
- static TestMutex* map_mutex;
- static std::list<Command> command_queue_copy;
- static std::list<FinishedCallback> callback_queue_copy;
- static TestCondVar cond_copy;
- static TestMutex queue_mutex_copy;
-
- static bool thread_waited;
-
-
- enum ExceptionFromWait { NOTHROW, THROW_UNCAUGHT_EX, THROW_OTHER };
- static ExceptionFromWait thread_throw_on_wait;
- FakeDataSrcClientsBuilder(
- std::list<Command>* command_queue,
- std::list<FinishedCallback>* callback_queue,
- TestCondVar* cond,
- TestMutex* queue_mutex,
- isc::datasrc::ClientListMapPtr* clients_map,
- TestMutex* map_mutex, int wakeup_fd)
- {
- FakeDataSrcClientsBuilder::started = false;
- FakeDataSrcClientsBuilder::command_queue = command_queue;
- FakeDataSrcClientsBuilder::callback_queue = callback_queue;
- FakeDataSrcClientsBuilder::cond = cond;
- FakeDataSrcClientsBuilder::queue_mutex = queue_mutex;
- FakeDataSrcClientsBuilder::wakeup_fd = wakeup_fd;
- FakeDataSrcClientsBuilder::clients_map = clients_map;
- FakeDataSrcClientsBuilder::map_mutex = map_mutex;
- FakeDataSrcClientsBuilder::thread_waited = false;
- FakeDataSrcClientsBuilder::thread_throw_on_wait = NOTHROW;
- }
- void run() {
- FakeDataSrcClientsBuilder::started = true;
- }
- };
- class TestThread {
- public:
- TestThread(const boost::function<void()>& main) {
- main();
- }
- void wait() {
- FakeDataSrcClientsBuilder::thread_waited = true;
- switch (FakeDataSrcClientsBuilder::thread_throw_on_wait) {
- case FakeDataSrcClientsBuilder::NOTHROW:
- break;
- case FakeDataSrcClientsBuilder::THROW_UNCAUGHT_EX:
- isc_throw(util::thread::Thread::UncaughtException,
- "TestThread wait() saw an exception");
- case FakeDataSrcClientsBuilder::THROW_OTHER:
- isc_throw(Unexpected,
- "General emulated failure in TestThread wait()");
- }
- }
- };
- }
- typedef DataSrcClientsMgrBase<
- datasrc_clientmgr_internal::TestThread,
- datasrc_clientmgr_internal::FakeDataSrcClientsBuilder,
- datasrc_clientmgr_internal::TestMutex,
- datasrc_clientmgr_internal::TestCondVar> TestDataSrcClientsMgrBase;
- template<>
- void
- TestDataSrcClientsMgrBase::cleanup();
- template<>
- void
- TestDataSrcClientsMgrBase::reconfigureHook();
- class TestDataSrcClientsMgr :
- public asiolink::IOService,
- public TestDataSrcClientsMgrBase {
- public:
- TestDataSrcClientsMgr() :
- TestDataSrcClientsMgrBase(*static_cast<asiolink::IOService*>(this))
- {}
- };
- }
- }
- #endif
|