1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2015 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 cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL)
34 return cPickle.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(["python",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"))
126 self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
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)
134 def testTransaction2(self):
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)
144 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
145 dss.atomicApply([t0])
147 self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
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])
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])
157 def testTransaction3(self):
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)
167 t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
168 dss.atomicApply([t0])
170 t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
171 dss.atomicApply([t1])
173 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
175 t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
176 dss.atomicApply([t2])
177 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
179 def testTransaction4(self):
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)
189 t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
190 dss.atomicApply([t0])
192 t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
193 dss.atomicApply([t1])
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]})
202 def testTransaction5(self):
203 """ Like testTransaction2 but without transactions. """
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)
213 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
214 dss.atomicApply([t0])
216 self.assertRaises(SALOME.SALOME_Exception,dss.addKeyValueInVarErrorIfAlreadyExistingNow,varName,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
217 dss.addKeyValueInVarErrorIfAlreadyExistingNow(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
219 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
220 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
221 self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
222 keys=[str2Obj(elt) for elt in dss.getAllKeysOfVarWithTypeDict(varName)]
223 self.assertEqual(keys,['ab','cd'])
225 def testTransaction6(self):
226 """ Test to test RdWr global vars with transaction"""
229 dsm=salome.naming_service.Resolve("/DataServerManager")
230 dsm.cleanScopesInNS()
231 if scopeName in dsm.listScopes():
232 dsm.removeDataScope(scopeName)
233 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
234 self.assertTrue(isCreated)
236 t0=dss.createWorkingVarTransac(varName,obj2Str({}))
237 a=SalomeSDSClt.GetHandlerFromRef(t0.getVar())
238 self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
241 self.assertEqual(a.local_copy(),{"ab":4})
243 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
245 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
246 a.__setitem__("ef",["a","bb"])
247 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb"]})
248 a["ef"].append("ccc")
249 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
251 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]}})
252 a["gh"]["cd"].append(99) ; a["cd"].append(88)
253 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"]}})
254 # WARNING here not problem to overwrite
256 self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
258 self.assertTrue(isinstance(a,SalomeSDSClt.Dict))
259 self.assertTrue(isinstance(a,SalomeSDSClt.WrappedType))# important for EEM
260 # commit : RdWr->RdOnly
261 dss.atomicApply([t0])
263 self.assertEqual(dss.getAccessOfVar(varName),"RdOnly") # after atomicApply the var is readOnly. Impossible to change its value !
264 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
265 dsm.cleanScopesInNS()
266 del a # very important kill Ref before removingDataScope...
267 if scopeName in dsm.listScopes():
268 dsm.removeDataScope(scopeName)