diff --git a/software/html5as/test/README.md b/software/html5as/test/README.md new file mode 100644 index 0000000000000000000000000000000000000000..4a24769bd0dbe9c9004a9b79710ba0a19ab712f4 --- /dev/null +++ b/software/html5as/test/README.md @@ -0,0 +1 @@ +Tests for html5as software release diff --git a/software/html5as/test/setup.py b/software/html5as/test/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..def8858f47c2b11accd5208e29f54b017c997e20 --- /dev/null +++ b/software/html5as/test/setup.py @@ -0,0 +1,52 @@ +############################################################################## +# +# Copyright (c) 2019 Nexedi SA and Contributors. All Rights Reserved. +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## +from setuptools import setup, find_packages + +version = '0.0.1.dev0' +name = 'slapos.test.html5as' +with open("README.md") as f: + long_description = f.read() + +setup( + name=name, + version=version, + description="Test for SlapOS' HTML5AS", + long_description=long_description, + long_description_content_type='text/markdown', + maintainer="Nexedi", + maintainer_email="info@nexedi.com", + url="https://lab.nexedi.com/nexedi/slapos", + packages=find_packages(), + install_requires=[ + 'slapos.core', + 'slapos.libnetworkcache', + 'erp5.util', + 'requests', + ], + zip_safe=True, + test_suite='test', +) diff --git a/software/html5as/test/test.py b/software/html5as/test/test.py new file mode 100644 index 0000000000000000000000000000000000000000..2d80b7e1082d5f4cc432459e5eb1adac5d67f6cd --- /dev/null +++ b/software/html5as/test/test.py @@ -0,0 +1,134 @@ +############################################################################## +# +# Copyright (c) 2021 Nexedi SA and Contributors. All Rights Reserved. +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsibility of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# guarantees and support are strongly adviced to contract a Free Software +# Service Company +# +# This program is Free Software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +############################################################################## + +import os +import requests +from urlparse import urlparse + +from slapos.testing.testcase import makeModuleSetUpAndTestCaseClass + +setUpModule, SlapOSInstanceTestCase = makeModuleSetUpAndTestCaseClass( + os.path.abspath( + os.path.join(os.path.dirname(__file__), '..', 'software.cfg'))) + + +class HTML5ASTestCase(SlapOSInstanceTestCase): + """ + Common class for testing html5as. + It inherit from SlapOSInstanceTestCase which: + * Install the software release. + * Checks it compile without issue. + * Deploy the instance + * Check deployement works and promise pass + For testing the deployement a different testing class will need to be set up + per each variation of parameters the instance needs to be given. + """ + + def checkUrlAndGetResponse(self, url): + """ + Common class to check an url and return the response + """ + response = requests.get(url) + self.assertEqual(requests.codes['OK'], response.status_code) + return response + + +class TestEmptyDeploy(HTML5ASTestCase): + """ + This class test the instance with no parameters. + """ + + def test_deploy_with_no_paramater(self): + url = self.requestDefaultInstance().getConnectionParameterDict()['server_url'] + response = self.checkUrlAndGetResponse(url) + result = response.text + self.assertFalse("<h1>" in result) + self.assertTrue("<p>Hello World</p>" in result) + +class TestDeployWithTitle(HTML5ASTestCase): + """ + This class test an instance with the parameter "title" + """ + + @classmethod + def getInstanceParameterDict(cls): + return { + 'title': 'Test1', + } + + def test_deploy_with_title_parameter(self): + connection_parameter_dict = self.computer_partition.getConnectionParameterDict() + self.assertEqual(connection_parameter_dict["title"], "Title Test1!") + url = connection_parameter_dict['server_url'] + response = self.checkUrlAndGetResponse(url) + result = response.text + self.assertTrue("<h1>Test1</h1>" in result) + self.assertTrue("<p>Hello World</p>" in result) + +class TestGracefulWithPortChange(HTML5ASTestCase): + """ + This class test the instance with the parameter "port" + """ + + instance_parameter_dict = { + 'port': 8087 + } + + @classmethod + def getInstanceParameterDict(cls): + return cls.instance_parameter_dict + + def test_change_port_parameter(self): + """ + This test test port change and its application with graceful restart + """ + # Check initial connection parameter match expected port + url = self.computer_partition.getConnectionParameterDict()['server_url'] + self.assertEqual(urlparse(url).port, 8087) + # Check port is listening even thought it is duplicated with the promise: + # "port-listening-promise" + self.checkUrlAndGetResponse(url) + + # Update port parameter + self.instance_parameter_dict.update({ + 'port': 8086, + + }) + # Request instance with the new port parameter + self.requestDefaultInstance() + # Reprocess the instance to apply new port and run promises + self.slap.waitForInstance(self.instance_max_retry) + # Rerequest instance to get update connection parameter + url = self.requestDefaultInstance().getConnectionParameterDict()['server_url'] + # Make sure the new port is the one being used + self.assertEqual(urlparse(url).port, 8086) + + # Check port is listening even thought it is duplicated with the promise: + # "port-listening-promise" + self.checkUrlAndGetResponse(url) + +