From ab42f7fdfeb1f26faf7a9abf8bf35f65c08622c8 Mon Sep 17 00:00:00 2001 From: James Kasten Date: Fri, 24 Jul 2015 17:05:25 -0700 Subject: [PATCH] 100% unittests for apache plugin --- letsencrypt-apache/letsencrypt_apache/dvsni.py | 2 +- letsencrypt-apache/letsencrypt_apache/obj.py | 5 ----- .../letsencrypt_apache/parser.py | 9 +++++---- .../tests/complex_parsing_test.py | 1 + .../tests/display_ops_test.py | 18 ++++++++++++++++-- .../letsencrypt_apache/tests/dvsni_test.py | 11 +++++++++++ .../letsencrypt_apache/tests/parser_test.py | 6 ++++++ .../testdata/complex_parsing/apache2.conf | 2 +- 8 files changed, 41 insertions(+), 13 deletions(-) diff --git a/letsencrypt-apache/letsencrypt_apache/dvsni.py b/letsencrypt-apache/letsencrypt_apache/dvsni.py index 113991c53..fbe30b1a6 100644 --- a/letsencrypt-apache/letsencrypt_apache/dvsni.py +++ b/letsencrypt-apache/letsencrypt_apache/dvsni.py @@ -114,7 +114,7 @@ class ApacheDvsni(common.Dvsni): # TODO: Checkout _default_ rules. dvsni_addrs = set() - default_addr = obj.Addr(("*", self.configurator.config.dvsni_port)) + default_addr = obj.Addr(("*", str(self.configurator.config.dvsni_port))) for addr in vhost.addrs: if "_default_" == addr.get_addr(): diff --git a/letsencrypt-apache/letsencrypt_apache/obj.py b/letsencrypt-apache/letsencrypt_apache/obj.py index 040b69082..c0dcc6c43 100644 --- a/letsencrypt-apache/letsencrypt_apache/obj.py +++ b/letsencrypt-apache/letsencrypt_apache/obj.py @@ -118,11 +118,6 @@ class VirtualHost(object): # pylint: disable=too-few-public-methods self.ssl = ssl self.enabled = enabled - def add_names(self, servername, serveralias): - """Add name to vhost.""" - self.name = servername - self.aliases = serveralias - def get_names(self): """Return a set of all names.""" all_names = set() diff --git a/letsencrypt-apache/letsencrypt_apache/parser.py b/letsencrypt-apache/letsencrypt_apache/parser.py index 00af5d114..01ec4aa38 100644 --- a/letsencrypt-apache/letsencrypt_apache/parser.py +++ b/letsencrypt-apache/letsencrypt_apache/parser.py @@ -396,7 +396,10 @@ class ApacheParser(object): arg = os.path.normpath(os.path.join(self.root, arg)) # Attempts to add a transform to the file if one does not already exist - self._parse_file(arg) + if os.path.isdir(arg): + self._parse_file(os.path.join(arg, "*")) + else: + self._parse_file(arg) # Argument represents an fnmatch regular expression, convert it # Split up the path and convert each into an Augeas accepted regex @@ -409,11 +412,9 @@ class ApacheParser(object): split_arg[idx] = ("* [label()=~regexp('%s')]" % self.fnmatch_to_re(split)) # Reassemble the argument + # Note: This also normalizes the argument /serverroot/ -> /serverroot arg = "/".join(split_arg) - # If the include is a directory, just return the directory as a file - if arg.endswith("/"): - return get_aug_path(arg[:-1]) return get_aug_path(arg) def fnmatch_to_re(self, clean_fn_match): # pylint: disable=no-self-use diff --git a/letsencrypt-apache/letsencrypt_apache/tests/complex_parsing_test.py b/letsencrypt-apache/letsencrypt_apache/tests/complex_parsing_test.py index 5e4478f67..d6112a486 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/complex_parsing_test.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/complex_parsing_test.py @@ -36,6 +36,7 @@ class ComplexParserTest(util.ParserTest): ) def test_filter_args_num(self): + """Note: This may also fail do to Include conf-enabled/ syntax.""" matches = self.parser.find_dir("TestArgsDirective") self.assertEqual(len(self.parser.filter_args_num(matches, 1)), 3) diff --git a/letsencrypt-apache/letsencrypt_apache/tests/display_ops_test.py b/letsencrypt-apache/letsencrypt_apache/tests/display_ops_test.py index 5d08092ce..d7cfb09b3 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/display_ops_test.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/display_ops_test.py @@ -5,10 +5,12 @@ import unittest import mock import zope.component -from letsencrypt_apache.tests import util - from letsencrypt.display import util as display_util +from letsencrypt_apache import obj + +from letsencrypt_apache.tests import util + class SelectVhostTest(unittest.TestCase): """Tests for letsencrypt_apache.display_ops.select_vhost.""" @@ -53,6 +55,18 @@ class SelectVhostTest(unittest.TestCase): self.assertEqual(mock_logger.debug.call_count, 1) + @mock.patch("letsencrypt_apache.display_ops.zope.component.getUtility") + def test_multiple_names(self, mock_util): + mock_util().menu.return_value = (display_util.OK, 4) + + self.vhosts.append( + obj.VirtualHost( + "path", "aug_path", set([obj.Addr.fromstring("*:80")]), + False, False, + "wildcard.com", set(["*.wildcard.com"]))) + + self.assertEqual(self.vhosts[4], self._call(self.vhosts)) + if __name__ == "__main__": unittest.main() # pragma: no cover diff --git a/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py b/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py index 29b600ec3..ff13fef7b 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/dvsni_test.py @@ -114,6 +114,17 @@ class DvsniPerformTest(util.ApacheTest): names == set([self.achalls[0].nonce_domain]) or names == set([self.achalls[1].nonce_domain])) + def test_get_dvsni_addrs_default(self): + self.sni.configurator.choose_vhost = mock.Mock( + return_value=obj.VirtualHost( + "path", "aug_path", set([obj.Addr.fromstring("_default_:443")]), + False, False) + ) + + self.assertEqual( + set([obj.Addr.fromstring("*:443")]), + self.sni.get_dvsni_addrs(self.achalls[0])) + if __name__ == "__main__": unittest.main() # pragma: no cover diff --git a/letsencrypt-apache/letsencrypt_apache/tests/parser_test.py b/letsencrypt-apache/letsencrypt_apache/tests/parser_test.py index 45e77bdb9..ce234bff7 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/parser_test.py +++ b/letsencrypt-apache/letsencrypt_apache/tests/parser_test.py @@ -22,6 +22,12 @@ class BasicParserTest(util.ParserTest): shutil.rmtree(self.config_dir) shutil.rmtree(self.work_dir) + def test_find_config_root_no_root(self): + # pylint: disable=protected-access + os.remove(self.parser.loc["root"]) + self.assertRaises( + errors.NoInstallationError, self.parser._find_config_root) + def test_parse_file(self): """Test parse_file. diff --git a/letsencrypt-apache/letsencrypt_apache/tests/testdata/complex_parsing/apache2.conf b/letsencrypt-apache/letsencrypt_apache/tests/testdata/complex_parsing/apache2.conf index b7b6a9be2..26bf47263 100644 --- a/letsencrypt-apache/letsencrypt_apache/tests/testdata/complex_parsing/apache2.conf +++ b/letsencrypt-apache/letsencrypt_apache/tests/testdata/complex_parsing/apache2.conf @@ -38,7 +38,7 @@ IncludeOptional mods-enabled/*.conf # Include generic snippets of statements -IncludeOptional conf-enabled/*.conf +IncludeOptional conf-enabled/ # Include the virtual host configurations: IncludeOptional sites-enabled/*.conf