]> SALOME platform Git repositories - modules/kernel.git/blob - src/SALOMESDS/TestSalomeSDS.py
Salome HOME
Implementation of working glob var. Remove memory leak on TestSalomeSDS.py.
[modules/kernel.git] / src / SALOMESDS / TestSalomeSDS.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2015  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.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]))
218     #
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'])
224
225   def testTransaction6(self):
226     """ Test to test RdWr global vars with transaction"""
227     scopeName="Scope1"
228     varName="a"
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)
235     #
236     t0=dss.createWorkingVarTransac(varName,obj2Str({}))
237     a=SalomeSDSClt.GetHandlerFromRef(t0.getVar())
238     self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
239     # play
240     a["ab"]=4
241     self.assertEqual(a.local_copy(),{"ab":4})
242     a["cd"]=[5]
243     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
244     a["cd"].append(77)
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"]})
250     a["gh"]=a
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
255     a["gh"]=7
256     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
257     # end of play
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])
262     #
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)
269     pass
270
271   def setUp(self):
272     salome.salome_init()
273     pass
274   
275   pass
276
277 unittest.main()
278