12 April 2018

Main

#!/usr/local/bin/perl

#TODO Cofig below will be in configure.xml
$PROP_LOC=shift @ARGV;#Read Argument

printf "Stress Test Config file is:$PROP_LOC\n";
unless (open($fh, $PROP_LOC)) {#Open file handler
    die("Can't open $PROP_LOC");

};


%config = map /^\s*(\w+)\s*=\s*(.*)/, <$fh>;#Map Property File
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());#Timestam Function

# variable settings
$TIME_OUT=$config{FileCopyTimeout};
$THREAD_COUNT = $config{ThreadCount};
$FILE_BATCH_SIZE=$config{FileMultiplier};
@TEST_DISTRIBUTORS=split(",",$config{TargetDistributorIDs});
@TEST_DIR=split(",",$config{TargetDirList});
$FILE_MESSAGE=$config{FileMessage};

$FILE_GEN_PATH=$config{GeneratePath};
#my $test_flag = validate_target(@TEST_DIR);
$GOOD_FILE = $config{GoodDataPath};
$TARGET_PER_HOUR=$config{TargetFilesPerHour};

# Calculate how many messasge to be sent within one thread
$MESSAGE_PER_THREAD=$TARGET_PER_HOUR/$THREAD_COUNT;

# Wating time for thread
$SLEEP_TIME=1/(3600*$MESSAGE_PER_THREAD);
# Indicate how many line of data in the sample good file
$FILE_LENGTH = $config{FileLength};
# Array of threads
my @WORKERS;

#while(my ($key,$val) =each %config) {
#};



