From 3a7960710306d3e601759a6fc36361ff6f04ed67 Mon Sep 17 00:00:00 2001 From: James Kasten Date: Thu, 12 Feb 2015 02:42:49 -0800 Subject: [PATCH] Add tests to satisfy empty list assumption of authenticator interface --- letsencrypt/client/auth_handler.py | 1 + letsencrypt/client/tests/acme_util.py | 2 +- letsencrypt/client/tests/auth_handler_test.py | 70 ++++++++++++++----- 3 files changed, 55 insertions(+), 18 deletions(-) diff --git a/letsencrypt/client/auth_handler.py b/letsencrypt/client/auth_handler.py index 2315eb24b..984862f46 100644 --- a/letsencrypt/client/auth_handler.py +++ b/letsencrypt/client/auth_handler.py @@ -129,6 +129,7 @@ class AuthHandler(object): # pylint: disable=too-many-instance-attributes .. todo:: It might be worth it to try different challenges to find one that doesn't throw an exception + .. todo:: separate into more functions """ logging.info("Performing the following challenges:") diff --git a/letsencrypt/client/tests/acme_util.py b/letsencrypt/client/tests/acme_util.py index aa142af8e..08a7e44bd 100644 --- a/letsencrypt/client/tests/acme_util.py +++ b/letsencrypt/client/tests/acme_util.py @@ -26,7 +26,7 @@ CHALLENGES = { "successURL": "https://example.ca/confirmrecovery/bb1b9928932", "contact": "c********n@example.com" }, - "recoveryTokent": + "recoveryToken": { "type": "recoveryToken" }, diff --git a/letsencrypt/client/tests/auth_handler_test.py b/letsencrypt/client/tests/auth_handler_test.py index 2125b4882..945141f4e 100644 --- a/letsencrypt/client/tests/auth_handler_test.py +++ b/letsencrypt/client/tests/auth_handler_test.py @@ -59,6 +59,29 @@ class SatisfyChallengesTest(unittest.TestCase): self.assertEqual(len(self.handler.dv_c[dom]), 1) self.assertEqual(len(self.handler.client_c[dom]), 0) + def test_name1_rectok1(self): + dom = "0" + challenge = [acme_util.CHALLENGES["recoveryToken"]] + msg = acme_util.get_chall_msg(dom, "nonce0", challenge) + self.handler.add_chall_msg(dom, msg, "dummy_key") + + self.handler._satisfy_challenges() # pylint: disable=protected-access + + self.assertEqual(len(self.handler.responses), 1) + self.assertEqual(len(self.handler.responses[dom]), 1) + + # Test if statement for dv_auth perform + self.assertEqual(self.mock_client_auth.perform.call_count, 1) + self.assertEqual(self.mock_dv_auth.perform.call_count, 0) + + self.assertEqual("RecTokenChall0", self.handler.responses[dom][0]) + # Assert 1 domain + self.assertEqual(len(self.handler.dv_c), 1) + self.assertEqual(len(self.handler.client_c), 1) + # Assert 1 auth challenge, 0 dv + self.assertEqual(len(self.handler.dv_c[dom]), 0) + self.assertEqual(len(self.handler.client_c[dom]), 1) + def test_name5_dvsni5(self): challenge = [acme_util.CHALLENGES["dvsni"]] for i in xrange(5): @@ -74,6 +97,10 @@ class SatisfyChallengesTest(unittest.TestCase): self.assertEqual(len(self.handler.client_c), 5) # Each message contains 1 auth, 0 client + # Test proper call count for methods + self.assertEqual(self.mock_client_auth.perform.call_count, 0) + self.assertEqual(self.mock_dv_auth.perform.call_count, 1) + for i in xrange(5): dom = str(i) self.assertEqual(len(self.handler.responses[dom]), 1) @@ -103,6 +130,10 @@ class SatisfyChallengesTest(unittest.TestCase): self.assertEqual(len(self.handler.dv_c), 1) self.assertEqual(len(self.handler.client_c), 1) + # Test if statement for client_auth perform + self.assertEqual(self.mock_client_auth.perform.call_count, 0) + self.assertEqual(self.mock_dv_auth.perform.call_count, 1) + self.assertEqual( self.handler.responses[dom], self._get_exp_response(dom, path, challenges)) @@ -251,33 +282,38 @@ class SatisfyChallengesTest(unittest.TestCase): str(i), "nonce%d" % i, challenges, combos), "dummy_key") - mock_chall_path.return_value = gen_path( - ["dvsni", "proofOfPossession"], challenges) + mock_chall_path.side_effect = [ + gen_path(["dvsni", "proofOfPossession"], challenges), + gen_path(["proofOfPossession"], challenges), + gen_path(["dvsni"], challenges), + ] # This may change in the future... but for now catch the error self.assertRaises(errors.LetsEncryptAuthHandlerError, self.handler._satisfy_challenges) # Verify cleanup is actually run correctly - self.assertEqual(self.mock_dv_auth.cleanup.call_count, 3) - self.assertEqual(self.mock_client_auth.cleanup.call_count, 3) + self.assertEqual(self.mock_dv_auth.cleanup.call_count, 2) + self.assertEqual(self.mock_client_auth.cleanup.call_count, 2) + + + dv_cleanup_args = self.mock_dv_auth.cleanup.call_args_list + client_cleanup_args = self.mock_client_auth.cleanup.call_args_list # Check DV cleanup - mock_cleanup_args = self.mock_dv_auth.cleanup.call_args_list - for i in xrange(3): - # Assert length of arg list was 1 - arg_chall_list = mock_cleanup_args[i][0][0] - self.assertEqual(len(arg_chall_list), 1) - self.assertTrue(isinstance(arg_chall_list[0], - challenge_util.DvsniChall)) + for i in xrange(2): + dv_chall_list = dv_cleanup_args[i][0][0] + self.assertEqual(len(dv_chall_list), 1) + self.assertTrue( + isinstance(dv_chall_list[0], challenge_util.DvsniChall)) + # Check Auth cleanup - mock_cleanup_args = self.mock_client_auth.cleanup.call_args_list - for i in xrange(3): - arg_chall_list = mock_cleanup_args[i][0][0] - self.assertEqual(len(arg_chall_list), 1) - self.assertTrue(isinstance(arg_chall_list[0], - challenge_util.PopChall)) + for i in xrange(2): + client_chall_list = client_cleanup_args[i][0][0] + self.assertEqual(len(client_chall_list), 1) + self.assertTrue( + isinstance(client_chall_list[0], challenge_util.PopChall)) def _get_exp_response(self, domain, path, challenges): # pylint: disable=no-self-use