ts: add test env save/restore mechanism

Add the save_test_env and reset_test_env procedure to record original
test environment (global and environment variables) and restore it once
a test set has been done.
This commit is contained in:
Xavier Delaruelle
2020-12-06 18:26:02 +01:00
parent f7df5b57cf
commit d7b3cb0045
16 changed files with 179 additions and 2 deletions

View File

@@ -41,7 +41,7 @@ fi
# make target
target=test
testserie=modules
setuptestfiles=(00/005 00/006 00/010 00/050 00/080)
setuptestfiles=(00/005 00/006 00/010 00/050 00/080 00/085)
if [ $# -gt 0 ]; then
if [ "$1" = "cov" ]; then
export COVERAGE=y
@@ -49,7 +49,7 @@ if [ $# -gt 0 ]; then
elif [ "$1" = "install" ]; then
target=testinstall
testserie=install
setuptestfiles=(00/005 00/006 00/010)
setuptestfiles=(00/005 00/006 00/010 00/011)
shift
fi
fi

View File

@@ -1242,3 +1242,100 @@ proc setenv_loaded_module {modlist modfilelist {notaskedmodlist {}}} {
unsetenv_path_var MODULES_LMNOTUASKED
}
}
# when saving variable ignore internal variable used to perform tests
array set skipped_var [list runtests 1 subdir 1 errorInfo 1 test_counts 1\
errorCode 1 comp_error 1 dir 1 test_name 1 comp_output 1 comp_exit 1\
autoinit_mode 1 endpipe 1 saved_var 1 saved_array_var 1 saved_env_var 1\
env 1 skipped_var 1 auto_execs 1 shell 1]
# save name and value for any global variables
proc save_test_env {} {
# reset dump structs
foreach var [list saved_var saved_array_var saved_env_var] {
global $var
if {[info exists $var]} {
array unset $var
}
}
global env skipped_var
foreach var [info globals] {
if {![info exists skipped_var($var)]} {
if {[array exists ::$var]} {
set saved_var($var) [array get ::$var]
set saved_array_var($var) 1
} else {
set saved_var($var) [set ::$var]
}
}
}
send_user "\tSaved test variables: [array names saved_var]\n"
array set saved_env_var [array get ::env]
send_user "\tSaved test environment variables: [array names\
saved_env_var]\n"
}
# restore test environment to its initial saved sate
proc reset_test_env {} {
global saved_var saved_array_var saved_env_var env skipped_var
# reset Tcl global variables
foreach var [info globals] {
if {![info exists skipped_var($var)]} {
# temp variables should be unset
if {![info exists saved_var($var)]} {
lappend unset_list $var
unset ::$var
# initial value should be restored if changed
} elseif {![info exists saved_array_var($var)]} {
if {$saved_var($var) ne [set ::$var]} {
lappend restore_list $var
set ::$var $saved_var($var)
}
} else {
if {$saved_var($var) ne [array get ::$var]} {
lappend restore_list $var
array set ::$var $saved_var($var)
}
}
}
}
# unset saved variables should be restored
foreach var [array names saved_var] {
if {![info exists ::$var]} {
lappend restore_list $var
set ::$var $saved_var($var)
}
}
if {[info exists unset_list]} {
send_user "\tUnset temp variables: $unset_list\n"
}
if {[info exists restore_list]} {
send_user "\tRestore test variable initial values: $restore_list\n"
}
# reset environment variables
foreach var [array names env] {
# temp variables should be unset
if {![info exists saved_env_var($var)]} {
send_user "\tUnset $var\n"
unset env($var)
# initial value should be restored if changed
} else {
if {$saved_env_var($var) ne $env($var)} {
send_user "\tSetup $var = '$saved_env_var($var)'\n"
set env($var) $saved_env_var($var)
}
}
}
# unset saved variables should be restored
foreach var [array names saved_env_var] {
if {![info exists env($var)]} {
send_user "\tSetup $var = '$saved_env_var($var)'\n"
set env($var) $saved_env_var($var)
}
}
}

View File

@@ -0,0 +1,23 @@
##############################################################################
# Modules Revision 3.0
# Providing a flexible user environment
#
# File: modules.00-init/%M%
# Revision: %I%
# First Edition: 2020/12/06
# Last Mod.: %U%, %G%
#
# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr
#
# Description: Testuite testsequence
# Command:
# Sub-Command:
#
# Comment: %C{
# Save variable set defined to perform test, which will
# be restored at end of each test set
# }C%
#
##############################################################################
save_test_env

View File

@@ -0,0 +1,23 @@
##############################################################################
# Modules Revision 3.0
# Providing a flexible user environment
#
# File: modules.00-init/%M%
# Revision: %I%
# First Edition: 2020/12/06
# Last Mod.: %U%, %G%
#
# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr
#
# Description: Testuite testsequence
# Command:
# Sub-Command:
#
# Comment: %C{
# Save variable set defined to perform test, which will
# be restored at end of each test set
# }C%
#
##############################################################################
save_test_env

View File

@@ -62,3 +62,6 @@ proc _test_modules {shell cmd output} {
send_user "expected: $output\n";
}
}
# save specific test env
save_test_env

View File

@@ -28,3 +28,6 @@ unset modload
unset line2
unset line2x
unset find_msg_sh
# restore orig saved test env
save_test_env

View File

@@ -259,3 +259,6 @@ set c16contre "$mlu {$c16modpath1re}\n$mll {$c16mod1}\n$mll {$c16mod2}\n$mll $c1
# generate modulefiles that cannot be recorded in git repository
create_endspace_test_modulefiles
# save specific test env
save_test_env

View File

@@ -257,3 +257,6 @@ unset homewithcolldotmod
unset homewithcolldotmodre
unset hometestcoll
unset hometestdotmod
# restore orig saved test env
save_test_env

View File

@@ -27,3 +27,6 @@ set whatis_cf "$env(MODULEWHATISCACHE)apropos.cache"
if { [ file exists $whatis_cf ] } {
catch { exec /bin/rm $whatis_cf }
}
# save specific test env
save_test_env

View File

@@ -23,3 +23,6 @@
unset env(MODULEWHATISCACHE)
unset whatis_cf
# restore orig saved test env
save_test_env

View File

@@ -136,3 +136,6 @@ set ibadvers0 "badmodvers"
set obadvers0 "badmodvers/foo"
set ibadvers1 "badmodvers/dir1"
set obadvers1 "badmodvers/dir1/2.0"
# save specific test env
save_test_env

View File

@@ -136,3 +136,6 @@ unset ibadvers0
unset obadvers0
unset ibadvers1
unset obadvers1
# restore orig saved test env
save_test_env

View File

@@ -36,3 +36,5 @@ set version6 "1.10"
set module6 "$module/$version6"
set modulefile6 "$modpath/$module6"
# save specific test env
save_test_env

View File

@@ -34,3 +34,6 @@ unset version5
unset version6
unset module6
unset modulefile6
# restore orig saved test env
save_test_env

View File

@@ -46,3 +46,5 @@ set modulepath "$path\:$modpath"
setenv_path_var MODULEPATH $modulepath
# save specific test env
save_test_env

View File

@@ -47,3 +47,6 @@ if { $verbose > 1 } {
if { [ version_test "BEGINENV=\[1-9\]" ] } {
file delete $env(_MODULESBEGINENV_)
}
# restore orig saved test env
save_test_env