summaryrefslogtreecommitdiff
path: root/TAO/tests/Permanent_Forward/StubTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tests/Permanent_Forward/StubTest.cpp')
-rw-r--r--TAO/tests/Permanent_Forward/StubTest.cpp353
1 files changed, 353 insertions, 0 deletions
diff --git a/TAO/tests/Permanent_Forward/StubTest.cpp b/TAO/tests/Permanent_Forward/StubTest.cpp
new file mode 100644
index 00000000000..cf3e5176b71
--- /dev/null
+++ b/TAO/tests/Permanent_Forward/StubTest.cpp
@@ -0,0 +1,353 @@
+// $Id$
+
+//========================================================================
+/**
+ * @file StubTest.cpp
+ *
+ * This program tests the basic functionality of the TAO_Stub in case
+ * of permanent_forward
+ *
+ * @author Frank Rehberger
+ */
+//=========================================================================
+
+
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+#include "tao/ORB.h"
+#include "tao/Environment.h"
+#include "tao/SystemException.h"
+#include "tao/Object.h"
+#include "tao/Stub.h"
+#include "tao/Profile.h"
+#include "tao/IIOP_Profile.h"
+
+#ifndef FRANKS_ASSERT
+#define FRANKS_ASSERT(X) \
+ ((X) \
+ ? static_cast<void>(0) \
+ : ACE_VERSIONED_NAMESPACE_NAME::__ace_assert(__FILE__, __LINE__, ACE_TEXT_CHAR_TO_TCHAR (#X)))
+#endif
+
+ACE_RCSID (Permanent_Forward,
+ StubTest,
+ "$Id$")
+
+static bool
+is_endpoint (TAO_Profile *profile, const char *host, unsigned short port)
+ {
+ TAO_IIOP_Profile *iiop = dynamic_cast<TAO_IIOP_Profile*> (profile);
+ TAO_Endpoint *endpoint = iiop->endpoint ();
+ TAO_IIOP_Endpoint *iiop_endpoint = dynamic_cast<TAO_IIOP_Endpoint*> (endpoint);
+ const char * endpoint_host = iiop_endpoint->host();
+ unsigned short endpoint_port = iiop_endpoint->port();
+
+ bool retval =
+ ACE_OS::strcmp (endpoint_host, host)==0
+ && endpoint_port == port;
+
+ return retval;
+ }
+
+static bool
+equal_endpoint (TAO_Profile *profile, TAO_Profile *other)
+ {
+ TAO_IIOP_Profile *iiop = dynamic_cast<TAO_IIOP_Profile*> (profile);
+ TAO_Endpoint *endpoint = iiop->endpoint ();
+ TAO_IIOP_Endpoint *iiop_endpoint = dynamic_cast<TAO_IIOP_Endpoint*> (endpoint);
+ const char * endpoint_host = iiop_endpoint->host();
+ unsigned short endpoint_port = iiop_endpoint->port();
+
+ TAO_IIOP_Profile *other_iiop = dynamic_cast<TAO_IIOP_Profile*> (other);
+ TAO_Endpoint *other_endpoint = other_iiop->endpoint ();
+ TAO_IIOP_Endpoint *other_iiop_endpoint = dynamic_cast<TAO_IIOP_Endpoint*> (other_endpoint);
+ const char * other_endpoint_host = other_iiop_endpoint->host();
+ unsigned short other_endpoint_port = other_iiop_endpoint->port();
+
+ bool retval =
+ ACE_OS::strcmp (endpoint_host, other_endpoint_host)==0
+ && endpoint_port == other_endpoint_port;
+
+ return retval;
+ }
+
+static bool
+marshaled_equal_to_other (CORBA::ORB_ptr orb, CORBA::Object_ptr obj, TAO_MProfile *other_mprofile)
+{
+ CORBA::String_var str = orb->object_to_string (obj);
+
+ CORBA::Object_var obj_copy = orb->string_to_object (str.in ());
+
+ TAO_Stub *stub_copy = obj_copy->_stubobj ();
+ TAO_MProfile *copy_mprofile = &(stub_copy->base_profiles ());
+
+ if ( copy_mprofile->size() != other_mprofile->size())
+ return false;
+
+ for (size_t i=0; i<copy_mprofile->size(); ++i)
+ {
+ TAO_Profile *copy_profile = copy_mprofile->get_profile (i);
+ TAO_Profile *other_profile = other_mprofile->get_profile (i);
+
+ if ( ! equal_endpoint (copy_profile, other_profile) )
+ return false;
+ }
+
+ return true;
+}
+
+static void
+test_forward_permanent (CORBA::ORB_ptr orb)
+{
+ CORBA::Object_var obj1 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:1111,iiop:192.168.1.3:1111/NameService");
+
+ // the permanent profile
+ CORBA::Object_var obj4 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:4444,iiop:192.168.1.3:4444/NameService");
+
+ TAO_Stub *stub1 = obj1->_stubobj ();
+ TAO_Stub *stub4 = obj4->_stubobj ();
+
+ TAO_Profile *profile = NULL;
+
+ profile = stub1->profile_in_use ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 1111));
+
+ // ----- forward to obj2 permanently
+ stub1->add_forward_profiles (stub4->base_profiles(), true /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 4444));
+
+ // ----- stringified object reference must be equal to obj4->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub4->base_profiles())) );
+
+ // ----- consume second profile of obj2
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.3", 4444));
+
+
+ // ----- reached end, next_profile() must yield NULL
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (profile == NULL);
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+}
+
+static void
+test_forward_permanent_mix (CORBA::ORB_ptr orb)
+{
+ CORBA::Object_var obj1 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:1111,iiop:192.168.1.3:1111/NameService");
+
+ CORBA::Object_var obj2 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:2222,iiop:192.168.1.3:2222/NameService");
+
+ CORBA::Object_var obj3 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:3333,iiop:192.168.1.3:3333/NameService");
+
+ CORBA::Object_var obj4 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:4444,iiop:192.168.1.3:4444/NameService");
+
+ CORBA::Object_var obj5 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:5555,iiop:192.168.1.3:5555/NameService");
+
+ TAO_Stub *stub1 = obj1->_stubobj ();
+ TAO_Stub *stub2 = obj2->_stubobj ();
+ TAO_Stub *stub3 = obj3->_stubobj ();
+ TAO_Stub *stub4 = obj4->_stubobj ();
+ TAO_Stub *stub5 = obj5->_stubobj ();
+
+ TAO_Profile *profile = NULL;
+
+ profile = stub1->profile_in_use ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 1111));
+
+ // ----- forward to obj2
+ stub1->add_forward_profiles (stub2->base_profiles(), false /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 2222));
+
+ // ----- forward to obj3
+ stub1->add_forward_profiles (stub3->base_profiles(), false /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 3333));
+
+ // ----- stringified object reference must be equal to obj1->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub1->base_profiles())) );
+
+ // ----- forward to obj4 permanently
+ stub1->add_forward_profiles (stub4->base_profiles(), true /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 4444));
+
+ // ----- stringified object reference must be equal to obj4->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub4->base_profiles())) );
+
+ // ----- consume second profile from obj4
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.3", 4444));
+
+ // ----- forward to obj2
+ stub1->add_forward_profiles (stub2->base_profiles(), false /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 2222));
+
+ // ----- forward to obj3
+ stub1->add_forward_profiles (stub3->base_profiles(), false /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 3333));
+
+ // ----- stringified object reference must be equal to obj4->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub4->base_profiles())) );
+
+ // ----- forward to obj5 permanently
+ stub1->add_forward_profiles (stub5->base_profiles(), true /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 5555));
+
+ // ----- stringified object reference must be equal to obj5->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub5->base_profiles())) );
+
+ // ----- consume second profile from obj5
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.3", 5555));
+
+ // ----- stringified object reference must be equal to obj1->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub5->base_profiles())) );
+
+ // reached end of profiles, next_profile must return NULL
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (profile == NULL);
+}
+
+static void
+test_forward (CORBA::ORB_ptr orb)
+{
+ CORBA::Object_var obj1 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:1111,iiop:192.168.1.3:1111/NameService");
+
+ CORBA::Object_var obj2 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:2222,iiop:192.168.1.3:2222/NameService");
+
+ CORBA::Object_var obj3 = orb->string_to_object ("corbaloc:iiop:192.168.1.2:3333,iiop:192.168.1.3:3333/NameService");
+
+ TAO_Stub *stub1 = obj1->_stubobj ();
+ TAO_Stub *stub2 = obj2->_stubobj ();
+ TAO_Stub *stub3 = obj3->_stubobj ();
+
+ TAO_Profile *profile = NULL;
+
+ profile = stub1->profile_in_use ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 1111));
+
+ // ----- forward to obj2
+ stub1->add_forward_profiles (stub2->base_profiles(), false /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 2222));
+
+ // ----- forward to obj3
+
+ stub1->add_forward_profiles (stub3->base_profiles(), false /* permanent */ );
+
+ FRANKS_ASSERT (stub1->forward_profiles () != NULL);
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.2", 3333));
+
+ // ----- stringified object reference must be equal to obj1->base_prpfiles().
+ FRANKS_ASSERT (marshaled_equal_to_other (orb, obj1.in (), &(stub1->base_profiles())) );
+
+ // ----- consume second profile of obj3
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.3", 3333));
+
+ // ----- consume second profile of obj2
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.3", 2222));
+
+ // ----- consume second profile of obj1
+
+ profile = stub1->next_profile ();
+
+ FRANKS_ASSERT (is_endpoint (profile, "192.168.1.3", 1111));
+
+ FRANKS_ASSERT (stub1->forward_profiles () == NULL);
+
+ // ----- reached end, next_profile() must yield NULL
+
+ profile = stub1->next_profile ();
+}
+
+int
+main (int argc, char *argv[])
+{
+ ACE_DEBUG ((LM_DEBUG, "---------------------------------------------\n"));
+ ACE_DEBUG ((LM_DEBUG, "Running the Stub Tests.\n"));
+
+ try
+ {
+ // Retrieve the ORB.
+ CORBA::ORB_var orb = CORBA::ORB_init (argc,
+ argv,
+ "");
+
+ test_forward (orb.in());
+ test_forward_permanent (orb.in());
+ test_forward_permanent_mix (orb.in());
+ }
+ catch (const CORBA::SystemException& sysex)
+ {
+ sysex._tao_print_exception ("Unexpected system Exception!!\n");
+ return -1;
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("Unexpected CORBA Exception!\n");
+ return -1;
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Stub Tests Successfully Completed!\n"));
+ ACE_DEBUG ((LM_DEBUG, "---------------------------------------------\n"));
+
+ return 0;
+}