diff options
Diffstat (limited to 'tests/Bug_1383_Regression/SimpleClient.cpp')
-rw-r--r-- | tests/Bug_1383_Regression/SimpleClient.cpp | 216 |
1 files changed, 111 insertions, 105 deletions
diff --git a/tests/Bug_1383_Regression/SimpleClient.cpp b/tests/Bug_1383_Regression/SimpleClient.cpp index ea3fa36e0bf..4b9cc99d591 100644 --- a/tests/Bug_1383_Regression/SimpleClient.cpp +++ b/tests/Bug_1383_Regression/SimpleClient.cpp @@ -7,122 +7,128 @@ #include "Callee_i.h" #include "tao/IORManipulation/IORManip_Loader.h" -CORBA::ORB_var orb; +CORBA::ORB_var _orb; ACE_THR_FUNC_RETURN RunFunc(void *) { - ACE_DEBUG ((LM_DEBUG, "running the orb\n")); - orb->run(); - ACE_DEBUG ((LM_DEBUG, "done running orb\n")); + ACE_DEBUG ((LM_DEBUG, "running the _orb\n")); + _orb->run(); + ACE_DEBUG ((LM_DEBUG, "done running _orb\n")); return 0; } int ACE_TMAIN (int argc, ACE_TCHAR *argv[]) { - // initialize the ORB - orb = CORBA::ORB_init (argc, argv); - - // Get the "RootPOA" - CORBA::Object_var obj = orb->resolve_initial_references("RootPOA"); - PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in ()); - - // activate its managers so it can handle incoming requests - poa->the_POAManager()->activate(); - - // get a thread going to handle incoming requests - ACE_Thread::spawn(RunFunc); - - // we could also use the corbaloc syntax to get a reference to the - // object. This will cause the orb to talk directly to the other - // orb with no name service or common file involved. - obj = orb->string_to_object("corbaloc::localhost:9999/Simple"); - - if (CORBA::is_nil(obj.in ())) + try { - ACE_ERROR ((LM_ERROR, "could not get reference\n")); - return 1; + // initialize the ORB + _orb = CORBA::ORB_init (argc, argv); + + // Get the "RootPOA" + CORBA::Object_var obj = _orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj.in ()); + + // activate its managers so it can handle incoming requests + poa->the_POAManager()->activate(); + + // get a thread going to handle incoming requests + ACE_Thread::spawn(RunFunc); + + // we could also use the c_orbaloc syntax to get a reference to the + // object. This will cause the _orb to talk directly to the other + // _orb with no name service or common file involved. + obj = _orb->string_to_object("c_orbaloc::localhost:9999/Simple"); + + if (CORBA::is_nil(obj.in ())) + { + ACE_ERROR ((LM_ERROR, "could not get reference\n")); + return 1; + } + + // narrow the reference to the particular type we wish to deal with + Simple_var simple = Simple::_narrow(obj.in ()); + if (CORBA::is_nil(simple.in ())) + { + ACE_ERROR ((LM_ERROR, "could not get reference\n")); + return 1; + } + + // create an object reference that has a bogus value for the first + // profile + obj = _orb->resolve_initial_references("IORManipulation"); + TAO_IOP::TAO_IOR_Manipulation_var iorm = + TAO_IOP::TAO_IOR_Manipulation::_narrow(obj.in()); + + // Status: The following scenarios appear to work: + // - first profile invalid host name, second profile valid. + // - first profile invalid ip number, second profiel valid. + // - first profiel invalid port number, second profile valid. + // + // The following causes a core dump of the server: + // - first and second invalid + // + // Note that he iormanip is being used since it is not practical + // to have a test case that depends on a VPN being present. + // + CORBA::Object_var name1 = + _orb->string_to_object ("c_orbaloc:iiop:10.0.2.3:6060/xyz"); + CORBA::Object_var name2 = + _orb->string_to_object ("c_orbaloc:iiop:daisnot:7070/xyz"); + CORBA::String_var name1_ior = _orb->object_to_string(name1.in()); + CORBA::String_var name2_ior = _orb->object_to_string(name2.in()); + + // create a callback object + Callee_i * callee_i = new Callee_i; + // get the CORBA reference + PortableServer::ObjectId_var id = + poa->activate_object (callee_i); + + CORBA::Object_var object_act = poa->id_to_reference (id.in ()); + + Callee_var callee = Callee::_narrow (object_act.in ()); + + if (CORBA::is_nil(callee.in ())) + { + ACE_ERROR ((LM_ERROR, "could not get callback object\n")); + return 1; + } + else + { + CORBA::String_var str = _orb->object_to_string(callee.in ()); + FILE *output_file= ACE_OS::fopen ("ior", "w"); + if (output_file == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Cannot open output file for writing IOR: ior\n"), + 1); + ACE_OS::fprintf (output_file, "%s", str.in ()); + ACE_OS::fclose (output_file); + } + + // create a reference with two profiles with the first on being + // bogus. If things work as they should the callback should be + // succesful with the ORB trying the second profile. + TAO_IOP::TAO_IOR_Manipulation::IORList iors (2); + iors.length (2); + iors [0] = name1; + iors [1] = name2; + + CORBA::Object_var merged = iorm->merge_iors(iors); + Callee_var doubleCallee = Callee::_unchecked_narrow(merged.in()); + + ACE_DEBUG ((LM_DEBUG, "Profile count is %d\n", + iorm->get_profile_count(merged.in()))); + + simple->registerCallee(doubleCallee.in ()); + + ACE_OS::sleep(120); + + ACE_DEBUG ((LM_DEBUG, "done sleeping\n")); + + _orb->shutdown(1); } - - // narrow the reference to the particular type we wish to deal with - Simple_var simple = Simple::_narrow(obj.in ()); - if (CORBA::is_nil(simple.in ())) + catch (const ::CORBA::Exception &ex) { - ACE_ERROR ((LM_ERROR, "could not get reference\n")); - return 1; + ex._tao_print_exception("Caught unexpected CORBA exception :"); } - - // create an object reference that has a bogus value for the first - // profile - obj = orb->resolve_initial_references("IORManipulation"); - TAO_IOP::TAO_IOR_Manipulation_var iorm = - TAO_IOP::TAO_IOR_Manipulation::_narrow(obj.in()); - - // Status: The following scenarios appear to work: - // - first profile invalid host name, second profile valid. - // - first profile invalid ip number, second profiel valid. - // - first profiel invalid port number, second profile valid. - // - // The following causes a core dump of the server: - // - first and second invalid - // - // Note that he iormanip is being used since it is not practical - // to have a test case that depends on a VPN being present. - // - CORBA::Object_var name1 = - orb->string_to_object ("corbaloc:iiop:10.0.2.3:6060/xyz"); - CORBA::Object_var name2 = - orb->string_to_object ("corbaloc:iiop:daisnot:7070/xyz"); - CORBA::String_var name1_ior = orb->object_to_string(name1.in()); - CORBA::String_var name2_ior = orb->object_to_string(name2.in()); - - // create a callback object - Callee_i * callee_i = new Callee_i; - // get the CORBA reference - PortableServer::ObjectId_var id = - poa->activate_object (callee_i); - - CORBA::Object_var object_act = poa->id_to_reference (id.in ()); - - Callee_var callee = Callee::_narrow (object_act.in ()); - - if (CORBA::is_nil(callee.in ())) - { - ACE_ERROR ((LM_ERROR, "could not get callback object\n")); - return 1; - } - else - { - CORBA::String_var str = orb->object_to_string(callee.in ()); - FILE *output_file= ACE_OS::fopen ("ior", "w"); - if (output_file == 0) - ACE_ERROR_RETURN ((LM_ERROR, - "Cannot open output file for writing IOR: ior\n"), - 1); - ACE_OS::fprintf (output_file, "%s", str.in ()); - ACE_OS::fclose (output_file); - } - - // create a reference with two profiles with the first on being - // bogus. If things work as they should the callback should be - // succesful with the ORB trying the second profile. - TAO_IOP::TAO_IOR_Manipulation::IORList iors (2); - iors.length (2); - iors [0] = name1; - iors [1] = name2; - - CORBA::Object_var merged = iorm->merge_iors(iors); - Callee_var doubleCallee = Callee::_unchecked_narrow(merged.in()); - - ACE_DEBUG ((LM_DEBUG, "Profile count is %d\n", - iorm->get_profile_count(merged.in()))); - - simple->registerCallee(doubleCallee.in ()); - - ACE_OS::sleep(120); - - ACE_DEBUG ((LM_DEBUG, "done slpeeing\n")); - - orb->shutdown(1); - return 0; } |