diff --git a/bottle.py b/bottle.py index 23fff762c..776b2bb4c 100755 --- a/bottle.py +++ b/bottle.py @@ -3633,6 +3633,21 @@ def load_app(target): _debug = debug +def _main_module_args(): + from __main__ import __package__ as package + file_path = sys.argv[0] + if package is None: + return [file_path] + else: + base_name, _ = os.path.splitext(os.path.basename(file_path)) + return [ + '-m', + ( + package if base_name == '__main__' + else '.'.join((package, base_name)) if package + else base_name + ) + ] def run(app=None, server='wsgiref', @@ -3667,11 +3682,11 @@ def run(app=None, try: fd, lockfile = tempfile.mkstemp(prefix='bottle.', suffix='.lock') os.close(fd) # We only need this file to exist. We never write to it + args = [sys.executable] + _main_module_args() + sys.argv[1:] + environ = os.environ.copy() + environ['BOTTLE_CHILD'] = 'true' + environ['BOTTLE_LOCKFILE'] = lockfile while os.path.exists(lockfile): - args = [sys.executable] + sys.argv - environ = os.environ.copy() - environ['BOTTLE_CHILD'] = 'true' - environ['BOTTLE_LOCKFILE'] = lockfile p = subprocess.Popen(args, env=environ) while p.poll() is None: # Busy wait... os.utime(lockfile, None) # I am alive! diff --git a/test/servertestpackage/__init__.py b/test/servertestpackage/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/servertestpackage/__main__.py b/test/servertestpackage/__main__.py new file mode 100644 index 000000000..fb35a52c6 --- /dev/null +++ b/test/servertestpackage/__main__.py @@ -0,0 +1 @@ +from . import submodule diff --git a/test/servertestpackage/absolute.py b/test/servertestpackage/absolute.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/servertestpackage/relative.py b/test/servertestpackage/relative.py new file mode 100644 index 000000000..7ea5e9649 --- /dev/null +++ b/test/servertestpackage/relative.py @@ -0,0 +1,2 @@ +def test_handler(): + return 'OK' diff --git a/test/servertestpackage/submodule.py b/test/servertestpackage/submodule.py new file mode 100644 index 000000000..da10bfada --- /dev/null +++ b/test/servertestpackage/submodule.py @@ -0,0 +1,38 @@ +import sys, os, socket + +import servertestpackage.absolute +from . import relative + +test_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +os.chdir(test_root) +sys.path.insert(0, os.path.dirname(test_root)) +sys.path.insert(0, test_root) + +try: + server = sys.argv[1] + port = int(sys.argv[2]) + reloads= '--reload' in sys.argv + + if server == 'gevent': + from gevent import monkey + monkey.patch_all() + elif server == 'eventlet': + import eventlet + eventlet.monkey_patch() + + try: + import coverage + coverage.process_startup() + except ImportError: + pass + + from bottle import route, run + route('/test', callback=relative.test_handler) + run(reloader=reloads, port=port, server=server, quiet=True) + +except socket.error: + sys.exit(3) +except ImportError: + sys.exit(128) +except KeyboardInterrupt: + pass diff --git a/test/servertesttop.py b/test/servertesttop.py new file mode 100644 index 000000000..9e317bc5e --- /dev/null +++ b/test/servertesttop.py @@ -0,0 +1 @@ +import servertestpackage.submodule diff --git a/test/test_server.py b/test/test_server.py index 3363872d4..a8340d651 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -14,8 +14,7 @@ except: from urllib2 import urlopen -serverscript = os.path.join(os.path.dirname(__file__), 'servertest.py') - +test_root = os.path.dirname(os.path.abspath(__file__)) def ping(server, port): ''' Check if a server accepts connections on a specific TCP port ''' @@ -28,10 +27,14 @@ def ping(server, port): finally: s.close() - class TestServer(unittest.TestCase): server = 'wsgiref' skip = False + script = [os.path.join(os.path.dirname(__file__), 'servertest.py')] + extra_args = [] + + def base_cmd(self, port): + return [sys.executable] + self.script + [self.server, str(port)] + self.extra_args def setUp(self): self.skip = self.skip or 'fast' in sys.argv @@ -40,9 +43,8 @@ def setUp(self): for port in range(8800, 8900): self.port = port # Start servertest.py in a subprocess - cmd = [sys.executable, serverscript, self.server, str(port)] - cmd += sys.argv[1:] # pass cmdline arguments to subprocesses - self.p = Popen(cmd, stdout=PIPE, stderr=PIPE) + cmd = self.base_cmd(port) + sys.argv[1:] # pass cmdline arguments to subprocesses + self.p = Popen(cmd, stdout=PIPE, stderr=PIPE, cwd=test_root) # Wait for the socket to accept connections for i in range(100): time.sleep(0.1) @@ -97,6 +99,23 @@ def test_simple(self): if self.skip: return self.assertEqual(tob('OK'), self.fetch('test')) +class TestServerTopModule(TestServer): + script = ['-m', 'servertesttop'] + +class TestServerTopModuleReloader(TestServerTopModule): + extra_args = ['--reload'] + +class TestServerPackage(TestServer): + script = ['-m', 'servertestpackage'] + +class TestServerPackageReloader(TestServerPackage): + extra_args = ['--reload'] + +class TestServerSubmodule(TestServer): + script = ['-m', 'servertestpackage.submodule'] + +class TestServerSubmoduleReloader(TestServerSubmodule): + extra_args = ['--reload'] blacklist = ['cgi', 'flup', 'gae', 'wsgiref'] blacklist += ['fapws3', 'cherrypy', 'diesel'] # deprecated adapters