From 54d67e2378fe3633996e284f577950329bfff7c5 Mon Sep 17 00:00:00 2001 From: Jakub Warmuz Date: Mon, 8 Dec 2014 20:41:52 +0100 Subject: [PATCH 1/4] Add tests for unique_file --- letsencrypt/client/le_util_test.py | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/letsencrypt/client/le_util_test.py b/letsencrypt/client/le_util_test.py index 926830602..0aa04caeb 100644 --- a/letsencrypt/client/le_util_test.py +++ b/letsencrypt/client/le_util_test.py @@ -69,6 +69,45 @@ class CheckPermissionsTest(unittest.TestCase): self.assertFalse(self._call(0o600)) +class UniqueFileTest(unittest.TestCase): + """Tests for letsencrypt.class.le_util.unique_file.""" + + def setUp(self): + self.root_path = tempfile.mkdtemp() + self.default_name = os.path.join(self.root_path, 'foo.txt') + + def _call(self, mode=0o600): + from letsencrypt.client.le_util import unique_file + return unique_file(self.default_name, mode) + + def test_returns_fd_for_writing(self): + fd, name = self._call() + fd.write('bar') + fd.close() + self.assertEqual(open(name).read(), 'bar') + + def test_default_not_exists(self): + self.assertEqual(self._call()[1], self.default_name) + + def test_default_exists(self): + name1 = self._call()[1] # create foo.txt + name2 = self._call()[1] + name3 = self._call()[1] + + self.assertNotEqual(name1, name2) + basename2 = os.path.basename(name2) + self.assertEqual(os.path.dirname(name2), self.root_path) + self.assertTrue(basename2.startswith('foo')) + self.assertTrue(basename2.endswith('.txt')) + + self.assertNotEqual(name1, name3) + self.assertNotEqual(name2, name3) + basename3 = os.path.basename(name3) + self.assertEqual(os.path.dirname(name3), self.root_path) + self.assertTrue(basename3.startswith('foo')) + self.assertTrue(basename3.endswith('.txt')) + + # https://en.wikipedia.org/wiki/Base64#Examples JOSE_B64_PADDING_EXAMPLES = { 'any carnal pleasure.': ('YW55IGNhcm5hbCBwbGVhc3VyZS4', '='), From 8ea085553ab750d734c6845ab9f18bd1bb9f615d Mon Sep 17 00:00:00 2001 From: Jakub Warmuz Date: Mon, 8 Dec 2014 21:29:53 +0100 Subject: [PATCH 2/4] Fix coverage for le_util --- letsencrypt/client/le_util.py | 4 ++++ letsencrypt/client/le_util_test.py | 14 ++++++++++++++ setup.py | 1 + 3 files changed, 19 insertions(+) diff --git a/letsencrypt/client/le_util.py b/letsencrypt/client/le_util.py index 75924e08b..42f88bc5d 100644 --- a/letsencrypt/client/le_util.py +++ b/letsencrypt/client/le_util.py @@ -17,6 +17,10 @@ def make_or_verify_dir(directory, mode=0o755, uid=0): :raises LetsEncryptClientError: if a directory already exists, but has wrong permissions or owner + :raises OSError: if invalid or inaccessible file names and + paths, or other arguments that have the correct type, + but are not accepted by the operating system. + """ try: os.makedirs(directory, mode) diff --git a/letsencrypt/client/le_util_test.py b/letsencrypt/client/le_util_test.py index 0aa04caeb..2432a6d65 100644 --- a/letsencrypt/client/le_util_test.py +++ b/letsencrypt/client/le_util_test.py @@ -4,6 +4,8 @@ import shutil import tempfile import unittest +import mock + class MakeOrVerifyDirTest(unittest.TestCase): """Tests for letsencrypt.client.le_util.make_or_verify_dir. @@ -40,6 +42,11 @@ class MakeOrVerifyDirTest(unittest.TestCase): def test_existing_wrong_mode_fails(self): self.assertRaises(Exception, self._call, self.path, 0o600) + def test_reraises_os_error(self): + with mock.patch.object(os, 'makedirs') as makedirs: + makedirs.side_effect = OSError() + self.assertRaises(OSError, self._call, 'bar', 12312312) + class CheckPermissionsTest(unittest.TestCase): """Tests for letsencrypt.client.le_util.check_permissions. @@ -86,6 +93,10 @@ class UniqueFileTest(unittest.TestCase): fd.close() self.assertEqual(open(name).read(), 'bar') + def test_right_mode(self): + self.assertEqual(0o700, os.stat(self._call(0o700)[1]).st_mode & 0o777) + self.assertEqual(0o100, os.stat(self._call(0o100)[1]).st_mode & 0o777) + def test_default_not_exists(self): self.assertEqual(self._call()[1], self.default_name) @@ -168,6 +179,9 @@ class JOSEB64DecodeTest(unittest.TestCase): def test_non_ascii_unicode_fails(self): self.assertRaises(ValueError, self._call, u'\u0105') + def test_type_error_no_unicode_or_str(self): + self.assertRaises(TypeError, self._call, object()) + if __name__ == '__main__': unittest.main() diff --git a/setup.py b/setup.py index a2a13fecf..9f1e6ef69 100755 --- a/setup.py +++ b/setup.py @@ -5,6 +5,7 @@ from setuptools import setup install_requires = [ 'argparse', 'jsonschema', + 'mock', 'M2Crypto', 'pycrypto', 'python-augeas', From f7784f2023e8f351c539586c56d2f9ec3a9086e1 Mon Sep 17 00:00:00 2001 From: Jakub Warmuz Date: Tue, 9 Dec 2014 19:24:16 +0100 Subject: [PATCH 3/4] Fix lexicographic order in install_requires --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9f1e6ef69..bc7e7f364 100755 --- a/setup.py +++ b/setup.py @@ -5,8 +5,8 @@ from setuptools import setup install_requires = [ 'argparse', 'jsonschema', - 'mock', 'M2Crypto', + 'mock', 'pycrypto', 'python-augeas', 'python2-pythondialog', From e107b9259a85848b2b813d6e79eb84a88d3cfec6 Mon Sep 17 00:00:00 2001 From: Jakub Warmuz Date: Tue, 9 Dec 2014 19:41:56 +0100 Subject: [PATCH 4/4] Pin pylint<1.4 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index a2a13fecf..941f42247 100755 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ testing_extras = [ 'coverage', 'nose', 'nosexcover', - 'pylint', + 'pylint<1.4', # py2.6 compat, c.f #97 'tox', ]