mirror of
https://github.com/certbot/certbot.git
synced 2026-06-05 23:04:39 -04:00
This PR is the part 4 to implement #6541. It adds the integration tests for the nginx certbot plugin, and corresponds to the certbot-ci translation of certbot-nginx/tests/boulder-integration.sh that is executed for each PR. As with certbot core tests, tests are written in Python, and executed by pytest, against a dynamic Boulder/Pebble instance setup. Tests are parallelized, of course, and a specific IntegrationTestsContext class, extended the one from certbot core tests, is crafter for these specific tests: its main goal is to setup a specific nginx instance for the current test. On top of that, I use the test parametrization feature of Pytest, to drastically reduce the size of the actual code: indeed, the 6 tests from the original bash script share the same logic. So using a parametrization, one unique test is written, that is then executed 6 times against 6 different sets of parameters. Note that the module integration_tests.nginx_tests.nginx_config do the same, but in Python, than certbot-nginx/tests/boulder-integration.conf.sh. The latter will be removed in a future PR, with all other bash scripts. * Add nginx tests * Distribute the other_port * Load a pre-generated key/cert for nginx config * Correct preload, remove a test, simplify a variable * Integrate assertion directly in the test function * Check process is not terminated * Add spaces in the nginx config * Add comments * Use indirection * Allow external cert * Add coverage threshold for certbot-nginx
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
import os
|
|
import subprocess
|
|
|
|
from certbot_integration_tests.certbot_tests import context as certbot_context
|
|
from certbot_integration_tests.utils import misc
|
|
from certbot_integration_tests.nginx_tests import nginx_config as config
|
|
|
|
|
|
class IntegrationTestsContext(certbot_context.IntegrationTestsContext):
|
|
"""General fixture describing a certbot-nginx integration tests context"""
|
|
def __init__(self, request):
|
|
super(IntegrationTestsContext, self).__init__(request)
|
|
|
|
self.nginx_root = os.path.join(self.workspace, 'nginx')
|
|
os.mkdir(self.nginx_root)
|
|
|
|
self.webroot = os.path.join(self.nginx_root, 'webroot')
|
|
os.mkdir(self.webroot)
|
|
with open(os.path.join(self.webroot, 'index.html'), 'w') as file_handler:
|
|
file_handler.write('Hello World!')
|
|
|
|
self.nginx_config_path = os.path.join(self.nginx_root, 'nginx.conf')
|
|
self.nginx_config = None
|
|
|
|
default_server = request.param['default_server']
|
|
self.process = self._start_nginx(default_server)
|
|
|
|
def cleanup(self):
|
|
self._stop_nginx()
|
|
super(IntegrationTestsContext, self).cleanup()
|
|
|
|
def certbot_test_nginx(self, args):
|
|
"""
|
|
Main command to execute certbot using the nginx plugin.
|
|
:param list args: list of arguments to pass to nginx
|
|
"""
|
|
command = ['--authenticator', 'nginx', '--installer', 'nginx',
|
|
'--nginx-server-root', self.nginx_root]
|
|
command.extend(args)
|
|
return self._common_test(command)
|
|
|
|
def _start_nginx(self, default_server):
|
|
self.nginx_config = config.construct_nginx_config(
|
|
self.nginx_root, self.webroot, self.http_01_port, self.tls_alpn_01_port,
|
|
self.other_port, default_server, wtf_prefix=self.worker_id)
|
|
with open(self.nginx_config_path, 'w') as file:
|
|
file.write(self.nginx_config)
|
|
|
|
process = subprocess.Popen(['nginx', '-c', self.nginx_config_path, '-g', 'daemon off;'])
|
|
|
|
assert process.poll() is None
|
|
misc.check_until_timeout('http://localhost:{0}'.format(self.http_01_port))
|
|
return process
|
|
|
|
def _stop_nginx(self):
|
|
assert self.process.poll() is None
|
|
self.process.terminate()
|
|
self.process.wait()
|