]> SALOME platform Git repositories - modules/yacs.git/blobdiff - src/yacsloader_swig/Test/testSaveLoadRun.py
Salome HOME
Fix the python API of the savestate feature.
[modules/yacs.git] / src / yacsloader_swig / Test / testSaveLoadRun.py
index 460f6c208a3884e85710d1e9f1b16a8bd7c0d46e..a4bc88c3aa7aa17269a49f8201f04e33b8586d27 100755 (executable)
@@ -1,4 +1,4 @@
-# Copyright (C) 2006-2015  CEA/DEN, EDF R&D
+# Copyright (C) 2006-2016  CEA/DEN, EDF R&D
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -454,7 +454,7 @@ for i in xrange(nb):
     node2000.setScript("o6=2+i5")
     p.edAddLink(node200.edGetSamplePort(),i5)
     #
-    node3=self.r.createForEachLoop("node3",td)
+    node3=self.r.createForEachLoop("node3",td2)
     p.edAddChild(node3)
     p.edAddCFLink(node2,node3)
     p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
@@ -540,7 +540,7 @@ for i in xrange(nb):
     node2000.setScript("def ff(x):\n  return 2+x")
     p.edAddLink(node200.edGetSamplePort(),i5)
     #
-    node3=self.r.createForEachLoop("node3",td)
+    node3=self.r.createForEachLoop("node3",td2)
     p.edAddChild(node3)
     p.edAddCFLink(node2,node3)
     p.edAddLink(o6,node3.edGetSeqOfSamplesPort())
@@ -1319,7 +1319,6 @@ for i in i8:
   def test19(self):
     """This test checks the mechanism of YACS that allow PythonNodes to know their DynParaLoop context."""
     fname="test19.xml"
-    r=SALOMERuntime.getSALOMERuntime()
     l=loader.YACSLoader()
     #
     p=self.r.createProc("PROC")
@@ -1383,6 +1382,202 @@ assert(my_dpl_localization[0][1]>=0 and my_dpl_localization[0][1]<3)
     self.assertEqual(p.getState(),pilot.DONE)
     pass
 
