diff --git a/certbot-ci/certbot_integration_tests/apache_tests/apache_config.py b/certbot-ci/certbot_integration_tests/apache_tests/apache_config.py index 811615988..80411837c 100644 --- a/certbot-ci/certbot_integration_tests/apache_tests/apache_config.py +++ b/certbot-ci/certbot_integration_tests/apache_tests/apache_config.py @@ -13,6 +13,8 @@ def construct_apache_config_dir(apache_root, http_port, https_port, key_path=Non webroot_path = os.path.join(apache_root, 'www') os.mkdir(webroot_path) + with open(os.path.join(webroot_path, 'index.html'), 'w') as file_h: + file_h.write('Hello World!') main_config_path = os.path.join(config_path, 'apache2.conf') with open(main_config_path, 'w') as file_h: @@ -93,21 +95,24 @@ Listen {http} user = user if user != 'root' else 'www-data' group = user + pid_file = os.path.join(run_path, 'apache.pid') + with open(os.path.join(config_path, 'envvars'), 'w') as file_h: file_h.write('''\ unset HOME export APACHE_RUN_USER={user} export APACHE_RUN_GROUP={group} -export APACHE_PID_FILE={run_path}/apache2.pid +export APACHE_PID_FILE={pid_file} export APACHE_RUN_DIR={run_path} export APACHE_LOCK_DIR={lock_path} export APACHE_LOG_DIR={logs_path} export LANG=C -'''.format(user=user, group=group, run_path=run_path, lock_path=lock_path, logs_path=logs_path)) +'''.format(user=user, group=group, pid_file=pid_file, + run_path=run_path, lock_path=lock_path, logs_path=logs_path)) new_environ['APACHE_RUN_USER'] = user new_environ['APACHE_RUN_GROUP'] = group - new_environ['APACHE_PID_FILE'] = os.path.join(run_path, 'apache.pid') + new_environ['APACHE_PID_FILE'] = pid_file new_environ['APACHE_RUN_DIR'] = run_path new_environ['APACHE_LOCK_DIR'] = lock_path new_environ['APACHE_LOG_DIR'] = logs_path @@ -158,9 +163,9 @@ export LANG=C '''.format(https=https_port, le_host=le_host, webroot=webroot_path, cert_path=cert_path, key_path=key_path)) - return new_environ + return new_environ, pid_file def test(): env = construct_apache_config_dir('/tmp/test1', 5001, 5002) - subprocess.call(['apache2', '-f', '/tmp/test1/config/apache2.conf'], env=env) + subprocess.call(['apache2ctl', '-DFOREGROUND'], env=env) diff --git a/certbot-ci/certbot_integration_tests/apache_tests/context.py b/certbot-ci/certbot_integration_tests/apache_tests/context.py index d058e7ae6..78a848ef4 100644 --- a/certbot-ci/certbot_integration_tests/apache_tests/context.py +++ b/certbot-ci/certbot_integration_tests/apache_tests/context.py @@ -1,28 +1,43 @@ import os +import signal +import subprocess from certbot_integration_tests.certbot_tests import context as certbot_context +from certbot_integration_tests.apache_tests import apache_config +from certbot_integration_tests.utils import certbot_call class IntegrationTestsContext(certbot_context.IntegrationTestsContext): def __init__(self, request): super(IntegrationTestsContext, self).__init__(request) + subprocess.check_output(['chmod', '+x', self.workspace]) + self.apache_root = os.path.join(self.workspace, 'apache') os.mkdir(self.apache_root) - self.webroot = os.path.join(self.apache_root, 'www') - os.mkdir(self.webroot) - with open(os.path.join(self.webroot, 'index.html'), 'w') as file_handler: - file_handler.write('Hello World!') - - self.process = self._start_apache() + self.apache_env, self.apache_pid_file = apache_config.construct_apache_config_dir( + self.apache_root, self.http_01_port, self.tls_alpn_01_port, + wtf_prefix=self.worker_id) def cleanup(self): self._stop_apache() - super(IntegrationTestsContext, self).cleanup() + #super(IntegrationTestsContext, self).cleanup() - def _start_apache(self): - pass + def certbot_test_apache(self, args): + command = ['--authenticator', 'apache', '--installer', 'apache'] + command.extend(args) + + return certbot_call.certbot_test( + command, self.directory_url, self.http_01_port, self.tls_alpn_01_port, + self.config_dir, self.workspace, env=self.apache_env, force_renew=True) def _stop_apache(self): - pass + try: + with open(self.apache_pid_file) as file_h: + pid = int(file_h.read().strip()) + except BaseException: + pid = None + + if pid: + os.kill(pid, signal.SIGTERM) diff --git a/certbot-ci/certbot_integration_tests/apache_tests/test_main.py b/certbot-ci/certbot_integration_tests/apache_tests/test_main.py new file mode 100644 index 000000000..f03c05baf --- /dev/null +++ b/certbot-ci/certbot_integration_tests/apache_tests/test_main.py @@ -0,0 +1,18 @@ +import pytest + +from certbot_integration_tests.apache_tests import context as apache_context + + +@pytest.fixture() +def context(request): + # Fixture request is a built-in pytest fixture describing current test request. + integration_test_context = apache_context.IntegrationTestsContext(request) + try: + yield integration_test_context + finally: + integration_test_context.cleanup() + + +def test_it(context): + command = ['-d', 'apache.{0}.wtf'.format(context.worker_id)] + context.certbot_test_apache(command) diff --git a/certbot-ci/certbot_integration_tests/utils/certbot_call.py b/certbot-ci/certbot_integration_tests/utils/certbot_call.py index 1bff94e75..a4225cb25 100755 --- a/certbot-ci/certbot_integration_tests/utils/certbot_call.py +++ b/certbot-ci/certbot_integration_tests/utils/certbot_call.py @@ -11,7 +11,7 @@ from certbot_integration_tests.utils.constants import * def certbot_test(certbot_args, directory_url, http_01_port, tls_alpn_01_port, - config_dir, workspace, force_renew=True): + config_dir, workspace, env=None, force_renew=True): """ Invoke the certbot executable available in PATH in a test context for the given args. The test context consists in running certbot in debug mode, with various flags suitable @@ -23,19 +23,21 @@ def certbot_test(certbot_args, directory_url, http_01_port, tls_alpn_01_port, :param int tls_alpn_01_port: port for the TLS-ALPN-01 challenges :param str config_dir: certbot configuration directory to use :param str workspace: certbot current directory to use + :param obj env: the environment variables to use (default: None, then current env will be used) :param bool force_renew: set False to not force renew existing certificates (default: True) :return: stdout as string :rtype: str """ + new_environ = env if env else os.environ.copy() command, env = _prepare_args_env(certbot_args, directory_url, http_01_port, tls_alpn_01_port, - config_dir, workspace, force_renew) + config_dir, workspace, force_renew, new_environ) return subprocess.check_output(command, universal_newlines=True, cwd=workspace, env=env) def _prepare_args_env(certbot_args, directory_url, http_01_port, tls_alpn_01_port, - config_dir, workspace, force_renew): - new_environ = os.environ.copy() + config_dir, workspace, force_renew, env): + new_environ = env.copy() new_environ['TMPDIR'] = workspace additional_args = []