diff options
Diffstat (limited to 'TAO/orbsvcs/tests/Notify/Basic/Updates.cpp')
-rw-r--r-- | TAO/orbsvcs/tests/Notify/Basic/Updates.cpp | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/Notify/Basic/Updates.cpp b/TAO/orbsvcs/tests/Notify/Basic/Updates.cpp new file mode 100644 index 00000000000..3933aaa37a1 --- /dev/null +++ b/TAO/orbsvcs/tests/Notify/Basic/Updates.cpp @@ -0,0 +1,488 @@ +//$Id$ + +#include "ace/Arg_Shifter.h" +#include "ace/Get_Opt.h" +#include "tao/debug.h" +#include "Updates.h" + +ACE_RCSID (Notify_Tests, Updates, "$Id$") + +Updates_StructuredPushConsumer::Updates_StructuredPushConsumer (Updates *test_client) + : test_client_ (test_client) +{ +} + +void +Updates_StructuredPushConsumer::offer_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ACE_ENV_ARG_DECL_NOT_USED + ) + ACE_THROW_SPEC (( + CORBA::SystemException, + CosNotifyComm::InvalidEventType + )) +{ + if (TAO_debug_level) + ACE_DEBUG ((LM_DEBUG, "StructuredPushConsumer::offer_change invoked:\n")); + this->test_client_->types_changed (added, removed); +} + +/***************************************************************************/ + +Updates_StructuredPushSupplier::Updates_StructuredPushSupplier (Updates* test_client) + :test_client_ (test_client) +{ +} + +Updates_StructuredPushSupplier::~Updates_StructuredPushSupplier () +{ +} + +void +Updates_StructuredPushSupplier::subscription_change ( + const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed + ACE_ENV_ARG_DECL_NOT_USED + ) + ACE_THROW_SPEC ((CORBA::SystemException, + CosNotifyComm::InvalidEventType)) +{ + if (TAO_debug_level) + ACE_DEBUG ((LM_DEBUG, "StructuredPushSupplier::subscription_change invoked:\n")); + this->test_client_->types_changed (added, removed); +} + +/***************************************************************************/ + +Updates::Updates (void) + : added_count_ (0), removed_count_ (0) +{ +} + +Updates::~Updates () +{ +} + +int +Updates::init (int argc, + char* argv [] + ACE_ENV_ARG_DECL) +{ + // Initialize base class. + Notify_Test_Client::init (argc, + argv + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + // Create all participents. + this->create_EC (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + CosNotifyChannelAdmin::AdminID adminid; + + supplier_admin_ = + ec_->new_for_suppliers (this->ifgop_, + adminid + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + ACE_ASSERT (!CORBA::is_nil (supplier_admin_.in ())); + + consumer_admin_ = + ec_->new_for_consumers (this->ifgop_, + adminid + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + ACE_ASSERT (!CORBA::is_nil (consumer_admin_.in ())); + + ACE_NEW_RETURN (consumer_, + Updates_StructuredPushConsumer (this), + -1); + consumer_->init (root_poa_.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + consumer_->connect (this->consumer_admin_.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + ACE_NEW_RETURN (supplier_, + Updates_StructuredPushSupplier (this), + -1); + supplier_->init (root_poa_.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + supplier_->connect (this->supplier_admin_.in () + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + return 0; +} + +void +Updates::create_EC (ACE_ENV_SINGLE_ARG_DECL) +{ + CosNotifyChannelAdmin::ChannelID id; + + ec_ = notify_factory_->create_channel (initial_qos_, + initial_admin_, + id + ACE_ENV_ARG_PARAMETER); + ACE_CHECK; + + ACE_ASSERT (!CORBA::is_nil (ec_.in ())); +} + +void +Updates::types_changed (const CosNotification::EventTypeSeq & added, + const CosNotification::EventTypeSeq & removed) +{ + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Added Types.. \n")); + this->print_event_types (added); + + ACE_DEBUG ((LM_DEBUG, "Removed Types.. \n")); + this->print_event_types (removed); + } + + ACE_GUARD (TAO_SYNCH_MUTEX, mon, this->lock_); + + this->added_count_ += added.length (); + this->removed_count_ += removed.length (); +} + +void +Updates::print_event_types (const CosNotification::EventTypeSeq &types) +{ + for (CORBA::ULong i = 0; i < types.length (); ++i) + { + ACE_DEBUG ((LM_DEBUG, "(%s, %s)\n", types[i].domain_name.in (), types[i].type_name. in())); + } +} + +void +Updates::add_type (CosNotification::EventTypeSeq& type_seq, const char* type) +{ + // Make space. + int index = type_seq.length (); + type_seq.length (index + 1); + + type_seq[index].domain_name = CORBA::string_dup (type); + type_seq[index].type_name = CORBA::string_dup (type); +} + +void +Updates::wait_for_updates (int expected_added, int expected_removed) +{ + while (1) + { + if (added_count_ == expected_added && + removed_count_ == expected_removed) + break; + + ACE_Time_Value tv(0, 100 * 1000); + orb_->run(tv); + } +} + +void +Updates::reset_counts (void) +{ + ACE_GUARD (TAO_SYNCH_MUTEX, mon, this->lock_); + this->added_count_ = 0; + this->removed_count_ = 0; +} + +void +Updates::run_test (ACE_ENV_SINGLE_ARG_DECL) +{ + this->test_subscription_change (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + if (TAO_debug_level) + ACE_DEBUG ((LM_DEBUG, "Finished testing subscription_change!\n")); + + this->test_offer_change (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + ACE_DEBUG ((LM_DEBUG, "Updates test has run successfully!\n")); +} + +void +Updates::test_subscription_change (ACE_ENV_SINGLE_ARG_DECL) +{ + { + // reset counts. + this->reset_counts (); + + /// Currently we're subscribed for "*" + /// Add RED, GREEN and BLUE + /// Remove ORANGE and PINK + + CosNotification::EventTypeSeq added, removed; + + this->add_type (added, "RED"); + this->add_type (added, "GREEN"); + this->add_type (added, "BLUE"); + + this->add_type (removed, "ORANGE"); + this->add_type (removed, "PINK"); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Calling subscription_change with added types:\n")); + this->print_event_types (added); + ACE_DEBUG ((LM_DEBUG, "Calling subscription_change with removed types:\n")); + this->print_event_types (removed); + } + + this->consumer_->get_proxy_supplier ()->subscription_change (added, + removed + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK; + + this->wait_for_updates (3, 0); // The supplier should receive Added (RED, GREEN, BLUE) + + // Get the subscriptions visible to the supplier. + CosNotification::EventTypeSeq_var obtained = + this->supplier_->get_proxy_consumer ()->obtain_subscription_types (CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "obtain_subscription_types \n")); + this->print_event_types (obtained.in ()); + } + } + + { + // reset counts. + this->reset_counts (); + + // Now, add PURPLE, RED and GREEN + CosNotification::EventTypeSeq added, removed; + + this->add_type (added, "PURPLE"); + this->add_type (added, "GREEN"); + this->add_type (added, "BLUE"); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Calling subscription_change with added types:\n")); + this->print_event_types (added); + ACE_DEBUG ((LM_DEBUG, "Calling subscription_change with removed types:\n")); + this->print_event_types (removed); + } + + this->consumer_->get_proxy_supplier ()->subscription_change (added, + removed + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK; + + this->wait_for_updates (1, 0); // The supplier should receive Added (PURPLE). + + // Get the subscriptions visible to the supplier. + CosNotification::EventTypeSeq_var obtained = + this->supplier_->get_proxy_consumer ()->obtain_subscription_types (CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "obtain_subscription_types \n")); + this->print_event_types (obtained.in ()); + } + } + + { + // reset counts. + this->reset_counts (); + + // Next, Remove everything by subcribing to "*" + CosNotification::EventTypeSeq added, removed; + + this->add_type (added, "*"); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Calling subscription_change with added types:\n")); + this->print_event_types (added); + ACE_DEBUG ((LM_DEBUG, "Calling subscription_change with removed types:\n")); + this->print_event_types (removed); + } + + this->consumer_->get_proxy_supplier ()->subscription_change (added, + removed + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK; + + this->wait_for_updates (0, 4); + // The supplier should receive Remove {RED, GREEN} out of the 4 actally removed (RED, GREEN, BLUE, PURPLE) becaue that whats it offered for. + + // Get the subscriptions visible to the supplier. + CosNotification::EventTypeSeq_var obtained = + this->supplier_->get_proxy_consumer ()->obtain_subscription_types (CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "obtain_subscription_types \n")); + this->print_event_types (obtained.in ()); + } + } + +} + +void +Updates::test_offer_change (ACE_ENV_SINGLE_ARG_DECL) +{ + { + // reset counts. + this->reset_counts (); + + /// Currently we're subscribed for "*" + /// Add RED, GREEN and BLUE + /// Remove ORANGE and PINK + + CosNotification::EventTypeSeq added, removed; + + this->add_type (added, "RED"); + this->add_type (added, "GREEN"); + this->add_type (added, "BLUE"); + + this->add_type (removed, "ORANGE"); + this->add_type (removed, "PINK"); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Calling offer_change with added types:\n")); + this->print_event_types (added); + ACE_DEBUG ((LM_DEBUG, "Calling offer_change with removed types:\n")); + this->print_event_types (removed); + } + + this->supplier_->get_proxy_consumer ()->offer_change (added, + removed + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK; + + this->wait_for_updates (3, 0); // The consumer should receive Added (RED, GREEN, BLUE) + + // Get the offers visible to the supplier. + CosNotification::EventTypeSeq_var obtained = + this->consumer_->get_proxy_supplier ()->obtain_offered_types (CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "obtain_offer_types \n")); + this->print_event_types (obtained.in ()); + } + } + + { + // reset counts. + this->reset_counts (); + + // Now, add PURPLE, RED and GREEN + CosNotification::EventTypeSeq added, removed; + + this->add_type (added, "PURPLE"); + this->add_type (added, "GREEN"); + this->add_type (added, "BLUE"); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Calling offer_change with added types:\n")); + this->print_event_types (added); + ACE_DEBUG ((LM_DEBUG, "Calling offer_change with removed types:\n")); + this->print_event_types (removed); + } + + this->supplier_->get_proxy_consumer ()->offer_change (added, + removed + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK; + + this->wait_for_updates (1, 0); // The consumer should receive Added (PURPLE). + + // Get the offers visible to the consumer. + CosNotification::EventTypeSeq_var obtained = + this->consumer_->get_proxy_supplier ()->obtain_offered_types (CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "obtain_offer_types \n")); + this->print_event_types (obtained.in ()); + } + } + + { + // reset counts. + this->reset_counts (); + + // Next, Remove everything by subcribing to "*" + CosNotification::EventTypeSeq added, removed; + + this->add_type (added, "*"); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "Calling offer_change with added types:\n")); + this->print_event_types (added); + ACE_DEBUG ((LM_DEBUG, "Calling offer_change with removed types:\n")); + this->print_event_types (removed); + } + + this->supplier_->get_proxy_consumer ()->offer_change (added, + removed + ACE_ENV_ARG_PARAMETER + ); + ACE_CHECK; + + this->wait_for_updates (0, 4); + // The consumer should receive Remove {RED, GREEN} out of the 4 actally removed (RED, GREEN, BLUE, PURPLE) becaue that whats it offered for. + + // Get the offers visible to the consumer. + CosNotification::EventTypeSeq_var obtained = + this->consumer_->get_proxy_supplier ()->obtain_offered_types (CosNotifyChannelAdmin::ALL_NOW_UPDATES_ON); + + if (TAO_debug_level) + { + ACE_DEBUG ((LM_DEBUG, "obtain_offer_types \n")); + this->print_event_types (obtained.in ()); + } + } + +} + +/***************************************************************************/ + +int +main (int argc, char* argv[]) +{ + Updates updates; + + ACE_TRY_NEW_ENV + { + updates.init (argc, + argv + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + updates.run_test (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCH (CORBA::SystemException, se) + { + ACE_PRINT_EXCEPTION (se, "Error: "); + return 1; + } + ACE_ENDTRY; + + return 0; +} |