54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
#!/usr/bin/env python
|
|
from __future__ import with_statement
|
|
|
|
import contextlib
|
|
import errno
|
|
import os
|
|
import random
|
|
import signal
|
|
import socket
|
|
import subprocess
|
|
import sys
|
|
import time
|
|
import urllib2
|
|
|
|
if __name__ == "__main__":
|
|
tornado_root = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
|
'../../..'))
|
|
# dev_appserver doesn't seem to set SO_REUSEADDR
|
|
port = random.randrange(10000, 11000)
|
|
# does dev_appserver.py ever live anywhere but /usr/local/bin?
|
|
proc = subprocess.Popen([sys.executable,
|
|
"/usr/local/bin/dev_appserver.py",
|
|
os.path.dirname(os.path.abspath(__file__)),
|
|
"--port=%d" % port,
|
|
"--skip_sdk_update_check",
|
|
],
|
|
cwd=tornado_root)
|
|
|
|
try:
|
|
for i in xrange(50):
|
|
with contextlib.closing(socket.socket()) as sock:
|
|
err = sock.connect_ex(('localhost', port))
|
|
if err == 0:
|
|
break
|
|
elif err != errno.ECONNREFUSED:
|
|
raise Exception("Got unexpected socket error %d" % err)
|
|
time.sleep(0.1)
|
|
else:
|
|
raise Exception("Server didn't start listening")
|
|
|
|
resp = urllib2.urlopen("http://localhost:%d/" % port)
|
|
print resp.read()
|
|
finally:
|
|
# dev_appserver sometimes ignores SIGTERM (especially on 2.5),
|
|
# so try a few times to kill it.
|
|
for sig in [signal.SIGTERM, signal.SIGTERM, signal.SIGKILL]:
|
|
os.kill(proc.pid, sig)
|
|
res = os.waitpid(proc.pid, os.WNOHANG)
|
|
if res != (0,0):
|
|
break
|
|
time.sleep(0.1)
|
|
else:
|
|
os.waitpid(proc.pid, 0)
|