diff options
Diffstat (limited to 'TAO/tests/POA/Excessive_Object_Deactivations/Excessive_Object_Deactivations.cpp')
-rw-r--r-- | TAO/tests/POA/Excessive_Object_Deactivations/Excessive_Object_Deactivations.cpp | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/TAO/tests/POA/Excessive_Object_Deactivations/Excessive_Object_Deactivations.cpp b/TAO/tests/POA/Excessive_Object_Deactivations/Excessive_Object_Deactivations.cpp new file mode 100644 index 00000000000..7880507c3fa --- /dev/null +++ b/TAO/tests/POA/Excessive_Object_Deactivations/Excessive_Object_Deactivations.cpp @@ -0,0 +1,245 @@ +// $Id$ + +//======================================================================== +// +// = LIBRARY +// TAO/tests/POA/Excessive_Object_Deactivations +// +// = FILENAME +// Excessive_Object_Deactivations.cpp +// +// = DESCRIPTION +// This program tests for excessive deactivations of a servant. +// The test checks excessive deactivations in a POA with SYSTEM_ID +// and other POA with USER_ID. The test also check for excessive +// deactivations during upcalls. +// +// = AUTHOR +// Irfan Pyarali +// +//========================================================================= + +#include "testS.h" + +class test_i : public POA_test +{ +public: + void deactivate_self (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); + + PortableServer::POA_ptr _default_POA (ACE_ENV_SINGLE_ARG_DECL); + + PortableServer::POA_var poa_; + + PortableServer::ObjectId id_; +}; + +PortableServer::POA_ptr +test_i::_default_POA (ACE_ENV_SINGLE_ARG_DECL_NOT_USED /*ACE_ENV_SINGLE_ARG_PARAMETER*/) +{ + return PortableServer::POA::_duplicate (this->poa_.in ()); +} + +void +test_i::deactivate_self (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)) +{ + this->poa_->deactivate_object (this->id_ + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + // Exception flag + int expected_exception_raised = 0; + + ACE_TRY + { + this->poa_->deactivate_object (this->id_ + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCH (PortableServer::POA::ObjectNotActive, ex) + { + // This is the correct exception! Ignore + expected_exception_raised = 1; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception caught of incorrect type"); + ACE_ASSERT (0); + } + ACE_ENDTRY; + ACE_CHECK; + + // Make sure an exception was raised and it was of the correct type. + ACE_ASSERT (expected_exception_raised); + + ACE_UNUSED_ARG (expected_exception_raised); +} + +void +test_object_deactivation (PortableServer::POA_ptr poa, + const PortableServer::ObjectId &id + ACE_ENV_ARG_DECL) +{ + test_i servant; + int expected_exception_raised = 0; + + PortableServer::ObjectId_var invalid_id = + PortableServer::string_to_ObjectId ("invalid id"); + + ACE_TRY_EX (invalid_id) + { + poa->deactivate_object (invalid_id.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK_EX (invalid_id); + } + ACE_CATCH (PortableServer::POA::ObjectNotActive, ex) + { + // This is the correct exception! Ignore + expected_exception_raised = 1; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception caught of incorrect type"); + ACE_ASSERT (0); + } + ACE_ENDTRY; + ACE_CHECK; + + // Make sure an exception was raised and it was of the correct + // type. + ACE_ASSERT (expected_exception_raised); + + + + poa->activate_object_with_id (id, + &servant + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + poa->deactivate_object (id + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + // Reset flag + expected_exception_raised = 0; + + ACE_TRY_EX (double_deactivate) + { + poa->deactivate_object (id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK_EX (double_deactivate); + } + ACE_CATCH (PortableServer::POA::ObjectNotActive, ex) + { + // This is the correct exception! Ignore + expected_exception_raised = 1; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception caught of incorrect type"); + ACE_ASSERT (0); + } + ACE_ENDTRY; + ACE_CHECK; + + // Make sure an exception was raised and it was of the correct + // type. + ACE_ASSERT (expected_exception_raised); + + poa->activate_object_with_id (id, + &servant + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + servant.poa_ = + PortableServer::POA::_duplicate (poa); + + servant.id_ = id; + + test_var test = + servant._this (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + test->deactivate_self (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + // ACE_ASSERT dissappears in non-debug builds + ACE_UNUSED_ARG (expected_exception_raised); + +} + +int +main (int argc, char **argv) +{ + ACE_DECLARE_NEW_CORBA_ENV; + + ACE_TRY + { + // Initialize the ORB first. + CORBA::ORB_var orb = CORBA::ORB_init (argc, + argv, + 0 + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Obtain the RootPOA. + CORBA::Object_var obj = + orb->resolve_initial_references ("RootPOA" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Get the POA_var object from Object_var. + PortableServer::POA_var root_poa = + PortableServer::POA::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Get the POAManager of the RootPOA. + PortableServer::POAManager_var poa_manager = + root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::PolicyList empty_policies; + PortableServer::POA_var child_poa = + root_poa->create_POA ("child", + poa_manager.in (), + empty_policies + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + obj = + root_poa->create_reference ("IDL:test:1.0" + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + PortableServer::ObjectId_var id = + root_poa->reference_to_id (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + test_object_deactivation (root_poa.in (), + id.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + id = PortableServer::string_to_ObjectId ("good id"); + + test_object_deactivation (child_poa.in (), + id.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Exception caught"); + return -1; + } + ACE_ENDTRY; + ACE_CHECK_RETURN (-1); + + return 0; +} |