Commit 90410daf authored by Jérome Perrin's avatar Jérome Perrin

test

parent 28920e42
......@@ -41,11 +41,12 @@ setup(name=name,
packages=find_packages(),
install_requires=[
'slapos.core',
'supervisor',
'slapos.libnetworkcache',
'erp5.util',
'selenium',
'supervisor',
'psutil',
'image'
],
zip_safe=True,
test_suite='test',
......
......@@ -28,43 +28,77 @@
import os
import urlparse
import multiprocessing
from time import sleep
import tempfile
from BaseHTTPServer import HTTPServer
from BaseHTTPServer import BaseHTTPRequestHandler
from utils import SlapOSInstanceTestCase
from utils import findFreeTCPPort
import cgi
import json
from selenium import webdriver
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
if os.environ.get('DEBUG'):
if debug_mode:
import logging
logging.basicConfig(level=logging.DEBUG)
import unittest
unittest.installHandler()
class TestRemoteDriver(SlapOSInstanceTestCase):
"""Test the remote driver on a minimal web server.
class WebServerMixin(object):
"""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):
"""Start a minimal web server.
"""
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):
self.send_response(200)
self.end_headers()
self.wfile.write('''
<html>
<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>''')
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')
port = findFreeTCPPort(ip)
server = HTTPServer((ip, port), TestHandler)
......@@ -75,7 +109,71 @@ class TestRemoteDriver(SlapOSInstanceTestCase):
def tearDown(self):
self.server_process.terminate()
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):
parameter_dict = self.computer_partition.getConnectionParameterDict()
webdriver_url = parameter_dict['url']
......@@ -145,7 +243,8 @@ class TestRemoteDriver(SlapOSInstanceTestCase):
driver = webdriver.Remote(
command_executor=webdriver_url,
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)
q.put(driver.title == 'Test page')
driver.quit()
......@@ -166,8 +265,25 @@ class TestRemoteDriver(SlapOSInstanceTestCase):
[True] * 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:
# - take screenshot
# - size is not negative / 0
# 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