#!/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";
#!/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();