diff --git a/script/mt b/script/mt index bbb01f75..7e79effd 100755 --- a/script/mt +++ b/script/mt @@ -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 diff --git a/testsuite/config/base-config.exp b/testsuite/config/base-config.exp index 24f7ad00..2086a5cc 100644 --- a/testsuite/config/base-config.exp +++ b/testsuite/config/base-config.exp @@ -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) + } + } +} diff --git a/testsuite/install.00-init/011-save_test_env.exp b/testsuite/install.00-init/011-save_test_env.exp new file mode 100644 index 00000000..fb097cdf --- /dev/null +++ b/testsuite/install.00-init/011-save_test_env.exp @@ -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 diff --git a/testsuite/modules.00-init/085-save_test_env.exp b/testsuite/modules.00-init/085-save_test_env.exp new file mode 100644 index 00000000..fb097cdf --- /dev/null +++ b/testsuite/modules.00-init/085-save_test_env.exp @@ -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 diff --git a/testsuite/modules.60-initx/010-init_ts.exp b/testsuite/modules.60-initx/010-init_ts.exp index 1e3b82c7..72abf226 100644 --- a/testsuite/modules.60-initx/010-init_ts.exp +++ b/testsuite/modules.60-initx/010-init_ts.exp @@ -62,3 +62,6 @@ proc _test_modules {shell cmd output} { send_user "expected: $output\n"; } } + +# save specific test env +save_test_env diff --git a/testsuite/modules.60-initx/999-cleanup.exp b/testsuite/modules.60-initx/999-cleanup.exp index 8f8af6bb..9a7ec9e6 100644 --- a/testsuite/modules.60-initx/999-cleanup.exp +++ b/testsuite/modules.60-initx/999-cleanup.exp @@ -28,3 +28,6 @@ unset modload unset line2 unset line2x unset find_msg_sh + +# restore orig saved test env +save_test_env diff --git a/testsuite/modules.61-coll/010-init_ts.exp b/testsuite/modules.61-coll/010-init_ts.exp index 7cbe3794..e12df0bd 100644 --- a/testsuite/modules.61-coll/010-init_ts.exp +++ b/testsuite/modules.61-coll/010-init_ts.exp @@ -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 diff --git a/testsuite/modules.61-coll/999-cleanup.exp b/testsuite/modules.61-coll/999-cleanup.exp index 8d81f1ba..0aa5a6b5 100644 --- a/testsuite/modules.61-coll/999-cleanup.exp +++ b/testsuite/modules.61-coll/999-cleanup.exp @@ -257,3 +257,6 @@ unset homewithcolldotmod unset homewithcolldotmodre unset hometestcoll unset hometestdotmod + +# restore orig saved test env +save_test_env diff --git a/testsuite/modules.70-maint/010-init_ts.exp b/testsuite/modules.70-maint/010-init_ts.exp index 79af4ead..251889a1 100644 --- a/testsuite/modules.70-maint/010-init_ts.exp +++ b/testsuite/modules.70-maint/010-init_ts.exp @@ -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 diff --git a/testsuite/modules.70-maint/999-cleanup.exp b/testsuite/modules.70-maint/999-cleanup.exp index ca4cfc0b..91009370 100644 --- a/testsuite/modules.70-maint/999-cleanup.exp +++ b/testsuite/modules.70-maint/999-cleanup.exp @@ -23,3 +23,6 @@ unset env(MODULEWHATISCACHE) unset whatis_cf + +# restore orig saved test env +save_test_env diff --git a/testsuite/modules.80-deep/010-init_ts.exp b/testsuite/modules.80-deep/010-init_ts.exp index 96891ba7..fbe08f04 100644 --- a/testsuite/modules.80-deep/010-init_ts.exp +++ b/testsuite/modules.80-deep/010-init_ts.exp @@ -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 diff --git a/testsuite/modules.80-deep/999-cleanup.exp b/testsuite/modules.80-deep/999-cleanup.exp index 5d1b4673..ceb6f84e 100644 --- a/testsuite/modules.80-deep/999-cleanup.exp +++ b/testsuite/modules.80-deep/999-cleanup.exp @@ -136,3 +136,6 @@ unset ibadvers0 unset obadvers0 unset ibadvers1 unset obadvers1 + +# restore orig saved test env +save_test_env diff --git a/testsuite/modules.91-sort/010-init_ts.exp b/testsuite/modules.91-sort/010-init_ts.exp index 5605a8bd..e90bedf9 100644 --- a/testsuite/modules.91-sort/010-init_ts.exp +++ b/testsuite/modules.91-sort/010-init_ts.exp @@ -36,3 +36,5 @@ set version6 "1.10" set module6 "$module/$version6" set modulefile6 "$modpath/$module6" +# save specific test env +save_test_env diff --git a/testsuite/modules.91-sort/999-cleanup.exp b/testsuite/modules.91-sort/999-cleanup.exp index c92f8dbc..210070a1 100644 --- a/testsuite/modules.91-sort/999-cleanup.exp +++ b/testsuite/modules.91-sort/999-cleanup.exp @@ -34,3 +34,6 @@ unset version5 unset version6 unset module6 unset modulefile6 + +# restore orig saved test env +save_test_env diff --git a/testsuite/modules.95-version/010-init_ts.exp b/testsuite/modules.95-version/010-init_ts.exp index a6b66f30..675f4ce1 100644 --- a/testsuite/modules.95-version/010-init_ts.exp +++ b/testsuite/modules.95-version/010-init_ts.exp @@ -46,3 +46,5 @@ set modulepath "$path\:$modpath" setenv_path_var MODULEPATH $modulepath +# save specific test env +save_test_env diff --git a/testsuite/modules.95-version/999-cleanup.exp b/testsuite/modules.95-version/999-cleanup.exp index 50ddd199..7869c01a 100644 --- a/testsuite/modules.95-version/999-cleanup.exp +++ b/testsuite/modules.95-version/999-cleanup.exp @@ -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