2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-05-24 04:32:04 +00:00
xcat-core/xCAT-test/xcattest
2016-07-25 08:56:18 -04:00

989 lines
30 KiB
Perl
Executable File

#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
use strict;
use warnings;
use Getopt::Long;
use Data::Dumper;
use Term::ANSIColor;
use Time::Local;
BEGIN
{
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr';
}
use lib "$::XCATROOT/lib/perl";
my $rootdir = "$::XCATROOT/share/xcat/tools/autotest";
my $needhelp = 0;
my $configfile = "$rootdir/default.conf";
my $bundle_list = undef;
my $case_list = undef;
my $cmd_list = undef;
my $needshow = 0;
my $restore = 0;
my $ret = 0;
my $string1 = undef;
if (
!GetOptions("h|?" => \$needhelp,
"f=s" => \$configfile,
"b=s" => \$bundle_list,
"t=s" => \$case_list,
"c=s" => \$cmd_list,
"l" => \$needshow,
"restore" => \$restore)
)
{
&usage;
exit 1;
}
if ($needhelp)
{
&usage;
exit 0;
}
#load case to $cases
# key type
#$cases[x](x>0): hash
# name string
# os:AIX/Linux string
# arch:ppc64/x386 string
# hcp:hmc/mm/bmc/fsp string
# cmd: array
# check: array
my @cases = ();
if ($needshow) {
&loadcase;
exit 0;
}
my $resultdir = "$rootdir/result";
my $stop_to_keep_env = 0;
#Create result directory
mkdir $resultdir unless -d $resultdir;
# create a log
my $timestamp = `date +"%Y%m%d%H%M%S"`;
open(LOG, ">$resultdir/xcattest.log.$timestamp")
or die "Can't open logfile for writing: $!";
&log_this("xCAT automated test started at " . scalar(localtime()));
open(LOG_ERR, ">$resultdir/failedcases.$timestamp")
or die "Can't open error logfile for writing: $!";
#read config file
#config{object}{type}{name}{attr}
#config{table}{name}{entry}{key}
#config{script_prev}->[]
#config{script_post}->[]
#config{var}{varname}
my %config = ();
$ret = &getConfig;
if ($ret != 0) {
goto EXIT;
}
$ret = &init;
if ($ret != 0) {
goto EXIT;
}
my @filespath = ();
#loading and check cases
$ret = &loadcase;
if ($ret != 0) {
goto EXIT;
}
#run case
&reordercases if (defined($bundle_list) || defined($case_list));
&runcase;
EXIT:
if ($restore) {
&uninit;
}
&log_this("\nxCAT automated test finished at " . scalar(localtime()));
&log_this("Please check results in the $resultdir, \nand see $resultdir/failedcases.$timestamp file for failed cases.\nsee $resultdir/performance.report.$timestamp file for time consumption");
close(LOG);
close(LOG_ERR);
my $reportfile = "$resultdir/performance.report.$timestamp";
my $tmpreport = "$resultdir/xcattest.log.$timestamp";
&getreport($tmpreport, $reportfile);
if ($stop_to_keep_env) {
exit 1;
} else {
exit 0;
}
# end main
#
# logger
#
sub log_this
{
if ($needshow) {
return;
}
print LOG join("\n", @_), "\n";
my $msg = join("\n", @_);
if ($msg =~ /\[Pass\]/) {
print color("green"), "$msg\n", color("reset");
} elsif ($msg =~ /\[Failed\]/) {
print color("red"), "$msg\n", color("reset");
} else {
print "$msg\n";
}
}
sub log_error
{
print LOG_ERR join("\n", @_), "\n";
}
sub getConfig
{
log_this("******************************");
log_this("Reading Configure");
log_this("******************************");
if (!(-e $configfile)) {
log_this("Warning: The xCAT test Configure file doesn't exist!");
return 0;
}
my $type = undef; #Script_Prev,Script_Post,Table,Object,System,Custom
my $sub_type = undef; # The string after $type_
# Script-->
# Script_Prev
# Script_Post
# Table--->
# Table_xxxxx
# Object-->
# Object_xxxx
# System---->
# Custom---->
my $name = undef;
my $attr = undef;
my $value = undef;
my $c = 0;
my $cmd = undef;
my $mgt_name = undef;
open(FILE, "$configfile") or die "can't to open $configfile";
while (my $line = <FILE>) {
$line = &trim($line);
next if (length($line) == 0);
#Table name can not contain "_"
if ($line =~ /\[\s*(\w+)\_(\w+)\s*\]/) {
$type = $1;
$sub_type = $2;
$name = undef;
$c = 0;
} elsif ($line =~ /\[\s*System|Custom\s*\]/) {
$type = "Varible";
} elsif ($type eq "Table") {
##TABLE BLOCK##
if ($line =~ /(\w+)\s*=\s*([\w\.\-]+)/) {
$attr = $1;
$value = $2;
if ($name && ($config{table}{$sub_type}{$name}{__KEY__} ne $attr)) {
$config{table}{$sub_type}{$name}{$attr} = $value;
} else {
$name = $value;
$config{table}{$sub_type}{$name}{__KEY__} = $attr;
}
}
} elsif ($type eq "Object") {
##OBJECT BLOCK##
if ($line =~ /(\w+)\s*=\s*([:\w\.\-\/]+)/) {
$attr = $1;
$value = $2;
if ($attr eq "Name") {
$name = $value;
} elsif (!defined($name)) {
print "Please give name for Object\n";
close FILE;
return 1;
} else {
$config{object}{$sub_type}{$name}{$attr} = $value;
}
}
} elsif ($type eq "Script") {
##SCRIPT_BLOCK##
if ($sub_type eq "Prev") {
$config{script_prev}->[$c] = $line;
$c = $c + 1;
}
elsif ($sub_type eq "Post") {
$config{script_post}->[$c] = $line;
$c = $c + 1;
}
} elsif ($type eq "Varible") {
##NODE_BLOCK##
if ($line =~ /(\w+)\s*=\s*([\w\.\-\+\/:]+)/) {
$config{var}{$1} = $2;
}
}
}
if (exists $config{object}) {
foreach my $type (keys %{ $config{object} }) {
foreach my $name (keys %{ $config{object}{$type} }) {
log_this("OBJECT:$name,TYPE:$type");
foreach my $attr (keys %{ $config{object}{$type}{$name} }) {
log_this(" $attr = $config{object}{$type}{$name}{$attr};");
}
}
}
}
if (exists $config{table}) {
foreach my $type (keys %{ $config{table} }) {
log_this("TABLE:$type");
foreach my $name (keys %{ $config{table}{$type} }) {
log_this(" $config{table}{$type}{$name}{__KEY__} = $name");
foreach my $attr (keys %{ $config{table}{$type}{$name} }) {
if ($attr ne '__KEY__') {
log_this(" $attr = $config{table}{$type}{$name}{$attr}");
}
}
log_this("\n");
}
}
}
if (exists $config{script_prev}) {
log_this("Script_Prev:");
foreach $cmd (@{ $config{script_prev} }) {
log_this(" $cmd");
}
}
if (exists $config{script_post}) {
log_this("Script_Post:");
foreach $cmd (@{ $config{script_post} }) {
log_this(" $cmd");
}
}
if (exists $config{var}) {
log_this("Varible:");
foreach my $varname (keys %{ $config{var} }) {
log_this(" $varname = $config{var}{$varname}");
}
}
close FILE;
return 0;
}
sub init
{
if ($restore) {
log_this("******************************");
log_this("Backup current xCAT database");
log_this("******************************");
&runcmd("mkdir -p /tmp/xCATdbbackup");
&runcmd("dumpxCATdb -p /tmp/xCATdbbackup");
if ($::RUNCMD_RC != 0) {
&log_this("Fail to backup xCAT database");
&runcmd("rm -rf /tmp/xCATdbbackup");
$restore = 0;
return 1;
}
}
log_this("******************************");
log_this("Initialize xCAT test evironment");
log_this("******************************");
my $cmd = undef;
foreach $cmd (@{ $config{script_prev} }) {
log_this("$cmd");
&runcmd($cmd);
if ($::RUNCMD_RC != 0) {
&log_this("Fail to run $cmd");
return 1;
}
}
if (exists $config{object}) {
foreach my $type (keys %{ $config{object} }) {
foreach my $name (keys %{ $config{object}{$type} }) {
$cmd = "chdef -t $type -o $name";
foreach my $attr (keys %{ $config{object}{$type}{$name} }) {
$cmd = $cmd . " $attr=$config{object}{$type}{$name}{$attr}";
}
log_this($cmd);
runcmd($cmd);
if ($::RUNCMD_RC != 0) {
log_this("Fail to run $cmd");
return 1;
}
}
}
}
if (exists $config{table}) {
foreach my $type (keys %{ $config{table} }) {
foreach my $name (keys %{ $config{table}{$type} }) {
$cmd = "chtab $config{table}{$type}{$name}{__KEY__}=$name";
foreach my $attr (keys %{ $config{table}{$type}{$name} }) {
if ($attr ne '__KEY__') {
$cmd = $cmd . " $type.$attr=$config{table}{$type}{$name}{$attr}";
}
}
log_this($cmd);
&runcmd($cmd);
if ($::RUNCMD_RC != 0) {
&log_this("Fail to run $cmd");
return 1;
}
}
}
}
if (!exists $config{var}{OS}) {
my @output = runcmd("uname");
$config{var}{OS} = $output[0];
log_this("Detecting: OS = $config{var}{OS}");
} else {
$config{var}{OS} = lc($config{var}{OS});
}
if (!exists $config{var}{ARCH}) {
if (!exists $config{var}{CN}) {
$config{var}{ARCH} = "Unknown";
log_this("No compute node defined,can't get ARCH of compute node");
} else {
$config{var}{ARCH} = getnodeattr($config{var}{CN}, "arch");
if ($config{var}{ARCH} =~ /ppc/) {
$config{var}{ARCH} = 'ppc';
} elsif ($config{var}{ARCH} =~ /86/) {
$config{var}{ARCH} = 'x86';
}
log_this("Detecting: ARCH = $config{var}{ARCH}");
}
}
if (!exists $config{var}{HCP}) {
if (!exists $config{var}{CN}) {
$config{var}{HCP} = "Unknown";
log_this("No compute node defined,can't get HCP TYPE of compute node");
} else {
$config{var}{HCP} = getnodeattr($config{var}{CN}, "mgt");
log_this("Detecting: HCP = $config{var}{HCP}");
}
}
return 0;
}
sub uninit
{
log_this("******************************");
log_this("un-initialize xCAT test evironment");
log_this("******************************");
my $cmd = undef;
# if(exists $config{object}){
# foreach my $type (keys %{$config{object}}){
# foreach my $name (keys %{$config{object}{$type}}){
# $cmd = "rmdef -t $type -o $name";
# log_this($cmd);
# runcmd($cmd);
# if($::RUNCMD_RC != 0){
# log_this("Fail to run $cmd");
# return 1;
# }
# }
# }
# }
# if(exists $config{table}){
# foreach my $type (keys %{$config{table}}){
# foreach my $name (keys %{$config{table}{$type}}){
# $cmd = "chtab -d $config{table}{$type}{$name}{__KEY__}=$name $type";
# log_this($cmd);
# runcmd($cmd);
# if($::RUNCMD_RC != 0){
# log_this("Fail to run $cmd");
# return 1;
# }
# }
# }
# }
foreach $cmd (@{ $config{script_post} }) {
log_this($cmd);
runcmd($cmd);
if ($::RUNCMD_RC != 0) {
log_this("Fail to run $cmd");
return 1;
}
}
&runcmd("restorexCATdb -p /tmp/xCATdbbackup");
&runcmd("rm -rf /tmp/xCATdbbackup");
return 0;
}
sub Get_Files_Recursive
{
my $dir = $_[0];
foreach $dir (@_)
{
opendir(my $d, $dir);
for (; ;)
{
my $direntry = readdir($d);
last unless defined $direntry;
next if $direntry =~ m/^\.\w*/;
next if $direntry eq '..';
if (-d $dir . "/" . $direntry)
{
Get_Files_Recursive($dir . "/" . $direntry);
}
else
{ my $dirpath = $dir . '/' . $direntry . "\n";
print $dirpath;
#print $dir."\n";
push(@filespath, glob("$dirpath"));
}
}
closedir($d);
}
}
sub loadcase
{
log_this("******************************");
log_this("loading test cases");
log_this("******************************");
my $casedir = "/opt/xcat/share/xcat/tools/autotest/testcase";
my @files = ();
#if($cmd_list){
# my @cmds = split /,/,$cmd_list;
# for my $cmd (@cmds){
# push (@files, glob("$casedir/$cmd/*"));
# }
#} else {
# @files = glob("$casedir/*/*");
#}
Get_Files_Recursive("$casedir");
for (my $countfile = 0 ; $countfile < @filespath ; $countfile++)
{
if ($cmd_list) {
my @cmds = split /,/, $cmd_list;
for (my $countcmd = 0 ; $countcmd < @cmds ; $countcmd++) {
if ($filespath[$countfile] =~ m/\/$cmds[$countcmd]\/case/) {
push(@files, glob("$filespath[$countfile]"));
}
}
} else {
push(@files, glob("$filespath[$countfile]"));
}
}
my $file;
my $line;
my $i = 0;
my $j = -1;
my $z = 0;
my $skip = 0;
my @caserange = ();
my @rightcase = ();
my @notrightcase = ();
if ($bundle_list) {
my @bundles = split /,/, $bundle_list;
foreach my $bundle (@bundles) {
if (!open(FILE, "<$rootdir/bundle/$bundle")) {
log_this("can't open $rootdir/bundle/$bundle");
return 1;
}
while ($line = <FILE>) {
$line = trim($line);
next if (length($line) == 0);
push(@caserange, $line);
}
close(FILE);
}
}
if ($case_list) {
@caserange = split /,/, $case_list;
}
foreach $file (@files) {
if (!open(FILE, "<$file")) {
log_this("can't open $file");
return 1;
}
while ($line = <FILE>) {
$line = &trim($line);
next if (length($line) == 0);
#skip comment lines
next if ($line =~ /^\s*#/);
#TODO: description line is treated as a comment line for now
next if ($line =~ /^description\s*:/);
if ($line =~ /^start\s*:\s*([\w-]+)/) {
$skip = 0;
my $name = $1;
if ($caserange[0] && !(grep { /^$name$/ } @caserange)) {
$skip = 1;
next;
}
$j = -1;
$cases[$i] = {};
$cases[$i]->{name} = $name;
$cases[$i]->{filename} = $file;
if (!$needshow) {
$cases[$i]->{cmd} = [];
$cases[$i]->{check} = [];
$cases[$i]->{cmdcheck} = [];
push(@rightcase, $name);
} else {
$skip = 1;
$i = $i + 1;
}
} elsif ($line =~ /^os\s*:\s*(\w[\w\,]+)/) {
next if $skip;
$string1 = $1;
if ($string1 =~ /^rhels\s*/ && -f "/etc/redhat-release") {
$cases[$i]->{os} = "rhels";
} elsif ($string1 =~ /^sles\s*/ && -f "/etc/SuSE-release") {
$cases[$i]->{os} = "sles";
} elsif ($string1 =~ /^ubuntu\s*/ && -f "/etc/lsb-release") {
$cases[$i]->{os} = "ubuntu";
}
else {
$cases[$i]->{os} = $string1;
}
chomp($cases[$i]->{os});
chomp($config{var}{OS});
if ($cases[$i]->{os} !~ /$config{var}{OS}/) {
if ((($config{var}{OS} =~ /^Linux\s*/i) && ($cases[$i]->{os} =~ /^aix\s*/i)) || (($config{var}{OS} =~ /^aix\s*/i) && ($cases[$i]->{os} !~ /^aix\s*/i)) || (($config{var}{OS} =~ /^rhels\s*/i) && ($cases[$i]->{os} !~ /^Linux\s*/i)) || (($config{var}{OS} =~ /^sles\s*/i) && ($cases[$i]->{os} !~ /^Linux\s*/i)) || (($config{var}{OS} =~ /^ubuntu\s*/i) && ($cases[$i]->{os} !~ /^Linux\s*/i))) {
push(@notrightcase, $cases[$i]->{name});
pop(@rightcase);
$skip = 1;
}
}
} elsif ($line =~ /^arch\s*:\s*(\w[\w\,]+)/) {
next if $skip;
$cases[$i]->{arch} = $1;
if ($cases[$i]->{arch} !~ /$config{var}{ARCH}/) {
push(@notrightcase, $cases[$i]->{name});
pop(@rightcase);
$skip = 1;
}
} elsif ($line =~ /^hcp\s*:\s*(\w[\w\,]+)/) {
next if $skip;
$cases[$i]->{hcp} = $1;
if ($cases[$i]->{hcp} !~ /$config{var}{HCP}/) {
push(@notrightcase, $cases[$i]->{name});
pop(@rightcase);
$skip = 1;
}
} elsif ($line =~ /^type\s*:\s*(\w[\w\,-]+)/) {
next if $skip;
$cases[$i]->{type} = $1;
if ($cases[$i]->{type} !~ /$config{var}{TYPE}/) {
push(@notrightcase, $cases[$i]->{name});
pop(@rightcase);
$skip = 1;
}
} elsif ($line =~ /^stop\s*:\s*(\w[\w\,]+)/) {
next if $skip;
$cases[$i]->{stop} = $1;
} elsif ($line =~ /^cmd\s*:\s*([\/\$\w].+)/) {
next if $skip;
$j = $j + 1;
$z = 0;
$cases[$i]->{cmd}->[$j] = &getvar($1);
if ($cases[$i]->{cmd}->[$j] eq '') {
close(FILE);
return 1;
}
} elsif ($line =~ /^check\s*:\s*(\w.+)/) {
next if $skip;
$cases[$i]->{check}->[$j][$z] = &getvar($1);
if ($cases[$i]->{check}->[$j][$z] eq '') {
close(FILE);
return 1;
}
$z = $z + 1;
} elsif ($line =~ /^cmdcheck\s*:\s*(\w.+)/) {
next if $skip;
$cases[$i]->{cmdcheck}->[$j][$z] = &getvar($1);
if ($cases[$i]->{cmdcheck}->[$j][$z] eq '') {
close(FILE);
return 1;
}
$z = $z + 1;
} elsif ($line =~ /^end/) {
next if $skip;
$i = $i + 1;
}
}
close(FILE);
}
if ($needshow) {
foreach my $case (@cases) {
print "$case->{name}\n";
}
return 0;
}
log_this("To run:", @rightcase);
log_this("Not to run:", @notrightcase);
return 0;
}
sub getnodeattr
{
my ($node, $attr) = @_;
my @output = runcmd("lsdef -t node -o $node -i $attr");
my $t;
if ($::RUNCMD_RC) {
# return "Unknown";
foreach $t (1 .. 40) {
log_this("could not get node attr $attr ");
@output = runcmd("lsdef -t node -o $node -i $attr");
last if ($::RUNCMD_RC == 0);
}
}
if ($::RUNCMD_RC == 0) {
foreach my $output1 (@output) {
if ($output1 =~ /$attr=(\w.+)/) {
log_this("$attr is $1");
return $1;
}
}
}
return "Unknown";
}
sub gettablevalue
{
my ($keyname, $key, $colname, $table) = @_;
my @output = runcmd("gettab $keyname=$key $table\.$colname");
return $output[0];
}
#to remove space and comment
sub trim
{
my $str = shift @_;
if ($str) {
# $str =~ s/\#/__wellnumber__/g;
$str =~ s/^\s+|#.+|\s+$//g;
# $str =~ s/__wellnumber__/#/g;
}
return $str;
}
sub getvar
{
my $str = shift @_;
while ($str =~ /\$\$(\w+)/) {
my $varname = $1;
if (exists($config{var}{$varname})) {
$str =~ s/\$\$$varname/$config{var}{$varname}/g;
} else {
log_this("Error:can't get varible $varname");
return '';
}
}
return $str;
}
sub getfunc
{
my $str = shift @_;
my $func = undef;
my @para = ();
my $parameter = undef;
my $value = undef;
while ($str =~ /__(\w+)\(([\s\,\w\$]*)\)__/) {
$func = $1;
$parameter = $2;
log_this("parameter is $parameter,fun is $func");
@para = split /\s*,\s*/, trim($parameter);
if ($func eq "GETNODEATTR") {
$value = getnodeattr(@para);
log_this("value is $value");
if ($value eq "Unknown") {
$value = '';
}
} elsif ($func eq "INC") {
$value = $para[0] + 1;
} elsif ($func eq "GETTABLEVALUE") {
$value = gettablevalue(@para);
}
$str =~ s/__$func\($parameter\)__/$value/g;
}
return $str;
}
sub runcase
{
log_this("******************************");
log_this("Start to run test cases");
log_this("******************************");
my @output = ();
my $rc = 0;
my $j = 0;
my $z = 0;
my $lvalue = undef;
my $rvalue = undef;
my $op = undef;
my $failed = 0;
my $total = 0;
my $failnum = 0;
foreach my $case (@cases) {
my @record = ();
$failed = 0;
$j = 0;
$total = $total + 1;
my $now1 = timelocal(localtime());
my $time1 = scalar(localtime());
log_this("------START:$$case{name}::Time:$time1------");
push @record, "------START:$$case{name}::Time:$time1------";
push @record, "FILENAME:$$case{filename}";
foreach my $cmd (@{ $$case{cmd} }) {
$cmd = getfunc($cmd);
#by
my $runstart = timelocal(localtime());
log_this("\nRUN:$cmd");
push(@record, "\nRUN:$cmd");
@output = &runcmd($cmd);
$rc = $::RUNCMD_RC;
#by
my $runstop = timelocal(localtime());
my $diffduration = $runstop - $runstart;
log_this("\n[$cmd] Running Time:$diffduration sec");
push(@record, ("\n[$cmd] Running Time:$diffduration sec"));
log_this("RETURN: rc = $rc", "OUTPUT:", @output);
push(@record, ("RETURN rc = $rc", "OUTPUT:", @output));
foreach my $check (@{ $$case{check}->[$j] }) {
if ($failed) {
last;
}
if ($check =~ /rc\s*([=!]+)\s*(\d+)/) {
$lvalue = $rc;
$op = $1;
$rvalue = $2;
if ((($op eq '!=') && ($lvalue == $rvalue))
|| (($op eq '==') && ($lvalue != $rvalue))) {
$failed = 1;
}
if ($failed) {
log_this("CHECK:rc $op $rvalue\t[Failed]");
push(@record, "CHECK:rc $op $rvalue\t[Failed]");
last;
} else {
log_this("CHECK:rc $op $rvalue\t[Pass]");
push(@record, "CHECK:rc $op $rvalue\t[Pass]");
}
} elsif ($check =~ /output\s*([=!~]+)\s*(\S.*)/
&& $check !~ /output\s*([=!~])\1/) {
$lvalue = join("\n", @output);
$op = $1;
$rvalue = $2;
$rvalue = getfunc($rvalue);
if ((($op eq '=~') && ($lvalue !~ /$rvalue/))
|| (($op eq '!~') && ($lvalue =~ /$rvalue/))
|| (($op eq '==') && ($lvalue ne $rvalue))
|| (($op eq '!=') && ($lvalue eq $rvalue))) {
$failed = 1;
}
if ($failed) {
log_this("CHECK:output $op $rvalue\t[Failed]");
push(@record, "CHECK:output $op $rvalue\t[Failed]");
last;
} else {
log_this("CHECK:output $op $rvalue\t[Pass]");
push(@record, "CHECK:output $op $rvalue\t[Pass]");
}
} elsif ($check =~ /output\s*~~\s*(\S.*)/) {
$op = "~~";
$failed = 1;
$rvalue = $1;
$rvalue = getfunc($rvalue);
my $num;
if ($rvalue =~ /(\d+)/) {
$num = $1;
}
$rvalue =~ s/(\d+)//;
foreach my $line (@output) {
chomp($line);
if ($line =~ /$rvalue/) {
if ($num =~ /^\d+$/) {
my $max = $num * 1.1;
my $min = $num * 0.9;
$line =~ /.*:.*: (\d+) /;
if ($1 < $max && $1 > $min) {
$failed = 0;
last;
}
} else {
next;
}
}
}
if ($failed) {
log_this("CHECK:output $op $rvalue $num\t[Failed]");
push(@record, "CHECK:output $op $rvalue\t[Failed]");
last;
} else {
log_this("CHECK:output $op $rvalue $num\t[Pass]");
push(@record, "CHECK:output $op $rvalue\t[Pass]");
}
}
}
foreach my $cmdcheck (@{ $$case{cmdcheck}->[$j] }) {
if ($cmdcheck) {
&runcmd($cmdcheck);
$rc = $::RUNCMD_RC;
if ($rc == 1) {
log_this("CMDCHECK:output $cmdcheck\t[Failed]");
push(@record, "CHECK:output $cmdcheck\t[Failed]");
} elsif ($rc == 0) {
log_this("CMDCHECK:output $cmdcheck\t[Pass]");
push(@record, "CHECK:output $cmdcheck\t[Pass]");
}
}
}
$j = $j + 1;
}
my $now2 = timelocal(localtime());
my $time2 = scalar(localtime());
my $diff = $now2 - $now1;
if ($failed) {
log_this("------END::$$case{name}::Failed::Time:$time2 ::Duration::$diff sec------");
push(@record, "------END::$$case{name}::Failed::Time:$time2 ::Duration::$diff sec------");
} else {
log_this("------END::$$case{name}::Passed::Time:$time2 ::Duration::$diff sec------");
push(@record, "------END::$$case{name}::Passed::Time:$time2 ::Duration::$diff sec------");
}
if ($failed) {
$failnum = $failnum + 1;
log_error(@record);
if (defined($$case{stop}) && ($$case{stop} =~ /^yes$/)) {
$stop_to_keep_env = 1;
last;
}
}
}
log_this("\n\n");
log_this("------Total: $total , Failed: $failnum------");
}
sub runcmd
{
my ($cmd) = @_;
my $rc = 0;
$::RUNCMD_RC = 0;
my $outref = [];
@$outref = `$cmd 2>&1`;
if ($?)
{
$rc = $?;
$rc = $rc >> 8;
$::RUNCMD_RC = $rc;
}
chomp(@$outref);
return @$outref;
}
sub usage
{
print "Usage:xcattest - Run xcat test cases.\n";
print " xcattest [-?|-h]\n";
print " xcattest [-f configure file] [-b case bundle list] [--restore]\n";
print " xcattest [-f configure file] [-t case list] [--restore]\n";
print " xcattest [-f configure file] [-c cmd list] [-l] [--restore]\n";
print "\n";
return;
}
sub getreport
{
open(INDOC, ">$_[1]") || die("open STDOUT failed");
print INDOC "Testcase Duration\n";
print INDOC "------------------------------------------------------------------------------\n";
close(INDOC);
open(STDOUT, ">>$_[1]") || die("open STDOUT failed");
open FD, "<$_[0]" or die "$?";
while (<FD>) {
if (/Time/) {
s/------//g;
$_ .= "\n" if /END/;
print STDOUT $_;
}
}
close(FD);
close(STDOUT);
}
sub reordercases {
my @caserange = ();
my $line;
if ($bundle_list) {
my @bundles = split /,/, $bundle_list;
foreach my $bundle (@bundles) {
if (!open(FILE, "<$rootdir/bundle/$bundle")) {
log_this("can't open $rootdir/bundle/$bundle");
return 1;
}
while ($line = <FILE>) {
$line = trim($line);
next if (length($line) == 0);
push(@caserange, $line);
}
close(FILE);
}
}
if ($case_list) {
@caserange = split /,/, $case_list;
}
my @tmpcases = ();
foreach my $case (@caserange) {
my $i = 0;
my $hit = 0;
foreach my $runcase (@cases) {
if ($runcase->{name} eq $case) {
$hit = 1;
last;
}
$i++;
next;
}
push(@tmpcases, $cases[$i]) if ($hit);
}
@cases = @tmpcases;
}