Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DO NOT MERGE] testing webdriver with spawn #4470

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion server/webdriver/base_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,15 @@ def create_driver(preferences=None):
chrome_options.add_argument('--hide-scrollbars')
if preferences:
chrome_options.add_experimental_option("prefs", preferences)
driver = webdriver.Chrome(options=chrome_options)
try:
print("before creating driver")
driver = webdriver.Chrome(options=chrome_options)
print("after creating driver")
except Exception as e:
print("caught exception")
print(str(e))


# Set a reliable window size for all tests (can be overwritten though)
driver.set_window_size(DEFAULT_WIDTH, DEFAULT_HEIGHT)
return driver
Expand Down
103 changes: 67 additions & 36 deletions shared/lib/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,70 +16,101 @@
import os
import platform
import socket
import unittest
import warnings

from flask_testing import LiveServerTestCase

from nl_server.flask import create_app as create_nl_app
from server.__init__ import create_app as create_web_app
import server.lib.util as libutil


def find_open_port():
def find_open_port(skip_ports: set[int] | None = None):
for port in range(12000, 13000):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
if skip_ports and port in skip_ports:
continue
res = sock.connect_ex(('localhost', port))
if res != 0:
return port


is_nl_mode = os.environ.get('ENABLE_MODEL') == 'true'
if is_nl_mode:
def get_nl_port(web_port: int):
# Start NL server on an unused port, so multiple integration tests can
# run at the same time.
if platform.system() == 'Darwin' and platform.processor() == 'arm':
msg = '\n\n!!!!! IMPORTANT NOTE !!!!!!\n' \
'Detected MacOS ARM processor! You need to have a local ' \
'NL server running (using run_nl_server.sh).\n'
warnings.warn(msg)
nl_port = 6060
should_start_nl_server = False
msg = '\n\n!!!!! IMPORTANT NOTE !!!!!!\n' \
'Detected MacOS ARM processor! You need to have a local ' \
'NL server running (using run_nl_server.sh).\n'
warnings.warn(msg)
nl_port = 6060
should_start_nl_server = False
else:
nl_port = find_open_port(set[web_port])
should_start_nl_server = True
return nl_port, should_start_nl_server


def start_nl_server(port):
nl_app = create_nl_app()
nl_app.run(port=port, debug=False, use_reloader=False, threaded=True)


def start_web_server(web_port, nl_port=None):
if nl_port:
web_app = create_web_app(f'http://127.0.0.1:{nl_port}')
else:
nl_port = find_open_port()
should_start_nl_server = True
web_app = create_web_app()
web_app.run(port=web_port, use_reloader=False)


class NLWebServerTestCase(LiveServerTestCase):
class NLWebServerTestCase(unittest.TestCase):

@classmethod
def setUpClass(cls):
if is_nl_mode:
cls.web_port = find_open_port()
cls.is_nl_mode = os.environ.get('ENABLE_MODEL') == 'true'
nl_port = None
if cls.is_nl_mode:
nl_port, should_start_nl_server = get_nl_port(cls.web_port)
if should_start_nl_server:

def start_nl_server(app):
app.run(port=nl_port, debug=False, use_reloader=False, threaded=True)

nl_app = create_nl_app()
# Create a thread that will contain our running server
cls.proc = multiprocessing.Process(target=start_nl_server,
args=(nl_app,),
daemon=True)
cls.proc.start()
cls.nl_proc = multiprocessing.Process(target=start_nl_server,
args=(nl_port,),
daemon=True)
cls.nl_proc.start()
else:
cls.proc = None
cls.nl_proc = None
libutil.check_backend_ready(
['http://127.0.0.1:{}/healthz'.format(nl_port)])

skip_ports = set([cls.web_port, nl_port])
# Start web app.
for _ in range(5):
try:
print("trying to start server")
cls.web_proc = multiprocessing.Process(target=start_web_server,
args=(cls.web_port, nl_port))
cls.web_proc.start()
print("server started")
break
except Exception as e:
print("exception caught in test server")
print(str(e))
if "already in use" in str(e):
cls.web_port = find_open_port(skip_ports)
skip_ports.add(cls.web_port)
print(skip_ports)
continue
else:
print("raising exception")
raise e
libutil.check_backend_ready([f'http://127.0.0.1:{cls.web_port}/healthz'])

def get_server_url(cls):
return f'http://localhost:{cls.web_port}'

@classmethod
def tearDownClass(cls):
if is_nl_mode and cls.proc:
cls.proc.terminate()

def create_app(self):
"""Returns the Flask Server running Data Commons."""
if is_nl_mode:
app = create_web_app('http://127.0.0.1:{}'.format(nl_port))
else:
app = create_web_app()
app.config['LIVESERVER_PORT'] = 0
return app
if cls.is_nl_mode and cls.nl_proc:
cls.nl_proc.terminate()
cls.web_proc.terminate()
5 changes: 2 additions & 3 deletions shared/lib/test_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,5 @@ def set_up_macos_for_tests():
if _set_up_done:
return
_set_up_done = True
if sys.version_info >= (3, 8) and sys.platform == "darwin":
multiprocessing.set_start_method("fork")
os.environ['no_proxy'] = '*'
multiprocessing.set_start_method("spawn")
os.environ['no_proxy'] = '*'
Loading