summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TAO/ChangeLog9
-rw-r--r--TAO/tests/DynUnion_Test/DynUnionTest.cpp166
-rw-r--r--TAO/tests/DynUnion_Test/dynany.idl11
-rw-r--r--TAO/tests/DynUnion_Test/dynunion_test.mpc18
-rwxr-xr-xTAO/tests/DynUnion_Test/run_test.pl30
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;