Salome HOME
Merge remote-tracking branch 'origin/V8_3_BR' into ngr/python3_dev
[modules/kernel.git] / src / SALOMESDS / TestSalomeSDS.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20 # Author : Anthony Geay
21
22 import SalomeSDSClt
23 import SALOME
24 import salome
25 import unittest
26 import pickle
27 import gc
28 import time
29 import multiprocessing as mp
30
31 def obj2Str(obj):
32   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
33 def str2Obj(strr):
34   return pickle.loads(strr)
35 def generateKey(varName,scopeName):
36   dsm=salome.naming_service.Resolve("/DataServerManager")
37   dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
38   assert(not isCreated)
39   t=dss.addKeyValueInVarHard(varName,obj2Str("ef"),obj2Str([11,14,100]))
40   time.sleep(3)
41   dss.atomicApply([t])
42 def work(t):
43   i,varName,scopeName=t
44   if i==0:
45     generateKey(varName,scopeName)
46     return 0
47   else:
48     import TestSalomeSDSHelper0
49     import os,subprocess
50     fname=os.path.splitext(TestSalomeSDSHelper0.__file__)[0]+".py"
51     proc=subprocess.Popen(["python",fname],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
52     out,err=proc.communicate()
53     if proc.returncode!=0:
54       print(out)
55       print(err)
56     return proc.returncode
57
58 class SalomeSDSTest(unittest.TestCase):
59   
60   def testList1(self):
61     a=SalomeSDSClt.CreateRdExtGlobalVar([],"a","Scope0")
62     self.assertEqual(a.local_copy(),[])
63     a.append(5)
64     self.assertEqual(a.local_copy(),[5])
65     self.assertRaises(SALOME.SALOME_Exception,a.__delitem__,0)
66     a.append(["rt"])
67     self.assertEqual(a.local_copy(),[5,["rt"]])
68     a[1].append(8)
69     self.assertEqual(a.local_copy(),[5,["rt",8]])
70     a.extend(a)
71     self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8]])
72     a.extend(a[3:])
73     self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8],["rt",8]])
74     a[4].append(7)
75     self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8],["rt",8,7]])
76     a.ptr().getMyDataScopeServer().deleteVar("a")
77     pass
78   
79   def testDict1(self):
80     a=SalomeSDSClt.CreateRdExtGlobalVar({},"a","Scope0")
81     a["ab"]=4
82     self.assertEqual(a.local_copy(),{"ab":4})
83     a["cd"]=[5]
84     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
85     a["cd"].append(77)
86     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
87     a.__setitem__("ef",["a","bb"])
88     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb"]})
89     self.assertRaises(SALOME.SALOME_Exception,a.__setitem__,"ef",["a","bb"])
90     self.assertRaises(SALOME.SALOME_Exception,a.__setitem__,"ef",["a","bb","ccc"])
91     a["ef"].append("ccc")
92     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
93     a["gh"]=a
94     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]}})
95     a["gh"]["cd"].append(99) ; a["cd"].append(88)
96     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77,99],"ef":["a","bb","ccc"]}})
97     a.ptr().getMyDataScopeServer().deleteVar("a")
98     pass
99
100   def testReadOnly1(self):
101     a=SalomeSDSClt.CreateRdOnlyGlobalVar({"ab":4,"cd":[5,77]},"a","Scope0")
102     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
103     self.assertRaises(Exception,a.__getitem__,"ab")
104     a.ptr().getMyDataScopeServer().deleteVar("a")
105
106   def testTransaction1(self):
107     scopeName="Scope1"
108     varName="a"
109     dsm=salome.naming_service.Resolve("/DataServerManager")
110     dsm.cleanScopesInNS()
111     if scopeName in dsm.listScopes():
112       dsm.removeDataScope(scopeName)
113     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
114     self.assertTrue(isCreated)
115     #
116     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
117     dss.atomicApply([t0])
118     #
119     self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
120     #
121     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
122     dss.atomicApply([t1])
123     #
124     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
125     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
126     wk.waitFor()
127     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
128     #
129     nbProc=8
130     pool=mp.Pool(processes=nbProc)
131     asyncResult=pool.map_async(work,[(i,varName,scopeName) for i in range(nbProc)])
132     self.assertEqual(asyncResult.get(),nbProc*[0]) # <- the big test is here !
133     dsm.removeDataScope(scopeName)
134
135   def testTransaction2(self):
136     scopeName="Scope1"
137     varName="a"
138     dsm=salome.naming_service.Resolve("/DataServerManager")
139     dsm.cleanScopesInNS()
140     if scopeName in dsm.listScopes():
141       dsm.removeDataScope(scopeName)
142     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
143     self.assertTrue(isCreated)
144     #
145     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
146     dss.atomicApply([t0])
147     #
148     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
149     #
150     self.assertRaises(SALOME.SALOME_Exception,dss.addKeyValueInVarErrorIfAlreadyExisting,varName,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
151     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
152     dss.atomicApply([t1])
153     #
154     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
155     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
156     wk.waitFor()
157     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
158
159   def testTransaction3(self):
160     scopeName="Scope1"
161     varName="a"
162     dsm=salome.naming_service.Resolve("/DataServerManager")
163     dsm.cleanScopesInNS()
164     if scopeName in dsm.listScopes():
165       dsm.removeDataScope(scopeName)
166     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
167     self.assertTrue(isCreated)
168     #
169     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
170     dss.atomicApply([t0])
171     #
172     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
173     dss.atomicApply([t1])
174     #
175     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
176     #
177     t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
178     dss.atomicApply([t2])
179     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
180
181   def testTransaction4(self):
182     scopeName="Scope1"
183     varName="a"
184     dsm=salome.naming_service.Resolve("/DataServerManager")
185     dsm.cleanScopesInNS()
186     if scopeName in dsm.listScopes():
187       dsm.removeDataScope(scopeName)
188     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
189     self.assertTrue(isCreated)
190     #
191     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
192     dss.atomicApply([t0])
193     #
194     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
195     dss.atomicApply([t1])
196     #
197     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
198     wk,t2=dss.waitForKeyInVarAndKillIt(varName,obj2Str("cd"))
199     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
200     wk.waitFor()
201     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
202     dss.atomicApply([t2])
203     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
204
205   def testTransaction5(self):
206     """ Like testTransaction2 but without transactions. """
207     scopeName="Scope1"
208     varName="a"
209     dsm=salome.naming_service.Resolve("/DataServerManager")
210     dsm.cleanScopesInNS()
211     if scopeName in dsm.listScopes():
212       dsm.removeDataScope(scopeName)
213     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
214     self.assertTrue(isCreated)
215     #
216     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
217     dss.atomicApply([t0])
218     #
219     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
220     t1=dss.addMultiKeyValueSession(varName)
221     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
222     self.assertRaises(SALOME.SALOME_Exception,t1.addKeyValueInVarErrorIfAlreadyExistingNow,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
223     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
224     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
225     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
226     wk.waitFor()
227     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
228     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})# it is not a bug ! commit of t1 not done !
229     dss.atomicApply([t1])
230     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
231     #
232     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
233     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
234     wk.waitFor()
235     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
236     keys=[str2Obj(elt) for elt in dss.getAllKeysOfVarWithTypeDict(varName)]
237     self.assertEqual(keys,['ab','cd'])
238
239   def testTransaction6(self):
240     """ Test to test RdWr global vars with transaction"""
241     scopeName="Scope1"
242     varName="a"
243     dsm=salome.naming_service.Resolve("/DataServerManager")
244     dsm.cleanScopesInNS()
245     if scopeName in dsm.listScopes():
246       dsm.removeDataScope(scopeName)
247     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
248     self.assertTrue(isCreated)
249     #
250     t0=dss.createWorkingVarTransac(varName,obj2Str({}))
251     a=SalomeSDSClt.GetHandlerFromRef(t0.getVar())
252     self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
253     # play
254     a["ab"]=4
255     self.assertEqual(a.local_copy(),{"ab":4})
256     a.assign({"ab":5})
257     self.assertEqual(a.local_copy(),{"ab":5})
258     a.assign({"ab":4})
259     a["cd"]=[5]
260     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
261     a["cd"].append(77)
262     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
263     a.__setitem__("ef",["a","bb"])
264     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb"]})
265     a["ef"].append("ccc")
266     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
267     a["gh"]=a
268     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]}})
269     a["gh"]["cd"].append(99) ; a["cd"].append(88)
270     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77,99],"ef":["a","bb","ccc"]}})
271     # WARNING here not problem to overwrite
272     a["gh"]=7
273     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
274     # end of play
275     self.assertTrue(isinstance(a,SalomeSDSClt.Dict))
276     self.assertTrue(isinstance(a,SalomeSDSClt.WrappedType))# important for EEM
277     # commit : RdWr->RdOnly
278     dss.atomicApply([t0])
279     #
280     self.assertEqual(dss.getAccessOfVar(varName),"RdOnly") # after atomicApply the var is readOnly. Impossible to change its value !
281     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
282     dsm.cleanScopesInNS()
283     del a # very important kill Ref before removingDataScope...
284     if scopeName in dsm.listScopes():
285       dsm.removeDataScope(scopeName)
286     pass
287
288   def testTransaction7(self):
289     """Like testTransaction5 but after a recovery."""
290     scopeName="Scope1"
291     varName="a"
292     dsm=salome.naming_service.Resolve("/DataServerManager")
293     dsm.cleanScopesInNS()
294     if scopeName in dsm.listScopes():
295       dsm.removeDataScope(scopeName)
296     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
297     self.assertTrue(isCreated)
298     #
299     t0=dss.createRdExtInitVarTransac(varName,obj2Str({"ab":[4,5,6]}))
300     dss.atomicApply([t0])
301     #
302     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
303     t1=dss.addMultiKeyValueSession(varName)
304     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
305     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
306     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})# it is not a bug ! commit of t1 not done !
307     dss.atomicApply([t1])
308     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
309     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
310     pass
311
312   def setUp(self):
313     salome.salome_init()
314     pass
315   
316   pass
317
318 unittest.main()
319