diff --git a/letsencrypt-apache/letsencrypt_apache/augeas_configurator.py b/letsencrypt-apache/letsencrypt_apache/augeas_configurator.py index ea4bd0384..91b78c566 100644 --- a/letsencrypt-apache/letsencrypt_apache/augeas_configurator.py +++ b/letsencrypt-apache/letsencrypt_apache/augeas_configurator.py @@ -87,7 +87,8 @@ class AugeasConfigurator(common.Plugin): self._log_save_errors(ex_errs) # Erase Save Notes self.save_notes = "" - return False + raise errors.PluginError( + "Error saving files, check logs for more info.") # Retrieve list of modified files # Note: Noop saves can cause the file to be listed twice, I used a diff --git a/letsencrypt-apache/letsencrypt_apache/tests/augeas_configurator_test.py b/letsencrypt-apache/letsencrypt_apache/tests/augeas_configurator_test.py new file mode 100644 index 000000000..b9b6712a7 --- /dev/null +++ b/letsencrypt-apache/letsencrypt_apache/tests/augeas_configurator_test.py @@ -0,0 +1,81 @@ +"""Test for letsencrypt_apache.augeas_configurator.""" +import os +import shutil +import unittest + +import mock + +from letsencrypt import errors + +from letsencrypt.tests import acme_util + +from letsencrypt_apache import configurator +from letsencrypt_apache import obj + +from letsencrypt_apache.tests import util + + +class AugeasConfiguratorTest(util.ApacheTest): + """Test for Augeas Configurator base class.""" + + def setUp(self): # pylint: disable=arguments-differ + super(AugeasConfiguratorTest, self).setUp() + + self.config = util.get_apache_configurator( + self.config_path, self.config_dir, self.work_dir) + + self.vh_truth = util.get_vh_truth( + self.temp_dir, "debian_apache_2_4/two_vhost_80") + + def tearDown(self): + shutil.rmtree(self.temp_dir) + shutil.rmtree(self.config_dir) + shutil.rmtree(self.work_dir) + + def test_bad_parse(self): + self.config.parser._parse_file(os.path.join( + self.config.parser.root, "conf-available", "bad_conf_file.conf")) + self.assertRaises( + errors.PluginError, self.config.check_parsing_errors, "httpd.aug") + + def test_bad_save(self): + mock_save = mock.Mock() + mock_save.side_effect = IOError + self.config.aug.save = mock_save + + self.assertRaises(errors.PluginError, self.config.save) + + def test_finalize_save(self): + mock_finalize = mock.Mock() + self.config.reverter = mock_finalize + self.config.save("Example Title") + + self.assertTrue(mock_finalize.is_called) + + def test_recovery_routine(self): + mock_load = mock.Mock() + self.config.aug.load = mock_load + + self.config.recovery_routine() + self.assertEqual(mock_load.call_count, 1) + + def test_revert_challenge_config(self): + mock_load = mock.Mock() + self.config.aug.load = mock_load + + self.config.revert_challenge_config() + self.assertEqual(mock_load.call_count, 1) + + def test_rollback_checkpoints(self): + mock_load = mock.Mock() + self.config.aug.load = mock_load + + self.config.rollback_checkpoints() + self.assertEqual(mock_load.call_count, 1) + + def test_view_config_changes(self): + self.config.view_config_changes() + + +if __name__ == "__main__": + unittest.main() # pragma: no cover \ No newline at end of file diff --git a/letsencrypt-apache/letsencrypt_apache/tests/testdata/debian_apache_2_4/two_vhost_80/apache2/conf-available/bad_conf_file.conf b/letsencrypt-apache/letsencrypt_apache/tests/testdata/debian_apache_2_4/two_vhost_80/apache2/conf-available/bad_conf_file.conf new file mode 100644 index 000000000..1aad6a9f4 --- /dev/null +++ b/letsencrypt-apache/letsencrypt_apache/tests/testdata/debian_apache_2_4/two_vhost_80/apache2/conf-available/bad_conf_file.conf @@ -0,0 +1,5 @@ + + +ServerName invalid.net + + diff --git a/letsencrypt/reverter.py b/letsencrypt/reverter.py index a20ebb8dc..a31281a5b 100644 --- a/letsencrypt/reverter.py +++ b/letsencrypt/reverter.py @@ -27,6 +27,9 @@ class Reverter(object): def __init__(self, config): self.config = config + le_util.make_or_verify_dir( + config.backup_dir, constants.CONFIG_DIRS_MODE, os.geteuid()) + def revert_temporary_config(self): """Reload users original configuration files after a temporary save. diff --git a/letsencrypt/tests/reverter_test.py b/letsencrypt/tests/reverter_test.py index f2615453a..da57bf8dc 100644 --- a/letsencrypt/tests/reverter_test.py +++ b/letsencrypt/tests/reverter_test.py @@ -377,7 +377,6 @@ def setup_work_direc(): """ work_dir = tempfile.mkdtemp("work") backup_dir = os.path.join(work_dir, "backup") - os.makedirs(backup_dir) return mock.MagicMock( work_dir=work_dir, backup_dir=backup_dir,