Salome HOME
Improve test stability.
[modules/yacs.git] / src / yacsloader_swig / Test / testSaveLoadRun.py
1 # Copyright (C) 2006-2021  CEA/DEN, EDF R&D
2 #
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
7 #
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # Lesser General Public License for more details.
12 #
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 #
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19
20 import unittest
21 import tempfile
22 import os
23
24 import pilot
25 import SALOMERuntime
26 import loader
27
28 import datetime
29
30 class TestSaveLoadRun(unittest.TestCase):
31   def setUp(self):
32     SALOMERuntime.RuntimeSALOME.setRuntime()
33     self.r=SALOMERuntime.getSALOMERuntime()
34     self.workdir = tempfile.mkdtemp(suffix=".yacstest")
35     pass
36
37   def test0(self):
38     """First test of HP Container no loop here only the 3 sorts of python nodes (the Distributed is it still used and useful ?) """
39     fname=os.path.join(self.workdir, "TestSaveLoadRun0.xml")
40     nbOfNodes=8
41     sqrtOfNumberOfTurn=1000 # 3000 -> 3.2s/Node, 1000 -> 0.1s/Node
42     l=loader.YACSLoader()
43     p=self.r.createProc("prTest0")
44     td=p.createType("double","double")
45     ti=p.createType("int","int")
46     pg=pilot.PlayGround()
47     pg.setData([("localhost",4)])
48     cont=p.createContainer("gg","HPSalome")
49     cont.setProperty("name","localhost")
50     cont.setProperty("hostname","localhost")
51     cont.setProperty("nb_proc_per_node","1")
52     script0="""
53 def ff(nb,dbg):
54     from math import cos
55     import datetime
56     
57     ref=datetime.datetime.now()
58     t=0. ; pas=1./float(nb)
59     for i in range(nb):
60         for j in range(nb):
61             x=j*pas
62             t+=1.+cos(1.*(x*3.14159))
63             pass
64         pass
65     print("coucou from script0-%i  -> %s"%(dbg,str(datetime.datetime.now()-ref)))
66     return t
67 """
68     script1="""
69 from math import cos
70 import datetime
71 ref=datetime.datetime.now()
72 o2=0. ; pas=1./float(i1)
73 for i in range(i1):
74   for j in range(i1):
75     x=j*pas
76     o2+=1.+cos(1.*(x*3.14159))
77     pass
78 print("coucou from script1-%i  -> %s"%(dbg,str(datetime.datetime.now()-ref)))
79 """
80     for i in range(nbOfNodes):
81       node0=self.r.createFuncNode("DistPython","node%i"%(i))
82       p.edAddChild(node0)
83       node0.setFname("ff")
84       node0.setContainer(cont)
85       node0.setScript(script0)
86       nb=node0.edAddInputPort("nb",ti) ; nb.edInitInt(sqrtOfNumberOfTurn)
87       dbg=node0.edAddInputPort("dbg",ti) ; dbg.edInitInt(i+1)
88       out0=node0.edAddOutputPort("s",td)
89       #
90       nodeMiddle=self.r.createFuncNode("Salome","node%i_1"%(i))
91       p.edAddChild(nodeMiddle)
92       p.edAddCFLink(node0,nodeMiddle)
93       nodeMiddle.setFname("ff")
94       nodeMiddle.setContainer(cont)
95       nodeMiddle.setScript(script0)
96       nb=nodeMiddle.edAddInputPort("nb",ti) ; nb.edInitInt(sqrtOfNumberOfTurn)
97       dbg=nodeMiddle.edAddInputPort("dbg",ti) ; dbg.edInitInt(i+1)
98       out0=nodeMiddle.edAddOutputPort("s",td)
99       nodeMiddle.setExecutionMode("remote")
100       #
101       nodeEnd=self.r.createScriptNode("Salome","node%i_2"%(i+1))
102       p.edAddChild(nodeEnd)
103       p.edAddCFLink(nodeMiddle,nodeEnd)
104       nodeEnd.setContainer(cont)
105       nodeEnd.setScript(script1)
106       i1=nodeEnd.edAddInputPort("i1",ti) ; i1.edInitInt(sqrtOfNumberOfTurn)
107       dbg=nodeEnd.edAddInputPort("dbg",ti) ; dbg.edInitInt(i)
108       o2=nodeEnd.edAddOutputPort("o2",td)
109       nodeEnd.setExecutionMode("remote")
110       pass
111     p.saveSchema(fname)
112     p=l.load(fname)
113     ex=pilot.ExecutorSwig()
114     self.assertEqual(p.getState(),pilot.READY)
115     st=datetime.datetime.now()
116     p.propagePlayGround(pg)
117     # 1st exec
118     ex.RunW(p,0)
119     print("Time spend of test0 to run 1st %s"%(str(datetime.datetime.now()-st)))
120     self.assertEqual(p.getState(),pilot.DONE)
121     # 2nd exec using the same already launched remote python interpreters
122     st=datetime.datetime.now()
123     ex.RunW(p,0)
124     print("Time spend of test0 to run 2nd %s"%(str(datetime.datetime.now()-st)))
125     self.assertEqual(p.getState(),pilot.DONE)
126     # 3rd exec using the same already launched remote python interpreters
127     st=datetime.datetime.now()
128     ex.RunW(p,0)
129     print("Time spend of test0 to run 3rd %s"%(str(datetime.datetime.now()-st)))
130     self.assertEqual(p.getState(),pilot.DONE)
131     pass
132
133   def test1(self):
134     """ HP Container again like test0 but the initialization key of HPContainer is used here."""
135     fname=os.path.join(self.workdir, "TestSaveLoadRun1.xml")
136     nbOfNodes=8
137     sqrtOfNumberOfTurn=1000 # 3000 -> 3.2s/Node, 1000 -> 0.1s/Node
138     l=loader.YACSLoader()
139     p=self.r.createProc("prTest1")
140     td=p.createType("double","double")
141     ti=p.createType("int","int")
142     pg=pilot.PlayGround()
143     pg.setData([("localhost",4)])
144     cont=p.createContainer("gg","HPSalome")
145     cont.setProperty("InitializeScriptKey","aa=123.456")
146     cont.setProperty("name","localhost")
147     cont.setProperty("hostname","localhost")
148     cont.setProperty("nb_proc_per_node","1")
149     script0="""
150 def ff(nb,dbg):
151     from math import cos
152     import datetime
153     
154     ref=datetime.datetime.now()
155     t=0. ; pas=1./float(nb)
156     for i in range(nb):
157         for j in range(nb):
158             x=j*pas
159             t+=1.+cos(1.*(x*3.14159))
160             pass
161         pass
162     print("coucou from script0-%i  -> %s"%(dbg,str(datetime.datetime.now()-ref)))
163     return t
164 """
165     # here in script1 aa is refered ! aa will exist thanks to HPCont Init Script
166     script1="""
167 from math import cos
168 import datetime
169 ref=datetime.datetime.now()
170 o2=0. ; pas=1./float(i1)
171 for i in range(i1):
172   for j in range(i1):
173     x=j*pas
174     o2+=1.+cos(1.*(x*3.14159))
175     pass
176 print("coucou %lf from script1-%i  -> %s"%(aa,dbg,str(datetime.datetime.now()-ref)))
177 aa+=1.
178 """
179     #
180     for i in range(nbOfNodes):
181       nodeMiddle=self.r.createFuncNode("Salome","node%i_1"%(i)) # PyFuncNode remote
182       p.edAddChild(nodeMiddle)
183       nodeMiddle.setFname("ff")
184       nodeMiddle.setContainer(cont)
185       nodeMiddle.setScript(script0)
186       nb=nodeMiddle.edAddInputPort("nb",ti) ; nb.edInitInt(sqrtOfNumberOfTurn)
187       dbg=nodeMiddle.edAddInputPort("dbg",ti) ; dbg.edInitInt(i+1)
188       out0=nodeMiddle.edAddOutputPort("s",td)
189       nodeMiddle.setExecutionMode("remote")
190       #
191       nodeEnd=self.r.createScriptNode("Salome","node%i_2"%(i+1)) # PythonNode remote
192       p.edAddChild(nodeEnd)
193       p.edAddCFLink(nodeMiddle,nodeEnd)
194       nodeEnd.setContainer(cont)
195       nodeEnd.setScript(script1)
196       i1=nodeEnd.edAddInputPort("i1",ti) ; i1.edInitInt(sqrtOfNumberOfTurn)
197       dbg=nodeEnd.edAddInputPort("dbg",ti) ; dbg.edInitInt(i)
198       o2=nodeEnd.edAddOutputPort("o2",td)
199       nodeEnd.setExecutionMode("remote")
200       pass
201     #
202     p.saveSchema(fname)
203     p=l.load(fname)
204     self.assertEqual(p.edGetDirectDescendants()[0].getContainer().getProperty("InitializeScriptKey"),"aa=123.456")
205     p.propagePlayGround(pg)
206     # 1st exec
207     ex=pilot.ExecutorSwig()
208     self.assertEqual(p.getState(),pilot.READY)
209     st=datetime.datetime.now()
210     ex.RunW(p,0)
211     print("Time spend of test1 to 1st run %s"%(str(datetime.datetime.now()-st)))
212     self.assertEqual(p.getState(),pilot.DONE)
213     # 2nd exec
214     st=datetime.datetime.now()
215     ex.RunW(p,0)
216     print("Time spend of test1 to 2nd run %s"%(str(datetime.datetime.now()-st)))
217     self.assertEqual(p.getState(),pilot.DONE)
218     # 3rd exec
219     st=datetime.datetime.now()
220     ex.RunW(p,0)
221     print("Time spend of test1 to 3rd run %s"%(str(datetime.datetime.now()-st)))
222     self.assertEqual(p.getState(),pilot.DONE)
223     pass
224
225   def test2(self):
226     """ Test on HP Containers in foreach context."""
227     script0="""def ff():
228     global aa
229     print("%%lf - %%s"%%(aa,str(my_container)))
230     return 16*[%i],0
231 """
232     script1="""from math import cos
233 import datetime
234 ref=datetime.datetime.now()
235 o2=0. ; pas=1./float(i1)
236 for i in range(i1):
237   for j in range(i1):
238     x=j*pas
239     o2+=1.+cos(1.*(x*3.14159))
240     pass
241 print("coucou %lf from script  -> %s"%(aa,str(datetime.datetime.now()-ref)))
242 aa+=1.
243 o3=0
244 """
245     script2="""o9=sum(i8)
246 """
247     fname=os.path.join(self.workdir, "TestSaveLoadRun2.xml")
248     nbOfNodes=8
249     sqrtOfNumberOfTurn=1000 # 3000 -> 3.2s/Node, 1000 -> 0.1s/Node
250     l=loader.YACSLoader()
251     p=self.r.createProc("prTest1")
252     td=p.createType("double","double")
253     ti=p.createType("int","int")
254     tdi=p.createSequenceTc("seqint","seqint",ti)
255     tdd=p.createSequenceTc("seqdouble","seqdouble",td)
256     pg=pilot.PlayGround()
257     pg.setData([("localhost",4)])
258     cont=p.createContainer("gg","HPSalome")
259     cont.setProperty("InitializeScriptKey","aa=123.456")
260     cont.setProperty("name","localhost")
261     cont.setProperty("hostname","localhost")
262     cont.setProperty("nb_proc_per_node","1")
263     #
264     node0=self.r.createFuncNode("Salome","PyFunction0") # PyFuncNode remote
265     p.edAddChild(node0)
266     node0.setFname("ff")
267     node0.setContainer(cont)
268     node0.setScript(script0%(sqrtOfNumberOfTurn))
269     out0_0=node0.edAddOutputPort("o1",tdi)
270     out1_0=node0.edAddOutputPort("o2",ti)
271     node0.setExecutionMode("remote")
272     #
273     node1=self.r.createForEachLoop("node1",ti)
274     p.edAddChild(node1)
275     p.edAddCFLink(node0,node1)
276     p.edAddLink(out0_0,node1.edGetSeqOfSamplesPort())
277     node1.edGetNbOfBranchesPort().edInitInt(8)
278     #
279     node2=self.r.createScriptNode("Salome","PyScript3")
280     node1.edAddChild(node2)
281     node2.setContainer(cont)
282     node2.setScript(script1)
283     i1=node2.edAddInputPort("i1",ti)
284     p.edAddLink(node1.edGetSamplePort(),i1)
285     out0_2=node2.edAddOutputPort("o2",td)
286     out1_2=node2.edAddOutputPort("o3",ti)
287     node2.setExecutionMode("remote")
288     #
289     node3=self.r.createScriptNode("Salome","PyScript7")
290     p.edAddChild(node3)
291     node3.setScript(script2)
292     p.edAddCFLink(node1,node3)
293     i8=node3.edAddInputPort("i8",tdd)
294     o9=node3.edAddOutputPort("o9",td)
295     p.edAddLink(out0_2,i8)
296     #
297     p.saveSchema(fname)
298     p=l.load(fname)
299     o9=p.getChildByName("PyScript7").getOutputPort("o9")
300     self.assertTrue(len(p.edGetDirectDescendants()[1].getChildByName("PyScript3").getContainer().getProperty("InitializeScriptKey"))!=0)
301     # 1st exec
302     refExpected=16016013.514623128
303     ex=pilot.ExecutorSwig()
304     p.propagePlayGround(pg)
305     self.assertEqual(p.getState(),pilot.READY)
306     st=datetime.datetime.now()
307     ex.RunW(p,0)
308     print("Time spend of test2 to 1st run %s"%(str(datetime.datetime.now()-st)))
309     self.assertEqual(p.getState(),pilot.DONE)
310     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
311     # 2nd exec
312     st=datetime.datetime.now()
313     ex.RunW(p,0)
314     print("Time spend of test2 to 2nd run %s"%(str(datetime.datetime.now()-st)))
315     self.assertEqual(p.getState(),pilot.DONE)
316     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
317     # 3rd exec
318     st=datetime.datetime.now()
319     ex.RunW(p,0)
320     print("Time spend of test2 to 3rd run %s"%(str(datetime.datetime.now()-st)))
321     self.assertEqual(p.getState(),pilot.DONE)
322     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
323     pass
324
325   def test3(self):
326     """ Test that focuses on parallel load of containers."""
327     script0="""
328 if "aa" not in globals():
329   aa=123.456
330 print("%%lf - %%s"%%(aa,str(my_container)))
331 o1=100*[%i]
332 o2=0
333 """
334     script1="""from math import cos
335 import datetime
336 ref=datetime.datetime.now()
337 if "aa" not in globals():
338   aa=123.456
339 o2=0. ; pas=1./float(i1)
340 for i in range(i1):
341   for j in range(i1):
342     x=j*pas
343     o2+=1.+cos(1.*(x*3.14159))
344     pass
345 print("coucou %lf from script  -> %s"%(aa,str(datetime.datetime.now()-ref)))
346 aa+=1.
347 o3=0
348 """
349     script2="""o9=sum(i8)
350 """
351     nbOfNodes=8
352     sqrtOfNumberOfTurn=10
353     l=loader.YACSLoader()
354     p=self.r.createProc("prTest1")
355     p.setProperty("executor","workloadmanager")
356     td=p.createType("double","double")
357     ti=p.createType("int","int")
358     tdi=p.createSequenceTc("seqint","seqint",ti)
359     tdd=p.createSequenceTc("seqdouble","seqdouble",td)
360     cont=p.createContainer("gg","Salome")
361     cont.setProperty("name","localhost")
362     cont.setProperty("hostname","localhost")
363     # no limit for the number of containers launched
364     cont.setProperty("nb_proc_per_node","0")
365     cont.setProperty("type","multi")
366     cont.usePythonCache(True)
367     cont.attachOnCloning()
368     #
369     node0=self.r.createScriptNode("Salome","Node0")
370     p.edAddChild(node0)
371     node0.setContainer(cont)
372     node0.setScript(script0%(sqrtOfNumberOfTurn))
373     out0_0=node0.edAddOutputPort("o1",tdi)
374     out1_0=node0.edAddOutputPort("o2",ti)
375     node0.setExecutionMode("remote")
376     #
377     node1=self.r.createForEachLoop("node1",ti)
378     p.edAddChild(node1)
379     p.edAddCFLink(node0,node1)
380     p.edAddLink(out0_0,node1.edGetSeqOfSamplesPort())
381     node1.edGetNbOfBranchesPort().edInitInt(16)
382     #
383     node2=self.r.createScriptNode("Salome","Node2")
384     node1.edAddChild(node2)
385     node2.setContainer(cont)
386     node2.setScript(script1)
387     i1=node2.edAddInputPort("i1",ti)
388     p.edAddLink(node1.edGetSamplePort(),i1)
389     out0_2=node2.edAddOutputPort("o2",td)
390     out1_2=node2.edAddOutputPort("o3",ti)
391     node2.setExecutionMode("remote")
392     #
393     node3=self.r.createScriptNode("Salome","Node3")
394     p.edAddChild(node3)
395     node3.setScript(script2)
396     p.edAddCFLink(node1,node3)
397     i8=node3.edAddInputPort("i8",tdd)
398     o9=node3.edAddOutputPort("o9",td)
399     p.edAddLink(out0_2,i8)
400     #
401     fname=os.path.join(self.workdir, "t3_new.xml")
402     p.saveSchema(fname)
403     p=l.load(fname)
404     o9=p.getChildByName("Node3").getOutputPort("o9")
405     # 1st exec
406     refExpected=11000.008377058712
407     ex=pilot.ExecutorSwig()
408     self.assertEqual(p.getState(),pilot.READY)
409     st=datetime.datetime.now()
410     ex.RunW(p,0)
411     print("Time spend of test3 to 1st run %s"%(str(datetime.datetime.now()-st)))
412     self.assertEqual(p.getState(),pilot.DONE)
413     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
414     # 2nd exec
415     st=datetime.datetime.now()
416     ex.RunW(p,0)
417     print("Time spend of test3 to 2nd run %s"%(str(datetime.datetime.now()-st)))
418     self.assertEqual(p.getState(),pilot.DONE)
419     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
420     # 3rd exec
421     st=datetime.datetime.now()
422     ex.RunW(p,0)
423     print("Time spend of test3 to 3rd run %s"%(str(datetime.datetime.now()-st)))
424     self.assertEqual(p.getState(),pilot.DONE)
425     self.assertAlmostEqual(refExpected,o9.getPyObj(),5)
426     pass
427
428   def test4(self):
429     """Double foreach."""
430     fname=os.path.join(self.workdir, "TestSaveLoadRun4.xml")
431     script1="""nb=7
432 ii=0
433 o1=nb*[None]
434 for i in range(nb):
435     tmp=(i+10)*[None]
436     for j in range(i+10):
437         tmp[j]=ii
438         ii+=1
439         pass
440     o1[i]=tmp
441     pass
442 """
443     l=loader.YACSLoader()
444     ex=pilot.ExecutorSwig()
445     p=self.r.createProc("pr")
446     p.setProperty("executor","workloadmanager")
447     cont=p.createContainer("gg","Salome")
448     cont.setProperty("name","localhost")
449     cont.setProperty("hostname","localhost")
450     # no limit for the number of containers launched
451     cont.setProperty("nb_proc_per_node","0")
452     cont.setProperty("type","multi")
453     cont.attachOnCloning()
454     td=p.createType("int","int")
455     td2=p.createSequenceTc("seqint","seqint",td)
456     td3=p.createSequenceTc("seqintvec","seqintvec",td2)
457     node1=self.r.createScriptNode("","node1")
458     node1.setScript(script1)
459     o1=node1.edAddOutputPort("o1",td3)
460     p.edAddChild(node1)
461     #
462     node2=self.r.createForEachLoop("node2",td2)
463     p.edAddChild(node2)
464     p.edAddCFLink(node1,node2)
465     p.edAddLink(o1,node2.edGetSeqOfSamplesPort())
466     node2.edGetNbOfBranchesPort().edInitInt(2)
467     node20=self.r.createBloc("node20")
468     node2.edAddChild(node20)
469     node200=self.r.createForEachLoop("node200",td)
470     node20.edAddChild(node200)
471     node200.edGetNbOfBranchesPort().edInitInt(10)
472     p.edAddLink(node2.edGetSamplePort(),node200.edGetSeqOfSamplesPort())
473     node2000=self.r.createScriptNode("","node2000")
474     node2000.setContainer(cont)
475     node2000.setExecutionMode("remote")
476     node200.edAddChild(node2000)
477     i5=node2000.edAddInputPort("i5",td)
478     o6=node2000.edAddOutputPort("o6",td)
479     node2000.setScript("o6=2+i5")
480     p.edAddLink(node200.edGetSamplePort(),i5)
481     #
482     node3=self.r.createForEachLoop("node3",td2)
483     p.edAddChild(node3)
484     p.edAddCFLink(node2,node3)
485     p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
486     node3.edGetNbOfBranchesPort().edInitInt(2)
487     node30=self.r.createBloc("node30")
488     node3.edAddChild(node30)
489     node300=self.r.createForEachLoop("node300",td)
490     node30.edAddChild(node300)
491     node300.edGetNbOfBranchesPort().edInitInt(10)
492     p.edAddLink(node3.edGetSamplePort(),node300.edGetSeqOfSamplesPort())
493     node3000=self.r.createScriptNode("","node3000")
494     node3000.setContainer(cont)
495     node3000.setExecutionMode("remote")
496     node300.edAddChild(node3000)
497     i14=node3000.edAddInputPort("i14",td)
498     o15=node3000.edAddOutputPort("o15",td)
499     node3000.setScript("o15=3+i14")
500     p.edAddLink(node300.edGetSamplePort(),i14)
501     #
502     node4=self.r.createScriptNode("","node4")
503     node4.setScript("o9=i8")
504     p.edAddChild(node4)
505     i8=node4.edAddInputPort("i8",td3)
506     o9=node4.edAddOutputPort("o9",td3)
507     p.edAddCFLink(node3,node4)
508     p.edAddLink(o15,i8)
509     p.saveSchema(fname)
510     p=l.load(fname)
511     ex = pilot.ExecutorSwig()
512     self.assertEqual(p.getState(),pilot.READY)
513     ex.RunW(p,0)
514     self.assertEqual(p.getState(),pilot.DONE)
515     zeResu=p.getChildByName("node4").getOutputPort("o9").get()
516     self.assertEqual(zeResu,[[5,6,7,8,9,10,11,12,13,14],[15,16,17,18,19,20,21,22,23,24,25],[26,27,28,29,30,31,32,33,34,35,36,37],[38,39,40,41,42,43,44,45,46,47,48,49,50],[51,52,53,54,55,56,57,58,59,60,61,62,63,64],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79], [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]])
517     pass
518
519   def test5(self):
520     """Non regression test 2 of multi pyNode, pyFuncNode sharing the same HPContainer instance."""
521     # TODO : This test is DEPRECATED. HPContainer will be removed.
522     self.skipTest("HPContainer deprecated.")
523     fname=os.path.join(self.workdir, "TestSaveLoadRun5.xml")
524     script1="""nb=7
525 ii=0
526 o1=nb*[None]
527 for i in range(nb):
528     tmp=(i+10)*[None]
529     for j in range(i+10):
530         tmp[j]=ii
531         ii+=1
532         pass
533     o1[i]=tmp
534     pass
535 """
536     l=loader.YACSLoader()
537     ex=pilot.ExecutorSwig()
538     p=self.r.createProc("pr")
539     pg=pilot.PlayGround()
540     pg.setData([("localhost",10)])
541     cont=p.createContainer("gg","HPSalome")
542     cont.setProperty("nb_proc_per_node","1")
543     td=p.createType("int","int")
544     td2=p.createSequenceTc("seqint","seqint",td)
545     td3=p.createSequenceTc("seqintvec","seqintvec",td2)
546     node1=self.r.createScriptNode("","node1")
547     node1.setScript(script1)
548     o1=node1.edAddOutputPort("o1",td3)
549     p.edAddChild(node1)
550     #
551     node2=self.r.createForEachLoop("node2",td2)
552     p.edAddChild(node2)
553     p.edAddCFLink(node1,node2)
554     p.edAddLink(o1,node2.edGetSeqOfSamplesPort())
555     node2.edGetNbOfBranchesPort().edInitInt(2)
556     node20=self.r.createBloc("node20")
557     node2.edAddChild(node20)
558     node200=self.r.createForEachLoop("node200",td)
559     node20.edAddChild(node200)
560     node200.edGetNbOfBranchesPort().edInitInt(10)
561     p.edAddLink(node2.edGetSamplePort(),node200.edGetSeqOfSamplesPort())
562     node2000=self.r.createFuncNode("Salome","node2000")
563     node2000.setFname("ff")
564     node2000.setContainer(cont)
565     node2000.setExecutionMode("remote")
566     node200.edAddChild(node2000)
567     i5=node2000.edAddInputPort("i5",td)
568     o6=node2000.edAddOutputPort("o6",td)
569     node2000.setScript("def ff(x):\n  return 2+x")
570     p.edAddLink(node200.edGetSamplePort(),i5)
571     #
572     node3=self.r.createForEachLoop("node3",td2)
573     p.edAddChild(node3)
574     p.edAddCFLink(node2,node3)
575     p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
576     node3.edGetNbOfBranchesPort().edInitInt(2)
577     node30=self.r.createBloc("node30")
578     node3.edAddChild(node30)
579     node300=self.r.createForEachLoop("node300",td)
580     node30.edAddChild(node300)
581     node300.edGetNbOfBranchesPort().edInitInt(10)
582     p.edAddLink(node3.edGetSamplePort(),node300.edGetSeqOfSamplesPort())
583     node3000=self.r.createFuncNode("Salome","node3000")
584     node3000.setFname("ff")
585     node3000.setContainer(cont)
586     node3000.setExecutionMode("remote")
587     node300.edAddChild(node3000)
588     i14=node3000.edAddInputPort("i14",td)
589     o15=node3000.edAddOutputPort("o15",td)
590     node3000.setScript("def ff(x):\n  return 3+x")
591     p.edAddLink(node300.edGetSamplePort(),i14)
592     #
593     node4=self.r.createScriptNode("","node4")
594     node4.setScript("o9=i8")
595     p.edAddChild(node4)
596     i8=node4.edAddInputPort("i8",td3)
597     o9=node4.edAddOutputPort("o9",td3)
598     p.edAddCFLink(node3,node4)
599     p.edAddLink(o15,i8)
600     p.saveSchema(fname)
601     p=l.load(fname)
602     p.propagePlayGround(pg)
603     ex = pilot.ExecutorSwig()
604     self.assertEqual(p.getState(),pilot.READY)
605     ex.RunW(p,0)
606     self.assertEqual(p.getState(),pilot.DONE)
607     zeResu=p.getChildByName("node4").getOutputPort("o9").get()
608     self.assertEqual(zeResu,[[5,6,7,8,9,10,11,12,13,14],[15,16,17,18,19,20,21,22,23,24,25],[26,27,28,29,30,31,32,33,34,35,36,37],[38,39,40,41,42,43,44,45,46,47,48,49,50],[51,52,53,54,55,56,57,58,59,60,61,62,63,64],[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79], [80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95]])
609     pass
610
611   def test6(self):
612     fname=os.path.join(self.workdir, "test6.xml")
613     p=self.r.createProc("prTest0")
614     td=p.createType("double","double")
615     ti=p.createType("int","int")
616     tsi=p.createSequenceTc("seqint","seqint",ti)
617     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
618     n0=self.r.createScriptNode("","n0")
619     o0=n0.edAddOutputPort("o0",tsi)
620     n0.setScript("o0=[3,6,8,9,-2,5]")
621     p.edAddChild(n0)
622     n1=self.r.createForEachLoop("n1",ti)
623     n10=self.r.createScriptNode("","n10")
624     n1.edAddChild(n10)
625     n10.setScript("o2=2*i1")
626     i1=n10.edAddInputPort("i1",ti)
627     o2=n10.edAddOutputPort("o2",ti)
628     p.edAddChild(n1)
629     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
630     p.edAddLink(n1.edGetSamplePort(),i1)
631     p.edAddCFLink(n0,n1)
632     n1.edGetNbOfBranchesPort().edInitPy(1)
633     n2=self.r.createScriptNode("","n2")
634     n2.setScript("o4=i3")
635     i3=n2.edAddInputPort("i3",tsi)
636     o4=n2.edAddOutputPort("o4",tsi)
637     n2.setScript("o4=i3")
638     p.edAddChild(n2)
639     p.edAddCFLink(n1,n2)
640     p.edAddLink(o2,i3)
641     p.saveSchema(fname)
642     #
643     l=loader.YACSLoader()
644     p=l.load(fname)
645     n1=p.getChildByName("n1")
646     ex=pilot.ExecutorSwig()
647     #
648     ex.RunW(p,0)
649     #
650     self.assertEqual(n1.getState(),pilot.DONE)
651     n1.edGetSeqOfSamplesPort().getPyObj()
652     a,b,c=n1.getPassedResults(ex)
653     self.assertEqual(a,list(range(6)))
654     self.assertEqual([elt.getPyObj() for elt in b],[[6, 12, 16, 18, -4, 10]])
655     self.assertEqual(c,['n10_o2_interceptor'])
656     pass
657
658   def test7(self):
659     fname=os.path.join(self.workdir, "test7.xml")
660     p=self.r.createProc("prTest1")
661     cont=p.createContainer("gg","Salome")
662     cont.setProperty("name","localhost")
663     cont.setProperty("hostname","localhost")
664     cont.setProperty("type","multi")
665     td=p.createType("double","double")
666     ti=p.createType("int","int")
667     tsi=p.createSequenceTc("seqint","seqint",ti)
668     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
669     n0=self.r.createScriptNode("","n0")
670     o0=n0.edAddOutputPort("o0",tsi)
671     n0.setScript("o0=[3,6,8,9,-2,5]")
672     p.edAddChild(n0)
673     n1=self.r.createForEachLoop("n1",ti)
674     n10=self.r.createScriptNode("","n10")
675     n10.setExecutionMode("remote")
676     n10.setContainer(cont)
677     n1.edAddChild(n10)
678     n10.setScript("""
679 import time
680 if i1==9:
681   time.sleep(2)
682   raise Exception("Simulated error !")
683 else:
684   o2=2*i1
685 """)
686     i1=n10.edAddInputPort("i1",ti)
687     o2=n10.edAddOutputPort("o2",ti)
688     p.edAddChild(n1)
689     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
690     p.edAddLink(n1.edGetSamplePort(),i1)
691     p.edAddCFLink(n0,n1)
692     n1.edGetNbOfBranchesPort().edInitPy(1)
693     n2=self.r.createScriptNode("","n2")
694     n2.setScript("o4=i3")
695     i3=n2.edAddInputPort("i3",tsi)
696     o4=n2.edAddOutputPort("o4",tsi)
697     n2.setScript("o4=i3")
698     p.edAddChild(n2)
699     p.edAddCFLink(n1,n2)
700     p.edAddLink(o2,i3)
701     p.saveSchema(fname)
702     #
703     l=loader.YACSLoader()
704     p=l.load(fname)
705     n1=p.getChildByName("n1")
706     ex=pilot.ExecutorSwig()
707     #
708     ex.RunW(p,0)
709     #
710     self.assertEqual(n1.getState(),pilot.FAILED)
711     n1.edGetSeqOfSamplesPort().getPyObj()
712     a,b,c=n1.getPassedResults(ex)
713     self.assertEqual(a,list(range(3)))
714     self.assertEqual([elt.getPyObj() for elt in b],[[6,12,16]])
715     self.assertEqual(c,['n10_o2_interceptor'])
716     pass
717
718   def test8(self):
719     from datetime import datetime
720     fname=os.path.join(self.workdir, "test8.xml")
721     p=self.r.createProc("prTest2")
722     cont=p.createContainer("gg","Salome")
723     cont.setProperty("name","localhost")
724     cont.setProperty("hostname","localhost")
725     cont.setProperty("type","multi")
726     td=p.createType("double","double")
727     ti=p.createType("int","int")
728     tsi=p.createSequenceTc("seqint","seqint",ti)
729     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
730     n0=self.r.createScriptNode("","n0")
731     o0=n0.edAddOutputPort("o0",tsi)
732     n0.setScript("o0=[3,6,8,9,-2,5]")
733     p.edAddChild(n0)
734     n1=self.r.createForEachLoop("n1",ti)
735     n10=self.r.createScriptNode("","n10")
736     n10.setExecutionMode("remote")
737     n10.setContainer(cont)
738     n1.edAddChild(n10)
739     n10.setScript("""
740 import time
741 if i1==9:
742   raise Exception("Simulated error !")
743 else:
744   time.sleep(0.1)
745   o2=2*i1
746 """)
747     i1=n10.edAddInputPort("i1",ti)
748     o2=n10.edAddOutputPort("o2",ti)
749     p.edAddChild(n1)
750     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
751     p.edAddLink(n1.edGetSamplePort(),i1)
752     p.edAddCFLink(n0,n1)
753     n1.edGetNbOfBranchesPort().edInitPy(2)
754     n2=self.r.createScriptNode("","n2")
755     n2.setScript("o4=i3")
756     i3=n2.edAddInputPort("i3",tsi)
757     o4=n2.edAddOutputPort("o4",tsi)
758     n2.setScript("o4=i3")
759     p.edAddChild(n2)
760     p.edAddCFLink(n1,n2)
761     p.edAddLink(o2,i3)
762     p.saveSchema(fname)
763     #
764     l=loader.YACSLoader()
765     p=l.load(fname)
766     n1=p.getChildByName("n1")
767     ex=pilot.ExecutorSwig()
768     ex.setKeepGoingProperty(True)
769     #
770     startt=datetime.now()
771     ex.RunW(p,0)
772     t0=datetime.now()-startt
773     #
774     self.assertEqual(n1.getState(),pilot.FAILED)
775     n1.edGetSeqOfSamplesPort().getPyObj()
776     a,b,c=n1.getPassedResults(ex)
777     self.assertEqual(a,[0,1,2,4,5])
778     self.assertEqual([elt.getPyObj() for elt in b],[[6,12,16,-4,10]])
779     self.assertEqual(c,['n10_o2_interceptor'])
780     
781     p.getChildByName("n1").getChildByName("n10").setScript("""
782 import time
783 if i1==3:
784   time.sleep(2)
785   raise Exception("Simulated error !")
786 else:
787   o2=2*i1
788 """)
789     ex=pilot.ExecutorSwig()
790     ex.setKeepGoingProperty(True)
791     #
792     startt=datetime.now()
793     ex.RunW(p,0)
794     t1=datetime.now()-startt
795     #
796     self.assertEqual(n1.getState(),pilot.FAILED)
797     n1.edGetSeqOfSamplesPort().getPyObj()
798     a,b,c=n1.getPassedResults(ex)
799     self.assertEqual(a,[1,2,3,4,5])
800     self.assertEqual([elt.getPyObj() for elt in b],[[12,16,18,-4,10]])
801     self.assertEqual(c,['n10_o2_interceptor'])
802     pass
803
804   def test9(self):
805     """ Test of assignation of already computed values for foreach node."""
806     fname=os.path.join(self.workdir, "test9.xml")
807     from datetime import datetime
808     p=self.r.createProc("prTest2")
809     cont=p.createContainer("gg","Salome")
810     cont.setProperty("name","localhost")
811     cont.setProperty("hostname","localhost")
812     cont.setProperty("type","multi")
813     td=p.createType("double","double")
814     ti=p.createType("int","int")
815     tsi=p.createSequenceTc("seqint","seqint",ti)
816     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
817     n0=self.r.createScriptNode("","n0")
818     o0=n0.edAddOutputPort("o0",tsi)
819     n0.setScript("o0=[3,6,8,9,-2,5]")
820     p.edAddChild(n0)
821     n1=self.r.createForEachLoop("n1",ti)
822     n10=self.r.createScriptNode("","n10")
823     n10.setExecutionMode("remote")
824     n10.setContainer(cont)
825     n1.edAddChild(n10)
826     n10.setScript("""
827 import time
828 if i1==9:
829   raise Exception("Simulated error !")
830 else:
831   time.sleep(0.1)
832   o2=2*i1
833 """)
834     i1=n10.edAddInputPort("i1",ti)
835     o2=n10.edAddOutputPort("o2",ti)
836     p.edAddChild(n1)
837     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
838     p.edAddLink(n1.edGetSamplePort(),i1)
839     p.edAddCFLink(n0,n1)
840     n1.edGetNbOfBranchesPort().edInitPy(2)
841     n2=self.r.createScriptNode("","n2")
842     n2.setScript("o4=i3")
843     i3=n2.edAddInputPort("i3",tsi)
844     o4=n2.edAddOutputPort("o4",tsi)
845     n2.setScript("o4=i3")
846     p.edAddChild(n2)
847     p.edAddCFLink(n1,n2)
848     p.edAddLink(o2,i3)
849     p.saveSchema(fname)
850     #
851     l=loader.YACSLoader()
852     p=l.load(fname)
853     n1=p.getChildByName("n1")
854     ex=pilot.ExecutorSwig()
855     ex.setKeepGoingProperty(True)
856     #
857     startt=datetime.now()
858     ex.RunW(p,0)
859     t0=datetime.now()-startt
860     #
861     self.assertEqual(p.getState(),pilot.FAILED)
862     self.assertEqual(n1.getState(),pilot.FAILED)
863     n1.edGetSeqOfSamplesPort().getPyObj()
864     a,b,c=n1.getPassedResults(ex)
865     self.assertEqual(a,[0,1,2,4,5])
866     self.assertEqual([elt.getPyObj() for elt in b],[[6,12,16,-4,10]])
867     self.assertEqual(c,['n10_o2_interceptor'])
868     
869     p.getChildByName("n1").getChildByName("n10").setScript("""
870 import time
871 time.sleep(2)
872 o2=7*i1
873 """)
874     ex=pilot.ExecutorSwig()
875     ex.setKeepGoingProperty(True)
876     p.getChildByName("n1").assignPassedResults(a,b,c)
877     #
878     startt=datetime.now()
879     ex.RunW(p,0)
880     t1=datetime.now()-startt
881     #
882     self.assertEqual(n1.getState(),pilot.DONE)
883     self.assertEqual(p.getState(),pilot.DONE)
884     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[6,12,16,63,-4,10])
885     pass
886
887   def test10(self):
888     fname=os.path.join(self.workdir, "test10.xml")
889     from datetime import datetime
890     p=self.r.createProc("prTest2")
891     cont=p.createContainer("gg","Salome")
892     cont.setProperty("name","localhost")
893     cont.setProperty("hostname","localhost")
894     cont.setProperty("type","multi")
895     td=p.createType("double","double")
896     ti=p.createType("int","int")
897     tsi=p.createSequenceTc("seqint","seqint",ti)
898     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
899     n0=self.r.createScriptNode("","n0")
900     o0=n0.edAddOutputPort("o0",tsi)
901     n0.setScript("o0=[ 3*elt for elt in range(12) ]")
902     p.edAddChild(n0)
903     n1=self.r.createForEachLoop("n1",ti)
904     n10=self.r.createScriptNode("","n10")
905     n10.setExecutionMode("remote")
906     n10.setContainer(cont)
907     n1.edAddChild(n10)
908     n10.setScript("""
909 import time
910 if i1%2==0:
911   raise Exception("Simulated error !")
912 else:
913   time.sleep(0.1)
914   o2=4*i1
915 """)
916     i1=n10.edAddInputPort("i1",ti)
917     o2=n10.edAddOutputPort("o2",ti)
918     p.edAddChild(n1)
919     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
920     p.edAddLink(n1.edGetSamplePort(),i1)
921     p.edAddCFLink(n0,n1)
922     n1.edGetNbOfBranchesPort().edInitPy(2)
923     n2=self.r.createScriptNode("","n2")
924     n2.setScript("o4=i3")
925     i3=n2.edAddInputPort("i3",tsi)
926     o4=n2.edAddOutputPort("o4",tsi)
927     n2.setScript("o4=i3")
928     p.edAddChild(n2)
929     p.edAddCFLink(n1,n2)
930     p.edAddLink(o2,i3)
931     p.saveSchema(fname)
932     #
933     l=loader.YACSLoader()
934     p=l.load(fname)
935     n1=p.getChildByName("n1")
936     ex=pilot.ExecutorSwig()
937     ex.setKeepGoingProperty(True)
938     #
939     startt=datetime.now()
940     ex.RunW(p,0)
941     t0=datetime.now()-startt
942     #
943     self.assertEqual(p.getState(),pilot.FAILED)
944     self.assertEqual(n1.getState(),pilot.FAILED)
945     n1.edGetSeqOfSamplesPort().getPyObj()
946     a,b,c=n1.getPassedResults(ex)
947     self.assertEqual(a,[1,3,5,7,9,11])
948     self.assertEqual([elt.getPyObj() for elt in b],[[12,36,60,84,108,132]])
949     self.assertEqual(c,['n10_o2_interceptor'])
950     
951     p.getChildByName("n1").getChildByName("n10").setScript("""
952 import time
953 if i1%2==1:
954   raise Exception("Simulated error !")
955 else:
956   time.sleep(1)
957   o2=5*i1
958 """)
959     ex=pilot.ExecutorSwig()
960     ex.setKeepGoingProperty(True)
961     p.getChildByName("n1").assignPassedResults(a,b,c)
962     #
963     startt=datetime.now()
964     ex.RunW(p,0)
965     t1=datetime.now()-startt
966     #assert(t1.total_seconds()<6.+1.)# normally 6/2+1 s (6 remaining elts in 2 // branches + 1s to launch container)
967     #
968     self.assertEqual(n1.getState(),pilot.DONE)
969     self.assertEqual(p.getState(),pilot.DONE)
970     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,12,30,36,60,60,90,84,120,108,150,132])
971     pass
972
973   pass
974
975
976   def test11(self):
977     "test if we do not restart from the begining of the schema after an error in a foreach"
978     fname=os.path.join(self.workdir, "test11.xml")
979     from datetime import datetime
980     p=self.r.createProc("prTest2")
981     cont=p.createContainer("gg","Salome")
982     cont.setProperty("name","localhost")
983     cont.setProperty("hostname","localhost")
984     cont.setProperty("type","multi")
985     td=p.createType("double","double")
986     ti=p.createType("int","int")
987     tsi=p.createSequenceTc("seqint","seqint",ti)
988     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
989     n0=self.r.createScriptNode("","n0")
990     o0=n0.edAddOutputPort("o0",tsi)
991     n0.setScript("o0=[ elt for elt in range(12) ]")
992     p.edAddChild(n0)
993     n1=self.r.createForEachLoop("n1",ti)
994     n10=self.r.createScriptNode("","n10")
995     n10.setExecutionMode("remote")
996     n10.setContainer(cont)
997     n1.edAddChild(n10)
998     n10.setScript("""
999 import time
1000 if i1%2==1:
1001   raise Exception("Simulated error !")
1002 else:
1003   time.sleep(0.1)
1004   o2=2*i1
1005 """)
1006     i1=n10.edAddInputPort("i1",ti)
1007     o2=n10.edAddOutputPort("o2",ti)
1008     p.edAddChild(n1)
1009     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
1010     p.edAddLink(n1.edGetSamplePort(),i1)
1011     p.edAddCFLink(n0,n1)
1012     n1.edGetNbOfBranchesPort().edInitPy(2)
1013     n2=self.r.createScriptNode("","n2")
1014     n2.setScript("o4=i3")
1015     i3=n2.edAddInputPort("i3",tsi)
1016     o4=n2.edAddOutputPort("o4",tsi)
1017     n2.setScript("o4=i3")
1018     p.edAddChild(n2)
1019     p.edAddCFLink(n1,n2)
1020     p.edAddLink(o2,i3)
1021     p.saveSchema(fname)
1022     #
1023     l=loader.YACSLoader()
1024     p=l.load(fname)
1025     n1=p.getChildByName("n1")
1026     ex=pilot.ExecutorSwig()
1027     ex.setKeepGoingProperty(True)
1028     #
1029     startt=datetime.now()
1030     ex.RunW(p,0)
1031     t0=datetime.now()-startt
1032     #
1033     self.assertEqual(p.getState(),pilot.FAILED)
1034     self.assertEqual(n1.getState(),pilot.FAILED)
1035     n1.edGetSeqOfSamplesPort().getPyObj()
1036     a,b,c=n1.getPassedResults(ex)
1037
1038     self.assertEqual(a,[0,2,4,6,8,10])
1039     self.assertEqual([elt.getPyObj() for elt in b],[[0,4,8,12,16,20]])
1040     
1041     p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(12) ]")
1042     p.getChildByName("n1").getChildByName("n10").setScript("""
1043 import time
1044 if i1%2==0:
1045   raise Exception("Simulated error !")
1046 else:
1047   time.sleep(1)
1048   o2=5*i1
1049 """)
1050     p.resetState(1)
1051
1052
1053     p.getChildByName("n1").assignPassedResults(a,b,c)
1054     p.exUpdateState();
1055     #
1056     startt=datetime.now()
1057     ex.RunW(p,0,False)
1058     t1=datetime.now()-startt
1059     #
1060     self.assertEqual(n1.getState(),pilot.DONE)
1061     self.assertEqual(p.getState(),pilot.DONE)
1062     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,5,4,15,8,25,12,35,16,45,20,55])
1063     pass
1064   
1065   def test12(self):
1066     """ Test of nested ForEachLoop with a port connected inside and outside the loop."""
1067     schema = self.r.createProc("schema")
1068     ti = schema.getTypeCode("int")
1069     tiset = schema.createSequenceTc("", "seqint", ti)
1070     tisetseq = schema.createSequenceTc("", "seqintvec", tiset)
1071
1072     n1 = self.r.createScriptNode("", "PyScript2")
1073     n1.edAddInputPort("i3", ti)
1074     n1.edAddInputPort("i4", ti)
1075     n1.edAddOutputPort("o5", ti)
1076     n1.setScript("o5=i3+i4")
1077
1078     n2 = self.r.createScriptNode("", "PyScript1")
1079     n2.edAddInputPort("i2", ti)
1080     n2.edAddOutputPort("o3", ti)
1081     n2.setScript("o3=i2")
1082
1083     b1 = self.r.createBloc("Bloc1")
1084     b1.edAddChild(n1)
1085     b1.edAddChild(n2)
1086
1087     fe1 = self.r.createForEachLoop("ForEach1", ti)
1088     fe1.getInputPort("nbBranches").edInitPy(2)
1089     fe1.getInputPort("SmplsCollection").edInitPy([1, 2, 3, 4])
1090     fe1.edSetNode(b1)
1091
1092     n3 = self.r.createScriptNode("", "PostProcessing")
1093     n3.edAddInputPort("i7", tiset)
1094     n3.edAddInputPort("i5", tiset)
1095     n3.edAddOutputPort("o4", ti)
1096     n3.setScript("""
1097 o4 = 0
1098 for i in i7:
1099     o4 = i + o4
1100
1101 for i in i5:
1102     o4 = i + o4
1103 """)
1104
1105     b0 = self.r.createBloc("Bloc0")
1106     b0.edAddChild(fe1)
1107     b0.edAddChild(n3)
1108
1109     fe0 = self.r.createForEachLoop("ForEach1", ti)
1110     fe0.getInputPort("nbBranches").edInitPy(2)
1111     fe0.getInputPort("SmplsCollection").edInitPy([1, 2, 3, 4])
1112     fe0.edSetNode(b0)
1113
1114     schema.edAddChild(fe0)
1115
1116     nx = self.r.createScriptNode("", "Result")
1117     nx.edAddInputPort("i8", tiset)
1118     nx.edAddOutputPort("o6", ti)
1119     nx.setScript("""
1120 o6 = 0
1121 for i in i8:
1122     o6 = i + o6
1123 """)
1124     schema.edAddChild(nx)
1125
1126     schema.edAddLink(fe1.getOutputPort("evalSamples"), n1.getInputPort("i3"))
1127     schema.edAddLink(fe0.getOutputPort("evalSamples"), n1.getInputPort("i4"))
1128
1129     schema.edAddDFLink(n1.getOutputPort("o5"), n3.getInputPort("i7"))
1130     schema.edAddDFLink(n2.getOutputPort("o3"), n3.getInputPort("i5"))
1131
1132     po5 = fe1.getOutputPort("Bloc1.PyScript2.o5")
1133     schema.edAddDFLink(po5, n2.getInputPort("i2"))
1134
1135     schema.edAddDFLink(n3.getOutputPort("o4"), nx.getInputPort("i8"))
1136 #    schema.saveSchema("foreach12.xml")
1137     
1138     e = pilot.ExecutorSwig()
1139     e.RunW(schema)
1140     self.assertEqual(schema.getState(),pilot.DONE)
1141     resVal = schema.getChildByName("Result").getOutputPort("o6").getPyObj()
1142     self.assertEqual(resVal, 160)
1143     pass
1144
1145   def test13(self):
1146     """ Non regression test EDF11239. ForEach into ForEach. Problem on cloning linked to DeloymentTree.appendTask method that was too strong."""
1147     p=self.r.createProc("Bug11239")
1148     ti=p.createType("int","int")
1149     ti2=p.createSequenceTc("seqint","seqint",ti)
1150     #
1151     cont=p.createContainer("DefaultContainer","Salome")
1152     #
1153     node0=self.r.createForEachLoop("ForEachLoop_int0",ti)
1154     p.edAddChild(node0)
1155     node0.edGetSeqOfSamplesPort().edInitPy(list(range(4)))
1156     node0.edGetNbOfBranchesPort().edInitInt(2)
1157     #
1158     node00=self.r.createBloc("Bloc0")
1159     node0.edAddChild(node00)
1160     node000_0=self.r.createForEachLoop("ForEachLoop_int1",ti)
1161     node00.edAddChild(node000_0)
1162     node000_0.edGetSeqOfSamplesPort().edInitPy(list(range(4)))
1163     node000_0.edGetNbOfBranchesPort().edInitInt(3)
1164     #
1165     node0000=self.r.createBloc("Bloc1")
1166     node000_0.edAddChild(node0000)
1167     #
1168     node0000_0=self.r.createScriptNode("","PyScript2")
1169     node0000.edAddChild(node0000_0)
1170     i3=node0000_0.edAddInputPort("i3",ti)
1171     i4=node0000_0.edAddInputPort("i4",ti)
1172     o5=node0000_0.edAddOutputPort("o5",ti)
1173     node0000_0.setScript("o5 = i3 + i4")
1174     node0000_0.setContainer(cont)
1175     node0000_0.setExecutionMode("remote")
1176     p.edAddLink(node0.edGetSamplePort(),i3)
1177     p.edAddLink(node000_0.edGetSamplePort(),i4)
1178     #
1179     node0000_1=self.r.createScriptNode("","PyScript1")
1180     node0000.edAddChild(node0000_1)
1181     o3=node0000_1.edAddOutputPort("o3",ti)
1182     node0000_1.setScript("o3 = 7")
1183     node0000_1.setExecutionMode("local")
1184     p.edAddCFLink(node0000_0,node0000_1)
1185     #
1186     node000_1=self.r.createScriptNode("","PostTraitement")
1187     node00.edAddChild(node000_1)
1188     i7=node000_1.edAddInputPort("i7",ti2)
1189     i5=node000_1.edAddInputPort("i5",ti2)
1190     node000_1.setScript("for i in i7:\n    print(i)\nprint(\"separation\")\nfor i in i5:\n    print(i)")
1191     node000_1.setContainer(cont)
1192     node000_1.setExecutionMode("remote")
1193     p.edAddLink(o5,i7)
1194     p.edAddLink(o3,i5)
1195     p.edAddCFLink(node000_0,node000_1)
1196     #
1197     #p.saveSchema("tmpp.xml")
1198     ex = pilot.ExecutorSwig()
1199     self.assertEqual(p.getState(),pilot.READY)
1200     ex.RunW(p,0)
1201     self.assertEqual(p.getState(),pilot.DONE)
1202     pass
1203
1204   def test14(self):
1205     """ Non regression EDF11027. Problem after Save/Load of a foreach node with type pyobj with input "SmplsCollection" manually set before. Correction in convertToYacsObjref from XML->Neutral. Objref can hide a string !"""
1206     xmlFileName=os.path.join(self.workdir, "test14.xml")
1207     SALOMERuntime.RuntimeSALOME_setRuntime()
1208     r=pilot.getRuntime()
1209     n0=r.createProc("test23/zeRun")
1210     tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
1211     tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tp)
1212     n0bis=r.createBloc("test23/main") ; n0.edAddChild(n0bis)
1213     n00=r.createBloc("test23/run") ; n0bis.edAddChild(n00)
1214     #
1215     n000=r.createForEachLoop("test23/FE",tp) ; n00.edAddChild(n000)
1216     n0000=r.createScriptNode("Salome","test23/run_internal") ; n000.edSetNode(n0000)
1217     i0=n0000.edAddInputPort("i0",tp)
1218     i1=n0000.edAddInputPort("i1",tp) ; i1.edInitPy(3)
1219     o0=n0000.edAddOutputPort("o0",tp)
1220     n0000.setScript("o0=i0+i1")
1221     #
1222     n00.edAddLink(n000.edGetSamplePort(),i0)
1223     #
1224     n000.edGetSeqOfSamplesPort().edInitPy(list(range(10)))
1225     n000.edGetNbOfBranchesPort().edInitInt(2)
1226     #
1227     n01=r.createScriptNode("Salome","test23/check") ; n0bis.edAddChild(n01)
1228     n0bis.edAddCFLink(n00,n01)
1229     i2=n01.edAddInputPort("i2",tp2)
1230     o1=n01.edAddOutputPort("o1",tp2)
1231     n01.setScript("o1=i2")
1232     n0bis.edAddLink(o0,i2)
1233     #
1234     n0.saveSchema(xmlFileName)
1235     #
1236     l=loader.YACSLoader()
1237     p=l.load(xmlFileName) # very import do not use n0 but use p instead !
1238     ex=pilot.ExecutorSwig()
1239     #
1240     self.assertEqual(p.getState(),pilot.READY)
1241     ex.RunW(p,0)
1242     self.assertEqual(p.getState(),pilot.DONE)
1243     self.assertEqual(p.getChildByName("test23/main.test23/check").getOutputPort("o1").getPyObj(),[3,4,5,6,7,8,9,10,11,12])
1244     pass
1245
1246   def test15(self):
1247     #fname=os.path.join(self.workdir, "BugInConcurrentLaunchDftCont.xml")
1248     p=self.r.createProc("pr")
1249     ti=p.createType("int","int")
1250     cont=p.createContainer("DefaultContainer","Salome")
1251     cont.setProperty("container_name","FactoryServer")
1252     b=self.r.createBloc("Bloc") ; p.edAddChild(b)
1253     #
1254     nb=4
1255     outs=[]
1256     for i in range(nb):
1257       node=self.r.createScriptNode("Salome","node%d"%i)
1258       node.setExecutionMode("remote")
1259       node.setContainer(cont)
1260       outs.append(node.edAddOutputPort("i",ti))
1261       node.setScript("i=%d"%i)
1262       b.edAddChild(node)
1263     #
1264     node=self.r.createScriptNode("Salome","nodeEnd")
1265     node.setExecutionMode("remote")
1266     node.setContainer(cont)
1267     res=node.edAddOutputPort("res",ti)
1268     p.edAddChild(node)
1269     l=[]
1270     for i in range(nb):
1271       elt="i%d"%i
1272       inp=node.edAddInputPort(elt,ti) ; l.append(elt)
1273       p.edAddChild(node)
1274       p.edAddLink(outs[i],inp)
1275     node.setScript("res="+"+".join(l))
1276     p.edAddCFLink(b,node)
1277     #
1278     for i in range(10):
1279       p.init()
1280       ex = pilot.ExecutorSwig()
1281       self.assertEqual(p.getState(),pilot.READY)
1282       ex.RunW(p,0)
1283       self.assertEqual(res.getPyObj(),6)
1284       self.assertEqual(p.getState(),pilot.DONE)
1285     pass
1286
1287   def test16(self):
1288     """ Test to check that a list[pyobj] outputport linked to pyobj inputport is OK."""
1289     SALOMERuntime.RuntimeSALOME_setRuntime()
1290     self.r=pilot.getRuntime()
1291     n0=self.r.createProc("test16/zeRun")
1292     tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
1293     tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tp)
1294     
1295     n00=self.r.createScriptNode("Salome","n00") ; n0.edAddChild(n00)
1296     o0=n00.edAddOutputPort("o0",tp2)
1297     n00.setScript("o0=[[i+1] for i in range(8)]")
1298     n01=self.r.createScriptNode("Salome","n01") ; n0.edAddChild(n01)
1299     i1=n01.edAddInputPort("i1",tp)
1300     n01.setScript("assert(i1==[[1], [2], [3], [4], [5], [6], [7], [8]])")
1301     n0.edAddCFLink(n00,n01)
1302     n0.edAddLink(o0,i1)
1303     #
1304     ex=pilot.ExecutorSwig()
1305     self.assertEqual(n0.getState(),pilot.READY)
1306     ex.RunW(n0,0)
1307     self.assertEqual(n0.getState(),pilot.DONE)
1308     pass
1309
1310   def test17(self):
1311     """ Same as test16 except that tp2 is not list of tp but a list of copy of tp"""
1312     SALOMERuntime.RuntimeSALOME_setRuntime()
1313     self.r=pilot.getRuntime()
1314     n0=self.r.createProc("test17/zeRun")
1315     tp=n0.createInterfaceTc("python:obj:1.0","pyobj",[])
1316     tpp=n0.createInterfaceTc("python:obj:1.0","pyobj",[]) # diff is here
1317     tp2=n0.createSequenceTc("list[pyobj]","list[pyobj]",tpp)
1318     
1319     n00=self.r.createScriptNode("Salome","n00") ; n0.edAddChild(n00)
1320     o0=n00.edAddOutputPort("o0",tp2)
1321     n00.setScript("o0=[[i+1] for i in range(8)]")
1322     n01=self.r.createScriptNode("Salome","n01") ; n0.edAddChild(n01)
1323     i1=n01.edAddInputPort("i1",tp)
1324     n01.setScript("assert(i1==[[1], [2], [3], [4], [5], [6], [7], [8]])")
1325     n0.edAddCFLink(n00,n01)
1326     n0.edAddLink(o0,i1)
1327     #
1328     ex=pilot.ExecutorSwig()
1329     self.assertEqual(n0.getState(),pilot.READY)
1330     ex.RunW(n0,0)
1331     self.assertEqual(n0.getState(),pilot.DONE)
1332     pass
1333
1334   def test18(self):
1335     p=self.r.createProc("prTest18")
1336     n00=self.r.createScriptNode("Salome","n00")
1337     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1338     n00.setExecutionMode("remote")
1339     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1340     cont=p.createContainer("gg","Salome")
1341     n00.setContainer(cont)
1342     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1343     cont.setProperty("nb_proc_per_nod","6")
1344     self.assertEqual(n00.getMaxLevelOfParallelism(),1)
1345     cont.setProperty("nb_proc_per_node","7")           # <- here
1346     self.assertEqual(n00.getMaxLevelOfParallelism(),7) # <- here
1347     pass
1348     
1349   def test19(self):
1350     """This test checks the mechanism of YACS that allow PythonNodes to know their DynParaLoop context."""
1351     fname=os.path.join(self.workdir, "test19.xml")
1352     l=loader.YACSLoader()
1353     #
1354     p=self.r.createProc("PROC")
1355     p.setProperty("executor","workloadmanager")
1356     ti=p.createType("int","int")
1357     tdi=p.createSequenceTc("seqint","seqint",ti)
1358     # Level0
1359     fe0=self.r.createForEachLoop("FE0",ti) ; p.edAddChild(fe0)
1360     fe0.edGetNbOfBranchesPort().edInitInt(4)
1361     fe0_end=self.r.createScriptNode("Salome","fe0_end")
1362     fe0.edSetFinalizeNode(fe0_end)
1363     fe0_end.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0"])
1364 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<4)""")
1365     n0=self.r.createScriptNode("Salome","n0") ; p.edAddChild(n0)
1366     n0.setScript("o1=range(10)")
1367     a=n0.edAddOutputPort("o1",tdi)
1368     p.edAddLink(a,fe0.edGetSeqOfSamplesPort()) ; p.edAddCFLink(n0,fe0)
1369     # Level1
1370     b0=self.r.createBloc("b0") ; fe0.edAddChild(b0)
1371     n1=self.r.createScriptNode("Salome","n1") ; b0.edAddChild(n1)
1372     n1.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0"])
1373 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<4)
1374 o1=range(10)""")
1375     b=n1.edAddOutputPort("o1",tdi)
1376     fe1=self.r.createForEachLoop("FE1",ti) ; b0.edAddChild(fe1)
1377     fe1.edGetNbOfBranchesPort().edInitInt(3)
1378     fe1_end=self.r.createScriptNode("Salome","fe1_end")
1379     fe1_end.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0.b0.FE1","FE0"])
1380 assert(my_dpl_localization[1][1]>=0 and my_dpl_localization[1][1]<4)
1381 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
1382 """)
1383     fe1.edSetFinalizeNode(fe1_end)
1384     p.edAddLink(b,fe1.edGetSeqOfSamplesPort()) ; p.edAddCFLink(n1,fe1)
1385     # Level2
1386     n2=self.r.createScriptNode("Salome","n2") ; fe1.edAddChild(n2)
1387     n2.setScript("""assert([elt[0] for elt in my_dpl_localization]==["FE0.b0.FE1","FE0"])
1388 assert(my_dpl_localization[1][1]>=0 and my_dpl_localization[1][1]<4)
1389 assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
1390 """)
1391     
1392     p.saveSchema(fname)
1393     ex=pilot.ExecutorSwig()
1394     
1395     # local run of PythonNodes n1 and n2
1396     p=l.load(fname)
1397     p.init()
1398     self.assertEqual(p.getState(),pilot.READY)
1399     ex.setDPLScopeSensitive(True) # <- this line is the aim of the test
1400     ex.RunW(p,0)
1401     self.assertEqual(p.getState(),pilot.DONE)
1402
1403     # run remote
1404     p=l.load(fname)
1405     cont=p.createContainer("gg","Salome")
1406     cont.setProperty("name","localhost")
1407     cont.setProperty("hostname","localhost")
1408     # no limit for the number of containers launched
1409     cont.setProperty("nb_proc_per_node","0")
1410     cont.setProperty("type","multi")
1411     #cont.usePythonCache(True)
1412     cont.attachOnCloning()
1413     n1=p.getChildByName("FE0.b0.n1") ; n1.setExecutionMode("remote") ; n1.setContainer(cont)
1414     n2=p.getChildByName("FE0.b0.FE1.n2") ; n2.setExecutionMode("remote") ; n2.setContainer(cont)
1415     p.init()
1416     self.assertEqual(p.getState(),pilot.READY)
1417     ex.RunW(p,0)
1418     self.assertEqual(p.getState(),pilot.DONE)
1419     pass
1420
1421   def test20(self):
1422     """This test revealed a huge bug in ElementaryNode contained in a loop or foreach. The RECONNECT state generated invalid dependancies that only HPContainer can reveal the problem"""
1423     def assignCont(n,cont):
1424       n.setExecutionMode("remote") ; n.setContainer(cont) 
1425       pass
1426     xmlFileName="test20.xml"
1427     p=self.r.createProc("test26")
1428     p.setProperty("executor","workloadmanager")
1429     #
1430     cont=p.createContainer("gg","Salome")
1431     cont.setProperty("name","localhost")
1432     cont.setProperty("hostname","localhost")
1433     # no limit for the number of containers launched
1434     cont.setProperty("nb_proc_per_node","0")
1435     cont.setProperty("type","multi")
1436     cont.usePythonCache(True)
1437     cont.attachOnCloning()
1438     #
1439     po=p.createInterfaceTc("python:obj:1.0","pyobj",[])
1440     sop=p.createSequenceTc("list[pyobj]","list[pyobj]",po)
1441     #
1442     b0=self.r.createBloc("test26/main") ; p.edAddChild(b0)
1443     n0=self.r.createScriptNode("Salome","test26/n0") ; assignCont(n0,cont) # 1
1444     n0.setScript("""import os
1445 dd=range(10)""")
1446     dd=n0.edAddOutputPort("dd",sop) ; b0.edAddChild(n0)
1447     fe0=self.r.createForEachLoop("test26/FE0",po) ; b0.edAddChild(fe0)
1448     fe0.edGetNbOfBranchesPort().edInitInt(1) # very important for the test : 1 !
1449     fe0i=self.r.createBloc("test26/FE0_internal") ; fe0.edSetNode(fe0i)
1450     zeArgInitNode2=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode2,cont) # 2
1451     fe0i.edAddChild(zeArgInitNode2)
1452     c1=zeArgInitNode2.edAddInputPort("c",po)
1453     c2=zeArgInitNode2.edAddOutputPort("c",po)
1454     zeRun=self.r.createBloc("test26/zeRun") ; fe0i.edAddChild(zeRun)
1455     zeArgInitNode=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode,cont) # 3
1456     zeRun.edAddChild(zeArgInitNode)
1457     ff1=zeArgInitNode.edAddInputPort("ff",po)
1458     ff2=zeArgInitNode.edAddOutputPort("ff",po)
1459     line01=self.r.createScriptNode("Salome","line01") ; zeRun.edAddChild(line01) ; assignCont(line01,cont) # 4
1460     line01.setScript("ee=3")
1461     ee0=line01.edAddOutputPort("ee",po)
1462     initt=self.r.createScriptNode("Salome","test26/initt") ; assignCont(initt,cont) # 5
1463     initt.setScript("pass") ; zeRun.edAddChild(initt)
1464     end=self.r.createScriptNode("Salome","test26/end") ; assignCont(end,cont) # 6
1465     end.setScript("import os") ; zeRun.edAddChild(end)
1466     retu=self.r.createScriptNode("Salome","return") ; assignCont(retu,cont) # 7
1467     retu.setScript("ee=i0") ; zeRun.edAddChild(retu)
1468     i0=retu.edAddInputPort("i0",po)
1469     ee=retu.edAddOutputPort("ee",po)
1470     zeRun.edAddCFLink(zeArgInitNode,line01)
1471     zeRun.edAddCFLink(line01,initt)
1472     zeRun.edAddCFLink(initt,end)
1473     zeRun.edAddCFLink(end,retu)
1474     p.edAddLink(ee0,i0)
1475     #
1476     returnn=self.r.createScriptNode("Salome","return") ; assignCont(returnn,cont) # 8
1477     returnn.setScript("elt=i0")
1478     i00=returnn.edAddInputPort("i0",po)
1479     elt=returnn.edAddOutputPort("elt",po)
1480     fe0i.edAddChild(returnn)
1481     fe0i.edAddCFLink(zeArgInitNode2,zeRun)
1482     fe0i.edAddCFLink(zeRun,returnn)
1483     p.edAddLink(c2,ff1)
1484     p.edAddLink(ee,i00)
1485     #
1486     finalize=self.r.createScriptNode("Salome","test26/finalize") ; b0.edAddChild(finalize) ; assignCont(finalize,cont) # 9
1487     finalize.setScript("pass")
1488     b0.edAddCFLink(n0,fe0)
1489     b0.edAddCFLink(fe0,finalize)
1490     #
1491     p.edAddLink(dd,fe0.edGetSeqOfSamplesPort())
1492     p.edAddLink(fe0.edGetSamplePort(),c1)
1493     #
1494     #xmlFileName="test20.xml"
1495     #p.saveSchema(xmlFileName)
1496     p.getChildByName("test26/main.test26/FE0").edGetNbOfBranchesPort().edInitInt(1) # very important 1 !
1497     #
1498     ex=pilot.ExecutorSwig()
1499     self.assertEqual(p.getState(),pilot.READY)
1500     ex.RunW(p,0)
1501     self.assertEqual(p.getState(),pilot.DONE)
1502     pass
1503
1504   pass
1505
1506   def test21(self):
1507     "test if we restart from a saved state in a foreach loop"
1508     fname=os.path.join(self.workdir, "test21.xml")
1509     xmlStateFileName=os.path.join(self.workdir, "saveState21.xml")
1510     from datetime import datetime
1511     p=self.r.createProc("prTest21")
1512     cont=p.createContainer("gg","Salome")
1513     cont.setProperty("name","localhost")
1514     cont.setProperty("hostname","localhost")
1515     cont.setProperty("type","multi")
1516     td=p.createType("double","double")
1517     ti=p.createType("int","int")
1518     tsi=p.createSequenceTc("seqint","seqint",ti)
1519     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
1520     n0=self.r.createScriptNode("","n0")
1521     o0=n0.edAddOutputPort("o0",tsi)
1522     n0.setScript("o0=[ elt for elt in range(6) ]")
1523     p.edAddChild(n0)
1524     n1=self.r.createForEachLoop("n1",ti)
1525     n10=self.r.createScriptNode("","n10")
1526     n10.setExecutionMode("remote")
1527     n10.setContainer(cont)
1528     n1.edAddChild(n10)
1529     n10.setScript("""
1530 import time
1531 time.sleep(9)
1532 o2=2*i1
1533 """)
1534     i1=n10.edAddInputPort("i1",ti)
1535     o2=n10.edAddOutputPort("o2",ti)
1536     p.edAddChild(n1)
1537     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
1538     p.edAddLink(n1.edGetSamplePort(),i1)
1539     p.edAddCFLink(n0,n1)
1540     n1.edGetNbOfBranchesPort().edInitPy(2)
1541     n2=self.r.createScriptNode("","n2")
1542     n2.setScript("o4=i3")
1543     i3=n2.edAddInputPort("i3",tsi)
1544     o4=n2.edAddOutputPort("o4",tsi)
1545     n2.setScript("o4=i3")
1546     p.edAddChild(n2)
1547     p.edAddCFLink(n1,n2)
1548     p.edAddLink(o2,i3)
1549     p.saveSchema(fname)
1550     #
1551     l=loader.YACSLoader()
1552     p=l.load(fname)
1553     n1=p.getChildByName("n1")
1554     ex=pilot.ExecutorSwig()
1555     ex.setKeepGoingProperty(True)
1556     #
1557     startt=datetime.now()
1558     import threading
1559     myRun=threading.Thread(None, ex.RunW, None, (p,0))
1560     myRun.start()
1561     import time
1562     time.sleep(15)
1563     SALOMERuntime.schemaSaveState(p, ex, xmlStateFileName)
1564     a,b,c=n1.getPassedResults(ex)
1565     myRun.join()
1566     t0=datetime.now()-startt
1567     #
1568     self.assertEqual(p.getState(),pilot.DONE)
1569     self.assertEqual(n1.getState(),pilot.DONE)
1570     self.assertEqual(a,[0,1])
1571     self.assertEqual([elt.getPyObj() for elt in b],[[0,2]])
1572     #
1573     p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
1574     p.getChildByName("n1").getChildByName("n10").setScript("""
1575 import time
1576 time.sleep(0.1)
1577 o2=5*i1
1578 """)
1579     loader.loadState(p, xmlStateFileName)
1580     p.resetState(1)
1581     p.getChildByName("n1").assignPassedResults(a,b,c)
1582     p.exUpdateState();
1583     #
1584     ex.RunW(p,0,False)
1585     #
1586     self.assertEqual(n1.getState(),pilot.DONE)
1587     self.assertEqual(p.getState(),pilot.DONE)
1588     self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,2,10,15,20,25])
1589
1590     # Restart from a saved state in a foreach loop without using assignPassedResults.
1591     # This test uses the files test21.xml and saveState21.xml produced by test21.
1592
1593     ex=pilot.ExecutorSwig()
1594     l=loader.YACSLoader()
1595     q=l.load(fname)
1596     q.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
1597     q.getChildByName("n1").getChildByName("n10").setScript("""
1598 import time
1599 time.sleep(0.1)
1600 print("execution n10:", i1)
1601 o2=5*i1
1602 """)
1603     q.getChildByName("n2").setScript("""
1604 print("execution n2:", i3)
1605 o4=i3
1606 """)
1607     loader.loadState(q, xmlStateFileName)
1608     q.resetState(1)
1609     q.exUpdateState()
1610     #
1611     ex.RunW(q,0,False)
1612     #
1613     self.assertEqual(q.getChildByName("n1").getState(),pilot.DONE)
1614     self.assertEqual(q.getState(),pilot.DONE)
1615     self.assertEqual(q.getChildByName("n2").getOutputPort("o4").getPyObj(),[0,2,10,15,20,25])
1616     pass
1617
1618   def test23(self):
1619     """ test focused on weight attribut after a dump and reload from a xml file
1620     """
1621     fname=os.path.join(self.workdir, "test23.xml")
1622     p=self.r.createProc("prTest23")
1623     cont=p.createContainer("gg","Salome")
1624     cont.setProperty("name","localhost")
1625     cont.setProperty("hostname","localhost")
1626     cont.setProperty("type","multi")
1627     td=p.createType("double","double")
1628     ti=p.createType("int","int")
1629     tsi=p.createSequenceTc("seqint","seqint",ti)
1630     tsd=p.createSequenceTc("seqdbl","seqdbl",td)
1631     n0=self.r.createScriptNode("","n0")
1632     o0=n0.edAddOutputPort("o0",tsi)
1633     n0.setScript("o0=[ elt for elt in range(6) ]")
1634     p.edAddChild(n0)
1635     n1=self.r.createForEachLoop("n1",ti)
1636     n1.setWeight(3)
1637     n10=self.r.createScriptNode("","n10")
1638     n10.setExecutionMode("remote")
1639     n10.setContainer(cont)
1640     n1.edAddChild(n10)
1641     n10.setScript("""
1642 import time
1643 time.sleep(2)
1644 o2=2*i1
1645 """)
1646     n10.setWeight(4.)
1647     i1=n10.edAddInputPort("i1",ti)
1648     o2=n10.edAddOutputPort("o2",ti)
1649     p.edAddChild(n1)
1650     p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
1651     p.edAddLink(n1.edGetSamplePort(),i1)
1652     p.edAddCFLink(n0,n1)
1653     n1.edGetNbOfBranchesPort().edInitPy(2)
1654     n2=self.r.createScriptNode("","n2")
1655     n2.setScript("o4=i3")
1656     i3=n2.edAddInputPort("i3",tsi)
1657     o4=n2.edAddOutputPort("o4",tsi)
1658     n2.setScript("o4=i3")
1659     p.edAddChild(n2)
1660     p.edAddCFLink(n1,n2)
1661     p.edAddLink(o2,i3)
1662     p.saveSchema(fname)
1663     #
1664     l=loader.YACSLoader()
1665     p=l.load(fname)
1666     self.assertEqual(p.getChildByName("n1").getWeight().getSimpleLoopWeight(),3.0)
1667     self.assertEqual(p.getChildByName("n1").getChildByName("n10").getWeight().getElementaryWeight(),4.0)
1668     pass
1669
1670   def test24(self):
1671     """ Non regression test EDF17470"""
1672     SALOMERuntime.RuntimeSALOME.setRuntime()
1673     r=SALOMERuntime.getSALOMERuntime()
1674     p=r.createProc("prTest2")
1675     #
1676     cont1=p.createContainer("cont1","Salome")
1677     cont1.setProperty("name","localhost")
1678     cont1.setProperty("hostname","localhost")
1679     cont1.setProperty("type","multi")
1680     cont1.setProperty("container_name","container1@")
1681     #
1682     cont2=p.createContainer("cont2","Salome")
1683     cont2.setProperty("name","localhost")
1684     cont2.setProperty("hostname","localhost")
1685     cont2.setProperty("type","multi")
1686     cont2.setProperty("container_name","container2@")
1687     #
1688     td=p.createType("double","double")
1689     ti=p.createType("int","int")
1690     ts=p.createType("string","string")
1691     n0=r.createScriptNode("","n0")
1692     n0.setScript("""import SalomeSDSClt
1693 import SALOME
1694 import salome
1695 import unittest
1696 import pickle
1697 import gc
1698 import time
1699
1700 def obj2Str(obj):
1701   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
1702 def str2Obj(strr):
1703   return pickle.loads(strr)
1704
1705
1706 salome.salome_init()
1707 scopeName="Scope1"
1708 varName="a"
1709 dsm=salome.naming_service.Resolve("/DataServerManager")
1710 dsm.cleanScopesInNS()
1711 if scopeName in dsm.listScopes():
1712   dsm.removeDataScope(scopeName)
1713 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
1714 #
1715 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
1716 dss.atomicApply([t0])
1717 """)
1718     n0_sn=n0.edAddOutputPort("scopeName",ts)
1719     n0_vn=n0.edAddOutputPort("varName",ts)
1720     #
1721     n1=r.createScriptNode("","n1")
1722     n1_sn=n1.edAddInputPort("scopeName",ts)
1723     n1_vn=n1.edAddInputPort("varName",ts)
1724     n1.setScript("""import SalomeSDSClt
1725 import SALOME
1726 import salome
1727 import unittest
1728 import pickle
1729 import gc
1730 import time
1731
1732
1733 def obj2Str(obj):
1734   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
1735 def str2Obj(strr):
1736   return pickle.loads(strr)
1737
1738 salome.salome_init()
1739 dsm=salome.naming_service.Resolve("/DataServerManager")
1740 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
1741 assert(not isCreated)
1742
1743 t1=dss.addMultiKeyValueSession(varName)
1744 # lecture 'ef'
1745 wk2=dss.waitForKeyInVar(varName,obj2Str("ef"))
1746 wk2.waitFor()
1747 assert(str2Obj(dss.waitForMonoThrRev(wk2))==[11,12])""")
1748     n1.setContainer(cont1)
1749     #
1750     n2=r.createScriptNode("","n2")
1751     n2_sn=n2.edAddInputPort("scopeName",ts)
1752     n2_vn=n2.edAddInputPort("varName",ts)
1753     n2.setScript("""import SalomeSDSClt
1754 import SALOME
1755 import salome
1756 import unittest
1757 import pickle
1758 import gc
1759 import time
1760
1761
1762 def obj2Str(obj):
1763   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
1764 def str2Obj(strr):
1765   return pickle.loads(strr)
1766
1767 salome.salome_init()
1768 dsm=salome.naming_service.Resolve("/DataServerManager")
1769 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
1770 assert(not isCreated)
1771 time.sleep(3.)
1772 t1=dss.addMultiKeyValueSession(varName)
1773 t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
1774 t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("ef"),obj2Str([11,12]))
1775 """)
1776     n2.setContainer(cont2)
1777     #
1778     p.edAddChild(n0)
1779     p.edAddChild(n1)
1780     p.edAddChild(n2)
1781     p.edAddCFLink(n0,n1)
1782     p.edAddCFLink(n0,n2)
1783     p.edAddLink(n0_sn,n1_sn)
1784     p.edAddLink(n0_vn,n1_vn)
1785     p.edAddLink(n0_sn,n2_sn)
1786     p.edAddLink(n0_vn,n2_vn)
1787     #
1788     ex=pilot.ExecutorSwig()
1789     ex.RunW(p,0)
1790     self.assertEqual(p.getState(),pilot.DONE)
1791     pass
1792
1793   def test25(self):
1794     fname=os.path.join(self.workdir, "test25.xml")
1795     p=self.r.createProc("p0")
1796     tp=p.createInterfaceTc("python:obj:1.0","pyobj",[])
1797     n1_0_sc=self.r.createScriptNode("Salome","n1_0_sc")
1798     p.edAddChild(n1_0_sc)
1799     n1_0_sc.setExecutionMode("remote")
1800     n1_0_sc.setScript("""""")
1801     i1_0_sc=n1_0_sc.edAddInputPort("i1",tp)
1802     i1_0_sc.edInitPy(list(range(4)))
1803
1804     cont=p.createContainer("gg","Salome")
1805     cont.setProperty("name","localhost")
1806     cont.setProperty("hostname","localhost")
1807     n1_0_sc.setContainer(cont)
1808
1809     p.saveSchema(fname)
1810     l=loader.YACSLoader()
1811     p=l.load(fname)
1812     ex=pilot.ExecutorSwig()
1813     self.assertEqual(p.getState(),pilot.READY)
1814     ex.RunW(p,0)
1815     self.assertEqual(p.getState(),pilot.DONE)
1816     pass
1817
1818   def test27(self):
1819     """ 
1820     This test is here to check that old (<=930) graphs are always loadable.
1821     So an xml file coming from test14 in 930 has been generated and converted into home made "base64" like format.
1822     This test puts unbased64 byte array into test_930.xml and load it to check that everything is OK.
1823     """
1824     import os
1825     content_of_file = b'DDkShXM2PeNCndPqRfnYX5EAt.GaRgPq7dNqtfnYZgvqh=kQf7moXCE2z5lED.tCxgM2RcOqdfl29ePC9YnAx3uaGetqF5lE=.E2D0uS1eM2RcOqdfl2FjPqBYE2pdNq7fl2FjPqBYHoT3.2=.Ew9dsCdUFqVfOaj2Eaxet4BeN2=BOKRWOwF0PqfYMqdYHoT3.2=.EwxYNKHeNa=5O4heOwF4OKBeN2=7Maj2FaZXOaFDFwI.E2=1kibUua=5O4heOwF7Nq9YE2pdNq7fl2ZbMiFDFwI.E2=1nqFZNCdaM2RcOqdfl21dvqFZN2=7Maj2ECbWsKxbNQxYNKL6lo12HoT3.2=.EwneOCfeNqleM2RcOqdfl2BdPC9hcCbjN4Jfd2=APqRWuaRWuwF.uSxYNKFDFwI.E2=1kibUua=5O4heOwFAsiHdNqtYE2pdNq7fl2nWtCZbPaFDFwI.E2=1n4xbMiVdNqdYs2RcOqdfl26eNaVesq9g9qRWu4ZbOaHYFwI.E2=.E2=1kCHjMCdYsibUFqVfOaj2H4xbMiVdNqdYvupdNq7YE2PcMqfeOwFAe4BjOqdYHoT3.2=.E2=.Ew1Yvq1eNC9ds2RcOqdfl2VWsiVgMKdWPuxbPulXPqRdNqtYE2PcMqfeOwF.l2x5lE=.E2=.E2D.tCxUuaHWuS=5O4heOwFAPqRWu4ZbOaHjdqVfOaF.FiVXOidfl2McP49jNCbgeaHauaHYHoT3.2=.E2=.Ew1Yvq1eNC9ds2RcOqdfl2RcOqdYE2PcMqfeOwF1PqlcMq3jPC9YHoT3.2=.EwxAPqRWu4ZbOaHblE=.E2D2MqxgM2RcOqdfl29ePC9YnAx9O4ZbN2T3.2=.E2=.EwFXPqlUFqVfOaj2EidgsiHAnoHetqF5lE=.E2=.E2=.E2D4PqHeO4lVM2RcOqdfl29ePC9YnAx48WF.FqFYu4RgMKj2FAF.EqxjMCueOKtVMij2GoX2E29dsCdfl21dvqFZN2T3.2=.E2=.E2=.E2=.EwZbMqZbOa=5O4heOwF0uanWtAnDFCfbPuZbMidYtqVXN2T3.2=.E2=.E2=.E2=.E2=.EwngNCZUsiT1n4xWOaT1m2qg6WUWe0qjMAj7MAp7OAifdwDDH4xWOaT1nongNCZUsiT3.2=.E2=.E2=.E2=.E2=.EwZbMCxYsi=5O4heOwF7MAF.EibUuaj2ECbjN4JYHoT3.2=.E2=.E2=.E2=.E2=.EwZbMCxYsi=5O4heOwF7OAF.EibUuaj2ECbjN4JYHoT3.2=.E2=.E2=.E2=.E2=.Ewxesi1jNC9UFqVfOaj2Hq12E29dsCdfl21dvqFZN2x5lE=.E2=.E2=.E2=.E2DDGKRXOKReNwI.E2=.E2=.E2=1noNjNCdcP43blE=.E2=.E2=.E2D0O49cMqZbPK=APqRWtCxXOwF4O4BguaF5lE=.E2=.E2=.E2=.E2D4NCxfNqxWOaT0uanWtAnDFWcXnoNYvqhbPq7eNw=1laHjOq1jNC9bmaPcMqmcOq1XOanXnoNYvqhUvqHWtwI.E2=.E2=.E2=.E2=1kixbPq7eNw9ePC9YnAx48WR0uanWtAnDFCfbPuZbMidYtqVXMwx0vqRjMadbk2D0vq1jNC9bmK11no9jMCxYsiT3.2=.E2=.E2=.Ewx0O49cMqZbPKT3.2=.E2=.Ewx2MqxgNwI.E2=.E2=1mKRXOKReM2RcOqdfl29ePC9YnAxAMKdgPKF5lE=.E2=.E2=.E2DAv4HdMC9bkwljMadbkwVBf06c6eUhfqX9mKH9euT1noljMadbkwxAv4HdMC9blE=.E2=.E2=.E2D7Nq1jNC9UFqVfOaj2GKH2E29dsCdfl2BdPC9hcCbjN4Jfd2x5lE=.E2=.E2=.E2DDOi9UvqHWs2RcOqdfl2xcl2=0uS1eOwF1OKnWvO1dvqFZOuFDFwI.E2=.E2=1noZbMqZbOaT3.2=.E2=.EwljNq9YvqBbk2D4NCxfNqxWOaT0uanWtAnDFCfbMwx4NCxfNqxWOaT.Ew9jNqxWOaT0uanWtAnDH43eP4pXno9jNqxWOaT.EwxAPqRWtCxXNwI.E2=.E2=1kaVWu4BdNqpUH4xbMiHjMqj2FaVXPCdYFwI.E2=.E2=.E2=1laHjOqRjMadbkidgsiHAnoHetqR0uanWtAnDFWcbEidgsiHAnoHetqydNq9eNCRcMqDDFaHjOqRjMadbk2D4NCxfMCxYsiTDMADDFaHjOq1jNC9blE=.E2=.E2=.E2D0vqRjMadbkidgsiHAnolVOalhMwx0vqRjMadbk2D0vq1jNC9bmKH1no9jMCxYsiT3.2=.E2=.Ewx0O49cMqZbPKT3.2=.Ewx2MqxgNwI.E2=1kCVYu4heMidYtwI.E2=.E2=1kixbPq7eNw9ePC9YnAx9O4ZbNo9ePC9YnAx2uiRbEidgsiHAnoMe6wx0vqRjMadbkw9jMCxYsiT5N4EYu4RgMKdgswx0vq1jNC9blE=.E2=.E2D4u4BeuaT1mKRWtwH1noZbMiT1noPcMqfeNwI.E2=1no1cNCVfOa9eNCT3.2=.Ew1cNCVfOa9eNCT3.2=.E2=.Ew9jNqxWOaT0uanWtAnDGqVdNqR0uanWtAnDFCfbNo9ePC9YnAx48WDDEixbPq7eNwD0vq1jNC9bn8hUsqng9qBXOalWuKxbMwx0vq1jNC9blE=.E2=.E2D4u4BeuaT1m4HYu4bbkw7cMiVblED4u4BeuaT1nC9YuKRiNwAUkmI5EwxAsiHdNqtbkwx4u4BeuaT3.wPcMqfeNwDAsiHdNqtbkmX17ER1nonWtCZbPaT1noPcMqfeNwI1liVXOidbkwnWtCZbPaT17AAZ=oDDHC9YuKRiNwDDFiVXOidblED4u4BeuaT1nC9YuKRiNwAgkmI5EwxAsiHdNqtbkwx4u4BeuaT3.wPcMqfeNwDAsiHdNqtbkm917ER1nonWtCZbPaT1noPcMqfeNwI1liVXOidbkwnWtCZbPaT18gAZ=oDDHC9YuKRiNwDDFiVXOidblED4u4BeuaT1nC9YuKRiNwAakmI5EwxAsiHdNqtbkwx4u4BeuaT3.wPcMqfeNwDAsiHdNqtbkmv17ER1nonWtCZbPaT1noPcMqfeNwI1liVXOidbkwnWtCZbPaT16QAZ=oDDHC9YuKRiNwDDFiVXOidblED4u4BeuaT1nC9YuKRiNwAdkmI5EwxAsiHdNqtbkwx4u4BeuaT3.wx0O49cNwDDG4HYu4bbkwx4u4BeuaT3.2=.Ewx.u4HcOqdWuaHblE=.E2D.u4HcOqdWuaHblE=.E2=.E2D0vqRjMadbkidgsiHAnohcOKRbEidgsiHAnoHetqR0uanWtAnDFWcbEidgsiHAnoHetqydNq9eNCRcMqDDEixbPq7eNwD0vq1jNC9bmKX1no9jMCxYsiT3.2=.E2=.EwPcMqfeNwDDN4JYuaNbkwVBf06c6eUhcmn17ER9euT1noxYNKHeNaT1noPcMqfeNwI.E2=1no1cNCVfOa9eNCT3.wx.tCxgNwI3'
1826
1827     fname=os.path.join(self.workdir, "test_930.xml")
1828     with open(fname,"wb") as f:
1829       f.write( pilot.FromBase64Swig(content_of_file) )
1830
1831     SALOMERuntime.RuntimeSALOME_setRuntime()
1832     l=loader.YACSLoader()
1833     p=l.load(fname)
1834     self.assertTrue(p.getChildByName("test23/main").getChildByName("test23/run").getChildByName("test23/FE").getChildByName("test23/run_internal").getInputPort("i1").getPyObj() == 3)
1835     self.assertTrue(p.getChildByName("test23/main").getChildByName("test23/run").getChildByName("test23/FE").edGetSeqOfSamplesPort().getPyObj()==list(range(10)))
1836     os.remove(fname)
1837     pass
1838
1839 if __name__ == '__main__':
1840   import os,sys
1841   U = os.getenv('USER')
1842   with open("/tmp/" + U + "/UnitTestsResult", 'a') as f:
1843       f.write("  --- TEST src/yacsloader: testSaveLoadRun.py\n")
1844       suite = unittest.makeSuite(TestSaveLoadRun)
1845       result=unittest.TextTestRunner(f, descriptions=1, verbosity=1).run(suite)
1846   sys.exit(not result.wasSuccessful())