]> SALOME platform Git repositories - modules/kernel.git/blob - src/Container/Test/testProxy.py
Salome HOME
[EDF30062] : Forward of current directory mecanism
[modules/kernel.git] / src / Container / Test / testProxy.py
1 #  -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2023-2024  CEA/DEN, EDF R&D
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
21 import unittest
22 import os
23 import salome
24 import Engines
25 import pickle
26 import tempfile
27 import pylauncher
28 import KernelBasis
29
30 class TestProxy(unittest.TestCase):
31     def testProxy(self):
32         """
33         [EDF27816] : This test checks two things :
34         - Capability of ContainerManager to launch a Container with overriden environement
35         - Management of proxy creation to manage big obj exchange between process (here between Container and the current process)
36         """
37         hostname = "localhost"
38         cp = pylauncher.GetRequestForGiveContainer(hostname,"container_test")
39
40         with tempfile.TemporaryDirectory() as tmpdirname:
41             val_for_jj = "3333"
42             val_for_big_obj = str( tmpdirname )
43             val_for_thres = 100 # force proxy file
44             # Override environement for all containers launched
45             salome.cm.SetBigObjOnDiskDirectory(val_for_big_obj)
46             salome.cm.SetBigObjOnDiskThreshold(val_for_thres)
47             salome.cm.SetOverrideEnvForContainersSimple(env = [("jj",val_for_jj)])
48             cont = salome.cm.GiveContainer(cp)
49             ## Time to test it
50             script_st = """import os
51 import KernelBasis
52 _,a = KernelBasis.GetBigObjOnDiskProtocolAndDirectory()
53 b = os.environ["jj"]
54 c = KernelBasis.GetBigObjOnDiskThreshold()
55 j = a,b,c"""
56             pyscript = cont.createPyScriptNode("testScript",script_st)
57             a,b,c = pickle.loads(pyscript.execute(["j"],pickle.dumps(([],{}))))[0]
58             self.assertTrue( a == val_for_big_obj )
59             self.assertTrue( b == val_for_jj )
60             self.assertTrue( c == val_for_thres )
61             # check environment using POSIX API in the container process
62             for k,v in [("jj",val_for_jj)]:
63                 assert( {elt.key:elt.value.value() for elt in cont.get_os_environment()}[k] == v )
64             #
65             import SALOME_PyNode
66             poa = salome.orb.resolve_initial_references("RootPOA")
67             obj = SALOME_PyNode.SenderByte_i(poa,pickle.dumps( ([],{}) ))
68             id_o = poa.activate_object(obj)
69             refPtr = poa.id_to_reference(id_o)
70             script_st2 = """ob = list( range(100) )""" # size of pickled ob must be greater than val_for_thres
71             pyscript2 = cont.createPyScriptNode("testScript2",script_st2)
72             pyscript2.executeFirst(refPtr)
73             ret2 = pyscript2.executeSecond(["ob"])
74             self.assertTrue( len(ret2) == 1)
75             ret2 = ret2[0]
76             ret3 = pickle.loads( SALOME_PyNode.SeqByteReceiver(ret2).data() )
77             self.assertTrue( isinstance( ret3, SALOME_PyNode.BigObjectOnDiskList ) )
78             self.assertTrue( val_for_big_obj == os.path.dirname( ret3.getFileName().getFileName() ) )# very important part of test
79             self.assertTrue( ret3.get() == list(range(100)) )
80             fn = ret3.getFileName().getFileName()
81             self.assertTrue( os.path.exists( fn ) )
82             ret3.unlinkOnDestructor()
83             del ret3
84             import gc
85             gc.collect(0)
86             self.assertTrue( not os.path.exists( fn ) ) # at destruction of ret3 the corresponding pckl file must be destructed
87             cont.Shutdown()
88
89     def testExecCodeAtInit(self):
90         """
91         [EDF28648] : allow initialisation script at startup
92         """
93         import os
94         with tempfile.NamedTemporaryFile() as tmpFileName:
95             tmpFileName.close()
96             salome.cm.SetCodeOnContainerStartUp("""
97 with open("{}","w") as f:
98   f.write("coucou")
99 """.format(tmpFileName.name) )# injection of python code expected to be executed at startup
100             cp = pylauncher.GetRequestForGiveContainer("localhost","gg")
101             cont = salome.cm.GiveContainer(cp) # code is expected to be executed in process abroad -> file is supposed to contain coucou
102             cont.Shutdown()
103             salome.cm.SetCodeOnContainerStartUp("") # no more startup code for other tests
104             with open(tmpFileName.name,"r") as f:
105                 self.assertTrue(f.read()=="coucou")
106             os.unlink( tmpFileName.name ) # context manager do not clean file
107
108     def testWorkingDirectoryForward(self):
109         """
110         [EDF30062] test of forward of current directory overriding entry in Catalog
111         """
112         KernelBasis.SetForwardCurrentDirectoryStatus( True ) # key point
113         hostname = "localhost"
114         cp = pylauncher.GetRequestForGiveContainer(hostname,"container_test")
115
116         with tempfile.TemporaryDirectory() as tmpdirname:
117             os.chdir( str( tmpdirname ) )
118             cp = pylauncher.GetRequestForGiveContainer("localhost","gg")
119             cont = salome.cm.GiveContainer(cp)
120
121             pyscript2 = cont.createPyScriptNode("testScript","""import os
122 ret = os.getcwd()
123 """)
124             #
125             import SALOME_PyNode
126             poa = salome.orb.resolve_initial_references("RootPOA")
127             obj = SALOME_PyNode.SenderByte_i(poa,pickle.dumps( ([],{}) ))
128             id_o = poa.activate_object(obj)
129             refPtr = poa.id_to_reference(id_o)
130             #
131             pyscript2.executeFirst(refPtr)
132             ret2 = pyscript2.executeSecond(["ret"])
133             #
134             ret2 = ret2[0]
135             ret3 = pickle.loads( SALOME_PyNode.SeqByteReceiver(ret2).data() )
136             self.assertEqual(ret3,str(tmpdirname)) # key point
137             #
138             cont.Shutdown()
139         ################
140         KernelBasis.SetForwardCurrentDirectoryStatus( False ) # key point
141         cp = pylauncher.GetRequestForGiveContainer(hostname,"container_test")
142
143         with tempfile.TemporaryDirectory() as tmpdirname:
144             os.chdir( str( tmpdirname ) )
145             cp = pylauncher.GetRequestForGiveContainer("localhost","gg")
146             cont = salome.cm.GiveContainer(cp)
147
148             pyscript2 = cont.createPyScriptNode("testScript","""import os
149 ret = os.getcwd()
150 """)
151             #
152             import SALOME_PyNode
153             poa = salome.orb.resolve_initial_references("RootPOA")
154             obj = SALOME_PyNode.SenderByte_i(poa,pickle.dumps( ([],{}) ))
155             id_o = poa.activate_object(obj)
156             refPtr = poa.id_to_reference(id_o)
157             #
158             pyscript2.executeFirst(refPtr)
159             ret2 = pyscript2.executeSecond(["ret"])
160             #
161             ret2 = ret2[0]
162             ret3 = pickle.loads( SALOME_PyNode.SeqByteReceiver(ret2).data() )
163             self.assertNotEqual(ret3,str(tmpdirname)) # key point
164             #
165             cont.Shutdown()
166
167 if __name__ == '__main__':
168     salome.standalone()
169     salome.salome_init()
170     unittest.main()