Commit 15495c06 authored by Jérome Perrin's avatar Jérome Perrin

seleniumserver/test: use slapos.testing

parent 9fedc763
...@@ -28,9 +28,11 @@ from setuptools import setup, find_packages ...@@ -28,9 +28,11 @@ from setuptools import setup, find_packages
version = '0.0.1.dev0' version = '0.0.1.dev0'
name = 'slapos.test.seleniumserver' name = 'slapos.test.seleniumserver'
long_description = open("README.md").read() with open("README.md") as f:
long_description = f.read()
setup(name=name, setup(
name=name,
version=version, version=version,
description="Test for SlapOS' Selenium Server", description="Test for SlapOS' Selenium Server",
long_description=long_description, long_description=long_description,
...@@ -52,4 +54,4 @@ setup(name=name, ...@@ -52,4 +54,4 @@ setup(name=name,
], ],
zip_safe=True, zip_safe=True,
test_suite='test', test_suite='test',
) )
...@@ -47,14 +47,12 @@ from selenium.webdriver.common.desired_capabilities import DesiredCapabilities ...@@ -47,14 +47,12 @@ from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from utils import SlapOSInstanceTestCase, findFreeTCPPort from slapos.testing.testcase import makeModuleSetUpAndTestCaseClass
from slapos.testing.utils import findFreeTCPPort
debug_mode = os.environ.get('SLAPOS_TEST_DEBUG') setUpModule, SeleniumServerTestCase = makeModuleSetUpAndTestCaseClass(
# for development: debugging logs and install Ctrl+C handler os.path.abspath(
if debug_mode: os.path.join(os.path.dirname(__file__), '..', 'software.cfg')))
import logging
logging.basicConfig(level=logging.DEBUG)
unittest.installHandler()
class WebServerMixin(object): class WebServerMixin(object):
...@@ -71,12 +69,14 @@ class WebServerMixin(object): ...@@ -71,12 +69,14 @@ class WebServerMixin(object):
- upload a file and the file content will be displayed in div.uploadedfile - upload a file and the file content will be displayed in div.uploadedfile
""" """
def log_message(self, *args, **kw): def log_message(self, *args, **kw):
if debug_mode: if SeleniumServerTestCase._debug:
BaseHTTPRequestHandler.log_message(self, *args, **kw) BaseHTTPRequestHandler.log_message(self, *args, **kw)
def do_GET(self): def do_GET(self):
self.send_response(200) self.send_response(200)
self.end_headers() self.end_headers()
self.wfile.write(''' self.wfile.write(
'''
<html> <html>
<title>Test page</title> <title>Test page</title>
<body> <body>
...@@ -87,18 +87,22 @@ class WebServerMixin(object): ...@@ -87,18 +87,22 @@ class WebServerMixin(object):
</form> </form>
</body> </body>
</html>''') </html>''')
def do_POST(self): def do_POST(self):
form = cgi.FieldStorage( form = cgi.FieldStorage(
fp=self.rfile, fp=self.rfile,
headers=self.headers, headers=self.headers,
environ={'REQUEST_METHOD':'POST', environ={
'CONTENT_TYPE':self.headers['Content-Type'],}) 'REQUEST_METHOD': 'POST',
'CONTENT_TYPE': self.headers['Content-Type'],
})
self.send_response(200) self.send_response(200)
self.end_headers() self.end_headers()
file_data = 'no file' file_data = 'no file'
if form.has_key('f'): if form.has_key('f'):
file_data = form['f'].file.read() file_data = form['f'].file.read()
self.wfile.write(''' self.wfile.write(
'''
<html> <html>
<title>%s</title> <title>%s</title>
<div>%s</div> <div>%s</div>
...@@ -128,7 +132,8 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -128,7 +132,8 @@ class BrowserCompatibilityMixin(WebServerMixin):
def setUp(self): def setUp(self):
super(BrowserCompatibilityMixin, self).setUp() super(BrowserCompatibilityMixin, self).setUp()
self.driver = webdriver.Remote( self.driver = webdriver.Remote(
command_executor=self.computer_partition.getConnectionParameterDict()['backend-url'], command_executor=self.computer_partition.getConnectionParameterDict()
['backend-url'],
desired_capabilities=self.desired_capabilities) desired_capabilities=self.desired_capabilities)
def tearDown(self): def tearDown(self):
...@@ -158,9 +163,7 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -158,9 +163,7 @@ class BrowserCompatibilityMixin(WebServerMixin):
self.driver.find_element_by_xpath('//input[@name="f"]').send_keys(f.name) self.driver.find_element_by_xpath('//input[@name="f"]').send_keys(f.name)
self.driver.find_element_by_xpath('//input[@type="submit"]').click() self.driver.find_element_by_xpath('//input[@type="submit"]').click()
self.assertEqual( self.assertEqual(self.id(), self.driver.find_element_by_xpath('//div').text)
self.id(),
self.driver.find_element_by_xpath('//div').text)
def test_screenshot(self): def test_screenshot(self):
self.driver.get(self.server_url) self.driver.get(self.server_url)
...@@ -169,7 +172,9 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -169,7 +172,9 @@ class BrowserCompatibilityMixin(WebServerMixin):
self.assertGreater(len(screenshot.getcolors(maxcolors=512)), 2) self.assertGreater(len(screenshot.getcolors(maxcolors=512)), 2)
def test_window_and_screen_size(self): def test_window_and_screen_size(self):
size = json.loads(self.driver.execute_script(''' size = json.loads(
self.driver.execute_script(
'''
return JSON.stringify({ return JSON.stringify({
'screen.width': window.screen.width, 'screen.width': window.screen.width,
'screen.height': window.screen.height, 'screen.height': window.screen.height,
...@@ -188,7 +193,9 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -188,7 +193,9 @@ class BrowserCompatibilityMixin(WebServerMixin):
def test_resize_window(self): def test_resize_window(self):
self.driver.set_window_size(800, 900) self.driver.set_window_size(800, 900)
size = json.loads(self.driver.execute_script(''' size = json.loads(
self.driver.execute_script(
'''
return JSON.stringify({ return JSON.stringify({
'outerWidth': window.outerWidth, 'outerWidth': window.outerWidth,
'outerHeight': window.outerHeight 'outerHeight': window.outerHeight
...@@ -201,6 +208,7 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -201,6 +208,7 @@ class BrowserCompatibilityMixin(WebServerMixin):
webdriver_url = parameter_dict['backend-url'] webdriver_url = parameter_dict['backend-url']
queue = multiprocessing.Queue() queue = multiprocessing.Queue()
def _test(q, server_url): def _test(q, server_url):
driver = webdriver.Remote( driver = webdriver.Remote(
command_executor=webdriver_url, command_executor=webdriver_url,
...@@ -213,10 +221,9 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -213,10 +221,9 @@ class BrowserCompatibilityMixin(WebServerMixin):
nb_workers = 10 nb_workers = 10
workers = [] workers = []
for i in range(nb_workers): for _ in range(nb_workers):
worker = multiprocessing.Process( worker = multiprocessing.Process(
target=_test, target=_test, args=(queue, self.server_url))
args=(queue, self.server_url))
worker.start() worker.start()
workers.append(worker) workers.append(worker)
...@@ -229,16 +236,7 @@ class BrowserCompatibilityMixin(WebServerMixin): ...@@ -229,16 +236,7 @@ class BrowserCompatibilityMixin(WebServerMixin):
del _ # pylint del _ # pylint
self.assertEqual( self.assertEqual(
[True] * nb_workers, [True] * nb_workers, [queue.get() for _ in range(nb_workers)])
[queue.get() for _ in range(nb_workers)])
class SeleniumServerTestCase(SlapOSInstanceTestCase):
"""Test the remote driver on a minimal web server.
"""
@classmethod
def getSoftwareURLList(cls):
return (os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'software.cfg')), )
class TestBrowserSelection(WebServerMixin, SeleniumServerTestCase): class TestBrowserSelection(WebServerMixin, SeleniumServerTestCase):
...@@ -255,12 +253,9 @@ class TestBrowserSelection(WebServerMixin, SeleniumServerTestCase): ...@@ -255,12 +253,9 @@ class TestBrowserSelection(WebServerMixin, SeleniumServerTestCase):
driver.get(self.server_url) driver.get(self.server_url)
self.assertEqual('Test page', driver.title) self.assertEqual('Test page', driver.title)
self.assertIn( self.assertIn('Chrome', driver.execute_script('return navigator.userAgent'))
'Chrome',
driver.execute_script('return navigator.userAgent'))
self.assertNotIn( self.assertNotIn(
'Firefox', 'Firefox', driver.execute_script('return navigator.userAgent'))
driver.execute_script('return navigator.userAgent'))
driver.quit() driver.quit()
def test_firefox(self): def test_firefox(self):
...@@ -275,8 +270,7 @@ class TestBrowserSelection(WebServerMixin, SeleniumServerTestCase): ...@@ -275,8 +270,7 @@ class TestBrowserSelection(WebServerMixin, SeleniumServerTestCase):
self.assertEqual('Test page', driver.title) self.assertEqual('Test page', driver.title)
self.assertIn( self.assertIn(
'Firefox', 'Firefox', driver.execute_script('return navigator.userAgent'))
driver.execute_script('return navigator.userAgent'))
driver.quit() driver.quit()
def test_firefox_desired_version(self): def test_firefox_desired_version(self):
...@@ -313,9 +307,7 @@ class TestFrontend(WebServerMixin, SeleniumServerTestCase): ...@@ -313,9 +307,7 @@ class TestFrontend(WebServerMixin, SeleniumServerTestCase):
self.assertEqual('admin', parsed.username) self.assertEqual('admin', parsed.username)
self.assertTrue(parsed.password) self.assertTrue(parsed.password)
self.assertIn( self.assertIn('Grid Console', requests.get(admin_url, verify=False).text)
'Grid Console',
requests.get(admin_url, verify=False).text)
def test_browser_use_hub(self): def test_browser_use_hub(self):
parameter_dict = self.computer_partition.getConnectionParameterDict() parameter_dict = self.computer_partition.getConnectionParameterDict()
...@@ -346,11 +338,13 @@ class TestSSHServer(SeleniumServerTestCase): ...@@ -346,11 +338,13 @@ class TestSSHServer(SeleniumServerTestCase):
self.assertEqual('ssh', parsed.scheme) self.assertEqual('ssh', parsed.scheme)
client = paramiko.SSHClient() client = paramiko.SSHClient()
class TestKeyPolicy(object): class TestKeyPolicy(object):
"""Accept server key and keep it in self.key for inspection """Accept server key and keep it in self.key for inspection
""" """
def missing_host_key(self, client, hostname, key): def missing_host_key(self, client, hostname, key):
self.key = key self.key = key
key_policy = TestKeyPolicy() key_policy = TestKeyPolicy()
client.set_missing_host_key_policy(key_policy) client.set_missing_host_key_policy(key_policy)
...@@ -366,7 +360,8 @@ class TestSSHServer(SeleniumServerTestCase): ...@@ -366,7 +360,8 @@ class TestSSHServer(SeleniumServerTestCase):
# The publish format is the raw output of ssh-keygen and is something like this: # The publish format is the raw output of ssh-keygen and is something like this:
# 521 SHA256:9aZruv3LmFizzueIFdkd78eGtzghDoPSCBXFkkrHqXE user@hostname (ECDSA) # 521 SHA256:9aZruv3LmFizzueIFdkd78eGtzghDoPSCBXFkkrHqXE user@hostname (ECDSA)
# we only want to parse SHA256:9aZruv3LmFizzueIFdkd78eGtzghDoPSCBXFkkrHqXE # we only want to parse SHA256:9aZruv3LmFizzueIFdkd78eGtzghDoPSCBXFkkrHqXE
_, fingerprint_string, _, key_type = parameter_dict['ssh-fingerprint'].split() _, fingerprint_string, _, key_type = parameter_dict[
'ssh-fingerprint'].split()
self.assertEqual(key_type, '(ECDSA)') self.assertEqual(key_type, '(ECDSA)')
fingerprint_algorithm, fingerprint = fingerprint_string.split(':', 1) fingerprint_algorithm, fingerprint = fingerprint_string.split(':', 1)
...@@ -376,8 +371,9 @@ class TestSSHServer(SeleniumServerTestCase): ...@@ -376,8 +371,9 @@ class TestSSHServer(SeleniumServerTestCase):
self.assertEqual( self.assertEqual(
fingerprint, fingerprint,
# XXX with sha256, we need to remove that trailing = # XXX with sha256, we need to remove that trailing =
base64.b64encode(hashlib.new(fingerprint_algorithm, key_policy.key.asbytes()).digest())[:-1] base64.b64encode(
) hashlib.new(fingerprint_algorithm,
key_policy.key.asbytes()).digest())[:-1])
channel = client.invoke_shell() channel = client.invoke_shell()
channel.settimeout(30) channel.settimeout(30)
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment