]> SALOME platform Git repositories - modules/kernel.git/blob - src/SALOMESDS/TestSalomeSDS.py
Salome HOME
Support of multi key,var append in global vars.
[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.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
117     dss.atomicApply([t0])
118     #
119     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
120     dss.atomicApply([t1])
121     #
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])
125     #
126     nbProc=8
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)
131
132   def testTransaction2(self):
133     scopeName="Scope1"
134     varName="a"
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)
141     #
142     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
143     dss.atomicApply([t0])
144     #
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])
148     #
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])
152
153   def testTransaction3(self):
154     scopeName="Scope1"
155     varName="a"
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)
162     #
163     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
164     dss.atomicApply([t0])
165     #
166     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
167     dss.atomicApply([t1])
168     #
169     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
170     #
171     t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
172     dss.atomicApply([t2])
173     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
174
175   def testTransaction4(self):
176     scopeName="Scope1"
177     varName="a"
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)
184     #
185     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
186     dss.atomicApply([t0])
187     #
188     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
189     dss.atomicApply([t1])
190     #
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]})
197
198   def testTransaction5(self):
199     """ Like testTransaction2 but without transactions. """
200     scopeName="Scope1"
201     varName="a"
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)
208     #
209     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
210     dss.atomicApply([t0])
211     #
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]))
214     #
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'])
220
221   def setUp(self):
222     salome.salome_init()
223     pass
224   
225   pass
226
227 unittest.main()
228