1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 # Author : Anthony Geay
29 import multiprocessing as mp
32 return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
34 return pickle.loads(strr)
35 def generateKey(varName,scopeName):
36 dsm=salome.naming_service.Resolve("/DataServerManager")
37 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
39 t=dss.addKeyValueInVarHard(varName,obj2Str("ef"),obj2Str([11,14,100]))
45 generateKey(varName,scopeName)
48 import TestSalomeSDSHelper0
50 fname=os.path.splitext(TestSalomeSDSHelper0.__file__)[0]+".py"
51 proc = subprocess.Popen(["python3", fname], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
52 out,err=proc.communicate()
53 if proc.returncode!=0:
56 return proc.returncode
58 class SalomeSDSTest(unittest.TestCase):
61 a=SalomeSDSClt.CreateRdExtGlobalVar([],"a","Scope0")
62 self.assertEqual(a.local_copy(),[])
64 self.assertEqual(a.local_copy(),[5])
65 self.assertRaises(SALOME.SALOME_Exception,a.__delitem__,0)
67 self.assertEqual(a.local_copy(),[5,["rt"]])
69 self.assertEqual(a.local_copy(),[5,["rt",8]])
71 self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8]])
73 self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8],["rt",8]])
75 self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8],["rt",8,7]])
76 a.ptr().getMyDataScopeServer().deleteVar("a")
80 a=SalomeSDSClt.CreateRdExtGlobalVar({},"a","Scope0")
82 self.assertEqual(a.local_copy(),{"ab":4})
84 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
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"])
92 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
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")
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")
106 def testTransaction1(self):
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)
116 t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
117 dss.atomicApply([t0])
119 self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
121 t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
122 dss.atomicApply([t1])
124 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
125 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
127 self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
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)
135 def testTransaction2(self):
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)
145 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
146 dss.atomicApply([t0])
148 self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
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])
154 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
155 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
157 self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
159 def testTransaction3(self):
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)
169 t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
170 dss.atomicApply([t0])
172 t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
173 dss.atomicApply([t1])
175 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
177 t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
178 dss.atomicApply([t2])
179 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
181 def testTransaction4(self):
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)
191 t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
192 dss.atomicApply([t0])
194 t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
195 dss.atomicApply([t1])
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]})
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]})
205 def testTransaction5(self):
206 """ Like testTransaction2 but without transactions. """
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)
216 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
217 dss.atomicApply([t0])
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]))
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")
232 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
233 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
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'])
239 def testTransaction6(self):
240 """ Test to test RdWr global vars with transaction"""
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)
250 t0=dss.createWorkingVarTransac(varName,obj2Str({}))
251 a=SalomeSDSClt.GetHandlerFromRef(t0.getVar())
252 self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
255 self.assertEqual(a.local_copy(),{"ab":4})
257 self.assertEqual(a.local_copy(),{"ab":5})
260 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
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"]})
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
273 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
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])
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)
288 def testTransaction7(self):
289 """Like testTransaction5 but after a recovery."""
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)
299 t0=dss.createRdExtInitVarTransac(varName,obj2Str({"ab":[4,5,6]}))
300 dss.atomicApply([t0])
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]})