# Initiate threads
for(my $i=0;$i<$THREAD_COUNT;$i++) {
    my $pid=fork();#Use fork
    unless($pid) {#Test PID created
        exec("perl stress_test_CXFTYPE_send_worker.pl '$PROP_LOC' $i”);#Must use exec
        exit;#Should exit
    }
}


# wait all child processs finished.
while(waitpid(-1, WUNTRACED)>0){sleep 1;};#Test if all pid is done, then exit

printf "Exit Stress Test.\n";

Worker

#!/usr/local/bin/perl

#TODO Cofig below will be in configure.xml

$PROP_LOC=shift @ARGV;
$Thread_Num=shift @ARGV;
printf "Worker===>Stress Test Config file is:$PROP_LOC\n";
unless (open($fh, $PROP_LOC)) {
        die("Can't open $PROP_LOC");

};


%config = map /^\s*(\w+)\s*=\s*(.*)/, <$fh>;


#%config=(
#   FileCopyTimeout     =>@STRESS_CXFTYPE_FILE_COPY_TIME_OUT@,
#   FileExtension       =>"@STRESS_CXFTYPE_FILE_EXTENSION@",
#   FileMultiplier      =>@STRESS_CXFTYPE_FILE_MULTIP@,
#   FileLength          =>@STRESS_CXFTYPE_FILE_LEN@,
#   FileMessage         =>"@STRESS_CXFTYPE_FILE_MSG@",
#   GoodDataPath        =>"@STRESS_CXFTYPE_GOOD_DATA_PATH@",
#   GeneratePath        =>"@STRESS_CXFTYPE_GEN_PATH@",
#   TargetDirList       =>"@STRESS_CXFTYPE_TARGET_DIR_LIST@",
#   #TargetDirList      =>"/ftpusers/web/delta/inbound/,/ftpusers/web/custname1/inbound/,/ftpusers/web/custname2/inbound/,/ftpusers/web/custname3/inbound/",
#   TargetDistributorIDs=>"@STRESS_CXFTYPE_TARGET_DISTRIBUTOR_IDS@",
#   TargetFilesPerHour  =>@STRESS_CXFTYPE_TARGET_FILES_PERHOUR@,
#   TargetHost          =>"@STRESS_CXFTYPE_TARGET_HOST@",
#   Username            =>"@STRESS_CXFTYPE_USR@",
#   TargetPort          =>@STRESS_CXFTYPE_PORT@,
#   ThreadCount         =>@STRESS_CXFTYPE_THREAD_COUNT@
#);


($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());

# variable settings
$TIME_OUT=$config{FileCopyTimeout};
$THREAD_COUNT = $config{ThreadCount};
$FILE_BATCH_SIZE=$config{FileMultiplier};
@TEST_DISTRIBUTORS=split(",",$config{TargetDistributorIDs});
@TEST_DIR=split(",",$config{TargetDirList});
$FILE_MESSAGE=$config{FileMessage};

$FILE_GEN_PATH=$config{GeneratePath};
#my $test_flag = validate_target(@TEST_DIR);
$GOOD_FILE = $config{GoodDataPath};
$TARGET_PER_HOUR=$config{TargetFilesPerHour};

# Calculate how many messasge to be sent within one thread
$MESSAGE_PER_THREAD=$TARGET_PER_HOUR/$THREAD_COUNT;

# Wating time for thread
$SLEEP_TIME=1/(3600*$MESSAGE_PER_THREAD);
# Indicate how many line of data in the sample good file
$FILE_LENGTH = $config{FileLength};
# Array of threads

#SCP command function
$SCP_CMD="scp -o ConnectTimeout=$TIME_OUT";
$SSH_CMD="ssh -o NumberOfPasswordPrompts=0  -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=quiet ";

$CP_CMD="cp ";
sub sendFile($$) {
    my $src = $_[0];
    my $dest= $_[1];
    my $full_cmd = "$SCP_CMD $src $config{Username}\@$config{TargetHost}:$dest";
    print $full_cmd;
    system($full_cmd);
}


sub copyFile($$) {# $$ Means String String
    my $src=$_[0];
    my $dest= $_[1];
    my $full_cmd = $CP_CMD."$src $dest";
    print $full_cmd;
    system($full_cmd);
}

sub validate_target(@@) {
    my $full_cmd = "$SSH_CMD $config{Username}\@config{TargetHost}";

}

sub myRand ($){
    my $num_len = $_[0];
    my $rnd_num=int(rand(10**$num_len - 1));
    if ($rnd_num<0) {
        $rnd_num++;
    }
    my $num_str="".$rnd_num;
    my $zero_append_num = $num_len - length($num_str);
    if ($zero_append_num > 0) {
        for (my $i=0;$i<$zero_append_num;$i++) {
            $num_str="0".$num_str;
        }
    }
    return $num_str;

}





# sender threads
sub work_func_sender{
    my $distributor_count=@TEST_DISTRIBUTORS;
    my $distri_idx=0;
    my $message_counter=0;
    printf "Message per Thread => $MESSAGE_PER_THREAD\n";
    while($message_counter<$MESSAGE_PER_THREAD) {
        $cur_distri_id = @TEST_DISTRIBUTORS[$distri_idx];
        $cur_dir = @TEST_DIR[$distri_idx];
        # CUST_Tracking_310_20150608_183000_123456.wff
        my @new_filename_arr;

        # Calc file(message) to send
        my $delta_message=$MESSAGE_PER_THREAD-$message_counter;
        if($delta_message >= $FILE_BATCH_SIZE) {
            $delta_message=$FILE_BATCH_SIZE;
        }
        printf ("File Multi $delta_message\n");
        for (my $i=0;$i<$delta_message;$i++) {
            print "Thread $Thread_Num i is $i\n";
            my $new_filename=$FILE_MESSAGE."_".$cur_distri_id."_"."$year$mon$day_$hour$min$sec"."_".myRand(6).".".$config{FileExtension};
            my $src_file=$FILE_GEN_PATH.$new_filename;
            copyFile($GOOD_FILE,$src_file);
            # push to new_filename_arr
            push(@new_filename_arr,$src_file);
        }
        # Begin write Data

        # End Write Data
        printf "Gernerate path: $src_file";
        my $dest_file=$cur_dir;
        # execute send
        $src_file =join(' ', @new_filename_arr);
        sendFile($src_file, $dest_file);
        $message_counter+=$delta_message;
        $distri_idx++;
        $distri_idx = int($distri_idx % $distributor_count);
        # Sleep time
        sleep($SLEEP_TIME);
    }
}


work_func_sender();


blog comments powered by Disqus
Flag Counter