Commit 95888eff authored by Jérome Perrin's avatar Jérome Perrin

test

parent b6e6c752
...@@ -41,11 +41,12 @@ setup(name=name, ...@@ -41,11 +41,12 @@ setup(name=name,
packages=find_packages(), packages=find_packages(),
install_requires=[ install_requires=[
'slapos.core', 'slapos.core',
'supervisor',
'slapos.libnetworkcache', 'slapos.libnetworkcache',
'erp5.util', 'erp5.util',
'selenium', 'selenium',
'supervisor',
'psutil', 'psutil',
'image'
], ],
zip_safe=True, zip_safe=True,
test_suite='test', test_suite='test',
......
...@@ -28,43 +28,77 @@ ...@@ -28,43 +28,77 @@
import os import os
import urlparse import urlparse
import multiprocessing import multiprocessing
from time import sleep
import tempfile
from BaseHTTPServer import HTTPServer from BaseHTTPServer import HTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler from BaseHTTPServer import BaseHTTPRequestHandler
import cgi
from utils import SlapOSInstanceTestCase import json
from utils import findFreeTCPPort
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from PIL import Image
from io import BytesIO
from utils import SlapOSInstanceTestCase
from utils import findFreeTCPPort
debug_mode = os.environ.get('DEBUG')
# for development: debugging logs and install Ctrl+C handler # for development: debugging logs and install Ctrl+C handler
if os.environ.get('DEBUG'): if debug_mode:
import logging import logging
logging.basicConfig(level=logging.DEBUG) logging.basicConfig(level=logging.DEBUG)
import unittest import unittest
unittest.installHandler() unittest.installHandler()
class TestRemoteDriver(SlapOSInstanceTestCase): class WebServerMixin(object):
"""Test the remote driver on a minimal web server. """Mixin class which provides a simple web server reachable at self.server_url
""" """
@classmethod
def getSoftwareURLList(cls):
return (os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'software.cfg')), )
def setUp(self): def setUp(self):
"""Start a minimal web server. """Start a minimal web server.
""" """
class TestHandler(BaseHTTPRequestHandler): class TestHandler(BaseHTTPRequestHandler):
"""Request handler for our test server.
The implemented server is: submit q and you'll get a page with q as title.
"""
def log_message(self, *args, **kw):
if debug_mode:
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>
<form action="/" method="POST">
<input name="q" type="text"></input>
<input type="submit" value="I'm feeling lucky"></input>
</form>
</body>
</html>''') </html>''')
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD':'POST',
'CONTENT_TYPE':self.headers['Content-Type'],})
self.send_response(200)
self.end_headers()
self.wfile.write('''
<html>
<title>%s</title>
</html>
''' % form['q'].value)
super(WebServerMixin, self).setUp()
ip = os.environ.get('LOCAL_IPV4', '127.0.1.1') ip = os.environ.get('LOCAL_IPV4', '127.0.1.1')
port = findFreeTCPPort(ip) port = findFreeTCPPort(ip)
server = HTTPServer((ip, port), TestHandler) server = HTTPServer((ip, port), TestHandler)
...@@ -75,7 +109,71 @@ class TestRemoteDriver(SlapOSInstanceTestCase): ...@@ -75,7 +109,71 @@ class TestRemoteDriver(SlapOSInstanceTestCase):
def tearDown(self): def tearDown(self):
self.server_process.terminate() self.server_process.terminate()
self.server_process.join() self.server_process.join()
super(WebServerMixin, self).tearDown()
class BrowserCompatibilityMixin(WebServerMixin):
"""Mixin class to run validation tests on a specific browser
"""
desired_capabilities = NotImplemented
user_agent = NotImplemented
def setUp(self):
super(BrowserCompatibilityMixin, self).setUp()
self.driver = webdriver.Remote(
command_executor=self.computer_partition.getConnectionParameterDict()['url'],
desired_capabilities=self.desired_capabilities)
def tearDown(self):
self.driver.close()
super(BrowserCompatibilityMixin, self).tearDown()
def test_user_agent(self):
self.assertIn(
self.user_agent,
self.driver.execute_script('return navigator.userAgent'))
def test_screenshot(self):
self.driver.get(self.server_url)
screenshot = Image.open(BytesIO(self.driver.get_screenshot_as_png()))
# just check it's not a white screen
self.assertGreater(len(screenshot.getcolors()), 2)
def test_scenario(self):
self.driver.get(self.server_url)
input_element = WebDriverWait(self.driver, 3).until(
EC.visibility_of_element_located((By.NAME, 'q')))
input_element.send_keys(self.id())
input_element.submit()
self.assertEqual(self.id(), self.driver.title)
def test_window_and_screen_size(self):
size = json.loads(self.driver.execute_script('''
return JSON.stringify({
'screen.availWidth': window.screen.availWidth,
'screen.availHeight': window.screen.availHeight,
'screen.pixelDepth': window.screen.pixelDepth,
'innerWidth': window.innerWidth,
'innerHeight': window.innerHeight })'''))
# Xvfb is configured like this
self.assertEqual(1024, size['screen.availWidth'])
self.assertEqual(768, size['screen.availHeight'])
self.assertEqual(24, size['screen.pixelDepth'])
# window size must not be 0 (wrong firefox integration report this)
self.assertGreater(size['innerWidth'], 0)
self.assertGreater(size['innerHeight'], 0)
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(SeleniumServerTestCase, WebServerMixin):
def test_firefox(self): def test_firefox(self):
parameter_dict = self.computer_partition.getConnectionParameterDict() parameter_dict = self.computer_partition.getConnectionParameterDict()
webdriver_url = parameter_dict['url'] webdriver_url = parameter_dict['url']
...@@ -145,7 +243,8 @@ class TestRemoteDriver(SlapOSInstanceTestCase): ...@@ -145,7 +243,8 @@ class TestRemoteDriver(SlapOSInstanceTestCase):
driver = webdriver.Remote( driver = webdriver.Remote(
command_executor=webdriver_url, command_executor=webdriver_url,
desired_capabilities=DesiredCapabilities.FIREFOX) desired_capabilities=DesiredCapabilities.FIREFOX)
# XXX we need to sleep a bit to wait for browser to be ready before using it, otherwise selenium crash
sleep(2)
driver.get(server_url) driver.get(server_url)
q.put(driver.title == 'Test page') q.put(driver.title == 'Test page')
driver.quit() driver.quit()
...@@ -166,8 +265,25 @@ class TestRemoteDriver(SlapOSInstanceTestCase): ...@@ -166,8 +265,25 @@ class TestRemoteDriver(SlapOSInstanceTestCase):
[True] * nb_workers, [True] * nb_workers,
[queue.get() for _ in range(nb_workers)]) [queue.get() for _ in range(nb_workers)])
class TestFirefox52(BrowserCompatibilityMixin, SeleniumServerTestCase):
desired_capabilities = dict(DesiredCapabilities.FIREFOX, version='52.9.0esr')
user_agent = 'Gecko/20100101 Firefox/52.0'
class TestFirefox60(BrowserCompatibilityMixin, SeleniumServerTestCase):
desired_capabilities = dict(DesiredCapabilities.FIREFOX, version='60.0.2esr')
user_agent = 'Gecko/20100101 Firefox/60.0'
class TestChrome69(BrowserCompatibilityMixin, SeleniumServerTestCase):
desired_capabilities = dict(DesiredCapabilities.CHROME, version='69.0.3497.0')
user_agent = 'Chrome/69.0.3497.0'
#del TestFirefox52
del TestFirefox60
del TestBrowserSelection
# more test: # more test:
# - take screenshot
# - size is not negative / 0
# XXX run ERP5 test ! # XXX run ERP5 test !
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