summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/Concurrency/CC_client.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/Concurrency/CC_client.cpp')
-rw-r--r--TAO/orbsvcs/tests/Concurrency/CC_client.cpp465
1 files changed, 465 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/Concurrency/CC_client.cpp b/TAO/orbsvcs/tests/Concurrency/CC_client.cpp
new file mode 100644
index 00000000000..ca5afcee699
--- /dev/null
+++ b/TAO/orbsvcs/tests/Concurrency/CC_client.cpp
@@ -0,0 +1,465 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO/orbsvcs/tests
+//
+// = FILENAME
+// CC_client.h
+//
+// = DESCRIPTION
+// This is the test class for the concurrency service. The class
+// implements a client to the concurrency service.
+// This file contains the main function for the test.
+//
+// = AUTHORS
+// Torben Worm <tworm@cs.wustl.edu>
+//
+// ============================================================================
+
+#include "CC_client.h"
+
+#include "tao/debug.h"
+
+#include "ace/Read_Buffer.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_unistd.h"
+#include "ace/os_include/os_ctype.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_fcntl.h"
+
+ACE_RCSID(Concurrency, CC_client, "$Id$")
+
+// Constructor.
+CC_Client::CC_Client (void)
+ : naming_service_ (0),
+ cc_factory_ior_file_ (0),
+ cc_factory_key_ (0),
+ f_handle_ (ACE_INVALID_HANDLE),
+ shutdown_ (0),
+ use_naming_service_ (1),
+ run_basic_tests_ (0),
+ run_extended_tests_ (0),
+ use_script_file_ (0),
+ script_file_ (0)
+{
+}
+
+CC_Client::~CC_Client (void)
+{
+ // Free resources and close the ior files.
+ if (this->cc_factory_ior_file_)
+ ACE_OS::fclose (this->cc_factory_ior_file_);
+
+ if (this->f_handle_ != ACE_INVALID_HANDLE)
+ ACE_OS::close (this->f_handle_);
+
+ if (this->cc_factory_key_ != 0)
+ ACE_OS::free (this->cc_factory_key_);
+
+ if (naming_service_!=0)
+ delete naming_service_;
+}
+
+// Reads the lock set factory ior from a file
+
+int
+CC_Client::read_ior (char *filename)
+{
+ // Open the file for reading.
+ this->f_handle_ = ACE_OS::open (filename,0);
+
+ if (this->f_handle_ == ACE_INVALID_HANDLE)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open %s for writing: %p\n",
+ filename),
+ -1);
+ ACE_Read_Buffer ior_buffer (this->f_handle_);
+ this->cc_factory_key_ = ior_buffer.read ();
+
+ if (this->cc_factory_key_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to allocate memory to read ior: %p\n"),
+ -1);
+ return 0;
+}
+
+// Parses the command line arguments and returns an error status.
+
+int
+CC_Client::parse_args (void)
+{
+ ACE_Get_Opt get_opts (argc_, argv_, "dc:sf:k:xbhe:");
+ int c;
+ int result;
+
+ if(argc_==1) // No arguments given on command line
+ {
+ print_usage();
+ return -1;
+ }
+
+ while ((c = get_opts ()) != -1)
+ switch (c)
+ {
+ case 'b': // debug flag
+ this->run_basic_tests_ = 1;
+ break;
+ case 'c':
+ this->use_script_file_ = 1;
+ this->script_file_ = ACE_OS::strdup (get_opts.opt_arg ());
+ break;
+ case 'd': // debug flag
+ TAO_debug_level++;
+ break;
+ case 'e': // debug flag
+ run_extended_tests_ = 1;
+ this->extended_tests_params_ = ACE_OS::strdup (get_opts.opt_arg ());
+ break;
+ case 'f': // read the IOR from the file.
+ result = this->read_ior (get_opts.opt_arg ());
+ if (result < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to read ior from %s : %p\n",
+ get_opts.opt_arg ()),
+ -1);
+ break;
+ case 'k': // read the cubit IOR from the command-line.
+ this->cc_factory_key_ =
+ ACE_OS::strdup (get_opts.opt_arg ());
+ break;
+ case 'x':
+ this->shutdown_ = 1;
+ break;
+ case 's': // Don't use the TAO Naming Service.
+ this->use_naming_service_ = 0;
+ break;
+ case 'h':
+ default:
+ print_usage ();
+ ACE_ERROR_RETURN ((LM_ERROR, ""), -1);
+ }
+
+ // Indicates successful parsing of command line.
+ return 0;
+}
+
+// Execute client example code.
+
+int
+CC_Client::run (void)
+{
+ int tests_run = 0;
+ // Tells whether any tests have been run
+
+ int success = CC_SUCCESS;
+ // Did test succeed?
+
+ if (this->run_basic_tests_ && success == CC_SUCCESS)
+ {
+ success = run_basic_tests ();
+ if(success==CC_FAIL)
+ ACE_DEBUG((LM_DEBUG, "Basic tests did not succeed\n"));
+ tests_run = 1;
+ }
+
+ if (this->run_extended_tests_ && success == CC_SUCCESS)
+ {
+ success = run_extended_tests (this->extended_tests_params_);
+ if(success==CC_FAIL)
+ ACE_DEBUG((LM_DEBUG, "Extended tests did not succeed\n"));
+ tests_run = 1;
+ }
+
+ if(this->use_script_file_ && success == CC_SUCCESS)
+ {
+ cmdlist = new CC_CommandList();
+ FILE *f;
+
+ // Open the command file for parsing if the filename!=stdin
+ if(ACE_OS::strcmp(this->script_file_, "stdin")!=0)
+ {
+ f = ACE_OS::fopen(this->script_file_, "r");
+ if(f==0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "Unable to open %s\n",
+ this->script_file_),
+ -1);
+ ace_cc_yyin = f;
+ }
+ ace_cc_yyparse();
+ }
+
+ // Other tests go here
+ // if (other_test_flag && success == CC_SUCCESS) ...
+
+ if (this->shutdown_)
+ // @@TAO is this needed??
+
+ if (tests_run == 0)
+ {
+ print_usage ();
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "No tests given\n"),
+ -1);
+ }
+
+ return success;
+}
+
+// This function runs basic tests concerned with only one lock set
+
+int
+CC_Client::run_basic_tests (void)
+{
+ Test_Single_Lock_With_Mode t1 (naming_service_,
+ CosConcurrencyControl::read);
+ Test_Single_Lock_With_Mode t2 (naming_service_,
+ CosConcurrencyControl::write);
+ Test_Single_Lock_With_Mode t3 (naming_service_,
+ CosConcurrencyControl::upgrade);
+ Test_Single_Lock_With_Mode t4 (naming_service_,
+ CosConcurrencyControl::intention_read);
+ Test_Single_Lock_With_Mode t5 (naming_service_,
+ CosConcurrencyControl::intention_write);
+ // This test should be run for several different lock mode, but
+ // since we do not support
+ Test_Release_Not_Held_Lock t6 (naming_service_,
+ CosConcurrencyControl::read);
+ if (t1.run () == CC_SUCCESS &&
+ t2.run () == CC_SUCCESS &&
+ t3.run () == CC_SUCCESS &&
+ t4.run () == CC_SUCCESS &&
+ t5.run () == CC_SUCCESS &&
+ t6.run () == CC_SUCCESS )
+ return CC_SUCCESS;
+ else
+ return CC_FAIL;
+}
+
+int
+CC_Client::check_extended_test_params(char *params)
+{
+ // Format (regexp): [0-9]+;.*;.*
+ int no_of_params = 0;
+ char *cp = params; // pointer to walk along the string
+ enum {TAO_START, TAO_NUMBER, TAO_ARG, TAO_ERROR} state = TAO_START;
+
+ while(*cp!='\0')
+ {
+ switch(state)
+ {
+ case TAO_START:
+ if(isdigit(*cp))
+ state = TAO_NUMBER;
+ else
+ state = TAO_ERROR;
+ break;
+
+ case TAO_NUMBER:
+ if((*cp)==';')
+ {
+ state = TAO_ARG;
+ no_of_params++;
+ }
+ else
+ if(!isdigit(*cp))
+ state = TAO_ERROR;
+ break;
+
+ case TAO_ARG:
+ if((*cp)==';')
+ {
+ no_of_params++;
+ }
+ break;
+
+ case TAO_ERROR:
+ return -1;
+ // break;
+
+ default:
+ ACE_ERROR_RETURN((LM_ERROR,
+ "CC_Client::check_extended_test_params\n"), -1);
+ }
+ cp++;
+ }
+ if (state==TAO_ERROR) // there was only one character given and it was wrong
+ return -1;
+ else
+ return no_of_params;
+}
+
+int
+CC_Client::run_extended_tests (char *params)
+{
+ int success = CC_FAIL;
+ int no_of_args = 0;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Params: %s\n",
+ params));
+
+ no_of_args = check_extended_test_params(params);
+ if(no_of_args==-1)
+ {
+ ACE_ERROR_RETURN((LM_ERROR,
+ "Error in parameter string (%s). Format: '<test#>;<arg1>;<arg2>'\n", params), CC_FAIL);
+ }
+
+ ACE_DEBUG((LM_DEBUG, "Number of arguments: %i\n", no_of_args));
+
+ char *cmd = ACE_OS::strtok (params, ";");
+ char *arg1 = ACE_OS::strtok (0, ";");
+ // char *arg2 = ACE_OS::strtok (0, ";");
+
+ // A possible scenario using test 1,2, and 3 Create and lock the
+ // lock set with the name 'Name'
+ // ./CC_client -e '1;Name'
+ // Try to lock the same lock set. The process will hang
+ // ./CC_client -e '2:Name'
+ // Unlocks the lock set. Now test 2 will continue.
+ // ./CC_client -e '3:Name'
+
+ if (ACE_OS::strcmp (cmd, "1") == 0)
+ {
+ Test_Setup_LockSet t1 (naming_service_, arg1);
+ success = t1.run ();
+ }
+
+ if (ACE_OS::strcmp (cmd, "2") == 0)
+ {
+ Test_Use_Already_Created_LockSet t2 (naming_service_, arg1);
+ success = t2.run ();
+ }
+
+ if (ACE_OS::strcmp (cmd, "3") == 0)
+ {
+ Test_Unlock_Already_Created_LockSet t3 (naming_service_, arg1);
+ success = t3.run ();
+ }
+
+ return success;
+}
+
+void
+CC_Client::print_usage (void)
+{
+ ACE_ERROR ((LM_ERROR,
+ "usage: %s"
+ " [-b]"
+ " [-c] cc-test-script"
+ " [-d]"
+ " [-f cc_factory-obj-ref-key-file]"
+ " [-k cc-obj-ref-key]"
+ " [-x]"
+ " [-s]"
+ "\n",
+ this->argv_ [0]));
+}
+
+int
+CC_Client::init_naming_service (void)
+{
+ try
+ {
+ ACE_NEW_RETURN (naming_service_,
+ CC_naming_service,
+ -1);
+
+ this->naming_service_->Init (this->orb_);
+ }
+ catch (const CORBA::Exception&)
+ {
+ return -1;
+ }
+ return 0;
+}
+
+int
+CC_Client::init (int argc, char **argv)
+{
+ int naming_result;
+ this->argc_ = argc;
+ this->argv_ = argv;
+
+ try
+ {
+ // Retrieve the ORB.
+ this->orb_ = CORBA::ORB_init (this->argc_,
+ this->argv_,
+ "internet");
+
+ // Parse command line and verify parameters.
+ if (this->parse_args () == -1)
+ return -1;
+
+ if (this->use_naming_service_)
+ {
+ naming_result = this->init_naming_service ();
+ if (naming_result < 0)
+ return naming_result;
+ }
+ else
+ {
+ if (this->cc_factory_key_ == 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "%s: no lock set factory key specified\n",
+ this->argv_[0]),
+ -1);
+
+
+ CORBA::Object_var factory_object =
+ this->orb_->string_to_object (this->cc_factory_key_);
+
+#if 0
+ // The test cannot currently run without the naming service.
+ this->factory_ =
+ CosConcurrencyControl::LockSetFactory::_narrow
+ (factory_object.in ());
+
+ if (CORBA::is_nil (this->factory_.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "invalid factory key <%s>\n",
+ this->cc_factory_key_),
+ -1);
+#endif /* 0 */
+ }
+
+ ACE_DEBUG ((LM_DEBUG,
+ "Factory received OK\n"));
+
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ex._tao_print_exception ("CC_Client::init");
+ return -1;
+ }
+
+ return 0;
+}
+
+// This function runs the test.
+
+int
+main (int argc, char **argv)
+{
+ CC_Client cc_client;
+
+ ACE_DEBUG ((LM_DEBUG,
+ "\n \t CosConcurrencyControl: client \n\n"));
+
+ if (cc_client.init (argc, argv) == -1)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Did not initialize correctly\n"));
+ return 1;
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Running the test\n"));
+ return cc_client.run ();
+ }
+}