diff options
Diffstat (limited to 'ACE/tests/Reactor_Registration_Test.cpp')
-rw-r--r-- | ACE/tests/Reactor_Registration_Test.cpp | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/ACE/tests/Reactor_Registration_Test.cpp b/ACE/tests/Reactor_Registration_Test.cpp new file mode 100644 index 00000000000..c44d21881c0 --- /dev/null +++ b/ACE/tests/Reactor_Registration_Test.cpp @@ -0,0 +1,181 @@ +// $Id$ + +// ============================================================================ +// +// = LIBRARY +// tests +// +// = FILENAME +// Reactor_Registration_Test.cpp +// +// = DESCRIPTION +// This is a test of registering handlers with the Reactor. +// +// = AUTHOR +// Irfan Pyarali <irfan@oomworks.com> +// +// ============================================================================ + +#include "tests/test_config.h" +#include "ace/Pipe.h" +#include "ace/Reactor.h" +#include "ace/Select_Reactor.h" +#include "ace/TP_Reactor.h" +#include "ace/WFMO_Reactor.h" +#include "ace/ACE.h" + +ACE_RCSID(tests, Reactor_Registration_Test, "$Id$") + +static const char message[] = "abcdefghijklmnopqrstuvwxyz"; +static const size_t message_size = 26; +static int iteration = 1; + +class Event_Handler : public ACE_Event_Handler +{ +public: + + Event_Handler (ACE_Reactor &reactor, + ACE_HANDLE read, + ACE_HANDLE write); + + ~Event_Handler (void); + + int handle_input (ACE_HANDLE fd = ACE_INVALID_HANDLE); + + int handle_close (ACE_HANDLE handle, + ACE_Reactor_Mask close_mask); + + ACE_Pipe pipe_; +}; + +Event_Handler::Event_Handler (ACE_Reactor &reactor, + ACE_HANDLE read, + ACE_HANDLE write) + : ACE_Event_Handler (&reactor), + pipe_ (read, write) +{ + ssize_t result = 0; + + if (read == ACE_INVALID_HANDLE) + { + result = this->pipe_.open (); + ACE_ASSERT (result == 0); + ACE_UNUSED_ARG (result); + } + + result = + this->reactor ()->register_handler (this->pipe_.read_handle (), + this, + ACE_Event_Handler::READ_MASK); + ACE_ASSERT (result == 0); + ACE_UNUSED_ARG (result); + + result = + ACE::send_n (this->pipe_.write_handle (), + message, + message_size); + ACE_ASSERT (result == static_cast<ssize_t> (message_size)); + ACE_UNUSED_ARG (result); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Event_Handler::Event_Handler for %@\n"), + this)); +} + +Event_Handler::~Event_Handler (void) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Event_Handler::~Event_Handler for %@\n"), + this)); +} + +int +Event_Handler::handle_input (ACE_HANDLE handle) +{ + char buf[message_size + 1]; + + ssize_t result = + ACE::recv_n (handle, + buf, + sizeof buf - 1); + ACE_ASSERT (result == static_cast<ssize_t> (message_size)); + ACE_UNUSED_ARG (result); + + buf[message_size] = '\0'; + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Message %C received for %@\n"), + buf, + this)); + + return -1; +} + +int +Event_Handler::handle_close (ACE_HANDLE, + ACE_Reactor_Mask) +{ + switch (iteration) + { + case 1: + new Event_Handler (*this->reactor (), + ACE_INVALID_HANDLE, + ACE_INVALID_HANDLE); + break; + case 2: + new Event_Handler (*this->reactor (), + this->pipe_.read_handle (), + this->pipe_.write_handle ()); + break; + case 3: + this->reactor ()->end_reactor_event_loop (); + break; + } + + iteration++; + delete this; + + return 0; +} + +void +test (ACE_Reactor_Impl &reactor_impl, + const char *reactor_type) +{ + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("\nTesting with %C\n\n"), + reactor_type)); + + ACE_Reactor reactor (&reactor_impl, + 0); + + new Event_Handler (reactor, + ACE_INVALID_HANDLE, + ACE_INVALID_HANDLE); + + reactor.run_reactor_event_loop (); +} + +int +run_main (int, ACE_TCHAR *[]) +{ + ACE_START_TEST (ACE_TEXT ("Reactor_Registration_Test")); + + iteration = 1; + ACE_Select_Reactor select_reactor; + test (select_reactor, "ACE_Select_Reactor"); + + iteration = 1; + ACE_TP_Reactor tp_reactor; + test (tp_reactor, "ACE_TP_Reactor"); + +#if defined (ACE_WIN32) + iteration = 1; + ACE_WFMO_Reactor wfmo_reactor; + test (wfmo_reactor, "ACE_WFMO_Reactor"); +#endif /* ACE_WIN32 */ + + ACE_END_TEST; + + return 0; +} |