mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-18 15:33:02 +00:00
Refactor services tests
This commit is contained in:
@@ -12,16 +12,13 @@ import requests
|
|||||||
from tornado import gen
|
from tornado import gen
|
||||||
from tornado.ioloop import IOLoop
|
from tornado.ioloop import IOLoop
|
||||||
|
|
||||||
|
|
||||||
from .mocking import public_url
|
from .mocking import public_url
|
||||||
from ..utils import url_path_join, wait_for_http_server
|
from ..utils import url_path_join, wait_for_http_server, random_port
|
||||||
|
|
||||||
here = os.path.dirname(os.path.abspath(__file__))
|
mockservice_path = os.path.dirname(os.path.abspath(__file__))
|
||||||
mockservice_py = os.path.join(here, 'mockservice.py')
|
mockservice_py = os.path.join(mockservice_path, 'mockservice.py')
|
||||||
mockservice_cmd = [sys.executable, mockservice_py]
|
mockservice_cmd = [sys.executable, mockservice_py]
|
||||||
|
|
||||||
from ..utils import random_port
|
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def external_service(app, name='mockservice'):
|
def external_service(app, name='mockservice'):
|
||||||
@@ -31,24 +28,29 @@ def external_service(app, name='mockservice'):
|
|||||||
'JUPYTERHUB_API_URL': url_path_join(app.hub.server.url, 'api/'),
|
'JUPYTERHUB_API_URL': url_path_join(app.hub.server.url, 'api/'),
|
||||||
'JUPYTERHUB_SERVICE_URL': 'http://127.0.0.1:%i' % random_port(),
|
'JUPYTERHUB_SERVICE_URL': 'http://127.0.0.1:%i' % random_port(),
|
||||||
}
|
}
|
||||||
p = Popen(mockservice_cmd, env=env)
|
proc = Popen(mockservice_cmd, env=env)
|
||||||
IOLoop().run_sync(lambda : wait_for_http_server(env['JUPYTERHUB_SERVICE_URL']))
|
IOLoop().run_sync(
|
||||||
|
lambda: wait_for_http_server(env['JUPYTERHUB_SERVICE_URL'])
|
||||||
|
)
|
||||||
try:
|
try:
|
||||||
yield env
|
yield env
|
||||||
finally:
|
finally:
|
||||||
p.terminate()
|
proc.terminate()
|
||||||
|
|
||||||
|
|
||||||
def test_managed_service(app, mockservice):
|
def test_managed_service(mockservice):
|
||||||
service = mockservice
|
service = mockservice
|
||||||
proc = service.proc
|
proc = service.proc
|
||||||
|
assert isinstance(proc.pid, object)
|
||||||
first_pid = proc.pid
|
first_pid = proc.pid
|
||||||
assert proc.poll() is None
|
assert proc.poll() is None
|
||||||
# shut it down:
|
|
||||||
|
# shut service down:
|
||||||
proc.terminate()
|
proc.terminate()
|
||||||
proc.wait(10)
|
proc.wait(10)
|
||||||
assert proc.poll() is not None
|
assert proc.poll() is not None
|
||||||
# ensure Hub notices and brings it back up:
|
|
||||||
|
# ensure Hub notices service is down and brings it back up:
|
||||||
for i in range(20):
|
for i in range(20):
|
||||||
if service.proc is not proc:
|
if service.proc is not proc:
|
||||||
break
|
break
|
||||||
@@ -62,16 +64,17 @@ def test_managed_service(app, mockservice):
|
|||||||
def test_proxy_service(app, mockservice_url, io_loop):
|
def test_proxy_service(app, mockservice_url, io_loop):
|
||||||
service = mockservice_url
|
service = mockservice_url
|
||||||
name = service.name
|
name = service.name
|
||||||
routes = io_loop.run_sync(app.proxy.get_routes)
|
io_loop.run_sync(app.proxy.get_routes)
|
||||||
url = public_url(app, service) + '/foo'
|
url = public_url(app, service) + '/foo'
|
||||||
r = requests.get(url, allow_redirects=False)
|
r = requests.get(url, allow_redirects=False)
|
||||||
path = '/services/{}/foo'.format(name)
|
path = '/services/{}/foo'.format(name)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
|
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
assert r.text.endswith(path)
|
assert r.text.endswith(path)
|
||||||
|
|
||||||
|
|
||||||
def test_external_service(app, io_loop):
|
def test_external_service(app):
|
||||||
name = 'external'
|
name = 'external'
|
||||||
with external_service(app, name=name) as env:
|
with external_service(app, name=name) as env:
|
||||||
app.services = [{
|
app.services = [{
|
||||||
@@ -83,6 +86,7 @@ def test_external_service(app, io_loop):
|
|||||||
app.init_services()
|
app.init_services()
|
||||||
app.init_api_tokens()
|
app.init_api_tokens()
|
||||||
evt = Event()
|
evt = Event()
|
||||||
|
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def add_services():
|
def add_services():
|
||||||
yield app.proxy.add_all_services(app._service_map)
|
yield app.proxy.add_all_services(app._service_map)
|
||||||
@@ -91,14 +95,12 @@ def test_external_service(app, io_loop):
|
|||||||
assert evt.wait(10)
|
assert evt.wait(10)
|
||||||
service = app._service_map[name]
|
service = app._service_map[name]
|
||||||
url = public_url(app, service) + '/api/users'
|
url = public_url(app, service) + '/api/users'
|
||||||
path = '/services/{}/api/users'.format(name)
|
|
||||||
r = requests.get(url, allow_redirects=False)
|
r = requests.get(url, allow_redirects=False)
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
assert r.status_code == 200
|
assert r.status_code == 200
|
||||||
resp = r.json()
|
resp = r.json()
|
||||||
|
|
||||||
assert isinstance(resp, list)
|
assert isinstance(resp, list)
|
||||||
assert len(resp) >= 1
|
assert len(resp) >= 1
|
||||||
assert isinstance(resp[0], dict)
|
assert isinstance(resp[0], dict)
|
||||||
assert 'name' in resp[0]
|
assert 'name' in resp[0]
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user