Salome HOME
add method NameChanged to update title name
[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 cPickle
27 import gc
28 import time
29 import multiprocessing as mp
30
31 def obj2Str(obj):
32   return cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL)
33 def str2Obj(strr):
34   return cPickle.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     self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
127     #
128     nbProc=8
129     pool=mp.Pool(processes=nbProc)
130     asyncResult=pool.map_async(work,[(i,varName,scopeName) for i in xrange(nbProc)])
131     self.assertEqual(asyncResult.get(),nbProc*[0]) # <- the big test is here !
132     dsm.removeDataScope(scopeName)
133
134   def testTransaction2(self):
135     scopeName="Scope1"
136     varName="a"
137     dsm=salome.naming_service.Resolve("/DataServerManager")
138     dsm.cleanScopesInNS()
139     if scopeName in dsm.listScopes():
140       dsm.removeDataScope(scopeName)
141     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
142     self.assertTrue(isCreated)
143     #
144     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
145     dss.atomicApply([t0])
146     #
147     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
148     #
149     self.assertRaises(SALOME.SALOME_Exception,dss.addKeyValueInVarErrorIfAlreadyExisting,varName,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
150     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
151     dss.atomicApply([t1])
152     #
153     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
154     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
155     self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
156
157   def testTransaction3(self):
158     scopeName="Scope1"
159     varName="a"
160     dsm=salome.naming_service.Resolve("/DataServerManager")
161     dsm.cleanScopesInNS()
162     if scopeName in dsm.listScopes():
163       dsm.removeDataScope(scopeName)
164     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
165     self.assertTrue(isCreated)
166     #
167     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
168     dss.atomicApply([t0])
169     #
170     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
171     dss.atomicApply([t1])
172     #
173     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
174     #
175     t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
176     dss.atomicApply([t2])
177     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
178
179   def testTransaction4(self):
180     scopeName="Scope1"
181     varName="a"
182     dsm=salome.naming_service.Resolve("/DataServerManager")
183     dsm.cleanScopesInNS()
184     if scopeName in dsm.listScopes():
185       dsm.removeDataScope(scopeName)
186     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
187     self.assertTrue(isCreated)
188     #
189     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
190     dss.atomicApply([t0])
191     #
192     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
193     dss.atomicApply([t1])
194     #
195     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
196     wk,t2=dss.waitForKeyInVarAndKillIt(varName,obj2Str("cd"))
197     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
198     self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
199     dss.atomicApply([t2])
200     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
201
202   def testTransaction5(self):
203     """ Like testTransaction2 but without transactions. """
204     scopeName="Scope1"
205     varName="a"
206     dsm=salome.naming_service.Resolve("/DataServerManager")
207     dsm.cleanScopesInNS()
208     if scopeName in dsm.listScopes():
209       dsm.removeDataScope(scopeName)
210     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
211     self.assertTrue(isCreated)
212     #
213     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
214     dss.atomicApply([t0])
215     #
216     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
217     t1=dss.addMultiKeyValueSession(varName)
218     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
219     self.assertRaises(SALOME.SALOME_Exception,t1.addKeyValueInVarErrorIfAlreadyExistingNow,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
220     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
221     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
222     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
223     self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
224     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})# it is not a bug ! commit of t1 not done !
225     dss.atomicApply([t1])
226     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
227     #
228     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
229     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
230     self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
231     keys=[str2Obj(elt) for elt in dss.getAllKeysOfVarWithTypeDict(varName)]
232     self.assertEqual(keys,['ab','cd'])
233
234   def testTransaction6(self):
235     """ Test to test RdWr global vars with transaction"""
236     scopeName="Scope1"
237     varName="a"
238     dsm=salome.naming_service.Resolve("/DataServerManager")
239     dsm.cleanScopesInNS()
240     if scopeName in dsm.listScopes():
241       dsm.removeDataScope(scopeName)
242     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
243     self.assertTrue(isCreated)
244     #
245     t0=dss.createWorkingVarTransac(varName,obj2Str({}))
246     a=SalomeSDSClt.GetHandlerFromRef(t0.getVar())
247     self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
248     # play
249     a["ab"]=4
250     self.assertEqual(a.local_copy(),{"ab":4})
251     a.assign({"ab":5})
252     self.assertEqual(a.local_copy(),{"ab":5})
253     a.assign({"ab":4})
254     a["cd"]=[5]
255     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
256     a["cd"].append(77)
257     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
258     a.__setitem__("ef",["a","bb"])
259     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb"]})
260     a["ef"].append("ccc")
261     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
262     a["gh"]=a
263     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]}})
264     a["gh"]["cd"].append(99) ; a["cd"].append(88)
265     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"]}})
266     # WARNING here not problem to overwrite
267     a["gh"]=7
268     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
269     # end of play
270     self.assertTrue(isinstance(a,SalomeSDSClt.Dict))
271     self.assertTrue(isinstance(a,SalomeSDSClt.WrappedType))# important for EEM
272     # commit : RdWr->RdOnly
273     dss.atomicApply([t0])
274     #
275     self.assertEqual(dss.getAccessOfVar(varName),"RdOnly") # after atomicApply the var is readOnly. Impossible to change its value !
276     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
277     dsm.cleanScopesInNS()
278     del a # very important kill Ref before removingDataScope...
279     if scopeName in dsm.listScopes():
280       dsm.removeDataScope(scopeName)
281     pass
282
283   def testTransaction7(self):
284     """Like testTransaction5 but after a recovery."""
285     scopeName="Scope1"
286     varName="a"
287     dsm=salome.naming_service.Resolve("/DataServerManager")
288     dsm.cleanScopesInNS()
289     if scopeName in dsm.listScopes():
290       dsm.removeDataScope(scopeName)
291     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
292     self.assertTrue(isCreated)
293     #
294     t0=dss.createRdExtInitVarTransac(varName,obj2Str({"ab":[4,5,6]}))
295     dss.atomicApply([t0])
296     #
297     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
298     t1=dss.addMultiKeyValueSession(varName)
299     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
300     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
301     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})# it is not a bug ! commit of t1 not done !
302     dss.atomicApply([t1])
303     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
304     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
305     pass
306
307   def setUp(self):
308     salome.salome_init()
309     pass
310   
311   pass
312
313 unittest.main()
314