summaryrefslogtreecommitdiff
path: root/ACE/TAO/tests/RTCORBA/Client_Protocol/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/tests/RTCORBA/Client_Protocol/client.cpp')
-rw-r--r--ACE/TAO/tests/RTCORBA/Client_Protocol/client.cpp234
1 files changed, 234 insertions, 0 deletions
diff --git a/ACE/TAO/tests/RTCORBA/Client_Protocol/client.cpp b/ACE/TAO/tests/RTCORBA/Client_Protocol/client.cpp
new file mode 100644
index 00000000000..7894a7a4046
--- /dev/null
+++ b/ACE/TAO/tests/RTCORBA/Client_Protocol/client.cpp
@@ -0,0 +1,234 @@
+// $Id$
+
+#include "testC.h"
+#include "ace/Get_Opt.h"
+#include "ace/OS_NS_unistd.h"
+#include "tao/RTCORBA/RTCORBA.h"
+#include "tao/Policy_ManagerC.h"
+#include "tao/Policy_CurrentC.h"
+
+#include "tao/Strategies/advanced_resource.h"
+
+const ACE_TCHAR *ior1 = ACE_TEXT("file://test1.ior");
+const ACE_TCHAR *ior2 = ACE_TEXT("file://test2.ior");
+CORBA::ULong protocol_type = 0;
+
+int
+parse_args (int argc, ACE_TCHAR *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, ACE_TEXT("s:c:p:"));
+ int c, result;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 's':
+ ior1 = get_opts.opt_arg ();
+ break;
+ case 'c':
+ ior2 = get_opts.opt_arg ();
+ break;
+ case 'p':
+ result = ::sscanf (ACE_TEXT_ALWAYS_CHAR (get_opts.opt_arg ()),
+ "%u",
+ &protocol_type);
+ if (result == 0 || result == EOF)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to process <-p> option"),
+ -1);
+ break;
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-s <ior> "
+ "-c <ior> "
+ "-p <protocol_type> "
+ "\n",
+ argv [0]),
+ -1);
+ }
+
+ return 0;
+}
+
+int
+check_for_nil (CORBA::Object_ptr obj, const char *msg)
+{
+ if (CORBA::is_nil (obj))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "ERROR: Object reference <%C> is nil\n",
+ msg),
+ -1);
+ else
+ return 0;
+}
+
+void
+exception_test (Test_ptr server,
+ const char *msg)
+{
+ try
+ {
+ server->test_method ();
+ }
+ catch (const CORBA::INV_POLICY& )
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "INV_POLICY exception is caught as expected.\n"));
+ }
+ catch (const CORBA::Exception&)
+ {
+ ACE_DEBUG ((LM_DEBUG, msg));
+ throw;
+ }
+}
+
+int
+ACE_TMAIN(int argc, ACE_TCHAR *argv[])
+{
+ try
+ {
+ // Initialize the ORB, resolve references and parse arguments.
+
+ // ORB.
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv);
+
+ // Parse arguments.
+ if (parse_args (argc, argv) != 0)
+ return -1;
+
+ // RTORB.
+ CORBA::Object_var object =
+ orb->resolve_initial_references ("RTORB");
+ RTCORBA::RTORB_var rt_orb = RTCORBA::RTORB::_narrow (object.in ());
+ if (check_for_nil (rt_orb.in (), "RTORB") == -1)
+ return -1;
+
+ // PolicyManager.
+ object = orb->resolve_initial_references ("ORBPolicyManager");
+ CORBA::PolicyManager_var policy_manager =
+ CORBA::PolicyManager::_narrow (object.in ());
+ if (check_for_nil (policy_manager.in (), "PolicyManager")
+ == -1)
+ return -1;
+
+ // PolicyCurrent.
+ object = orb->resolve_initial_references ("PolicyCurrent");
+ CORBA::PolicyCurrent_var policy_current =
+ CORBA::PolicyCurrent::_narrow (object.in ());
+ if (check_for_nil (policy_current.in (), "PolicyCurrent")
+ == -1)
+ return -1;
+
+ // Test object 1 (ClientProtocolPolicy set on server).
+ object = orb->string_to_object (ior1);
+ Test_var server1 = Test::_narrow (object.in ());
+ if (check_for_nil (server1.in (), "server1") == -1)
+ return -1;
+
+ // Test object 2 (no client-exposed ClientProtocolPolicy).
+ object = orb->string_to_object (ior2);
+ Test_var server2 = Test::_narrow (object.in ());
+ if (check_for_nil (server2.in (), "server2") == -1)
+ return -1;
+
+ // Do testing.
+
+ // Test 1: Invoke operation on the object that has
+ // ClientProtocolPolicy set on the server side.
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Test 1\n"));
+ server1->test_method ();
+
+ // Test 2: Set the ORB-level ClientProtocolPolicy override, and
+ // attempt the same invocation again. Should get
+ // CORBA::INV_POLICY exception since the policy is set on both
+ // client and server sides.
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Test 2\n"));
+ RTCORBA::ProtocolList protocols;
+ protocols.length (1);
+ protocols[0].protocol_type = protocol_type;
+ protocols[0].transport_protocol_properties =
+ RTCORBA::ProtocolProperties::_nil ();
+ protocols[0].orb_protocol_properties =
+ RTCORBA::ProtocolProperties::_nil ();
+
+ CORBA::PolicyList policy_list;
+ policy_list.length (1);
+ policy_list[0] =
+ rt_orb->create_client_protocol_policy (protocols);
+
+ policy_manager->set_policy_overrides (policy_list,
+ CORBA::SET_OVERRIDE);
+
+ exception_test (server1.in (),
+ "ERROR: Test 2 failed\n");
+
+ // Test 3: Attempt the invocation on the second object reference
+ // (the one that didn't have ClientProtocolPolicy set on the
+ // server side). This should succeed since there are no
+ // conflicts.
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Test 3\n"));
+ server2->test_method ();
+
+ // Test 4: Override ClientProtocolPolicy on the Current level.
+ // For the override value, use the sequence of protocols, none
+ // of which are available in the server ORB. Attempt an
+ // invocation on the second object. Should get
+ // CORBA::INV_POLICY exception since none of the protocols
+ // specified in the policy are available.
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Test 4\n"));
+ // Hardcode a sequence of nonexistent protocols.
+ protocols.length (3);
+ protocols[0].protocol_type = 3;
+ protocols[1].protocol_type = 4;
+ protocols[2].protocol_type = 5;
+ policy_list[0] =
+ rt_orb->create_client_protocol_policy (protocols);
+
+ policy_current->set_policy_overrides (policy_list,
+ CORBA::SET_OVERRIDE);
+
+ exception_test (server2.in (),
+ "ERROR: Test 4 failed\n");
+
+ // Test 5: Override ClientProtocolPolicy on the Current level
+ // again. This time use the sequence in which the first
+ // protocol isn't available and the second one is. The
+ // invocation should succeed through using the second protocol.
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Test 5\n"));
+ protocols.length (2);
+ protocols[0].protocol_type = 3;
+ protocols[1].protocol_type = protocol_type;
+ policy_list[0] =
+ rt_orb->create_client_protocol_policy (protocols);
+
+ policy_current->set_policy_overrides (policy_list,
+ CORBA::SET_OVERRIDE);
+
+ server2->test_method ();
+
+ // Testing over. Shut down server ORB.
+ ACE_DEBUG ((LM_DEBUG,
+ "\n Testing over\n"));
+ server2->shutdown ();
+
+ // Needed for SHMIOP to work fine. Please dont remove. Please
+ // see Bug 1197 for details.
+ ACE_OS::sleep (5);
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception (
+ "Unexpected exception caught in ClientProtocolPolicy test client:");
+ return -1;
+ }
+
+ return 0;
+}