diff options
Diffstat (limited to 'tests/Bug_2609_Regression_Test.cpp')
-rw-r--r-- | tests/Bug_2609_Regression_Test.cpp | 97 |
1 files changed, 64 insertions, 33 deletions
diff --git a/tests/Bug_2609_Regression_Test.cpp b/tests/Bug_2609_Regression_Test.cpp index 734ba205acd..475ef6aeb81 100644 --- a/tests/Bug_2609_Regression_Test.cpp +++ b/tests/Bug_2609_Regression_Test.cpp @@ -55,22 +55,24 @@ public: int open (void* pv) { TEST_TRACE ("open"); - g_semaphore.release(); // signal open completed + g_semaphore.release (); // signal open completed + // super::open() will register_handler for input. The default + // handle_input() from ACE_Event_Handler will return -1, triggering + // handler removal from the reactor. return super::open (pv); } //FUZZ: enable check_for_lack_ACE_OS - int handle_close (ACE_HANDLE fd, ACE_Reactor_Mask mask) + int handle_close (ACE_HANDLE, ACE_Reactor_Mask) { TEST_TRACE ("handle_close"); - super::handle_close (fd, mask); if (g_handler_deleted) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT("Handler deleted in base class' handle_close()\n"))); - } + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("Handler deleted in base handle_close()\n"))); + } // signal handle_close() completed - g_semaphore.release(); + g_semaphore.release (); return 0; } }; @@ -80,12 +82,15 @@ struct My_Task : public ACE_Task_Base int svc() { TEST_TRACE ("My_Task::svc"); - ACE_Reactor::instance()->owner(ACE_OS::thr_self()); - int rv = ACE_Reactor::instance()->run_reactor_event_loop(); + ACE_Reactor *r = ACE_Reactor::instance (); + r->owner (ACE_OS::thr_self ()); + int rv = r->run_reactor_event_loop (); if (rv < 0) - { - ACE_ERROR ((LM_ERROR, ACE_TEXT("Cannot run reactor event loop\n"))); - } + { + ACE_ERROR ((LM_ERROR, + ACE_TEXT ("Cannot run %p\n"), + ACE_TEXT ("reactor event loop"))); + } return 0; } }; @@ -95,7 +100,7 @@ struct Timer_Handler : public ACE_Event_Handler { int handle_timeout (const ACE_Time_Value&, const void*) { - g_semaphore.release(); // signal reactor started + g_semaphore.release (); // signal reactor started return 0; } }; @@ -109,40 +114,66 @@ run_main (int, ACE_TCHAR *[]) { ACE_START_TEST (ACE_TEXT ("Bug_2609_Regression_Test")); + int status = 0; + #if defined (ACE_HAS_THREADS) - My_Acceptor acceptor (ACE_INET_Addr(9876)); + My_Acceptor acceptor; + if (-1 == acceptor.open (ACE_sap_any_cast (const ACE_INET_Addr &))) + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("acceptor open")), + 1); + ACE_INET_Addr listen_addr; + acceptor.acceptor ().get_local_addr (listen_addr); +#if defined (ACE_HAS_IPV6) + const ACE_TCHAR *me = + listen_addr.get_type () == PF_INET ? ACE_LOCALHOST : ACE_IPV6_LOCALHOST; +#else + const ACE_TCHAR *me = ACE_LOCALHOST; +#endif /* ACE_HAS_IPV6 */ + ACE_INET_Addr connect_addr (listen_addr.get_port_number (), + me, + listen_addr.get_type ()); + Timer_Handler timer_handler; - ACE_Reactor::instance()->schedule_timer( - &timer_handler, 0, ACE_Time_Value(0)); + ACE_Reactor::instance()->schedule_timer (&timer_handler, + 0, + ACE_Time_Value(0)); My_Task task; - int activated = task.activate(); + int activated = task.activate (); if (activated < 0) - { - ACE_ERROR ((LM_ERROR, ACE_TEXT ("Could not activate task\n"))); - } + { + ACE_ERROR_RETURN ((LM_ERROR, + ACE_TEXT ("%p\n"), + ACE_TEXT ("Error activating task")), + 1); + } - g_semaphore.acquire();// wait for reactor to start + g_semaphore.acquire (); // wait for reactor to start { ACE_SOCK_Connector c1; ACE_SOCK_Stream s1; - ACE_INET_Addr a1(9876, "localhost"); - if (-1 == c1.connect (s1, a1)) - { - ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT("Could not connect\n")), -1); - } - g_semaphore.acquire(); // wait for open to complete - s1.close(); - g_semaphore.acquire(); // wait for handle_close to complete + if (-1 == c1.connect (s1, connect_addr)) + { + ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT("connect"))); + status = 1; + } + else + { + g_semaphore.acquire (); // wait for open to complete + s1.close (); // will trip handle_input() + g_semaphore.acquire (); // wait for handle_close to complete + } } - ACE_Reactor::end_event_loop(); - task.wait(); + ACE_Reactor::instance ()->end_reactor_event_loop (); + task.wait (); #else ACE_ERROR ((LM_INFO, ACE_TEXT ("threads not supported on this platform\n"))); #endif ACE_END_TEST; - return 0; + return status; } |