mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-05-20 10:34:30 +00:00
tests: functional: Make first wizard run more robust
- If for some reason, first setup is not completed yet, wait for it to complete. - Update eventually() method to wait for page load errors to go away. - If first wizard is already completed, don't try to run it again. - We can eventually remove waiting for 'setup thread finished' in container script. But not there yet. Tests: - Run transmission tests on a freshly created container. Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org> Reviewed-by: Veiko Aasa <veiko17@disroot.org>
This commit is contained in:
parent
5062cb2585
commit
0d9bd8d23e
@ -72,9 +72,13 @@ def visit(browser, path):
|
|||||||
browser.visit(config['DEFAULT']['url'] + path)
|
browser.visit(config['DEFAULT']['url'] + path)
|
||||||
|
|
||||||
|
|
||||||
def eventually(function, args=[], timeout=30):
|
def eventually(function, args=[], timeout=30, browser=None):
|
||||||
"""Execute a function returning a boolean expression till it returns
|
"""Execute the function until it returns True or timeout occurs.
|
||||||
True or a timeout is reached"""
|
|
||||||
|
Function is repeatedly executed at a fixed interval until it return True or
|
||||||
|
timeout occurs. If browser is provided, it is ensured that browser page is
|
||||||
|
fully loaded before the function is executed.
|
||||||
|
"""
|
||||||
end_time = time.time() + timeout
|
end_time = time.time() + timeout
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
while current_time < end_time:
|
while current_time < end_time:
|
||||||
@ -84,12 +88,26 @@ def eventually(function, args=[], timeout=30):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
if browser:
|
||||||
|
if not is_page_fully_loaded(browser):
|
||||||
|
pass
|
||||||
|
elif (browser.is_element_present_by_css('.neterror')
|
||||||
|
or browser.title == '503 Service Unavailable'):
|
||||||
|
# Reload if we are unable to contact web server or if
|
||||||
|
# FreedomBox service is not available yet.
|
||||||
|
browser.visit(browser.url)
|
||||||
|
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_page_fully_loaded(browser):
|
||||||
|
"""Return whether the page is still loading in the browser."""
|
||||||
|
return browser.execute_script('return document.readyState;') == 'complete'
|
||||||
|
|
||||||
|
|
||||||
class _PageLoaded:
|
class _PageLoaded:
|
||||||
"""
|
"""
|
||||||
Wait until a page (re)loaded.
|
Wait until a page (re)loaded.
|
||||||
@ -146,9 +164,7 @@ class _PageLoaded:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# If page has not loaded fully yet, wait until it does.
|
# If page has not loaded fully yet, wait until it does.
|
||||||
is_fully_loaded = driver.execute_script(
|
if not is_page_fully_loaded(driver):
|
||||||
'return document.readyState;') == 'complete'
|
|
||||||
if not is_fully_loaded:
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# If a page has fully loaded check if it is the expected URL.
|
# If a page has fully loaded check if it is the expected URL.
|
||||||
@ -338,6 +354,27 @@ def login(browser):
|
|||||||
config['DEFAULT']['password'])
|
config['DEFAULT']['password'])
|
||||||
|
|
||||||
|
|
||||||
|
def _run_first_wizard(browser):
|
||||||
|
"""Visit and complete first run wizard."""
|
||||||
|
username = config['DEFAULT']['username'],
|
||||||
|
password = config['DEFAULT']['password']
|
||||||
|
|
||||||
|
welcome_url = base_url + '/plinth/firstboot/welcome/'
|
||||||
|
browser.visit(welcome_url)
|
||||||
|
if browser.url != welcome_url:
|
||||||
|
# We got redirected because first wizard is already complete. Don't
|
||||||
|
# unnecessarily wait a long time.
|
||||||
|
return
|
||||||
|
|
||||||
|
# Wait for first setup process to complete
|
||||||
|
eventually(browser.is_element_present_by_css, args=['.form-start'],
|
||||||
|
timeout=1800, browser=browser)
|
||||||
|
submit(browser, form_class='form-start') # "Start Setup" button
|
||||||
|
_create_admin_account(browser, username, password)
|
||||||
|
if '/firstboot/backports' in browser.url:
|
||||||
|
submit(browser, element=browser.find_by_name('next')[0])
|
||||||
|
|
||||||
|
|
||||||
def login_with_account(browser, url, username, password=None):
|
def login_with_account(browser, url, username, password=None):
|
||||||
"""Login to the FreedomBox interface with provided account."""
|
"""Login to the FreedomBox interface with provided account."""
|
||||||
if password is None:
|
if password is None:
|
||||||
@ -362,11 +399,7 @@ def login_with_account(browser, url, username, password=None):
|
|||||||
browser.fill('password', password)
|
browser.fill('password', password)
|
||||||
submit(browser, form_class='form-login')
|
submit(browser, form_class='form-login')
|
||||||
else:
|
else:
|
||||||
browser.visit(base_url + '/plinth/firstboot/welcome')
|
_run_first_wizard(browser)
|
||||||
submit(browser, form_class='form-start') # "Start Setup" button
|
|
||||||
_create_admin_account(browser, username, password)
|
|
||||||
if '/firstboot/backports' in browser.url:
|
|
||||||
submit(browser, element=browser.find_by_name('next')[0])
|
|
||||||
|
|
||||||
|
|
||||||
def logout(browser):
|
def logout(browser):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user