Daemonized servers are now always launched with popen, and not directly invoked in...
[nepi.git] / test / util / server.py
index 4e0fbaf..0bb3a39 100755 (executable)
 # -*- coding: utf-8 -*-
 
 from nepi.util import server
+from nepi.util.constants import DeploymentConfiguration as DC
+
+import getpass
 import os
 import shutil
 import sys
+import tempfile
+import test_util
 import unittest
-import uuid
+import time
 
 class ServerTestCase(unittest.TestCase):
     def setUp(self):
-        self._root_dir = os.path.join(os.getenv("HOME"), ".nepi", 
-                str(uuid.uuid1()))
-        os.makedirs(self._root_dir)
+        self.root_dir = tempfile.mkdtemp()
 
     def test_server(self):
-        s = server.Server(self._root_dir)
+        s = server.Server(self.root_dir)
+        s.run()
+        c = server.Client(self.root_dir)
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+    def test_server_reconnect(self):
+        s = server.Server(self.root_dir)
+        s.run()
+        c = server.Client(self.root_dir)
+        
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        
+        # disconnect
+        del c
+        
+        # reconnect
+        c = server.Client(self.root_dir)
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+                
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+    def test_server_auto_reconnect(self):
+        s = server.Server(self.root_dir)
+        s.run()
+        c = server.Client(self.root_dir)
+        
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        
+        # purposedly break the connection
+        c._process.stdin.close()
+        c._process.stdout.close()
+        c._process.stderr.close()
+        
+        # assert that the communication works (possible with auto-reconnection)
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+                
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+    def test_server_long_message(self):
+        s = server.Server(self.root_dir)
         s.run()
-        c = server.Client(self._root_dir)
+        c = server.Client(self.root_dir)
+        msg = "1"*1145
+        c.send_msg(msg)
+        reply = c.read_reply()
+        self.assertEqual(reply, ("Reply to: "+msg))
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+    @test_util.skipUnless(os.getuid() == 0, "Test requires root privileges")
+    def test_sudo_server(self):
+        env = test_util.test_environment()
+        user = getpass.getuser()
+        # launch server
+        python_code = "from nepi.util import server;s=server.Server('%s');\
+                s.run()" % self.root_dir
+        server.popen_python(python_code, 
+                sudo = True)
+        c = server.Client(self.root_dir, 
+                sudo = True)
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+
+    def test_ssh_server(self):
+        env = test_util.test_environment()
+        user = getpass.getuser()
+        # launch server
+        python_code = "from nepi.util import server;s=server.Server('%s');\
+                s.run()" % self.root_dir
+        server.popen_python(python_code, 
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port, 
+                user = user, 
+                agent = True)
+        c = server.Client(self.root_dir, 
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port,
+                user = user, 
+                agent = True)
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+    def test_ssh_server_reconnect(self):
+        env = test_util.test_environment()
+        user = getpass.getuser()
+        # launch server
+        python_code = "from nepi.util import server;s=server.Server('%s');\
+                s.run()" % self.root_dir
+        server.popen_python(python_code, 
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port, 
+                user = user, 
+                agent = True)
+        
+        c = server.Client(self.root_dir, 
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port,
+                user = user, 
+                agent = True)
+                
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        
+        # disconnect
+        del c
+        
+        # reconnect
+        c = server.Client(self.root_dir,
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port,
+                user = user, 
+                agent = True)
+                
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        
+        c.send_stop()
+        reply = c.read_reply()
+        self.assertEqual(reply, "Stopping server")
+
+    def test_ssh_server_auto_reconnect(self):
+        env = test_util.test_environment()
+        user = getpass.getuser()
+        # launch server
+        python_code = "from nepi.util import server;s=server.Server('%s');\
+                s.run()" % self.root_dir
+        server.popen_python(python_code, 
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port, 
+                user = user, 
+                agent = True)
+        
+        c = server.Client(self.root_dir, 
+                communication = DC.ACCESS_SSH,
+                host = "localhost", 
+                port = env.port,
+                user = user, 
+                agent = True)
+                
+        c.send_msg("Hola")
+        reply = c.read_reply()
+        self.assertEqual(reply, "Reply to: Hola")
+        
+        # purposedly break the connection
+        c._process.stdin.close()
+        c._process.stdout.close()
+        c._process.stderr.close()
+        
+        # assert that the communication works (possible with auto-reconnection)
         c.send_msg("Hola")
         reply = c.read_reply()
-        self.assertTrue(reply == "Reply to: Hola")
+        self.assertEqual(reply, "Reply to: Hola")
+        
         c.send_stop()
         reply = c.read_reply()
-        self.assertTrue(reply == "Stopping server")
+        self.assertEqual(reply, "Stopping server")
 
     def tearDown(self):
-        shutil.rmtree(self._root_dir)
+        try:
+            shutil.rmtree(self.root_dir)
+        except:
+            # retry
+            time.sleep(0.1)
+            shutil.rmtree(self.root_dir)
 
 if __name__ == '__main__':
     unittest.main()