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