diff options
Diffstat (limited to 'TAO/orbsvcs/tests/FT_App/FT_Client.cpp')
-rw-r--r-- | TAO/orbsvcs/tests/FT_App/FT_Client.cpp | 647 |
1 files changed, 0 insertions, 647 deletions
diff --git a/TAO/orbsvcs/tests/FT_App/FT_Client.cpp b/TAO/orbsvcs/tests/FT_App/FT_Client.cpp deleted file mode 100644 index 2c77a1e7750..00000000000 --- a/TAO/orbsvcs/tests/FT_App/FT_Client.cpp +++ /dev/null @@ -1,647 +0,0 @@ -// $Id$ - -#include "FT_TestReplicaC.h" -#include <ace/Vector_T.h> -#include <ace/SString.h> -#include <ace/Get_Opt.h> -// FUZZ: disable check_for_streams_include -#include "ace/streams.h" -#include "ace/OS_NS_unistd.h" -#include "ace/OS_NS_stdio.h" - -class FTClientMain -{ - typedef ACE_Vector<ACE_CString> StringVec; - public: - /////////////////////////// - // construction/destruction - FTClientMain (); - - ~FTClientMain (); - - ///////////////// - // initialization - int parse_args (int argc, char *argv[]); - - //////////// - // execution - int run (ACE_ENV_SINGLE_ARG_DECL); - - ///////////////// - // implementation -private: - void usage (FILE* out)const; - void commandUsage (FILE* out); - int pass ( - long & counter, // inout - int & more, // out - ACE_CString & command, // inout - int retry // in - ACE_ENV_ARG_DECL); - - - int next_replica (ACE_ENV_SINGLE_ARG_DECL); - - //////////////////// - // forbidden methods - private: - FTClientMain (const FTClientMain & rhs); - FTClientMain & operator = (const FTClientMain & rhs); - - //////////////// - // Data members - private: - - CORBA::ORB_var orb_; - - int argc_; - char ** argv_; - const char * inFileName_; - FILE *inFile_; - FILE *commandIn_; - - enum Verbosity{ - SILENT, - QUIET, - NORMAL, - NOISY, - LOUD} - verbose_; - - - StringVec replica_iors_; - size_t replica_pos_; - const char * replica_name_; - FT_TEST::TestReplica_var replica_; -}; - - -FTClientMain::FTClientMain () - : inFile_(0) - , commandIn_(stdin) - , verbose_(NORMAL) - , replica_pos_(0) - , replica_name_("none") -{ -} - -FTClientMain::~FTClientMain () -{ - if (this->inFile_) - { - ACE_OS::fclose (this->inFile_); - this->inFile_ = 0; - } -} - -void FTClientMain::commandUsage(FILE* out) -{ - ACE_OS::fprintf (out, - "Each command must be at the beginning of a separate line.\n" - "Everything after the command (and operand if any) is ignored.\n" - "Valid commands are:\n" - " Access via method call:\n" - " =N set counter to N\n" - " cN get counter and compare to N (c stands for \"check\"\n" - " +N increment counter by N\n" - " -N decrement counter by N\n" - " Access as attribute:\n" - " >N set attribute to N\n" - " < get attribite\n" - " Try methods to be used by fault tolerant infrastructure: \n" - " ! is_alive\n" - " s get_state\n" - " S set_state\n" - " u get_update\n" - " U set_update\n" - " Simulate failure:\n" - " dN die on condition:\n" - " d%d don't die\n" - " d%d immediately\n" - " d%d while idle\n" - " (FT_TestReplica interface)\n" - " d%d before state change\n" - " d%d after state change, before replication\n" - " d%d after replication, before reply \n" - " (Monitorable interface)\n" - " d%d during is alive\n" - " d%d is_alive returns false\n" - " (Updatable interface)\n" - " d%d during get update\n" - " d%d before set update\n" - " d%d after set update\n" - " (Checkpointable interface)\n" - " d%d during get state\n" - " d%d before set state\n" - " d%d after set state\n" - " Logistics commands:\n" - " # ignore this line (comment).\n" - " v set verbosity:\n" - " 0 don't check counter value.\n" - " 1 only display counter value mismatch.\n" - " 2 display counter value after every command (default).\n" - " 3 display commands.\n" - " 4 display method calls.\n" - " zN sleep N seconds.\n" - " q quit (end the client, not the replica(s).)\n" - " q1 quit (end the client, and shutdown the currently active replica.)\n" - " ? help (this message)\n", - FT_TEST::TestReplica::NOT_YET, - FT_TEST::TestReplica::RIGHT_NOW, - FT_TEST::TestReplica::WHILE_IDLE, - FT_TEST::TestReplica::BEFORE_STATE_CHANGE, - FT_TEST::TestReplica::BEFORE_REPLICATION, - FT_TEST::TestReplica::BEFORE_REPLY, - FT_TEST::TestReplica::DURING_IS_ALIVE, - FT_TEST::TestReplica::DENY_IS_ALIVE, - FT_TEST::TestReplica::DURING_GET_UPDATE, - FT_TEST::TestReplica::BEFORE_SET_UPDATE, - FT_TEST::TestReplica::AFTER_SET_UPDATE, - FT_TEST::TestReplica::DURING_GET_STATE, - FT_TEST::TestReplica::BEFORE_SET_STATE, - FT_TEST::TestReplica::AFTER_SET_STATE); -} - -int -FTClientMain::parse_args (int argc, char *argv[]) -{ - this->argc_ = argc; - this->argv_ = argv; - int result = 0; - - // note: dfnkx are simple_util options - // include them here so we can detect bad args - ACE_Get_Opt get_opts (argc, argv, "c:f:"); - int c; - - while (result == 0 && (c = get_opts ()) != -1) - { - switch (c) - { - case 'c': - { - this->inFileName_ = get_opts.opt_arg (); - this->inFile_ = ACE_OS::fopen (this->inFileName_, "r"); - if(this->inFile_ && !ferror (this->inFile_)) - { - ACE_OS::fprintf (stdout, "FT Client: Reading commands from %s\n", this->inFileName_); - this->commandIn_ = this->inFile_; - } - else - { - ACE_OS::fprintf (stderr, "FT Client: Can't open input file: %s\n", this->inFileName_); - result = -1; - } - break; - } - case 'f': - { - replica_iors_.push_back(get_opts.opt_arg ()); - break; - } - - default: - case '?': - usage(stderr); - result = 1; - } - } - return result; -} - -void FTClientMain::usage(FILE* out)const -{ - ACE_OS::fprintf (out, "usage" - " -c <command file>" - " [-f <ior file>]...\n"); -} - -int FTClientMain::pass ( - long & counter, - int & more, - ACE_CString & command, - int retry - ACE_ENV_ARG_DECL) -{ - int result = 0; - - ::FT::State_var state; - unsigned long stateValue = 0; - ::FT::State_var update; - unsigned long updateValue = 0; - - while(more && result == 0 && !feof (this->commandIn_)) - { - if (! retry || command.length () == 0 ) - { - char buffer[1000]; - char *str_ = ACE_OS::fgets (buffer, sizeof(buffer)-1, this->commandIn_); - if ( str_ ) - { - str_ = ACE_OS::strrchr (str_, '\n'); - if ( str_ ) - *str_ = '\0'; - } - command = buffer; - } - retry = 0; - - if (command.length() >0) - { - char op = command[0]; - ACE_CString cdr = command.substr(1); - char * junque; - long operand = strtol(cdr.c_str(),&junque, 10); - - if (this->verbose_ >= NOISY) - { - ACE_OS::fprintf (stdout, "FT Client: %s\n", command.c_str()); - } - - // turn echo on (based on verbose) - // individual commands can turn it off - int echo = this->verbose_ >= QUIET; - - switch(op) - { - case '#': - { - echo = 0; - break; - } - case '=': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->set(%ld);\n", operand); - } - this->replica_->set(operand ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - counter = operand; - break; - } - case 'c': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->get();\n"); - } - long value = this->replica_->counter(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - if (value == operand) - { - ACE_OS::fprintf (stdout, "FT Client: Good: Read %ld expecting %ld\n", value, operand); - counter = operand; - } - else - { - ACE_OS::fprintf (stdout, "FT Client: Error: Read %ld expecting %ld\n", value, operand); - } - echo = 0; - break; - - } - case '>': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->counter(%ld);\n", operand); - } - this->replica_->counter(operand ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - counter = operand; - break; - } - case '+': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->increment(%ld);\n", operand); - } - this->replica_->increment(operand ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - counter += operand; - break; - } - case '-': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->increment(%ld);\n", -operand); - } - this->replica_->increment(-operand ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - counter -= operand; - break; - } - case '<': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->counter();\n"); - } - long attribute = this->replica_->counter(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - ACE_OS::fprintf (stdout, "FT Client: Attribute: %ld\n", attribute); - echo = 0; - break; - } - case '!': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->is_alive();\n"); - } - int alive = this->replica_->is_alive(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - ACE_OS::fprintf (stdout, "FT Client: Is alive? %d\n", alive); - break; - } - case 'd': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->die(%ld);\n", operand); - } - this->replica_->die(static_cast<FT_TEST::TestReplica::Bane> (operand) ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - echo = 0; - break; - } - case 's': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->get_state();\n"); - } - state = this->replica_->get_state(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - stateValue = counter; - break; - } - case 'S': - { - if (state->length () > 0) - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->set_state(saved_state);\n"); - } - this->replica_->set_state (state.in () - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - counter = stateValue; - } - else - { - ACE_OS::fprintf (stdout, "FT Client: Error: no saved state.\n"); - } - break; - } - case 'u': - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->get_update();\n"); - } - update = this->replica_->get_update(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - updateValue = counter; - break; - } - case 'U': - { - if (update->length () > 0) - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->set_update(saved_update);\n"); - } - this->replica_->set_update(update.in () ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - counter = updateValue; - } - else - { - ACE_OS::fprintf (stdout, "FT Client: ERROR: No saved update information.\n"); - } - break; - } - case 'v': - { - this->verbose_ = static_cast<Verbosity> (operand); - break; - } - case 'z': - { - if (operand == 0) - { - operand = 1; - } - ACE_Time_Value tv (operand,0); - ACE_OS::sleep(tv); - break; - } - case 'q': - { - if (operand != 0) - { - ACE_TRY_NEW_ENV - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->shutdown();\n"); - } - this->replica_->shutdown( ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - // @@ Note: this is here because the corba event loop seems to go to sleep - // if there's nothing for it to do. - // not quite sure why, yet. Dale - this->replica_->is_alive(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - ACE_OS::fprintf (stdout, "FT Client: Ignoring expected exception during shutdown.\n"); - ; // ignore exception during shutdown - } - ACE_ENDTRY; - } - echo = 0; - more = 0; - break; - } - default: - { - if (op != '?') - { - ACE_OS::fprintf (stdout, "FT Client: Unknown: %s\n", command.c_str()); - } - commandUsage(stderr); - break; - } - } - if (echo && this->verbose_ >= QUIET) - { - if (this->verbose_ >= LOUD) - { - ACE_OS::fprintf (stdout, "FT Client: ->get();\n"); - } - - long value = this->replica_->get(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - if (value == counter) - { - if (this->verbose_ >= NORMAL) - { - ACE_OS::fprintf (stdout, "FT Client: %ld\n", counter); - } - } - else - { - ACE_OS::fprintf (stdout, "FT Client: Error: read %ld expecting %ld\n", value, counter); - result = -1; - } - } - } - } - return result; -} - -int FTClientMain::next_replica (ACE_ENV_SINGLE_ARG_DECL) -{ - int result = 0; - if (this->replica_pos_ < this->replica_iors_.size()) - { - this->replica_name_ = this->replica_iors_[this->replica_pos_].c_str(); - this->replica_pos_ += 1; - CORBA::Object_var rep_obj = this->orb_->string_to_object (this->replica_name_ ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - this->replica_ = FT_TEST::TestReplica::_narrow (rep_obj.in ()); - if (! CORBA::is_nil (replica_.in ())) - { - result = 1; - } - else - { - ACE_OS::fprintf (stderr, "FT Client: Can't resolve IOR: %s\n", this->replica_name_); - } - } - else - { - ACE_OS::fprintf (stderr, "***OUT_OF_REPLICAS*** " - ACE_SIZE_T_FORMAT_SPECIFIER - "\n", this->replica_pos_); - } - return result; -} - - -int FTClientMain::run (ACE_ENV_SINGLE_ARG_DECL) -{ - int result = 0; - - this->orb_ = CORBA::ORB_init(this->argc_, this->argv_); - - int ok = next_replica (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - if (ok) - { - // retry information - ACE_CString command; - int retry = 0; - long counter = this->replica_->get(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - - if (this->verbose_ >= NORMAL) - { - ACE_OS::fprintf (stdout, "FT Client: Initial counter %ld\n", counter); - } - if (ACE_OS::isatty(fileno(stdin))) - { - ACE_OS::fprintf (stdout, "FT Client: Commands(? for help):\n"); - } - - int more = 1; - while (more && result == 0 && !feof (this->commandIn_)) - { - ACE_TRY_NEW_ENV - { - result = pass (counter, more, command, retry ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCH (CORBA::SystemException, sysex) - { - ACE_OS::fprintf (stdout, "FT Client: Caught system exception: \n"); - ACE_PRINT_EXCEPTION (sysex, "FT Client"); - - retry = 0; - int handled = 0; - - handled = next_replica(ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - if (handled) - { - ACE_OS::fprintf (stdout, "FT Client: Recovering from fault.\n"); - ACE_OS::fprintf (stdout, "FT Client: Activate %s\n", this->replica_name_); - if (command.length () == 0) - { - ACE_OS::fprintf (stdout, "FT Client: No command to retry.\n"); - } - else if (command[0] == 'd') - { - ACE_OS::fprintf (stdout, "FT Client: Not retrying \"die\" command.\n"); - } - else if (sysex.completed () == CORBA::COMPLETED_YES) - { - ACE_OS::fprintf (stdout, "FT Client: Last command completed. No retry needed.\n"); - } - else - { - if (sysex.completed () == CORBA::COMPLETED_MAYBE) - { - ACE_OS::fprintf (stdout, "FT Client: Last command may have completed. Retrying anyway.\n"); - } - retry = 1; - ACE_OS::fprintf (stdout, "FT Client: Retrying command: %s\n", command.c_str()); - } - } - if (! handled) - { - ACE_OS::fprintf (stdout, "FT Client: Exception not handled. Rethrow. "); - ACE_RE_THROW; - } - } - ACE_ENDTRY; - } - } - else - { - ACE_OS::fprintf (stderr, "FT Client: Can't connect to replica.\n"); - } - return result; -} - - -int -main (int argc, char *argv[]) -{ - FTClientMain app; - int result = app.parse_args(argc, argv); - if (result == 0) - { - ACE_TRY_NEW_ENV - { - result = app.run (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, - "FT_Client::main\t\n"); - result = -1; - } - ACE_ENDTRY; - } - return result; -} |