################################################################################
# TEST: EMOS_FRM_driver_retry_lib
################################################################################
# Copyright (C) 2000 EMOS Computer Consulting GmbH
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# For further information please contact:
#
# Dean Rajovic
# EMOS Computer Consulting GmbH
# Oskar-Messter-Straße 25
# 85737 Ismaning
# Germany
# tel.: +49 89 608 765-0
# mailto:drajovic@emos.de
# http://www.emos.de
################################################################################
# $Revision: 1.3 $
# $Author: drajovic $
# $Date: 2005/01/28 11:18:43 $
# $Source: C:/Archive/FRAMEWORK/EMOS_GPL/FRM/emos_frm_driver_retry_lib/script,v $
# $NoKeywords: $
################################################################################
#**#
#* The library containing routines that enable EMOS_FRM_driver to retry failed
#* tests. This is implemented by writing an execution log in a temporary file.
#* If the retry mode had been chosen (offered only in interactive mode), this
#* file is analysed by the succeeding run. If a failed or uncompleeted test is
#* detected, this test is reinvoked. All other tests are ignored.
#*/
#/**
#* Main flag that enables retry cabability [default=FALSE].
#* Use FRM_DRV_enable_retry() to activate retry capability.
#*/
static retry_enabled = FALSE;
#/**
#* Once the retry_enabled is set to true this flag governs wheter it is
#* possible to attempt a retry or not.
#*/
static retry_flag = FALSE;
static retry_log_file_name;
static retry_log_table[];
static retry_log_sep = "\t";
#/**
#* Use this function to enable the retry capability. You should either enable
#* retry generally for all test suites (i.e. the best place to call it is
#* the startup test). Otherwise you can enable/disable retry for each individual
#* test suite (make sure to call enable/disable in ALL your kickoff tests).
#*/
public function FRM_DRV_enable_retry()
{
retry_enabled = TRUE;
}
#/**
#* Use this function to disable retry capability.
#*/
public function FRM_DRV_disable_retry()
{
retry_enabled = FALSE;
}
#/**
#* Indicates wheter a retry is possible which is true if retry is generally
#* enabled, test is running in interactive mode and there is an old log file
#* that could govern the retry.
#*@return TRUE: can attempt to retry, FALSE: a "normal" run will be attempted
#*/
public function FRM_DRV_can_retry()
{
retry_flag = FALSE;
FRM_DRV_retry_set_log_file_name();
# retry disabled in general
if ( !retry_enabled )
return FALSE;
# retry is only possible in interactive mode
switch ( tolower( getvar( "batch" ) ) )
{
case 1:
case "on":
case "true":
return FALSE;
}
# make sure log file is there
if ( file_open( FRM_DRV_retry_get_log_file_name(), FO_MODE_READ ) == E_OK )
{
file_close( FRM_DRV_retry_get_log_file_name() );
return TRUE;
}
return FALSE;
}
#/**
#* Invokes a dialog which asks the user whether to retry the last run.
#* An internal flag is set to indicate whether to retry or not.
#*/
public function FRM_DRV_ask_retry()
{
auto rc;
if ( !FRM_DRV_can_retry() )
{
retry_flag = FALSE;
return;
}
rc = pause_test( "Do you want to retry this run?", "&No", "&Yes" );
if ( rc )
{
retry_flag = TRUE;
}
else
{
retry_flag = FALSE;
FRM_DRV_retry_load_log_table();
}
}
#/**
#* Indicates whether retry mode is active or not.
#*/
public function FRM_DRV_is_retry ()
{
return retry_flag;
}
#/**
#* You can define your own separator for entries in the log file [default=TAB].
#*/
public function FRM_DRV_retry_set_log_sep( in sep )
{
retry_log_sep = sep;
}
#/**
#* Returns the log separator.
#*@return the log separator
#*/
public function FRM_DRV_retry_get_log_sep()
{
return retry_log_sep;
}
#/**
#* Defines the name of the log file [default=
#* <WrTmpDir>\\<testName>_<resName>.log].
#*@param file (in) full path name of the log file (optional)
#*/
public function FRM_DRV_retry_set_log_file_name( in file )
{
auto tmpDir;
auto tstName;
auto resName;
auto dummy;
if ( file == "" )
{
tmpDir = getvar( "tempdir" );
split_path( getvar( "testname" ), dummy, tstName, "\\" );
split_path( getvar( "result" ), dummy, resName, "\\" );
retry_log_file_name = sprintf( "%s\\%s_%s.log"
, tmpDir
, tstName
, resName );
}
else
{
retry_log_file_name = file;
}
}
#/**
#* Retrieves the name of the active log file.
#*@return log file name
#*/
public function FRM_DRV_retry_get_log_file_name()
{
return retry_log_file_name;
}
#/**
#* Loads the log file into an internal array tho provide for a quick lookup.
#*@return E_OK: load successful else failure
#*/
public function FRM_DRV_retry_load_log_table()
{
auto line;
auto arr[], count, i;
auto rc;
# clean the table
for ( i in retry_log_table )
delete retry_log_table[i];
rc = file_open( FRM_DRV_retry_get_log_file_name(), FO_MODE_READ );
if ( rc != E_OK )
return rc;
while ( file_getline( FRM_DRV_retry_get_log_file_name(), line ) == E_OK )
{
count = split( line, arr, FRM_DRV_retry_get_log_sep() );
if ( count < 3 )
continue;
retry_log_table[ arr[1], arr[2] ] = arr[3];
}
rc = file_close( FRM_DRV_retry_get_log_file_name() );
# delete the old log file
dos_system( "del " & FRM_DRV_retry_get_log_file_name() );
return rc;
}
#/**
#* Retrieves an log entry. Empty stringis returned if entry is not found.
#*@return the entry or empty string if no entry found
#*/
public function FRM_DRV_retry_lookup_log ( in table, in test )
{
return retry_log_table[ table, test ];
}
#/**
#* Appends the first part of the log entry. This part contains all information
#* about a single test that is attempted with the exception of the return
#* code returned by this test.
#*@param table (in) name of the test table
#*@param test (in) name of the test
#*@return E_OK: success else failure
#*/
public function FRM_DRV_retry_log_test1( in table, in test )
{
auto rc;
auto logFile;
if ( !retry_enabled )
return E_OK;
logFile = FRM_DRV_retry_get_log_file_name();
rc+=file_open( logFile, FO_MODE_APPEND );
rc+=file_printf( logFile, "%s%s%s%s"
, table, FRM_DRV_retry_get_log_sep()
, test, FRM_DRV_retry_get_log_sep() );
rc+=file_close( logFile );
return rc;
}
#/**
#* Appends the second part of the log entry for the particular test. The second
#* part contains the return code received from the test.
#*@param test_rc (in) the rc returned by the test
#*@return E_OK: success, else failure
#*/
public function FRM_DRV_retry_log_test2( in test_rc )
{
auto rc;
auto logFile;
if ( !retry_enabled )
return E_OK;
logFile = FRM_DRV_retry_get_log_file_name();
rc+=file_open( logFile, FO_MODE_APPEND );
rc+=file_printf( logFile, "%s\r\n", test_rc );
rc+=file_close( logFile );
return rc;
}