certbot/certbot-nginx/certbot_nginx/tests/util.py

120 lines
3.8 KiB
Python
Raw Permalink Normal View History

"""Common utilities for certbot_nginx."""
2016-06-18 17:52:07 -04:00
import copy
2015-03-23 13:53:44 -04:00
import os
import pkg_resources
import tempfile
2015-03-23 13:53:44 -04:00
import unittest
import josepy as jose
2015-03-23 13:53:44 -04:00
import mock
import zope.component
2015-03-23 13:53:44 -04:00
from certbot import configuration
2015-09-16 21:52:11 -04:00
from certbot.tests import util as test_util
2015-08-05 18:39:31 -04:00
from certbot.plugins import common
from certbot_nginx import configurator
2016-07-14 21:15:01 -04:00
from certbot_nginx import nginxparser
2015-03-23 13:53:44 -04:00
class NginxTest(unittest.TestCase): # pylint: disable=too-few-public-methods
def setUp(self):
super(NginxTest, self).setUp()
self.temp_dir, self.config_dir, self.work_dir = common.dir_setup(
"etc_nginx", "certbot_nginx.tests")
self.logs_dir = tempfile.mkdtemp('logs')
2015-03-23 13:53:44 -04:00
self.config_path = os.path.join(self.temp_dir, "etc_nginx")
2015-03-23 13:53:44 -04:00
2015-08-05 18:39:31 -04:00
self.rsa512jwk = jose.JWKRSA.load(test_util.load_vector(
"rsa512_key.pem"))
def get_data_filename(filename):
2015-04-17 20:05:00 -04:00
"""Gets the filename of a test data file."""
return pkg_resources.resource_filename(
"certbot_nginx.tests", os.path.join(
"testdata", "etc_nginx", filename))
2015-03-23 13:53:44 -04:00
def get_nginx_configurator(
config_path, config_dir, work_dir, logs_dir, version=(1, 6, 2)):
2015-03-23 13:53:44 -04:00
"""Create an Nginx Configurator with the specified options."""
backups = os.path.join(work_dir, "backups")
with mock.patch("certbot_nginx.configurator.NginxConfigurator."
"config_test"):
2016-05-26 16:51:56 -04:00
with mock.patch("certbot_nginx.configurator.util."
"exe_exists") as mock_exe_exists:
mock_exe_exists.return_value = True
config = configurator.NginxConfigurator(
config=mock.MagicMock(
nginx_server_root=config_path,
le_vhost_ext="-le-ssl.conf",
config_dir=config_dir,
work_dir=work_dir,
logs_dir=logs_dir,
backup_dir=backups,
temp_checkpoint_dir=os.path.join(work_dir, "temp_checkpoints"),
in_progress_dir=os.path.join(backups, "IN_PROGRESS"),
server="https://acme-server.org:443/new",
tls_sni_01_port=5001,
),
name="nginx",
version=version)
config.prepare()
2015-09-16 21:52:11 -04:00
# Provide general config utility.
nsconfig = configuration.NamespaceConfig(config.config)
zope.component.provideUtility(nsconfig)
2015-09-16 21:52:11 -04:00
2015-03-23 13:53:44 -04:00
return config
def filter_comments(tree):
"""Filter comment nodes from parsed configurations."""
def traverse(tree):
"""Generator dropping comment nodes"""
2016-06-18 17:52:07 -04:00
for entry in tree:
2016-07-14 21:15:01 -04:00
# key, values = entry
spaceless = [e for e in entry if not nginxparser.spacey(e)]
if spaceless:
key = spaceless[0]
values = spaceless[1] if len(spaceless) > 1 else None
else:
key = values = ""
if isinstance(key, list):
2016-06-18 17:52:07 -04:00
new = copy.deepcopy(entry)
new[1] = filter_comments(values)
yield new
else:
2016-07-14 21:15:01 -04:00
if key != '#' and spaceless:
yield spaceless
return list(traverse(tree))
2015-10-11 14:28:39 -04:00
def contains_at_depth(haystack, needle, n):
2015-10-11 14:28:39 -04:00
"""Is the needle in haystack at depth n?
Return true if the needle is present in one of the sub-iterables in haystack
at depth n. Haystack must be an iterable.
"""
2015-10-11 15:19:39 -04:00
# Specifically use hasattr rather than isinstance(..., collections.Iterable)
# because we want to include lists but reject strings.
if not hasattr(haystack, '__iter__') or hasattr(haystack, 'strip'):
return False
if n == 0:
return needle in haystack
else:
for item in haystack:
if contains_at_depth(item, needle, n - 1):
return True
return False