From ddd30a7b870b6b3b6ccd55ad047c3604f866f1b2 Mon Sep 17 00:00:00 2001
From: Eugine Blikh <bigbes@gmail.com>
Date: Thu, 4 Jul 2013 19:04:26 +0400
Subject: [PATCH] 1) Moving ./test-run.py --gdb from xterm (or another standart
 X terminal emulator) to detached Screen session 2) Moving from unnecessary
 dependency "pexpect" to builtin "subprocess" module.

---
 test/lib/server.py           | 48 ++++++++++++++++--------------------
 test/lib/tarantool_server.py |  2 +-
 test/test-run.py             |  6 ++---
 3 files changed, 25 insertions(+), 31 deletions(-)

diff --git a/test/lib/server.py b/test/lib/server.py
index 20be099eb8..0dff9c9559 100644
--- a/test/lib/server.py
+++ b/test/lib/server.py
@@ -1,20 +1,19 @@
 import os
-import stat
-import shutil
-import subprocess
-import pexpect
-import socket
+import re
 import sys
-import signal
+import glob
+import stat
 import time
+import shlex
 import daemon
-import glob
+import shutil
+import signal
+import socket
+import subprocess
 import ConfigParser
-import re
 
 def check_port(port):
     """Check if the port we're connecting to is available"""
-
     try:
         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         sock.connect(("localhost", port))
@@ -22,18 +21,9 @@ def check_port(port):
         return
     raise RuntimeError("The server is already running on port {0}".format(port))
 
-def prepare_gdb(args):
+def prepare_gdb(binary, args):
     """Prepare server startup arguments to run under gdb."""
-
-    if "TERM" in os.environ:
-        term = os.environ["TERM"]
-    else:
-        term = "xterm"
-
-    if term not in ["xterm", "rxvt", "urxvt", "gnome-terminal", "konsole"]:
-        raise RuntimeError("--gdb: unsupported terminal {0}".format(term))
-
-    args = [ term, "-e", "gdb", "-ex", "break main", "-ex", "run" ] + args
+    args = shlex.split('screen -dmS tnt-gdb gdb %s -ex \'b main\' -ex run' % binary) + args 
     return args
 
 def prepare_valgrind(args, valgrind_log, valgrind_sup):
@@ -169,7 +159,7 @@ class Server(object):
             os.execvp(args[0], args)
 
     def prepare_args(self):
-        return [self.binary]
+        return []
 
     def start(self, start_and_exit=None, gdb=None, valgrind=None, silent=True):
         if start_and_exit != None: self.start_and_exit = start_and_exit
@@ -191,7 +181,7 @@ class Server(object):
         args = self.prepare_args()
 
         if self.gdb:
-            args = prepare_gdb(args)
+            args = prepare_gdb(self.binary, args)
         elif self.valgrind:
             args = prepare_valgrind(args, self.valgrind_log,
                                     os.path.abspath(os.path.join(self.vardir,
@@ -200,8 +190,8 @@ class Server(object):
         if self.start_and_exit:
             self._start_and_exit(args)
             return
-
-        self.process = pexpect.spawn(args[0], args[1:], cwd = self.vardir)
+        print args
+        self.process = subprocess.Popen(args, cwd = self.vardir)
 
         # wait until the server is connected
         self.wait_until_started()
@@ -231,10 +221,14 @@ class Server(object):
             os.kill(pid, signal.SIGTERM)
         #self.process.kill(signal.SIGTERM)
         if self.gdb or self.valgrind:
-            self.process.expect(pexpect.EOF, timeout = 1 << 30)
+            time = 0
+            while time < (1<<30) :
+                if self.process.poll() != None:
+                    break
+                time += 1
+                sleep(1)
         else:
-            self.process.expect(pexpect.EOF)
-        self.process.close()
+            self.process.wait()
 
         self.wait_until_stopped()
         # clean-up processs flags
diff --git a/test/lib/tarantool_server.py b/test/lib/tarantool_server.py
index 5ae0eb9f10..4312cce9da 100644
--- a/test/lib/tarantool_server.py
+++ b/test/lib/tarantool_server.py
@@ -176,5 +176,5 @@ class TarantoolServer(Server):
                 args.append("--background")
             else:
                 raise RuntimeError("'--gdb' and '--start-and-exit' can't be defined together")
-            self.server = pexpect.spawn(args[0], args[1:], cwd = self.vardir)
+            self.server = subprocess.Popen(args, cwd = self.vardir)
             self.server.wait()
diff --git a/test/test-run.py b/test/test-run.py
index 392ac2273d..4be93e95a0 100755
--- a/test/test-run.py
+++ b/test/test-run.py
@@ -90,9 +90,9 @@ class Options:
                 dest = "gdb",
                 action = "store_true",
                 default = False,
-                help = """Start the server under 'gdb' debugger.
-                See also --start-and-exit. This option is mutually exclusive with
-                --valgrind. Default: false.""")
+                help = """Start the server under 'gdb' debugger in detached
+                Screen. See also --start-and-exit. This option is mutually 
+                exclusive with --valgrind. Default: false.""")
 
         parser.add_argument(
                 "--valgrind",
-- 
GitLab