Salome HOME
Merge branch 'V9_2_2_BR'
[modules/kernel.git] / src / SALOMESDS / TestSalomeSDS.py
index 3f7b5cf89a48d92b2e230f1ff1c5a372b1163b49..557645649216c1326d76b86159b0fa0d63a9c6dd 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2019  CEA/DEN, EDF R&D, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -23,7 +23,7 @@ import SalomeSDSClt
 import SALOME
 import salome
 import unittest
-import cPickle
+import pickle
 import gc
 import time
 from datetime import datetime
@@ -32,9 +32,9 @@ import multiprocessing as mp
 nbOfSecWait=1.
 
 def obj2Str(obj):
-  return cPickle.dumps(obj,cPickle.HIGHEST_PROTOCOL)
+  return pickle.dumps(obj,pickle.HIGHEST_PROTOCOL)
 def str2Obj(strr):
-  return cPickle.loads(strr)
+  return pickle.loads(strr)
 def generateKey(varName,scopeName):
   dsm=salome.naming_service.Resolve("/DataServerManager")
   dss,isCreated=dsm.giveADataScopeTransactionCalled(scopeName)
@@ -51,11 +51,13 @@ def work(t):
     import TestSalomeSDSHelper0
     import os,subprocess
     fname=os.path.splitext(TestSalomeSDSHelper0.__file__)[0]+".py"
-    proc=subprocess.Popen(["python",fname],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
+    proc = subprocess.Popen(["python3", fname], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     out,err=proc.communicate()
     if proc.returncode!=0:
-      print out
-      print err
+      print("-------------- work -----------")
+      print(out)
+      print(err)
+      print("~~~~~~~~~~~~~~ work ~~~~~~~~~~~")
     return proc.returncode
   
 def func_test7(scopeName,cv,cv2,cv3,sharedNum):
@@ -164,7 +166,8 @@ class SalomeSDSTest(unittest.TestCase):
     #
     nbProc=8
     pool=mp.Pool(processes=nbProc)
-    asyncResult=pool.map_async(work,[(i,varName,scopeName) for i in xrange(nbProc)])
+    asyncResult=pool.map_async(work,[(i,varName,scopeName) for i in range(nbProc)])
+    print("asyncResult=", asyncResult)
     self.assertEqual(asyncResult.get(),nbProc*[0]) # <- the big test is here !
     dsm.removeDataScope(scopeName)
 
@@ -270,7 +273,7 @@ class SalomeSDSTest(unittest.TestCase):
     wk.waitFor()
     self.assertEqual(str2Obj(dss.waitForMonoThrRev(wk)),[7,8,9,10])
     keys=[str2Obj(elt) for elt in dss.getAllKeysOfVarWithTypeDict(varName)]
-    self.assertEqual(keys,['ab','cd'])
+    self.assertEqual(set(keys),set(['ab','cd']))
 
   def testTransaction6(self):
     """ Test to test RdWr global vars with transaction"""
@@ -346,7 +349,10 @@ class SalomeSDSTest(unittest.TestCase):
     pass
 
   def testTransaction8(self):
-    """ EDF 16833 """
+    """ EDF 16833 and EDF17719 """
+    funcContent="""def comptchev(a,b):
+    return "d" not in a
+"""
     scopeName="ScopePP"
     dsm=salome.naming_service.Resolve("/DataServerManager")
     dsm.cleanScopesInNS()
@@ -357,24 +363,33 @@ class SalomeSDSTest(unittest.TestCase):
 
     value={"a":1,"b":2}
     value2={'a':1,'c':3,'b':2}
+    value3={'a':1,'c':3,'b':2,'d':4}
 
     varName="abc"
-    t0=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),"sha1") # sha1 is the key used to compare the initial value
+    t0=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent) # sha1 is the key used to compare the initial value
     dss.atomicApply([t0])
     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value)
     t1=dss.addMultiKeyValueSession(varName)
     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("c"),obj2Str(3))
     dss.atomicApply([t1])
     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value2)
-    t2=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),"sha1") # key is the same as original one -> OK
+    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
     dss.atomicApply([t2])
     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value2) # value2 remains untouched
-    t3=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),"sha2")
-    self.assertRaises(SALOME.SALOME_Exception,dss.atomicApply,[t3]) # sha2 != sha1 -> rejected
+    t3=dss.addMultiKeyValueSession(varName)
+    t3.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("d"),obj2Str(4))
+    dss.atomicApply([t3])
+    self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value3)
+    t4=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent)
+    self.assertRaises(SALOME.SALOME_Exception,dss.atomicApply,[t4]) # d is in dict pointed by var. Func returns false -> rejected
+    self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value3)
     pass
   
   def testTransaction9(self):
-    """ EDF 16833 : use case 2. Trying to createRdExt during add key session"""
+    """ EDF 16833 and EDF17719 : use case 2. Trying to createRdExt during add key session"""
+    funcContent="""def comptchev(a,b):
+    return a==b
+"""
     scopeName="ScopePP"
     dsm=salome.naming_service.Resolve("/DataServerManager")
     dsm.cleanScopesInNS()
@@ -387,11 +402,11 @@ class SalomeSDSTest(unittest.TestCase):
     value2={'a':1,'c':3,'b':2}
 
     varName="abc"
-    t0=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),"sha1")
+    t0=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent)
     dss.atomicApply([t0])
     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value)
     t1=dss.addMultiKeyValueSession(varName)
-    t2=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),"sha1")
+    t2=dss.createRdExtVarFreeStyleTransac(varName,obj2Str(value),funcContent)
     dss.atomicApply([t2])
     self.assertEqual(str2Obj(dss.fetchSerializedContent(varName)),value)
     t1.addKeyValueInVarErrorIfAlreadyExistingNow(obj2Str("c"),obj2Str(3))