1############################################################################## 2# Modules Revision 3.0 3# Providing a flexible user environment 4# 5# File: modules.50-cmds/%M% 6# Revision: %I% 7# First Edition: 2018/10/29 8# Last Mod.: %U%, %G% 9# 10# Authors: Xavier Delaruelle, xavier.delaruelle@cea.fr 11# 12# Description: Testuite testsequence 13# Command: load, unload, purge, reload 14# Modulefiles: 15# Sub-Command: prereq, conflict 16# 17# Comment: %C{ 18# Test automatic resolution of modulefile dependencies when 19# some dependencies are cyclic 20# }C% 21# 22############################################################################## 23 24# enable auto_handling with environment variable 25setenv_var MODULES_AUTO_HANDLING 1 26 27set mp $modpath.deps 28 29# setup specific environment 30setenv_path_var MODULEPATH $mp 31 32# 33# tests on a module declaring a prereq on itself 34# ga > ga 35# 36 37set ans [list] 38lappend ans [list setpath LOADEDMODULES ga] 39lappend ans [list setpath _LMFILES_ $mp/ga] 40lappend ans [list setpath MODULES_LMPREREQ ga&ga] 41set tserr {load ga} 42testouterr_cmd sh {load ga} $ans $tserr 43# should get same result than above with either --force or --no-auto argument 44testouterr_cmd sh {load --force ga} $ans $tserr 45testouterr_cmd sh {load --no-auto ga} $ans $tserr 46testouterr_cmd sh {load --force --no-auto ga} $ans $tserr 47 48# set situation where this self-requiring module is loaded 49setenv_loaded_module [list ga] [list $mp/ga] 50setenv_path_var MODULES_LMPREREQ ga&ga 51 52set ans [list] 53lappend ans [list unsetpath LOADEDMODULES] 54lappend ans [list unsetpath _LMFILES_] 55lappend ans [list unsetpath MODULES_LMPREREQ] 56set tserr {unload ga} 57testouterr_cmd sh {unload ga} $ans $tserr 58# should get same result than above with either --force or --no-auto argument 59testouterr_cmd sh {unload --force ga} $ans $tserr 60testouterr_cmd sh {unload --no-auto ga} $ans $tserr 61testouterr_cmd sh {unload --force --no-auto ga} $ans $tserr 62 63testouterr_cmd sh {purge} $ans $tserr 64set ans [list] 65lappend ans [list setpath LOADEDMODULES ga] 66lappend ans [list setpath _LMFILES_ $mp/ga] 67lappend ans [list setpath MODULES_LMPREREQ ga&ga] 68set tserr "unload ga\nload ga" 69testouterr_cmd sh {reload} $ans $tserr 70 71 72# 73# tests on a module whose prereq declares itself a prereq on module 74# gb > gc > gb 75# 76 77unsetenv_loaded_module 78unsetenv_path_var MODULES_LMPREREQ 79set ans [list] 80lappend ans [list setpath LOADEDMODULES gc:gb] 81lappend ans [list setpath _LMFILES_ $mp/gc:$mp/gb] 82lappend ans [list setpath MODULES_LMPREREQ gc&gb:gb&gc] 83lappend ans [list setpath MODULES_LMNOTUASKED gc] 84set tserr "load gc\nload gb\n\n[msg_top_load gb {} gc {}]" 85testouterr_cmd_re sh {load gb} $ans $tserr 86testouterr_cmd_re sh {load --force gb} $ans $tserr 87 88set tserr [msg_load gb [err_prereq gb gc]] 89testouterr_cmd_re sh {load --no-auto gb} ERR $tserr 90set ans [list] 91lappend ans [list setpath LOADEDMODULES gb] 92lappend ans [list setpath _LMFILES_ $mp/gb] 93lappend ans [list setpath MODULES_LMPREREQ gb&gc] 94set tserr "load gb\n\n[msg_load gb [err_reqmisf gc]]" 95testouterr_cmd_re sh {load --force --no-auto gb} $ans $tserr 96 97set ans [list] 98lappend ans [list setpath LOADEDMODULES gb:gc] 99lappend ans [list setpath _LMFILES_ $mp/gb:$mp/gc] 100lappend ans [list setpath MODULES_LMPREREQ gb&gc:gc&gb] 101lappend ans [list setpath MODULES_LMNOTUASKED gb] 102set tserr "load gb\nload gc\n\n[msg_top_load gc {} gb {}]" 103testouterr_cmd_re sh {load gc} $ans $tserr 104 105setenv_loaded_module [list gc] [list $mp/gc] 106setenv_path_var MODULES_LMPREREQ gc&gb 107set ans [list] 108lappend ans [list setpath LOADEDMODULES gc:gb] 109lappend ans [list setpath _LMFILES_ $mp/gc:$mp/gb] 110lappend ans [list setpath MODULES_LMPREREQ gc&gb:gb&gc] 111# FIXME: gc is unloaded as it is seen part of DepRe, but it is loaded via ReqLo mechanism when gb is loaded 112# thus it is wrongly marked 'not user asked'. A "dep" evaluation mode prior effective load should correct this. 113lappend ans [list setpath MODULES_LMNOTUASKED gc] 114set tserr "unload gc\nload gc\nload gb\n\n[msg_top_load gb {} gc [list gc {}]]" 115testouterr_cmd_re sh {load gb} $ans $tserr 116testouterr_cmd_re sh {load --force gb} $ans $tserr 117 118setenv_loaded_module [list gb] [list $mp/gb] 119setenv_path_var MODULES_LMPREREQ gb&gc 120set ans [list] 121lappend ans [list setpath LOADEDMODULES gb:gc] 122lappend ans [list setpath _LMFILES_ $mp/gb:$mp/gc] 123lappend ans [list setpath MODULES_LMPREREQ gb&gc:gc&gb] 124# FIXME: gb is unloaded as it is seen part of DepRe, but it is loaded via ReqLo mechanism when gc is loaded 125# thus it is wrongly marked 'not user asked'. A "dep" evaluation mode prior effective load should correct this. 126lappend ans [list setpath MODULES_LMNOTUASKED gb] 127set tserr "unload gb\nload gb\nload gc\n\n[msg_top_load gc {} gb [list gb {}]]" 128testouterr_cmd_re sh {load gc} $ans $tserr 129testouterr_cmd_re sh {load --force gc} $ans $tserr 130 131setenv_loaded_module [list gc gb] [list $mp/gc $mp/gb] [list gc] 132setenv_path_var MODULES_LMPREREQ gc&gb gb&gc 133set ans [list] 134lappend ans [list unsetpath LOADEDMODULES] 135lappend ans [list unsetpath _LMFILES_] 136lappend ans [list unsetpath MODULES_LMPREREQ] 137lappend ans [list unsetpath MODULES_LMNOTUASKED] 138set tserr "unload gb\nunload gc\n\n[msg_top_unload gb {} gc {}]" 139testouterr_cmd_re sh {unload gb} $ans $tserr 140testouterr_cmd_re sh {unload --force gb} $ans $tserr 141set tserr "unload gb\nunload gc\n\n[msg_top_unload gc gb {} {}]" 142testouterr_cmd_re sh {unload gc} $ans $tserr 143testouterr_cmd_re sh {unload --force gc} $ans $tserr 144set tserr "unload gb\nunload gc" 145testouterr_cmd_re sh {purge} $ans $tserr 146testouterr_cmd_re sh {reload} ERR $err_unsatreload 147 148setenv_loaded_module [list gb gc] [list $mp/gb $mp/gc] [list gb] 149setenv_path_var MODULES_LMPREREQ gb&gc gc&gb 150set tserr "unload gc\nunload gb\n\n[msg_top_unload gb gc {} {}]" 151testouterr_cmd_re sh {unload gb} $ans $tserr 152testouterr_cmd_re sh {unload --force gb} $ans $tserr 153set tserr "unload gc\nunload gb\n\n[msg_top_unload gc {} gb {}]" 154testouterr_cmd_re sh {unload gc} $ans $tserr 155testouterr_cmd_re sh {unload --force gc} $ans $tserr 156set tserr "unload gc\nunload gb" 157testouterr_cmd_re sh {purge} $ans $tserr 158testouterr_cmd_re sh {reload} ERR $err_unsatreload 159 160setenv_loaded_module [list gz] [list $mp/gz] 161unsetenv_path_var MODULES_LMPREREQ 162setenv_path_var MODULES_LMCONFLICT gz&gb 163# evaluation is attempted prior conflict violation check 164set tserr "load gc\nload gb\n\n[msg_load gb [err_conflict gb gz]]" 165testouterr_cmd_re sh {load gb} ERR $tserr 166set ans [list] 167lappend ans [list setpath LOADEDMODULES gz:gc:gb] 168lappend ans [list setpath _LMFILES_ $mp/gz:$mp/gc:$mp/gb] 169lappend ans [list setpath MODULES_LMPREREQ gc&gb:gb&gc] 170lappend ans [list setpath MODULES_LMNOTUASKED gc] 171set tserr "load gc\nload gb\n\n[msg_top_load gb {} gc {} [err_conlof gz]]" 172testouterr_cmd_re sh {load --force gb} $ans $tserr 173 174setenv_loaded_module [list gz gc gb] [list $mp/gz $mp/gc $mp/gb] [list gc] 175setenv_path_var MODULES_LMPREREQ gc&gb gb&gc 176set ans [list] 177lappend ans [list setpath LOADEDMODULES gz] 178lappend ans [list setpath _LMFILES_ $mp/gz] 179lappend ans [list unsetpath MODULES_LMPREREQ] 180lappend ans [list setpath MODULES_LMCONFLICT gz&gb] 181lappend ans [list unsetpath MODULES_LMNOTUASKED] 182set tserr "unload gz\nunload gb\nunload gc\nload gz\n\n[msg_top_unload gb {} gc gz]" 183testouterr_cmd_re sh {unload gb} $ans $tserr 184 185unsetenv_loaded_module 186unsetenv_path_var MODULES_LMCONFLICT 187unsetenv_path_var MODULES_LMPREREQ 188set ans [list] 189lappend ans [list setpath LOADEDMODULES gc:gb:gy] 190lappend ans [list setpath _LMFILES_ $mp/gc:$mp/gb:$mp/gy] 191lappend ans [list setpath MODULES_LMPREREQ gc&gb:gb&gc:gy&gb] 192lappend ans [list setpath MODULES_LMNOTUASKED gc:gb] 193set tserr "load gc\nload gb\nload gy\n\n[msg_top_load gy {} [list gc gb] {}]" 194testouterr_cmd_re sh {load gy} $ans $tserr 195 196setenv_loaded_module [list gy] [list $mp/gy] 197setenv_path_var MODULES_LMPREREQ gy&gb 198set ans [list] 199lappend ans [list setpath LOADEDMODULES gc:gb:gy] 200lappend ans [list setpath _LMFILES_ $mp/gc:$mp/gb:$mp/gy] 201lappend ans [list setpath MODULES_LMPREREQ gc&gb:gb&gc:gy&gb] 202lappend ans [list setpath MODULES_LMNOTUASKED gc] 203set tserr "unload gy\nload gc\nload gb\nload gy\n\n[msg_top_load gb {} gc gy]" 204testouterr_cmd_re sh {load gb} $ans $tserr 205set ans [list] 206lappend ans [list setpath LOADEDMODULES gb:gy:gc] 207lappend ans [list setpath _LMFILES_ $mp/gb:$mp/gy:$mp/gc] 208lappend ans [list setpath MODULES_LMPREREQ gb&gc:gy&gb:gc&gb] 209lappend ans [list setpath MODULES_LMNOTUASKED gb] 210set tserr "unload gy\nload gb\nload gy\nload gc\n\n[msg_top_load gc {} gb gy]" 211testouterr_cmd_re sh {load gc} $ans $tserr 212 213setenv_loaded_module [list gc gb gy] [list $mp/gc $mp/gb $mp/gy] [list gc] 214setenv_path_var MODULES_LMPREREQ gc&gb gb&gc gy&gb 215set ans [list] 216lappend ans [list setpath LOADEDMODULES gc:gb] 217lappend ans [list setpath _LMFILES_ $mp/gc:$mp/gb] 218lappend ans [list setpath MODULES_LMPREREQ gc&gb:gb&gc] 219set tserr "unload gy" 220testouterr_cmd_re sh {unload gy} $ans $tserr 221set ans [list] 222lappend ans [list unsetpath LOADEDMODULES] 223lappend ans [list unsetpath _LMFILES_] 224lappend ans [list unsetpath MODULES_LMPREREQ] 225lappend ans [list unsetpath MODULES_LMNOTUASKED] 226set tserr "unload gy\nunload gb\nunload gc\n\n[msg_top_unload gb gy gc {}]" 227testouterr_cmd_re sh {unload gb} $ans $tserr 228testouterr_cmd_re sh {unload --force gb} $ans $tserr 229set tserr "unload gy\nunload gb\nunload gc\n\n[msg_top_unload gc [list gy gb] {} {}]" 230testouterr_cmd_re sh {unload gc} $ans $tserr 231 232 233# 234# tests on a module whose prereq's prereq declares itself a prereq on module 235# prereqs declared with a 'module load' command rather 'prereq' command 236# gd > gf > ge > gd 237# 238 239unsetenv_loaded_module 240unsetenv_path_var MODULES_LMPREREQ 241set ans [list] 242lappend ans [list setpath LOADEDMODULES gf:ge:gd] 243lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge:$mp/gd] 244lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge] 245lappend ans [list setpath MODULES_LMNOTUASKED gf:ge] 246set tserr "load gf\nload ge\nload gd\n\n[msg_top_load gd {} [list gf ge] {}]" 247testouterr_cmd_re sh {load gd} $ans $tserr 248testouterr_cmd_re sh {load --force gd} $ans $tserr 249testouterr_cmd_re sh {load --no-auto gd} $ans $tserr 250testouterr_cmd_re sh {load --force --no-auto gd} $ans $tserr 251 252set ans [list] 253lappend ans [list setpath LOADEDMODULES gd:gf:ge] 254lappend ans [list setpath _LMFILES_ $mp/gd:$mp/gf:$mp/ge] 255lappend ans [list setpath MODULES_LMPREREQ gd&ge:gf&gd:ge&gf] 256lappend ans [list setpath MODULES_LMNOTUASKED gd:gf] 257set tserr "load gd\nload gf\nload ge\n\n[msg_top_load ge {} [list gd gf] {}]" 258testouterr_cmd_re sh {load ge} $ans $tserr 259 260set ans [list] 261lappend ans [list setpath LOADEDMODULES ge:gd:gf] 262lappend ans [list setpath _LMFILES_ $mp/ge:$mp/gd:$mp/gf] 263lappend ans [list setpath MODULES_LMPREREQ ge&gf:gd&ge:gf&gd] 264lappend ans [list setpath MODULES_LMNOTUASKED ge:gd] 265set tserr "load ge\nload gd\nload gf\n\n[msg_top_load gf {} [list ge gd] {}]" 266testouterr_cmd_re sh {load gf} $ans $tserr 267 268setenv_loaded_module [list gf] [list $mp/gf] 269setenv_path_var MODULES_LMPREREQ gf&gd 270set ans [list] 271lappend ans [list setpath LOADEDMODULES gf:ge:gd] 272lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge:$mp/gd] 273lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge] 274# FIXME: gf is unloaded as it is seen part of DepRe, but it is loaded via ReqLo mechanism when gd is loaded 275# thus it is wrongly marked 'not user asked'. A "dep" evaluation mode prior effective load should correct this. 276lappend ans [list setpath MODULES_LMNOTUASKED gf:ge] 277set tserr "unload gf\nload gf\nload ge\nload gd\n\n[msg_top_load gd {} [list gf ge] [list gf {}]]" 278testouterr_cmd_re sh {load gd} $ans $tserr 279testouterr_cmd_re sh {load --force gd} $ans $tserr 280set ans [list] 281lappend ans [list setpath LOADEDMODULES gf:ge:gd] 282lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge:$mp/gd] 283lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge] 284lappend ans [list setpath MODULES_LMNOTUASKED ge] 285set tserr "load ge\nload gd\n\n[msg_top_load gd {} ge {}]" 286testouterr_cmd_re sh {load --no-auto gd} $ans $tserr 287testouterr_cmd_re sh {load --force --no-auto gd} $ans $tserr 288 289set ans [list] 290lappend ans [list setpath LOADEDMODULES gf:ge] 291lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge] 292lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf] 293set tserr "load ge" 294testouterr_cmd_re sh {load ge} $ans $tserr 295testouterr_cmd_re sh {load --force ge} $ans $tserr 296testouterr_cmd_re sh {load --no-auto ge} $ans $tserr 297testouterr_cmd_re sh {load --force --no-auto ge} $ans $tserr 298 299setenv_loaded_module [list ge] [list $mp/ge] 300setenv_path_var MODULES_LMPREREQ ge&gf 301set ans [list] 302lappend ans [list setpath LOADEDMODULES ge:gd:gf] 303lappend ans [list setpath _LMFILES_ $mp/ge:$mp/gd:$mp/gf] 304lappend ans [list setpath MODULES_LMPREREQ ge&gf:gd&ge:gf&gd] 305# FIXME: ge is unloaded as it is seen part of DepRe, but it is loaded via ReqLo mechanism when gf is loaded 306# thus it is wrongly marked 'not user asked'. A "dep" evaluation mode prior effective load should correct this. 307lappend ans [list setpath MODULES_LMNOTUASKED ge:gd] 308set tserr "unload ge\nload ge\nload gd\nload gf\n\n[msg_top_load gf {} [list ge gd] [list ge {}]]" 309testouterr_cmd_re sh {load gf} $ans $tserr 310testouterr_cmd_re sh {load --force gf} $ans $tserr 311set ans [list] 312lappend ans [list setpath LOADEDMODULES ge:gd:gf] 313lappend ans [list setpath _LMFILES_ $mp/ge:$mp/gd:$mp/gf] 314lappend ans [list setpath MODULES_LMPREREQ ge&gf:gd&ge:gf&gd] 315lappend ans [list setpath MODULES_LMNOTUASKED gd] 316set tserr "load gd\nload gf\n\n[msg_top_load gf {} gd {}]" 317testouterr_cmd_re sh {load --no-auto gf} $ans $tserr 318testouterr_cmd_re sh {load --force --no-auto gf} $ans $tserr 319 320set ans [list] 321lappend ans [list setpath LOADEDMODULES ge:gd] 322lappend ans [list setpath _LMFILES_ $mp/ge:$mp/gd] 323lappend ans [list setpath MODULES_LMPREREQ ge&gf:gd&ge] 324set tserr "load gd" 325testouterr_cmd_re sh {load gd} $ans $tserr 326testouterr_cmd_re sh {load --force gd} $ans $tserr 327testouterr_cmd_re sh {load --no-auto gd} $ans $tserr 328testouterr_cmd_re sh {load --force --no-auto gd} $ans $tserr 329 330setenv_loaded_module [list gf ge gd] [list $mp/gf $mp/ge $mp/gd] [list gf ge] 331setenv_path_var MODULES_LMPREREQ gf&gd ge&gf gd&ge 332set ans [list] 333lappend ans [list unsetpath LOADEDMODULES] 334lappend ans [list unsetpath _LMFILES_] 335lappend ans [list unsetpath MODULES_LMPREREQ] 336lappend ans [list unsetpath MODULES_LMNOTUASKED] 337set tserr "unload gd\nunload ge\nunload gf\n\n[msg_top_unload gd {} [list ge gf] {}]" 338testouterr_cmd_re sh {unload gd} $ans $tserr 339testouterr_cmd_re sh {unload --force gd} $ans $tserr 340set tserr "unload gd\nunload ge\nunload gf\n\n[msg_top_unload gf [list gd ge] {} {}]" 341testouterr_cmd_re sh {unload gf} $ans $tserr 342testouterr_cmd_re sh {unload --force gf} $ans $tserr 343set tserr "unload gd\nunload ge\nunload gf\n\n[msg_top_unload ge gd gf {}]" 344testouterr_cmd_re sh {unload ge} $ans $tserr 345testouterr_cmd_re sh {unload --force ge} $ans $tserr 346set tserr "unload gd\nunload ge\nunload gf" 347testouterr_cmd_re sh {purge} $ans $tserr 348testouterr_cmd_re sh {reload} ERR $err_unsatreload 349 350setenv_loaded_module [list gd gf ge] [list $mp/gd $mp/gf $mp/ge] [list gd gf] 351setenv_path_var MODULES_LMPREREQ gd&ge gf&gd ge&gf 352set tserr "unload ge\nunload gf\nunload gd\n\n[msg_top_unload gd [list ge gf] {} {}]" 353testouterr_cmd_re sh {unload gd} $ans $tserr 354testouterr_cmd_re sh {unload --force gd} $ans $tserr 355set tserr "unload ge\nunload gf\nunload gd\n\n[msg_top_unload gf ge gd {}]" 356testouterr_cmd_re sh {unload gf} $ans $tserr 357testouterr_cmd_re sh {unload --force gf} $ans $tserr 358set tserr "unload ge\nunload gf\nunload gd\n\n[msg_top_unload ge {} [list gf gd] {}]" 359testouterr_cmd_re sh {unload ge} $ans $tserr 360testouterr_cmd_re sh {unload --force ge} $ans $tserr 361set tserr "unload ge\nunload gf\nunload gd" 362testouterr_cmd_re sh {purge} $ans $tserr 363testouterr_cmd_re sh {reload} ERR $err_unsatreload 364 365setenv_loaded_module [list gx] [list $mp/gx] 366unsetenv_path_var MODULES_LMPREREQ 367setenv_path_var MODULES_LMCONFLICT gx&gd 368# evaluation is attempted prior conflict violation check 369set tserr "load gf\nload ge\nload gd\n\n[msg_load gd [err_conflict gd gx]]" 370testouterr_cmd_re sh {load gd} ERR $tserr 371set ans [list] 372lappend ans [list setpath LOADEDMODULES gx:gf:ge:gd] 373lappend ans [list setpath _LMFILES_ $mp/gx:$mp/gf:$mp/ge:$mp/gd] 374lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge] 375lappend ans [list setpath MODULES_LMNOTUASKED gf:ge] 376set tserr "load gf\nload ge\nload gd\n\n[msg_top_load gd {} [list gf ge] {} [err_conlof gx]]" 377testouterr_cmd_re sh {load --force gd} $ans $tserr 378 379setenv_loaded_module [list gx gf ge gd] [list $mp/gx $mp/gf $mp/ge $mp/gd] [list gf ge] 380setenv_path_var MODULES_LMPREREQ gf&gd ge&gf gd&ge 381set ans [list] 382lappend ans [list setpath LOADEDMODULES gx] 383lappend ans [list setpath _LMFILES_ $mp/gx] 384lappend ans [list unsetpath MODULES_LMPREREQ] 385lappend ans [list setpath MODULES_LMCONFLICT gx&gd] 386lappend ans [list unsetpath MODULES_LMNOTUASKED] 387set tserr "unload gx\nunload gd\nunload ge\nunload gf\nload gx\n\n[msg_top_unload gd {} [list ge gf] gx]" 388testouterr_cmd_re sh {unload gd} $ans $tserr 389 390unsetenv_loaded_module 391unsetenv_path_var MODULES_LMCONFLICT 392unsetenv_path_var MODULES_LMPREREQ 393set ans [list] 394lappend ans [list setpath LOADEDMODULES gf:ge:gd:gw] 395lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge:$mp/gd:$mp/gw] 396lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge:gw&gd] 397lappend ans [list setpath MODULES_LMNOTUASKED gf:ge:gd] 398set tserr "load gf\nload ge\nload gd\nload gw\n\n[msg_top_load gw {} [list gf ge gd] {}]" 399testouterr_cmd_re sh {load gw} $ans $tserr 400 401setenv_loaded_module [list gw] [list $mp/gw] 402setenv_path_var MODULES_LMPREREQ gw&gd 403set ans [list] 404lappend ans [list setpath LOADEDMODULES gf:ge:gd:gw] 405lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge:$mp/gd:$mp/gw] 406lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge:gw&gd] 407lappend ans [list setpath MODULES_LMNOTUASKED gf:ge] 408set tserr "unload gw\nload gf\nload ge\nload gd\nload gw\n\n[msg_top_load gd {} [list gf ge] gw]" 409testouterr_cmd_re sh {load gd} $ans $tserr 410set ans [list] 411lappend ans [list setpath LOADEDMODULES ge:gd:gw:gf] 412lappend ans [list setpath _LMFILES_ $mp/ge:$mp/gd:$mp/gw:$mp/gf] 413lappend ans [list setpath MODULES_LMPREREQ ge&gf:gd&ge:gw&gd:gf&gd] 414lappend ans [list setpath MODULES_LMNOTUASKED ge:gd] 415set tserr "unload gw\nload ge\nload gd\nload gw\nload gf\n\n[msg_top_load gf {} [list ge gd] gw]" 416testouterr_cmd_re sh {load gf} $ans $tserr 417set ans [list] 418lappend ans [list setpath LOADEDMODULES gd:gw:gf:ge] 419lappend ans [list setpath _LMFILES_ $mp/gd:$mp/gw:$mp/gf:$mp/ge] 420lappend ans [list setpath MODULES_LMPREREQ gd&ge:gw&gd:gf&gd:ge&gf] 421lappend ans [list setpath MODULES_LMNOTUASKED gd:gf] 422set tserr "unload gw\nload gd\nload gw\nload gf\nload ge\n\n[msg_top_load ge {} [list gd gf] gw]" 423testouterr_cmd_re sh {load ge} $ans $tserr 424 425setenv_loaded_module [list gf ge gd gw] [list $mp/gf $mp/ge $mp/gd $mp/gw] [list gf ge] 426setenv_path_var MODULES_LMPREREQ gf&gd ge&gf gd&ge gw&gd 427set ans [list] 428lappend ans [list setpath LOADEDMODULES gf:ge:gd] 429lappend ans [list setpath _LMFILES_ $mp/gf:$mp/ge:$mp/gd] 430lappend ans [list setpath MODULES_LMPREREQ gf&gd:ge&gf:gd&ge] 431set tserr "unload gw" 432testouterr_cmd_re sh {unload gw} $ans $tserr 433set ans [list] 434lappend ans [list unsetpath LOADEDMODULES] 435lappend ans [list unsetpath _LMFILES_] 436lappend ans [list unsetpath MODULES_LMPREREQ] 437lappend ans [list unsetpath MODULES_LMNOTUASKED] 438set tserr "unload gw\nunload gd\nunload ge\nunload gf\n\n[msg_top_unload gd gw [list ge gf] {}]" 439testouterr_cmd_re sh {unload gd} $ans $tserr 440testouterr_cmd_re sh {unload --force gd} $ans $tserr 441set tserr "unload gw\nunload gd\nunload ge\nunload gf\n\n[msg_top_unload gf [list gw gd ge] {} {}]" 442testouterr_cmd_re sh {unload gf} $ans $tserr 443set tserr "unload gw\nunload gd\nunload ge\nunload gf\n\n[msg_top_unload ge [list gw gd] gf {}]" 444testouterr_cmd_re sh {unload ge} $ans $tserr 445 446 447# 448# tests on a module whose prereq's optional prereq declares itself a prereq on module 449# (gg > gj) | gi > gh > gg 450# 451 452unsetenv_loaded_module 453unsetenv_path_var MODULES_LMPREREQ 454 455set ans [list] 456lappend ans [list setpath LOADEDMODULES gh:gg:gj] 457lappend ans [list setpath _LMFILES_ $mp/gh:$mp/gg:$mp/gj] 458lappend ans [list setpath MODULES_LMPREREQ gh&gj|gi:gg&gh:gj&gg] 459lappend ans [list setpath MODULES_LMNOTUASKED gh:gg] 460set tserr "load gh\nload gg\nload gj\n\n[msg_top_load gj {} [list gh gg] {}]" 461testouterr_cmd_re sh {load gj} $ans $tserr 462set ans [list] 463lappend ans [list setpath LOADEDMODULES gj:gh:gg] 464lappend ans [list setpath _LMFILES_ $mp/gj:$mp/gh:$mp/gg] 465lappend ans [list setpath MODULES_LMPREREQ gj&gg:gh&gj|gi:gg&gh] 466lappend ans [list setpath MODULES_LMNOTUASKED gj:gh] 467set tserr "load gj\nload gh\nload gg\n\n[msg_top_load gg {} [list gj gh] {}]" 468testouterr_cmd_re sh {load gg} $ans $tserr 469 470setenv_loaded_module [list gi] [list $mp/gi] 471set ans [list] 472lappend ans [list setpath LOADEDMODULES gi:gh:gg] 473lappend ans [list setpath _LMFILES_ $mp/gi:$mp/gh:$mp/gg] 474lappend ans [list setpath MODULES_LMPREREQ gh&gj|gi:gg&gh] 475lappend ans [list setpath MODULES_LMNOTUASKED gh] 476set tserr "load gh\nload gg\n\n[msg_top_load gg {} gh {}]" 477testouterr_cmd_re sh {load gg} $ans $tserr 478 479setenv_loaded_module [list gi gh gg] [list $mp/gi $mp/gh $mp/gg] [list gh] 480setenv_path_var MODULES_LMPREREQ gh&gj|gi gg&gh 481set ans [list] 482lappend ans [list setpath LOADEDMODULES gi:gh:gg:gj] 483lappend ans [list setpath _LMFILES_ $mp/gi:$mp/gh:$mp/gg:$mp/gj] 484lappend ans [list setpath MODULES_LMPREREQ gh&gj|gi:gg&gh:gj&gg] 485lappend ans [list setpath MODULES_LMNOTUASKED gh:gg] 486set tserr "unload gg\nunload gh\nload gh\nload gg\nload gj\n\n[msg_top_load gj {} [list gh gg] [list [list gg gh] {}]]" 487testouterr_cmd_re sh {load gj} $ans $tserr 488 489setenv_loaded_module [list gj gh gg] [list $mp/gj $mp/gh $mp/gg] [list gj gh] 490setenv_path_var MODULES_LMPREREQ gj&gg gh&gj|gi gg&gh 491set ans [list] 492lappend ans [list unsetpath LOADEDMODULES] 493lappend ans [list unsetpath _LMFILES_] 494lappend ans [list unsetpath MODULES_LMPREREQ] 495lappend ans [list unsetpath MODULES_LMNOTUASKED] 496set tserr "unload gg\nunload gh\nunload gj\n\n[msg_top_unload gj [list gg gh] {} {}]" 497testouterr_cmd_re sh {unload gj} $ans $tserr 498set tserr "unload gg\nunload gh\nunload gj\n\n[msg_top_unload gh gg gj {}]" 499testouterr_cmd_re sh {unload gh} $ans $tserr 500set tserr "unload gg\nunload gh\nunload gj\n\n[msg_top_unload gg {} [list gh gj] {}]" 501testouterr_cmd_re sh {unload gg} $ans $tserr 502 503setenv_loaded_module [list gj gh gg] [list $mp/gj $mp/gh $mp/gg] [list gh] 504setenv_path_var MODULES_LMPREREQ gj&gg gh&gj|gi gg&gh 505set tserr "unload gg\nunload gh\nunload gj\n\n[msg_top_unload gj [list gg gh] {} {}]" 506testouterr_cmd_re sh {unload gj} $ans $tserr 507#FIXME: gj stays loaded as it is seen in conflict violation, should get other cases 508# in line with this one 509set ans [list] 510lappend ans [list setpath LOADEDMODULES gj] 511lappend ans [list setpath _LMFILES_ $mp/gj] 512lappend ans [list setpath MODULES_LMPREREQ gj&gg] 513lappend ans [list unsetpath MODULES_LMNOTUASKED] 514set tserr "unload gg\nunload gh\n\n[msg_top_unload gh gg {} {}]" 515testouterr_cmd_re sh {unload gh} $ans $tserr 516set tserr "unload gg\nunload gh\n\n[msg_top_unload gg {} gh {}]" 517testouterr_cmd_re sh {unload gg} $ans $tserr 518 519 520# 521# tests on a module whose prereq's prereq declares itself an optional prereq on module 522# gn | gk > gm > gl > gk 523# 524 525unsetenv_loaded_module 526unsetenv_path_var MODULES_LMPREREQ 527 528set ans [list] 529lappend ans [list setpath LOADEDMODULES gm:gl:gk] 530lappend ans [list setpath _LMFILES_ $mp/gm:$mp/gl:$mp/gk] 531lappend ans [list setpath MODULES_LMPREREQ gm&gn|gk:gl&gm:gk&gl] 532lappend ans [list setpath MODULES_LMNOTUASKED gm:gl] 533set tserr "load gm\nload gl\nload gk\n\n[msg_top_load gk {} [list gm gl] {}]" 534testouterr_cmd_re sh {load gk} $ans $tserr 535 536# set situation where dependent is already loaded with alternate prereq 537# which lead to inclusion of these loaded modules in DepRe mechanism when cycling dep is loaded 538setenv_loaded_module [list gn gm] [list $mp/gn $mp/gm] [list gn] 539setenv_path_var MODULES_LMPREREQ gm&gn|gk 540set ans [list] 541lappend ans [list setpath LOADEDMODULES gn:gm:gl:gk] 542lappend ans [list setpath _LMFILES_ $mp/gn:$mp/gm:$mp/gl:$mp/gk] 543lappend ans [list setpath MODULES_LMPREREQ gm&gn|gk:gl&gm:gk&gl] 544# FIXME: gm is unloaded as it is seen part of DepRe, but it is loaded via ReqLo mechanism when gl is loaded 545# thus it is wrongly marked 'not user asked'. A "dep" evaluation mode prior effective load should correct this. 546lappend ans [list setpath MODULES_LMNOTUASKED gn:gm:gl] 547set tserr "unload gm\nload gm\nload gl\nload gk\n\n[msg_top_load gk {} [list gm gl] [list gm {}]]" 548testouterr_cmd_re sh {load gk} $ans $tserr 549 550setenv_loaded_module [list gn gm gl gk] [list $mp/gn $mp/gm $mp/gl $mp/gk] [list gl] 551setenv_path_var MODULES_LMPREREQ gm&gn|gk gl&gm gk&gl 552set ans [list] 553lappend ans [list unsetpath LOADEDMODULES] 554lappend ans [list unsetpath _LMFILES_] 555lappend ans [list unsetpath MODULES_LMPREREQ] 556lappend ans [list unsetpath MODULES_LMNOTUASKED] 557set tserr "unload gk\nunload gl\nunload gm\nunload gn\n\n[msg_top_unload gn [list gk gl gm] {} {}]" 558testouterr_cmd_re sh {unload gn} $ans $tserr 559set tserr "unload gk\nunload gl\nunload gm\n\n[msg_top_unload gm [list gk gl] {} {}]" 560set ans [list] 561lappend ans [list setpath LOADEDMODULES gn] 562lappend ans [list setpath _LMFILES_ $mp/gn] 563lappend ans [list unsetpath MODULES_LMPREREQ] 564lappend ans [list unsetpath MODULES_LMNOTUASKED] 565testouterr_cmd_re sh {unload gm} $ans $tserr 566set ans [list] 567lappend ans [list setpath LOADEDMODULES gn:gm] 568lappend ans [list setpath _LMFILES_ $mp/gn:$mp/gm] 569lappend ans [list setpath MODULES_LMPREREQ gm&gn|gk] 570lappend ans [list unsetpath MODULES_LMNOTUASKED] 571set tserr "unload gk\nunload gl\n\n[msg_top_unload gl gk {} {}]" 572testouterr_cmd_re sh {unload gl} $ans $tserr 573set tserr "unload gk\nunload gl\n\n[msg_top_unload gk {} gl {}]" 574testouterr_cmd_re sh {unload gk} $ans $tserr 575 576 577# check dependency structures are correctly updated when loop cycle is detected on a module 578# having multiple dependent 579setenv_loaded_module [list gs gr gq gp go] [list $mp/gs $mp/gr $mp/gq $mp/gp $mp/go] [list gp] 580setenv_path_var MODULES_LMPREREQ gq&gs|go gr&gs|go gp&gq go&gp 581set ans [list] 582lappend ans [list unsetpath LOADEDMODULES] 583lappend ans [list unsetpath _LMFILES_] 584lappend ans [list unsetpath MODULES_LMPREREQ] 585lappend ans [list unsetpath MODULES_LMNOTUASKED] 586set tserr "unload gr\nunload go\nunload gp\nunload gq\nunload gs\n\n[msg_top_unload gs [list gr go gp gq] {} {}]" 587testouterr_cmd_re sh {unload gs} $ans $tserr 588 589 590# 591# Cleanup 592# 593 594# restore environment 595setenv_path_var MODULEPATH $modpath 596unsetenv_path_var MODULES_LMPREREQ 597unsetenv_path_var MODULES_LMCONFLICT 598unsetenv_loaded_module 599 600unsetenv_var MODULES_AUTO_HANDLING 601 602unset mp 603unset ans 604unset tserr 605