diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:21 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2006-07-24 15:50:21 +0000 |
commit | 3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c (patch) | |
tree | 197c810e5f5bce17b1233a7cb8d7b50c0bcd25e2 /TAO/orbsvcs/tests/Notify/XML_Persistence | |
parent | 6b846cf03c0bcbd8c276cb0af61a181e5f98eaae (diff) | |
download | ATCD-3aff90f4a822fcf5d902bbfbcc9fa931d6191a8c.tar.gz |
Repo restructuring
Diffstat (limited to 'TAO/orbsvcs/tests/Notify/XML_Persistence')
5 files changed, 533 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/Notify/XML_Persistence/Makefile.am b/TAO/orbsvcs/tests/Notify/XML_Persistence/Makefile.am new file mode 100644 index 00000000000..78d0832f1b2 --- /dev/null +++ b/TAO/orbsvcs/tests/Notify/XML_Persistence/Makefile.am @@ -0,0 +1,67 @@ +## Process this file with automake to create Makefile.in +## +## $Id$ +## +## This file was generated by MPC. Any changes made directly to +## this file will be lost the next time it is generated. +## +## MPC Command: +## ../bin/mwc.pl -type automake -noreldefs TAO.mwc + +ACE_BUILDDIR = $(top_builddir)/.. +ACE_ROOT = $(top_srcdir)/.. +TAO_BUILDDIR = $(top_builddir) +TAO_ROOT = $(top_srcdir) + + +## Makefile.XML_Persistence.am + +if BUILD_CORBA_MESSAGING +if !BUILD_MINIMUM_CORBA + +noinst_PROGRAMS = main + +main_CPPFLAGS = \ + -I$(ACE_ROOT) \ + -I$(ACE_BUILDDIR) \ + -I$(TAO_ROOT) \ + -I$(TAO_BUILDDIR) \ + -I$(TAO_ROOT)/orbsvcs \ + -I$(TAO_BUILDDIR)/orbsvcs \ + -DTAO_HAS_TYPED_EVENT_CHANNEL + +main_SOURCES = \ + main.cpp + +main_LDADD = \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosNotification_Skel.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosNotification_Serv.la \ + $(TAO_BUILDDIR)/tao/libTAO_DynamicAny.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_ETCL.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosEvent_Serv.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_Svc_Utils.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosNaming.la \ + $(TAO_BUILDDIR)/tao/libTAO_IFR_Client.la \ + $(TAO_BUILDDIR)/tao/libTAO_DynamicInterface.la \ + $(TAO_BUILDDIR)/tao/libTAO_Messaging.la \ + $(TAO_BUILDDIR)/tao/libTAO_PI.la \ + $(TAO_BUILDDIR)/tao/libTAO_CodecFactory.la \ + $(TAO_BUILDDIR)/tao/libTAO_Valuetype.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosEvent_Skel.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosNotification.la \ + $(TAO_BUILDDIR)/orbsvcs/orbsvcs/libTAO_CosEvent.la \ + $(TAO_BUILDDIR)/tao/libTAO_PortableServer.la \ + $(TAO_BUILDDIR)/tao/libTAO_AnyTypeCode.la \ + $(TAO_BUILDDIR)/tao/libTAO.la \ + $(ACE_BUILDDIR)/ace/libACE.la + +endif !BUILD_MINIMUM_CORBA +endif BUILD_CORBA_MESSAGING + +## Clean up template repositories, etc. +clean-local: + -rm -f *~ *.bak *.rpo *.sym lib*.*_pure_* core core.* + -rm -f gcctemp.c gcctemp so_locations *.ics + -rm -rf cxx_repository ptrepository ti_files + -rm -rf templateregistry ir.out + -rm -rf ptrepository SunWS_cache Templates.DB diff --git a/TAO/orbsvcs/tests/Notify/XML_Persistence/XML_Persistence.mpc b/TAO/orbsvcs/tests/Notify/XML_Persistence/XML_Persistence.mpc new file mode 100644 index 00000000000..141f3252109 --- /dev/null +++ b/TAO/orbsvcs/tests/Notify/XML_Persistence/XML_Persistence.mpc @@ -0,0 +1,5 @@ +// $Id$ + +project : orbsvcsexe, portableserver, notify_serv { + exename = main +} diff --git a/TAO/orbsvcs/tests/Notify/XML_Persistence/main.cpp b/TAO/orbsvcs/tests/Notify/XML_Persistence/main.cpp new file mode 100644 index 00000000000..463a3fc9b8d --- /dev/null +++ b/TAO/orbsvcs/tests/Notify/XML_Persistence/main.cpp @@ -0,0 +1,409 @@ +/** + * $Id$ + */ + +#include "orbsvcs/CosNotificationC.h" +#include "orbsvcs/NotifyExtC.h" +#include "orbsvcs/Notify/Notify_EventChannelFactory_i.h" + +// On SunOS 5.8 and MacOS X, the static initialization trick used +// in the CosNotification_Serv library does not work. Including the +// initializer class here works around the problem. +#if defined (sun) || defined (__APPLE__) +#include "orbsvcs/Notify/CosNotify_Initializer.h" +#endif /* sun || __APPLE__ */ + +#include "tao/TimeBaseC.h" +#include "tao/corba.h" +#include "tao/PortableServer/PortableServer.h" + +#include "ace/OS_NS_string.h" +#include "ace/OS_NS_stdio.h" +#include "ace/Dynamic_Service.h" +#include "ace/ARGV.h" + +class TestSupplier +: public POA_CosNotifyComm::StructuredPushSupplier +{ + virtual void disconnect_structured_push_supplier(ACE_ENV_SINGLE_ARG_DECL_NOT_USED) throw (CORBA::SystemException) { + } + + virtual void subscription_change( const CosNotification::EventTypeSeq&, + const CosNotification::EventTypeSeq& ACE_ENV_ARG_DECL_NOT_USED) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) + { + } +}; + +class TestConsumer +: public POA_CosNotifyComm::StructuredPushConsumer +{ + virtual void disconnect_structured_push_consumer(ACE_ENV_SINGLE_ARG_DECL_NOT_USED) throw (CORBA::SystemException) { + } + + virtual void offer_change( const CosNotification::EventTypeSeq&, const CosNotification::EventTypeSeq& ACE_ENV_ARG_DECL_NOT_USED) + throw (CORBA::SystemException, CosNotifyComm::InvalidEventType) + { + } + + virtual void push_structured_event(const CosNotification::StructuredEvent& ACE_ENV_ARG_DECL_NOT_USED) + throw (CORBA::SystemException, CosEventComm::Disconnected) + { + } +}; + +int main(int ac, char **av) +{ + int retval = 1; + + bool pass1 = false; + bool pass2 = false; + ACE_DECLARE_NEW_CORBA_ENV; + ACE_TRY + { + CORBA::ORB_var orb; + PortableServer::POA_var poa; + + orb = CORBA::ORB_init(ac, av, "" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + ACE_ASSERT(! CORBA::is_nil (orb.in ())); + + if (ac > 2 && ACE_OS::strcmp (av[1], "-pass") == 0) + { + int pn = av[2][0] - '0'; + switch (pn) + { + case 1: + pass1 = true; + pass2 = false; + break; + case 2: + pass1 = false; + pass2 = true; + break; + case 3: + pass1 = true; + pass2 = true; + break; + default: + ACE_OS::fprintf (stderr, "Illegal -pass command line option. Expecting 1, 2, or 3\n"); + return -1; + } + } + if (! pass1 && !pass2) + { + FILE *f; + f = fopen ("loadtest.xml", "r"); + if (f != 0) + { + fclose (f); + pass1 = false; + pass2 = true; + } + else + { + pass1 = true; + pass2 = false; + } + } + CORBA::Object_var obj = + orb->resolve_initial_references("RootPOA" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + ACE_ASSERT(! CORBA::is_nil (obj.in ())); + poa = PortableServer::POA::_narrow(obj.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + ACE_ASSERT(! CORBA::is_nil (poa.in ())); + PortableServer::POAManager_var mgr = poa->the_POAManager(); + mgr->activate(); + + CORBA::PolicyList policies (1); + policies.length (1); + + policies[0] = + poa->create_lifespan_policy (PortableServer::PERSISTENT + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + PortableServer::POA_var persistentPOA = poa->create_POA ( + "PersistentPOA", + mgr.in (), + policies + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + policies[0]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (pass1) + { + CosNotifyChannelAdmin::EventChannelFactory_var cosecf = + TAO_Notify_EventChannelFactory_i::create(persistentPOA.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + NotifyExt::EventChannelFactory_var ecf = + NotifyExt::EventChannelFactory::_narrow (cosecf.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (ecf.in ())) + { + return -1; + } + + CosNotification::QoSProperties qosprops(7); + CORBA::ULong i = 0; + + qosprops.length(7); + qosprops[i].name = CORBA::string_dup(CosNotification::EventReliability); + qosprops[i++].value <<= CosNotification::Persistent; + qosprops[i].name = CORBA::string_dup(CosNotification::ConnectionReliability); + qosprops[i++].value <<= CosNotification::Persistent; // Required, or we won't persist much + qosprops[i].name = CORBA::string_dup(CosNotification::Priority); + qosprops[i++].value <<= CosNotification::HighestPriority; + qosprops[i].name = CORBA::string_dup(CosNotification::Timeout); + qosprops[i++].value <<= (TimeBase::TimeT) 42000; // 4.2 ms + qosprops[i].name = CORBA::string_dup(CosNotification::StopTimeSupported); + qosprops[i++].value <<= CORBA::Any::from_boolean(1); + qosprops[i].name = CORBA::string_dup(CosNotification::MaximumBatchSize); + qosprops[i++].value <<= (CORBA::Long) 555; + qosprops[i].name = CORBA::string_dup(CosNotification::PacingInterval); + qosprops[i++].value <<= (TimeBase::TimeT) 34300; // 3.4 ms + qosprops.length(i); + + CosNotification::AdminProperties adminprops(4); + adminprops.length(4); + i = 0; + adminprops[i].name = CORBA::string_dup(CosNotification::MaxQueueLength); + adminprops[i++].value <<= (CORBA::Long) 1234; + adminprops[i].name = CORBA::string_dup(CosNotification::MaxConsumers); + adminprops[i++].value <<= (CORBA::Long) 3; + adminprops[i].name = CORBA::string_dup(CosNotification::MaxSuppliers); + adminprops[i++].value <<= (CORBA::Long) 3; + adminprops[i].name = CORBA::string_dup(CosNotification::RejectNewEvents); + adminprops[i++].value <<= CORBA::Any::from_boolean(1); + adminprops.length (i); + + CosNotifyChannelAdmin::ChannelID ecid; + ::CosNotifyChannelAdmin::EventChannel_var ec = + ecf->create_channel(qosprops, adminprops, ecid ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::AdminID consumer_admin_id; + CosNotifyChannelAdmin::ConsumerAdmin_var ca = + ec->new_for_consumers(CosNotifyChannelAdmin::OR_OP, + consumer_admin_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::AdminID supplier_admin_id; + CosNotifyChannelAdmin::SupplierAdmin_var sa = + ec->new_for_suppliers(CosNotifyChannelAdmin::OR_OP, + supplier_admin_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::ProxyID proxy_id; + CosNotifyChannelAdmin::ProxySupplier_var ps = + ca->obtain_notification_push_supplier( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + proxy_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::StructuredProxyPushSupplier_var strps = + CosNotifyChannelAdmin::StructuredProxyPushSupplier::_narrow(ps.in()); + + ps = ca->obtain_notification_push_supplier( + CosNotifyChannelAdmin::SEQUENCE_EVENT, + proxy_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::SequenceProxyPushSupplier_var seqps = + CosNotifyChannelAdmin::SequenceProxyPushSupplier::_narrow(ps.in()); + + ps = ca->obtain_notification_push_supplier( + CosNotifyChannelAdmin::ANY_EVENT, + proxy_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::ProxyPushSupplier_var anyps = + CosNotifyChannelAdmin::ProxyPushSupplier::_narrow(ps.in()); + + CosNotifyChannelAdmin::ProxyConsumer_var pc = + sa->obtain_notification_push_consumer( + CosNotifyChannelAdmin::STRUCTURED_EVENT, + proxy_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::StructuredProxyPushConsumer_var strpc = CosNotifyChannelAdmin::StructuredProxyPushConsumer::_narrow(pc.in()); + + pc = sa->obtain_notification_push_consumer( + CosNotifyChannelAdmin::SEQUENCE_EVENT, + proxy_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::SequenceProxyPushConsumer_var seqpc = CosNotifyChannelAdmin::SequenceProxyPushConsumer::_narrow(pc.in()); + + pc = + sa->obtain_notification_push_consumer( + CosNotifyChannelAdmin::ANY_EVENT, + proxy_id + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyChannelAdmin::ProxyPushConsumer_var anypc = CosNotifyChannelAdmin::ProxyPushConsumer::_narrow(pc.in()); + + CosNotifyFilter::FilterFactory_var ff = + ec->default_filter_factory (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotifyFilter::Filter_var filter1 = + ff->create_filter("EXTENDED_TCL" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + ACE_ASSERT(! CORBA::is_nil (filter1.in ())); + + CosNotifyFilter::Filter_var filter2 = + ff->create_filter("EXTENDED_TCL" ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + ACE_ASSERT(! CORBA::is_nil (filter2.in ())); + + CosNotifyFilter::ConstraintExpSeq constraint_list(1); + constraint_list.length(1); + constraint_list[0].event_types.length(0); + constraint_list[0].constraint_expr = CORBA::string_dup("Number == 100"); + + filter1->add_constraints(constraint_list ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + filter2->add_constraints(constraint_list ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + ca->add_filter (filter1.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + sa->add_filter (filter2.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + strps->add_filter (filter1.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + seqps->add_filter (filter2.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + anyps->add_filter (filter1.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + strpc->add_filter (filter2.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + seqpc->add_filter (filter1.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + anypc->add_filter (filter1.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + anypc->add_filter (filter2.in() ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CosNotification::EventTypeSeq added1(1), removed1(0); + added1.length(1); + added1[0].domain_name = CORBA::string_dup("nightly_builds"); + added1[0].type_name = CORBA::string_dup("*"); + ca->subscription_change(added1, removed1 ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // Connect a PushConsumer and PushSupplier + TestSupplier test_supplier_svt; + PortableServer::ObjectId_var oid1 = persistentPOA->activate_object (&test_supplier_svt + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + CORBA::Object_var obj1 = persistentPOA->id_to_reference (oid1.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + CosNotifyComm::StructuredPushSupplier_var push_sup = CosNotifyComm::StructuredPushSupplier::_narrow (obj1.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + TestConsumer test_consumer_svt; + PortableServer::ObjectId_var oid2 = persistentPOA->activate_object (&test_consumer_svt + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + CORBA::Object_var obj2 = persistentPOA->id_to_reference (oid2.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + CosNotifyComm::StructuredPushConsumer_var push_cons = CosNotifyComm::StructuredPushConsumer::_narrow (obj2.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + strpc->connect_structured_push_supplier(push_sup.in()); + strps->connect_structured_push_consumer(push_cons.in()); + + strps->suspend_connection(); + + persistentPOA->deactivate_object (oid1.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + persistentPOA->deactivate_object (oid2.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + ecf->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + //////////////////////////////// + // TODO make this not hardcoded + ACE_OS::rename ("abc.xml", "loadtest.xml"); + + } // end of pass 1 + + if (pass2) + { + + // Create a new ecf, which should load itself from loadtest.xml + CosNotifyChannelAdmin::EventChannelFactory_var + cosecf = TAO_Notify_EventChannelFactory_i::create(persistentPOA.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + ACE_TRY_CHECK; + NotifyExt::EventChannelFactory_var + ecf = NotifyExt::EventChannelFactory::_narrow (cosecf.in () ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (ecf.in ())) + { + return -1; + } + + // Force a change, which should write out a new abc.xml. + ecf->save_topology (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + ecf->destroy(ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + + poa->destroy (1, 1 ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (1); + orb->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (1); + poa = PortableServer::POA::_nil (); + orb = CORBA::ORB::_nil (); + retval = 0; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION(ex, "Error: Unexpected exception caught in main. "); + retval = -1; + } + ACE_CATCHALL + { + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("Error : Unknown exception caught in main.") )); + retval = -2; + } + ACE_ENDTRY; + return retval; +} diff --git a/TAO/orbsvcs/tests/Notify/XML_Persistence/run_test.pl b/TAO/orbsvcs/tests/Notify/XML_Persistence/run_test.pl new file mode 100755 index 00000000000..8140370ffd8 --- /dev/null +++ b/TAO/orbsvcs/tests/Notify/XML_Persistence/run_test.pl @@ -0,0 +1,50 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +# ex + +use lib "$ENV{ACE_ROOT}/bin"; +use PerlACE::Run_Test; +use File::Compare; + +$ACE_ROOT = $ENV{ACE_ROOT}; +$TAO_ROOT = "$ACE_ROOT/TAO"; + +$port = 12000 + PerlACE::uniqueid (); + +sub cleanup() { + unlink "loadtest.xml"; + unlink "abc.xml"; + for ($i = 0; $i < 10; ++$i) { + unlink "abc.00" . $i; + } + for ($i = 10; $i < 20; ++$i) { + unlink "abc.0" . $i; + } +} + +cleanup(); + +$ret = 0; + +$UTEST = new PerlACE::Process("main", "-orbobjrefstyle url -ORBEndpoint iiop://:$port -pass 3"); +$ret = $UTEST->SpawnWaitKill(20); +if ($ret != 0) { + print "ERROR : main returned $ret\n"; + exit $ret; +} + +$different = compare("loadtest.xml", "abc.xml"); +if ($different) { + print "ERROR : loadtest.xml != abc.xml\n"; + exit 1; +} else { + print "Success : loadtest.xml == abc.xml\n"; +} + + +exit $ret; diff --git a/TAO/orbsvcs/tests/Notify/XML_Persistence/svc.conf b/TAO/orbsvcs/tests/Notify/XML_Persistence/svc.conf new file mode 100644 index 00000000000..c0d276565cb --- /dev/null +++ b/TAO/orbsvcs/tests/Notify/XML_Persistence/svc.conf @@ -0,0 +1,2 @@ +static Notify_Default_Event_Manager_Objects_Factory "-DispatchingThreads 1" +dynamic Topology_Factory Service_Object* TAO_CosNotification_Persist:_make_TAO_Notify_XML_Topology_Factory() "-v -save_base_path ./abc -load_base_path ./loadtest -backup_count 2 -no_timestamp" |