]> SALOME platform Git repositories - modules/kernel.git/blob - src/SALOMESDS/TestSalomeSDS.py
Salome HOME
d61a9e1ed3bc6f249bcfb301f9026ee693efee79
[modules/kernel.git] / src / SALOMESDS / TestSalomeSDS.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2021  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 pickle
27 import gc
28 import time
29 from datetime import datetime
30 import multiprocessing as mp
31
32 nbOfSecWait=1.
33
34 def obj2Str(obj):
35   return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
36 def str2Obj(strr):
37   return pickle.loads(strr)
38 def generateKey(varName,scopeName):
39   dsm=salome.naming_service.Resolve("/DataServerManager")
40   dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
41   assert(not isCreated)
42   t=dss.addKeyValueInVarHard(varName,obj2Str("ef"),obj2Str([11,14,100]))
43   time.sleep(3)
44   dss.atomicApply([t])
45 def work(t):
46   IORNS,i,varName,scopeName=t
47   if i==0:
48     generateKey(varName,scopeName)
49     return 0
50   else:
51     import TestSalomeSDSHelper0
52     import os,subprocess
53     fname=os.path.splitext(TestSalomeSDSHelper0.__file__)[0]+".py"
54     proc = subprocess.Popen(["python3", fname, IORNS], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
55     out,err=proc.communicate()
56     if proc.returncode!=0:
57       print("-------------- work -----------")
58       print(out)
59       print(err)
60       print("~~~~~~~~~~~~~~ work ~~~~~~~~~~~")
61     return proc.returncode
62   
63 def func_test7(scopeName,cv,cv2,cv3,sharedNum):
64     salome.salome_init()
65     varName="a"
66     zeValue={"ab":[4,5,6]}
67     dsm=salome.naming_service.Resolve("/DataServerManager")
68     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName) # should be suspended nbOfSecWait s by main process
69     assert(not isCreated)
70     ######### micro-test1 - check that all requests are suspended
71     ######## Barrier
72     with cv2:
73       cv2.notify_all()
74       sharedNum.value=True
75     with cv3:
76       cv3.wait()
77     ####### End Barrier
78     s=datetime.now()
79     t0=dss.createRdWrVarTransac(varName,obj2Str(zeValue))
80     s=(datetime.now()-s).total_seconds()
81     assert(s>=0.99*nbOfSecWait and s<nbOfSecWait*1.01) # expect to wait nearly nbOfSecWait seconds
82     dss.atomicApply([t0])
83     ######### end of micro-test1
84     ######### micro-test2 - after activeRequests everything work well
85     s=datetime.now()
86     st=dss.fetchSerializedContent(varName)
87     assert(str2Obj(st)==zeValue)
88     s=(datetime.now()-s).total_seconds()
89     assert(s>=0. and s<0.05) # expect to be not locked
90     ######### end of micro-test2
91     with cv:
92       cv.notify_all()
93     dss.takeANap(nbOfSecWait) # emulate a DataServer occupation
94     pass
95   
96 class SalomeSDSTest(unittest.TestCase):
97   
98   def tessList1(self):
99     a=SalomeSDSClt.CreateRdExtGlobalVar([],"a","Scope0")
100     self.assertEqual(a.local_copy(),[])
101     a.append(5)
102     self.assertEqual(a.local_copy(),[5])
103     self.assertRaises(SALOME.SALOME_Exception,a.__delitem__,0)
104     a.append(["rt"])
105     self.assertEqual(a.local_copy(),[5,["rt"]])
106     a[1].append(8)
107     self.assertEqual(a.local_copy(),[5,["rt",8]])
108     a.extend(a)
109     self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8]])
110     a.extend(a[3:])
111     self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8],["rt",8]])
112     a[4].append(7)
113     self.assertEqual(a.local_copy(),[5,["rt",8],5,["rt",8],["rt",8,7]])
114     a.ptr().getMyDataScopeServer().deleteVar("a")
115     pass
116   
117   def tessDict1(self):
118     a=SalomeSDSClt.CreateRdExtGlobalVar({},"a","Scope0")
119     a["ab"]=4
120     self.assertEqual(a.local_copy(),{"ab":4})
121     a["cd"]=[5]
122     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
123     a["cd"].append(77)
124     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
125     a.__setitem__("ef",["a","bb"])
126     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb"]})
127     self.assertRaises(SALOME.SALOME_Exception,a.__setitem__,"ef",["a","bb"])
128     self.assertRaises(SALOME.SALOME_Exception,a.__setitem__,"ef",["a","bb","ccc"])
129     a["ef"].append("ccc")
130     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
131     a["gh"]=a
132     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]}})
133     a["gh"]["cd"].append(99) ; a["cd"].append(88)
134     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"]}})
135     a.ptr().getMyDataScopeServer().deleteVar("a")
136     pass
137
138   def tessReadOnly1(self):
139     a=SalomeSDSClt.CreateRdOnlyGlobalVar({"ab":4,"cd":[5,77]},"a","Scope0")
140     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
141     self.assertRaises(Exception,a.__getitem__,"ab")
142     a.ptr().getMyDataScopeServer().deleteVar("a")
143
144   def testTransaction1(self):
145     scopeName="Scope1"
146     varName="a"
147     dsm=salome.naming_service.Resolve("/DataServerManager")
148     dsm.cleanScopesInNS()
149     if scopeName in dsm.listScopes():
150       dsm.removeDataScope(scopeName)
151     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
152     self.assertTrue(isCreated)
153     #
154     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
155     dss.atomicApply([t0])
156     #
157     self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
158     #
159     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
160     dss.atomicApply([t1])
161     #
162     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
163     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
164     wk.waitFor()
165     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
166     #
167     nbProc=8
168     pool=mp.Pool(processes=nbProc)
169     from  NamingService import NamingService
170     asyncResult=pool.map_async(work,[(NamingService.IOROfNS(),i,varName,scopeName) for i in range(nbProc)])
171     print("asyncResult=", asyncResult)
172     self.assertEqual(asyncResult.get(),nbProc*[0]) # <- the big test is here !
173     dsm.removeDataScope(scopeName)
174
175   def tessTransaction2(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     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
189     #
190     self.assertRaises(SALOME.SALOME_Exception,dss.addKeyValueInVarErrorIfAlreadyExisting,varName,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
191     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
192     dss.atomicApply([t1])
193     #
194     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
195     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
196     wk.waitFor()
197     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
198
199   def tessTransaction3(self):
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.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
210     dss.atomicApply([t0])
211     #
212     t1=dss.addKeyValueInVarErrorIfAlreadyExisting(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
213     dss.atomicApply([t1])
214     #
215     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
216     #
217     t2=dss.removeKeyInVarErrorIfNotAlreadyExisting(varName,obj2Str("ab"))
218     dss.atomicApply([t2])
219     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'cd':[7,8,9,10]})
220
221   def tessTransaction4(self):
222     scopeName="Scope1"
223     varName="a"
224     dsm=salome.naming_service.Resolve("/DataServerManager")
225     dsm.cleanScopesInNS()
226     if scopeName in dsm.listScopes():
227       dsm.removeDataScope(scopeName)
228     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
229     self.assertTrue(isCreated)
230     #
231     t0=dss.createRdWrVarTransac(varName,obj2Str({"ab":[4,5,6]}))
232     dss.atomicApply([t0])
233     #
234     t1=dss.addKeyValueInVarHard(varName,obj2Str("cd"),obj2Str([7,8,9,10]))
235     dss.atomicApply([t1])
236     #
237     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
238     wk,t2=dss.waitForKeyInVarAndKillIt(varName,obj2Str("cd"))
239     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
240     wk.waitFor()
241     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
242     dss.atomicApply([t2])
243     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
244
245   def tessTransaction5(self):
246     """ Like testTransaction2 but without transactions. """
247     scopeName="Scope1"
248     varName="a"
249     dsm=salome.naming_service.Resolve("/DataServerManager")
250     dsm.cleanScopesInNS()
251     if scopeName in dsm.listScopes():
252       dsm.removeDataScope(scopeName)
253     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
254     self.assertTrue(isCreated)
255     #
256     t0=dss.createRdExtVarTransac(varName,obj2Str({"ab":[4,5,6]}))
257     dss.atomicApply([t0])
258     #
259     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
260     t1=dss.addMultiKeyValueSession(varName)
261     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
262     self.assertRaises(SALOME.SALOME_Exception,t1.addKeyValueInVarErrorIfAlreadyExistingNow,obj2Str("ab"),obj2Str([7,8,9,10]))#raises because ab is already a key !
263     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})
264     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
265     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
266     wk.waitFor()
267     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
268     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})# it is not a bug ! commit of t1 not done !
269     dss.atomicApply([t1])
270     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
271     #
272     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
273     wk=dss.waitForKeyInVar(varName,obj2Str("cd"))
274     wk.waitFor()
275     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
276     keys=[str2Obj(elt) for elt in dss.getAllKeysOfVarWithTypeDict(varName)]
277     self.assertEqual(set(keys),set(['ab','cd']))
278
279   def tessTransaction6(self):
280     """ Test to test RdWr global vars with transaction"""
281     scopeName="Scope1"
282     varName="a"
283     dsm=salome.naming_service.Resolve("/DataServerManager")
284     dsm.cleanScopesInNS()
285     if scopeName in dsm.listScopes():
286       dsm.removeDataScope(scopeName)
287     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
288     self.assertTrue(isCreated)
289     #
290     t0=dss.createWorkingVarTransac(varName,obj2Str({}))
291     a=SalomeSDSClt.GetHandlerFromRef(t0.getVar())
292     self.assertEqual(dss.getAccessOfVar(varName),"RdWr")
293     # play
294     a["ab"]=4
295     self.assertEqual(a.local_copy(),{"ab":4})
296     a.assign({"ab":5})
297     self.assertEqual(a.local_copy(),{"ab":5})
298     a.assign({"ab":4})
299     a["cd"]=[5]
300     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5]})
301     a["cd"].append(77)
302     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77]})
303     a.__setitem__("ef",["a","bb"])
304     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb"]})
305     a["ef"].append("ccc")
306     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]})
307     a["gh"]=a
308     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"],"gh":{"ab":4,"cd":[5,77],"ef":["a","bb","ccc"]}})
309     a["gh"]["cd"].append(99) ; a["cd"].append(88)
310     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"]}})
311     # WARNING here not problem to overwrite
312     a["gh"]=7
313     self.assertEqual(a.local_copy(),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
314     # end of play
315     self.assertTrue(isinstance(a,SalomeSDSClt.Dict))
316     self.assertTrue(isinstance(a,SalomeSDSClt.WrappedType))# important for EEM
317     # commit : RdWr->RdOnly
318     dss.atomicApply([t0])
319     #
320     self.assertEqual(dss.getAccessOfVar(varName),"RdOnly") # after atomicApply the var is readOnly. Impossible to change its value !
321     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{"ab":4,"cd":[5,77,88],"ef":["a","bb","ccc"],"gh":7})
322     dsm.cleanScopesInNS()
323     del a # very important kill Ref before removingDataScope...
324     if scopeName in dsm.listScopes():
325       dsm.removeDataScope(scopeName)
326     pass
327
328   def tessTransaction7(self):
329     """Like testTransaction5 but after a recovery."""
330     scopeName="Scope1"
331     varName="a"
332     dsm=salome.naming_service.Resolve("/DataServerManager")
333     dsm.cleanScopesInNS()
334     if scopeName in dsm.listScopes():
335       dsm.removeDataScope(scopeName)
336     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
337     self.assertTrue(isCreated)
338     #
339     t0=dss.createRdExtInitVarTransac(varName,obj2Str({"ab":[4,5,6]}))
340     dss.atomicApply([t0])
341     #
342     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
343     t1=dss.addMultiKeyValueSession(varName)
344     self.assertEqual(dss.getAccessOfVar(varName),"RdExtInit")
345     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("cd"),obj2Str([7,8,9,10]))
346     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6]})# it is not a bug ! commit of t1 not done !
347     dss.atomicApply([t1])
348     self.assertEqual(dss.getAccessOfVar(varName),"RdExt")
349     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),{'ab':[4,5,6],'cd':[7,8,9,10]})
350     pass
351
352   def tessTransaction8(self):
353     """ EDF 16833 and EDF17719 """
354     funcContent="""def comptchev(a,b):
355     return "d" not in a
356 """
357     scopeName="ScopePP"
358     dsm=salome.naming_service.Resolve("/DataServerManager")
359     dsm.cleanScopesInNS()
360     if scopeName in dsm.listScopes():
361         dsm.removeDataScope(scopeName)
362     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
363     self.assertTrue(isCreated)
364
365     value={"a":1,"b":2}
366     value2={'a':1,'c':3,'b':2}
367     value3={'a':1,'c':3,'b':2,'d':4}
368
369     varName="abc"
370     t0=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent) # sha1 is the key used to compare the initial value
371     dss.atomicApply([t0])
372     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value)
373     t1=dss.addMultiKeyValueSession(varName)
374     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("c"),obj2Str(3))
375     dss.atomicApply([t1])
376     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value2)
377     t2=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent) # func says OK this is the same (even if it is not the case) as original one -> OK
378     dss.atomicApply([t2])
379     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value2) # value2 remains untouched
380     t3=dss.addMultiKeyValueSession(varName)
381     t3.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("d"),obj2Str(4))
382     dss.atomicApply([t3])
383     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value3)
384     t4=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent)
385     self.assertRaises(SALOME.SALOME_Exception,dss.atomicApply,[t4]) # d is in dict pointed by var. Func returns false -> rejected
386     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value3)
387     pass
388   
389   def tessTransaction9(self):
390     """ EDF 16833 and EDF17719 : use case 2. Trying to createRdExt during add key session"""
391     funcContent="""def comptchev(a,b):
392     return a==b
393 """
394     scopeName="ScopePP"
395     dsm=salome.naming_service.Resolve("/DataServerManager")
396     dsm.cleanScopesInNS()
397     if scopeName in dsm.listScopes():
398         dsm.removeDataScope(scopeName)
399     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
400     self.assertTrue(isCreated)
401
402     value={"a":1,"b":2}
403     value2={'a':1,'c':3,'b':2}
404
405     varName="abc"
406     t0=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent)
407     dss.atomicApply([t0])
408     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value)
409     t1=dss.addMultiKeyValueSession(varName)
410     t2=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent)
411     dss.atomicApply([t2])
412     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value)
413     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("c"),obj2Str(3))
414     dss.atomicApply([t1])
415     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value2)
416     pass
417
418     
419   def tessLockToDump(self):
420     """ Test to check that holdRequests method. This method wait for clean server status and hold it until activeRequests is called.
421     Warning this method expects a not overloaded machine to be run because test is based on ellapse time.
422     """
423     scopeName="Scope1"
424     varName="ab"
425     zeObj={"ab":[5,6]}
426     dsm=salome.naming_service.Resolve("/DataServerManager")
427     dsm.cleanScopesInNS()
428     if scopeName in dsm.listScopes():
429         dsm.removeDataScope(scopeName)
430     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
431     self.assertTrue(isCreated)
432     cv=mp.Condition(mp.Lock())
433     cv2=mp.Condition(mp.Lock()) # sharedNum & cv2 & cv3 for the barrier
434     cv3=mp.Condition(mp.Lock())
435     sharedNum=mp.Value('b',False)
436     p=mp.Process(target=func_test7,args=(scopeName,cv,cv2,cv3,sharedNum))
437     p.start()
438     #
439     dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
440     self.assertTrue(not isCreated)
441     t0=dss.createRdWrVarTransac(varName,obj2Str(zeObj))
442     dss.atomicApply([t0])
443     rs=dss.getRequestSwitcher()
444     self.assertTrue(not isCreated)
445     ######## Barrier
446     with cv2:
447       if not sharedNum.value:
448         cv2.wait()
449       sharedNum.value=False
450       pass
451     with cv3:
452       cv3.notify_all()
453     ####### End Barrier
454     rs.holdRequests() # The aim of the test
455     self.assertEqual(rs.listVars(),[varName]) # call whereas holdRequest is called
456     time.sleep(nbOfSecWait)
457     rs.activeRequests() # The aim of the test
458     ######### micro-test3 - check that holdRequests is able to wait for a non finished job
459     with cv:
460       cv.wait()
461       s=datetime.now()
462       time.sleep(0.01) # let main proc the priority
463       rs.holdRequests() # the aim of the test is here. main process is occupied 1s -> holdRequests is Expected to wait
464       s=(datetime.now()-s).total_seconds()
465       self.assertTrue(str2Obj(rs.fetchSerializedContent(varName))==zeObj) # call whereas holdRequest is called
466       rs.activeRequests()
467       self.assertTrue(s>=0.99*nbOfSecWait and s<nbOfSecWait*1.01) # expect to be not locked
468     # finishing
469     p.join()
470     pass
471
472   def setUp(self):
473     #salome.salome_init()
474     salome.salome_init_without_session()
475     pass
476   
477   pass
478
479 if __name__=="__main__":
480   unittest.main()
481