+  def test20(self):
+    """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"""
+    def assignCont(n,cont):
+      n.setExecutionMode("remote") ; n.setContainer(cont) 
+      pass
+    xmlFileName="test20.xml"
+    p=self.r.createProc("test26")
+    #
+    cont=p.createContainer("gg","HPSalome") # very important ! HP Container needed for the test !
+    cont.setSizeOfPool(8) # important make this figure >= 6
+    #
+    po=p.createInterfaceTc("python:obj:1.0","pyobj",[])
+    sop=p.createSequenceTc("list[pyobj]","list[pyobj]",po)
+    #
+    b0=self.r.createBloc("test26/main") ; p.edAddChild(b0)
+    n0=self.r.createScriptNode("Salome","test26/n0") ; assignCont(n0,cont) # 1
+    n0.setScript("""import os
+dd=range(10)""")
+    dd=n0.edAddOutputPort("dd",sop) ; b0.edAddChild(n0)
+    fe0=self.r.createForEachLoop("test26/FE0",po) ; b0.edAddChild(fe0)
+    fe0.edGetNbOfBranchesPort().edInitInt(1) # very important for the test : 1 !
+    fe0i=self.r.createBloc("test26/FE0_internal") ; fe0.edSetNode(fe0i)
+    zeArgInitNode2=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode2,cont) # 2
+    fe0i.edAddChild(zeArgInitNode2)
+    c1=zeArgInitNode2.edAddInputPort("c",po)
+    c2=zeArgInitNode2.edAddOutputPort("c",po)
+    zeRun=self.r.createBloc("test26/zeRun") ; fe0i.edAddChild(zeRun)
+    zeArgInitNode=self.r.createScriptNode("Salome","zeArgInitNode") ; assignCont(zeArgInitNode,cont) # 3
+    zeRun.edAddChild(zeArgInitNode)
+    ff1=zeArgInitNode.edAddInputPort("ff",po)
+    ff2=zeArgInitNode.edAddOutputPort("ff",po)
+    line01=self.r.createScriptNode("Salome","line01") ; zeRun.edAddChild(line01) ; assignCont(line01,cont) # 4
+    line01.setScript("ee=3")
+    ee0=line01.edAddOutputPort("ee",po)
+    initt=self.r.createScriptNode("Salome","test26/initt") ; assignCont(initt,cont) # 5
+    initt.setScript("pass") ; zeRun.edAddChild(initt)
+    end=self.r.createScriptNode("Salome","test26/end") ; assignCont(end,cont) # 6
+    end.setScript("import os") ; zeRun.edAddChild(end)
+    retu=self.r.createScriptNode("Salome","return") ; assignCont(retu,cont) # 7
+    retu.setScript("ee=i0") ; zeRun.edAddChild(retu)
+    i0=retu.edAddInputPort("i0",po)
+    ee=retu.edAddOutputPort("ee",po)
+    zeRun.edAddCFLink(zeArgInitNode,line01)
+    zeRun.edAddCFLink(line01,initt)
+    zeRun.edAddCFLink(initt,end)
+    zeRun.edAddCFLink(end,retu)
+    p.edAddLink(ee0,i0)
+    #
+    returnn=self.r.createScriptNode("Salome","return") ; assignCont(returnn,cont) # 8
+    returnn.setScript("elt=i0")
+    i00=returnn.edAddInputPort("i0",po)
+    elt=returnn.edAddOutputPort("elt",po)
+    fe0i.edAddChild(returnn)
+    fe0i.edAddCFLink(zeArgInitNode2,zeRun)
+    fe0i.edAddCFLink(zeRun,returnn)
+    p.edAddLink(c2,ff1)
+    p.edAddLink(ee,i00)
+    #
+    finalize=self.r.createScriptNode("Salome","test26/finalize") ; b0.edAddChild(finalize) ; assignCont(finalize,cont) # 9
+    finalize.setScript("pass")
+    b0.edAddCFLink(n0,fe0)
+    b0.edAddCFLink(fe0,finalize)
+    #
+    p.edAddLink(dd,fe0.edGetSeqOfSamplesPort())
+    p.edAddLink(fe0.edGetSamplePort(),c1)
+    #
+    #p.saveSchema(xmlFileName)
+    p.getChildByName("test26/main.test26/FE0").edGetNbOfBranchesPort().edInitInt(1) # very important 1 !
+    #
+    ex=pilot.ExecutorSwig()
+    self.assertEqual(p.getState(),pilot.READY)
+    ex.RunW(p,0)
+    self.assertEqual(p.getState(),pilot.DONE)
+    pass
+
+  pass
+
+  def test21(self):
+    "test if we restart from a saved state in a foreach loop"
+    fname="test21.xml"
+    xmlStateFileName="saveState21.xml"
+    from datetime import datetime
+    p=self.r.createProc("prTest21")
+    cont=p.createContainer("gg","Salome")
+    cont.setProperty("name","localhost")
+    cont.setProperty("hostname","localhost")
+    cont.setProperty("type","multi")
+    td=p.createType("double","double")
+    ti=p.createType("int","int")
+    tsi=p.createSequenceTc("seqint","seqint",ti)
+    tsd=p.createSequenceTc("seqdbl","seqdbl",td)
+    n0=self.r.createScriptNode("","n0")
+    o0=n0.edAddOutputPort("o0",tsi)
+    n0.setScript("o0=[ elt for elt in range(6) ]")
+    p.edAddChild(n0)
+    n1=self.r.createForEachLoop("n1",ti)
+    n10=self.r.createScriptNode("","n10")
+    n10.setExecutionMode("remote")
+    n10.setContainer(cont)
+    n1.edAddChild(n10)
+    n10.setScript("""
+import time
+time.sleep(2)
+o2=2*i1
+""")
+    i1=n10.edAddInputPort("i1",ti)
+    o2=n10.edAddOutputPort("o2",ti)
+    p.edAddChild(n1)
+    p.edAddLink(o0,n1.edGetSeqOfSamplesPort())
+    p.edAddLink(n1.edGetSamplePort(),i1)
+    p.edAddCFLink(n0,n1)
+    n1.edGetNbOfBranchesPort().edInitPy(2)
+    n2=self.r.createScriptNode("","n2")
+    n2.setScript("o4=i3")
+    i3=n2.edAddInputPort("i3",tsi)
+    o4=n2.edAddOutputPort("o4",tsi)
+    n2.setScript("o4=i3")
+    p.edAddChild(n2)
+    p.edAddCFLink(n1,n2)
+    p.edAddLink(o2,i3)
+    p.saveSchema(fname)
+    #
+    l=loader.YACSLoader()
+    p=l.load(fname)
+    n1=p.getChildByName("n1")
+    ex=pilot.ExecutorSwig()
+    ex.setKeepGoingProperty(True)
+    #
+    startt=datetime.now()
+    import threading
+    myRun=threading.Thread(None, ex.RunW, None, (p,0))
+    myRun.start()
+    import time
+    time.sleep(5)
+    SALOMERuntime.schemaSaveState(p, ex, xmlStateFileName)
+    a,b,c=n1.getPassedResults(ex)
+    myRun.join()
+    t0=datetime.now()-startt
+    #
+    self.assertEqual(p.getState(),pilot.DONE)
+    self.assertEqual(n1.getState(),pilot.DONE)
+    self.assertEqual(a,[0,1])
+    self.assertEqual([elt.getPyObj() for elt in b],[[0L,2L]])
+    #
+    p.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
+    p.getChildByName("n1").getChildByName("n10").setScript("""
+import time
+time.sleep(0.1)
+o2=5*i1
+""")
+    loader.loadState(p, xmlStateFileName)
+    p.resetState(1)
+    p.getChildByName("n1").assignPassedResults(a,b,c)
+    p.exUpdateState();
+    #
+    startt=datetime.now()
+    ex.RunW(p,0,False)
+    t1=datetime.now()-startt
+    #
+    self.assertEqual(n1.getState(),pilot.DONE)
+    self.assertEqual(p.getState(),pilot.DONE)
+    self.assertEqual(p.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,2L,10L,15L,20L,25L])
+    pass
+  pass
+
+  def test22(self):
+    """Restart from a saved state in a foreach loop without using assignPassedResults.
+       This test uses the files test21.xml and saveState21.xml produced by test21.
+    """
+    fname="test21.xml"
+    xmlStateFileName="saveState21.xml"
+
+    ex=pilot.ExecutorSwig()
+    l=loader.YACSLoader()
+    q=l.load(fname)
+    q.getChildByName("n0").setScript("o0=[ 3*elt for elt in range(6) ]")
+    q.getChildByName("n1").getChildByName("n10").setScript("""
+import time
+time.sleep(0.1)
+print "execution n10:", i1
+o2=5*i1
+""")
+    q.getChildByName("n2").setScript("""
+print "execution n2:", i3
+o4=i3
+""")
+    loader.loadState(q, xmlStateFileName)
+    q.resetState(1)
+    q.exUpdateState()
+    #
+    ex.RunW(q,0,False)
+    #
+    self.assertEqual(q.getChildByName("n1").getState(),pilot.DONE)
+    self.assertEqual(q.getState(),pilot.DONE)
+    self.assertEqual(q.getChildByName("n2").getOutputPort("o4").getPyObj(),[0L,2L,10L,15L,20L,25L])
+    pass
   pass
 
 if __name__ == '__main__':