summaryrefslogtreecommitdiff
path: root/TAO/tests/OBV/Any/client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/OBV/Any/client.cpp')
-rw-r--r--TAO/tests/OBV/Any/client.cpp219
1 files changed, 219 insertions, 0 deletions
diff --git a/TAO/tests/OBV/Any/client.cpp b/TAO/tests/OBV/Any/client.cpp
new file mode 100644
index 00000000000..7bd3242eea3
--- /dev/null
+++ b/TAO/tests/OBV/Any/client.cpp
@@ -0,0 +1,219 @@
+// $Id$
+
+#include "AnyC.h"
+#include "ace/Get_Opt.h"
+
+ACE_RCSID(Any, client, "$Id$")
+
+const char *ior = "file://test.ior";
+
+int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "k:");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'k':
+ ior = get_opts.optarg;
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s "
+ "-k <ior> "
+ "\n",
+ argv [0]),
+ -1);
+ }
+ // Indicates sucessful parsing of the command line
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ try
+ {
+
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) client - test started.\n"));
+
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv);
+
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ // Create and register factories.
+
+ OBV_AnyTest::VA_init *va_factory = 0;
+ ACE_NEW_RETURN (va_factory,
+ OBV_AnyTest::VA_init,
+ 1); // supplied by mapping
+
+ orb->register_value_factory (va_factory->tao_repository_id (),
+ va_factory);
+ va_factory->_remove_ref (); // release ownership
+
+
+ OBV_AnyTest::VB_init *vb_factory = 0;
+ ACE_NEW_RETURN (vb_factory,
+ OBV_AnyTest::VB_init,
+ 1); // supplied by mapping
+
+ orb->register_value_factory (vb_factory->tao_repository_id (),
+ vb_factory);
+ vb_factory->_remove_ref (); // release ownership
+
+ // Do local test
+
+ OBV_AnyTest::VA_var va1, va2;
+ ACE_NEW_RETURN (va1.inout (), OBV_OBV_AnyTest::VA, 1);
+ ACE_NEW_RETURN (va2.inout (), OBV_OBV_AnyTest::VA, 1);
+
+ const CORBA::ULong magic = 3145;
+
+ va1->id (magic);
+ va2->id (magic);
+
+ CORBA::Any a1, a2;
+
+ // Test both copying and non-copying version of operator<<=
+ a1 <<= va1.in ();
+
+ OBV_AnyTest::VA *pva = va2._retn();
+ a2 <<= &pva;
+
+ OBV_AnyTest::VA* dst = 0;
+
+ if (!(a1 >>= dst) || dst->id () != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test failed.\n"),
+ 1);
+ }
+
+ if (!(a2 >>= dst) || dst->id () != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test failed.\n"),
+ 1);
+ }
+
+
+ // It should be possible to extract to a base type
+ OBV_AnyTest::VB_var vb1;
+ ACE_NEW_RETURN (vb1.inout (), OBV_OBV_AnyTest::VB, 1);
+ vb1->id (magic);
+
+ a1 <<= vb1.in ();
+ CORBA::ValueBase_var target;
+ if (!(a1 >>= CORBA::Any::to_value(target.out())))
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - base extraction test failed.\n"),
+ 1);
+ }
+ dst = OBV_AnyTest::VA::_downcast(target._retn());
+ if (dst == 0 || dst->id() != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - base extraction test failed.\n"),
+ 1);
+ }
+
+
+ // Now do remote test
+
+ CORBA::Object_var tmp =
+ orb->string_to_object(ior);
+
+ OBV_AnyTest::Test_var test =
+ OBV_AnyTest::Test::_narrow(tmp.in ());
+
+ if (CORBA::is_nil (test.in ()))
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "Nil OBV_AnyTest::Test reference <%s>\n",
+ ior),
+ 1);
+ }
+
+
+ // STEP 1.
+ CORBA::Any_var result = test->get_something (
+ 0);
+
+ if (!(result.inout () >>= dst) || dst->id () != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test 1 failed.\n"),
+ 1);
+ }
+
+ // STEP 2.
+ OBV_AnyTest::VB* dst_vb = 0;
+ result = test->get_something (
+ 1);
+
+ if (!(result.inout () >>= dst_vb) || dst_vb->id () != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test 2 failed.\n"),
+ 1);
+ }
+
+ // STEP 3. A sanity check demonstrating base-type pointer to
+ // derived type allowed.
+ OBV_AnyTest::VA* dst_va = test->get_vb();
+ if (dst_va->id () != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test 3 failed.\n"),
+ 1);
+ }
+
+#if !defined (TAO_HAS_OPTIMIZED_VALUETYPE_MARSHALING)
+ // @@ There's still a problem here with the optimized valuetype
+ // marshaling and passing values through anys. The problem is
+ // that while the Any in fact contains all of the required type
+ // information, there is no way to share that with the
+ // ValueBase::_tao_unmarshal_pre() which needs the type info in
+ // order to select the appropriate value factory.
+
+ // STEP 4. get a VB, but extract to a VA*.
+ result = test->get_something (
+ 1);
+
+ if (!(result.inout () >>= CORBA::Any::to_value(target.out())))
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test 4 extraction failed.\n"),
+ 1);
+ }
+ dst_va = OBV_AnyTest::VA::_downcast(target._retn());
+ if (dst_va == 0 || dst_va->id() != magic)
+ {
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "(%P|%t) client - test 4 failed.\n"),
+ 1);
+ }
+#endif /* TAO_HAS_OPTIMIZED_VALUETYPE_MARSHALING */
+
+ test->shutdown ();
+
+ orb->destroy ();
+
+ ACE_DEBUG ((LM_DEBUG, "(%P|%t) client - test finished.\n"));
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Exception caught in client:");
+ return 1;
+ }
+
+ return 0;
+}