diff options
-rw-r--r-- | TAO/ChangeLog | 9 | ||||
-rw-r--r-- | TAO/tests/DynUnion_Test/DynUnionTest.cpp | 166 | ||||
-rw-r--r-- | TAO/tests/DynUnion_Test/dynany.idl | 11 | ||||
-rw-r--r-- | TAO/tests/DynUnion_Test/dynunion_test.mpc | 18 | ||||
-rwxr-xr-x | TAO/tests/DynUnion_Test/run_test.pl | 30 |
5 files changed, 233 insertions, 1 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index 8593e994fbf..c737c64b5ec 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,10 +1,17 @@ +Tue Mar 13 09:55:52 UTC 2007 Johnny Willemsen <jwillemsen@remedy.nl> + + * tests/DynUnion_Test/*: + New DynUnion test, thanks to Khan Arshad <khan dot m dot arshad at gmail dot com> + for creating this test. According to the reporter this failed with 1.5 + but it works on svn head without problems. + Mon Mar 12 22:29:32 UTC 2007 Ossama Othman <ossama_othman at symantec dot com> * tao/checked_iterator.h: Moved to ACE. - * tao/Generic_Sequence_T.h: + * tao/Generic_Sequence_T.h: * tao/Unbounded_Octet_Sequence_T.h: Updated include directives. The checked_iterator.h header is diff --git a/TAO/tests/DynUnion_Test/DynUnionTest.cpp b/TAO/tests/DynUnion_Test/DynUnionTest.cpp new file mode 100644 index 00000000000..33aaba5e308 --- /dev/null +++ b/TAO/tests/DynUnion_Test/DynUnionTest.cpp @@ -0,0 +1,166 @@ +// $Id$ + +#include "dynanyC.h" +#include "tao/DynamicAny/DynamicAny.h" +#include "tao/TypeCodeFactory/TypeCodeFactory_Loader.h" + +// Creates DynUnion using typecodes generated through IDL compiler. +int runStatic(CORBA::ORB_ptr orb) +{ + try + { + CORBA::Object_var obj = + orb->resolve_initial_references("DynAnyFactory"); + + DynamicAny::DynAnyFactory_var dfact = + DynamicAny::DynAnyFactory::_narrow(obj); + + if (CORBA::is_nil (dfact.in ())) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Nil dynamic any factory after narrow\n"), + -1); + } + + DynamicAny::DynAny_var dany = + dfact->create_dyn_any_from_type_code(DynAnyTest::_tc_EventData); + + DynamicAny::DynUnion_var dunion = + DynamicAny::DynUnion::_narrow(dany); + + DynamicAny::DynAny_var disc = dunion->get_discriminator(); + + DynamicAny::DynEnum_var denum = + DynamicAny::DynEnum::_narrow(disc); + + if (CORBA::is_nil (denum.in ())) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Nil dynamic enum after narrow\n"), + -1); + } + + ACE_DEBUG ((LM_DEBUG, "Static Test Passed\n")); + } + catch (const CORBA::Exception & ex) + { + ex._tao_print_exception ("runStatic"); + return -1; + } + + return 0; +} + +// Creates DynUnion from typecode created programmatically + +int runDynamic(CORBA::ORB_ptr orb) +{ + try + { + // Create typecode for EventKind. + + CORBA::EnumMemberSeq eseq; + + eseq.length(2); + + eseq[0] = CORBA::string_dup("ALARM_EVENT"); + eseq[1] = CORBA::string_dup("LOG_EVENT"); + + CORBA::TypeCode_var eventKindTc; + + eventKindTc = orb->create_enum_tc("IDL:DynAnyTest/EventKind:1.0", + "EventKind", + eseq); + + // Create typecode for EventData. EventKind tc is used. + + CORBA::Any label; + CORBA::UnionMemberSeq useq; + + useq.length(2); + + label <<= DynAnyTest::ALARM_EVENT; + useq[0].name = CORBA::string_dup("ev_data"); + useq[0].label = label; + useq[0].type = CORBA::TypeCode::_duplicate(CORBA::_tc_any); + useq[0].type_def = CORBA::IDLType::_nil (); + + label <<= DynAnyTest::LOG_EVENT; + useq[1].name = CORBA::string_dup("ev_desc"); + useq[1].label = label; + useq[1].type = CORBA::TypeCode::_duplicate(CORBA::_tc_string); + useq[1].type_def = CORBA::IDLType::_nil (); + + CORBA::TypeCode_var eventDataTc; + + eventDataTc = orb->create_union_tc("IDL:DynAnyTest/EventData:1.0", + "EventData", + eventKindTc, + useq); + + // Now create DynUnion + + CORBA::Object_var obj = orb->resolve_initial_references("DynAnyFactory"); + + DynamicAny::DynAnyFactory_var dfact = + DynamicAny::DynAnyFactory::_narrow(obj); + + if (CORBA::is_nil (dfact.in ())) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Nil dynamic any factory after narrow\n"), + -1); + } + + DynamicAny::DynAny_var dany = + dfact->create_dyn_any_from_type_code(eventDataTc); + + DynamicAny::DynUnion_var dunion = + DynamicAny::DynUnion::_narrow(dany); + + DynamicAny::DynAny_var disc = dunion->get_discriminator(); + + DynamicAny::DynEnum_var denum = + DynamicAny::DynEnum::_narrow(disc); + + // This fails. The type of discriminator is ulong + if (CORBA::is_nil (denum.in ())) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Nil dynamic enum after narrow\n"), + -1); + } + + ACE_DEBUG ((LM_DEBUG, "Dynamic Test Passed\n")); + + denum->destroy(); + dunion->destroy(); + } + catch (const CORBA::Exception & ex) + { + ex._tao_print_exception ("Dynamic Test Failed with exception"); + } + return 0; +} + +int main(int argc, char * argv[]) +{ + try + { + CORBA::ORB_var orb = CORBA::ORB_init(argc, argv); + + if (runStatic(orb.in()) != 0) + return -1; + + if (runDynamic(orb.in()) != 0) + return -1; + } + catch (const CORBA::Exception & ex) + { + ex._tao_print_exception ("Tests failed with exception"); + return 1; + } + + return 0; +} + diff --git a/TAO/tests/DynUnion_Test/dynany.idl b/TAO/tests/DynUnion_Test/dynany.idl new file mode 100644 index 00000000000..bd245a5fcf0 --- /dev/null +++ b/TAO/tests/DynUnion_Test/dynany.idl @@ -0,0 +1,11 @@ +// $Id$ + +module DynAnyTest { + + enum EventKind {ALARM_EVENT, LOG_EVENT}; + + union EventData switch (EventKind) { + case ALARM_EVENT: any ev_data; + case LOG_EVENT: string ev_desc; + }; +}; diff --git a/TAO/tests/DynUnion_Test/dynunion_test.mpc b/TAO/tests/DynUnion_Test/dynunion_test.mpc new file mode 100644 index 00000000000..dd8a66703b9 --- /dev/null +++ b/TAO/tests/DynUnion_Test/dynunion_test.mpc @@ -0,0 +1,18 @@ +// $Id$ + +project(*IDL): dynamicany { + IDL_Files { + dynany.idl + } + custom_only = 1 +} + + +project(dynuniontest): dynamicany, typecodefactory { + exename = dynuniontest + after += *IDL + Source_Files { + DynUnionTest.cpp + dynanyC.cpp + } +} diff --git a/TAO/tests/DynUnion_Test/run_test.pl b/TAO/tests/DynUnion_Test/run_test.pl new file mode 100755 index 00000000000..2cec503b7fb --- /dev/null +++ b/TAO/tests/DynUnion_Test/run_test.pl @@ -0,0 +1,30 @@ +eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' + & eval 'exec perl -S $0 $argv:q' + if 0; + +# $Id$ +# -*- perl -*- + +use lib "$ENV{ACE_ROOT}/bin"; +use PerlACE::Run_Test; + +$status = 0; + +print STDOUT "Dyn Union\n\n"; + +if (PerlACE::is_vxworks_test()) { + $SV = new PerlACE::ProcessVX ("dynuniontest"); +} +else { + $SV = new PerlACE::Process ("dynuniontest"); +} + + +$server = $SV->SpawnWaitKill ($PerlACE::wait_interval_for_process_creation); + +if ($server != 0) { + print STDERR "ERROR: Dyn Union returned $server \n"; + $status = 1; +} + +exit $status; |