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.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
117 dss.atomicApply([t0])
119 t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
120 dss.atomicApply([t1])
122 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
123 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
124 self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
127 pool=mp.Pool(processes=nbProc)
128 asyncResult=pool.map_async(work,[(i,varName,scopeName) for i in xrange(nbProc)])
129 self.assertEqual(asyncResult.get(),nbProc*[0]) # <- the big test is here !
130 dsm.removeDataScope(scopeName)
132 def testTransaction2(self):
135 dsm=salome.naming_service.Resolve("/DataServerManager")
136 dsm.cleanScopesInNS()
137 if scopeName in dsm.listScopes():
138 dsm.removeDataScope(scopeName)
139 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
140 self.assertTrue(isCreated)
142 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
143 dss.atomicApply([t0])
145 self.assertRaises(SALOME.SALOME_Exception,dss.addKeyValueInVarErrorIfAlreadyExisting,varName,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
146 t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
147 dss.atomicApply([t1])
149 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
150 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
151 self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
153 def testTransaction3(self):
156 dsm=salome.naming_service.Resolve("/DataServerManager")
157 dsm.cleanScopesInNS()
158 if scopeName in dsm.listScopes():
159 dsm.removeDataScope(scopeName)
160 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
161 self.assertTrue(isCreated)
163 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
164 dss.atomicApply([t0])
166 t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
167 dss.atomicApply([t1])
169 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
171 t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
172 dss.atomicApply([t2])
173 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
175 def testTransaction4(self):
178 dsm=salome.naming_service.Resolve("/DataServerManager")
179 dsm.cleanScopesInNS()
180 if scopeName in dsm.listScopes():
181 dsm.removeDataScope(scopeName)
182 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
183 self.assertTrue(isCreated)
185 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
186 dss.atomicApply([t0])
188 t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
189 dss.atomicApply([t1])
191 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
192 wk,t2=dss.waitForKeyInVarAndKillIt(varName,obj2Str("cd"))
193 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
194 self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
195 dss.atomicApply([t2])
196 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
198 def testTransaction5(self):
199 """ Like testTransaction2 but without transactions. """
202 dsm=salome.naming_service.Resolve("/DataServerManager")
203 dsm.cleanScopesInNS()
204 if scopeName in dsm.listScopes():
205 dsm.removeDataScope(scopeName)
206 dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
207 self.assertTrue(isCreated)
209 t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
210 dss.atomicApply([t0])
212 self.assertRaises(SALOME.SALOME_Exception,dss.addKeyValueInVarErrorIfAlreadyExistingNow,varName,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
213 dss.addKeyValueInVarErrorIfAlreadyExistingNow(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
215 self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
216 wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
217 self.assertEqual(str2Obj(wk.waitFor()),[7,8,9,10])
218 keys=[str2Obj(elt) for elt in dss.getAllKeysOfVarWithTypeDict(varName)]
219 self.assertEqual(keys,['ab','cd'])