summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/CosEvent/Timeout/TimeoutTestMain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/CosEvent/Timeout/TimeoutTestMain.cpp')
-rw-r--r--TAO/orbsvcs/tests/CosEvent/Timeout/TimeoutTestMain.cpp178
1 files changed, 178 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/CosEvent/Timeout/TimeoutTestMain.cpp b/TAO/orbsvcs/tests/CosEvent/Timeout/TimeoutTestMain.cpp
new file mode 100644
index 00000000000..5e207d98720
--- /dev/null
+++ b/TAO/orbsvcs/tests/CosEvent/Timeout/TimeoutTestMain.cpp
@@ -0,0 +1,178 @@
+// $Id$
+
+#include "TestEventConsumer_i.h"
+
+#include "orbsvcs/CosEventCommC.h"
+#include "orbsvcs/CosEventChannelAdminC.h"
+#include "orbsvcs/CosNamingC.h"
+
+#include "ace/Task.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_strings.h"
+#include "ace/OS_NS_unistd.h"
+
+namespace
+{
+ const char *forty_bytes = "1234567890123456789012345678901234567890";
+}
+
+struct SupplierTask : ACE_Task_Base
+{
+ static const int N_ITERATIONS = 15;
+
+ SupplierTask (CosEventChannelAdmin::ProxyPushConsumer_ptr ppc,
+ CORBA::ORB_ptr orb)
+ : consumer_ (CosEventChannelAdmin::ProxyPushConsumer::_duplicate (ppc)),
+ orb_ (CORBA::ORB::_duplicate (orb))
+ {
+ }
+
+ CosEventChannelAdmin::ProxyPushConsumer_var consumer_;
+ CORBA::ORB_var orb_;
+
+ int svc()
+ {
+ // Create an event (just a string in this case).
+ CORBA::String_var eventData = forty_bytes;
+ int delay_ms = 500;
+
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Supplier starting...\n")));
+
+ for (int i = 0; i < N_ITERATIONS; ++i)
+ {
+ // Insert the event data into an any.
+ CORBA::Any any;
+ any <<= eventData.in ();
+
+ // Now push the event to the consumer
+ this->consumer_->push (any);
+
+ ACE_Time_Value event_delay (0, 1000 * delay_ms);
+ ACE_OS::sleep (event_delay);
+ }
+ this->orb_->destroy ();
+ return 0;
+ }
+};
+
+int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
+{
+ try
+ {
+ // Initialize the ORB.
+ CORBA::ORB_var orb = CORBA::ORB_init (argc, argv);
+
+ // Find the Naming Service.
+ CORBA::Object_var obj = orb->resolve_initial_references ("NameService");
+ CosNaming::NamingContextExt_var root_context =
+ CosNaming::NamingContextExt::_narrow (obj.in ());
+
+ obj = root_context->resolve_str ("CosEventService");
+
+ // Downcast the object reference to an EventChannel reference.
+ CosEventChannelAdmin::EventChannel_var ec =
+ CosEventChannelAdmin::EventChannel::_narrow (obj.in ());
+ if (CORBA::is_nil (ec.in ()))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Could not narrow the EventChannel.\n")));
+ return 1;
+ }
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Found the EventChannel.\n")));
+
+ bool consumer = false;
+ bool supplier = false;
+ bool hang = false;
+ for (int i=1; i < argc; ++i)
+ {
+ if (0 == ACE_OS::strcasecmp (argv[i], ACE_TEXT ("-consumer")))
+ consumer = true;
+ else if (0 == ACE_OS::strcasecmp (argv[i], ACE_TEXT ("-supplier")))
+ supplier = true;
+ else if (0 == ACE_OS::strcasecmp (argv[i], ACE_TEXT ("-hang")))
+ hang = true;
+ }
+
+ TestEventConsumer_i servant (orb.in (), hang);
+
+ if (consumer)
+ {
+ // Register it with the RootPOA.
+ obj = orb->resolve_initial_references ("RootPOA");
+ PortableServer::POA_var poa =
+ PortableServer::POA::_narrow (obj.in ());
+ PortableServer::ObjectId_var oid = poa->activate_object (&servant);
+ CORBA::Object_var consumer_obj = poa->id_to_reference (oid.in ());
+ CosEventComm::PushConsumer_var consumer =
+ CosEventComm::PushConsumer::_narrow (consumer_obj.in ());
+
+ // Get a ConsumerAdmin object from the EventChannel.
+ CosEventChannelAdmin::ConsumerAdmin_var consumerAdmin =
+ ec->for_consumers ();
+
+ // Get a ProxyPushSupplier from the ConsumerAdmin.
+ CosEventChannelAdmin::ProxyPushSupplier_var supplier =
+ consumerAdmin->obtain_push_supplier ();
+
+ // Connect to the ProxyPushSupplier, passing our PushConsumer object
+ // reference to it.
+ supplier->connect_push_consumer (consumer.in ());
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Consumer connected\n")));
+
+ // Activate the POA via its POAManager.
+ PortableServer::POAManager_var poa_manager = poa->the_POAManager ();
+ poa_manager->activate ();
+ servant.activate ();
+ }
+
+ SupplierTask *pST = 0;
+ if (supplier)
+ {
+ // The supplier will use its own ORB.
+ CORBA::String_var ec_str = orb->object_to_string (ec.in ());
+
+ int no_args = 0;
+ CORBA::ORB_var s_orb = CORBA::ORB_init (no_args, 0,
+ "Supplier_pure_client_ORB");
+
+ CORBA::Object_var s_ec_obj = s_orb->string_to_object (ec_str.in ());
+
+ CosEventChannelAdmin::EventChannel_var s_ec =
+ CosEventChannelAdmin::EventChannel::_narrow (s_ec_obj.in ());
+
+ // Get a SupplierAdmin object from the EventChannel.
+ CosEventChannelAdmin::SupplierAdmin_var supplierAdmin =
+ s_ec->for_suppliers ();
+
+ // Get a ProxyPushConsumer from the SupplierAdmin.
+ CosEventChannelAdmin::ProxyPushConsumer_var consumer =
+ supplierAdmin->obtain_push_consumer ();
+
+ // Connect to the ProxyPushConsumer as a PushSupplier
+ // (passing a nil PushSupplier object reference to it because
+ // we don't care to be notified about disconnects).
+ consumer->connect_push_supplier
+ (CosEventComm::PushSupplier::_nil ());
+
+ ACE_NEW_RETURN (pST, SupplierTask (consumer.in (), s_orb.in ()), -1);
+ pST->activate ();
+ }
+
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Ready to receive events...\n")));
+
+ // Enter the ORB event loop.
+ orb->run ();
+
+ ACE_Thread_Manager::instance ()->wait ();
+ orb->destroy ();
+ return 0;
+ }
+ catch (CORBA::Exception &ex)
+ {
+ ex._tao_print_exception (
+ ACE_TEXT (
+ "TimeoutTest: Caught CORBA::Exception:"));
+ }
+
+ return 1;
+}