def test_name5_mix(self, mock_chall_path):
        paths = []
        chosen_chall = [["dns"],
                        ["dvsni"],
                        ["simpleHttps", "proofOfPossession"],
                        ["simpleHttps"],
                        ["dns", "recoveryToken"]]
        challenge_list = [acme_util.get_dv_challenges(),
                          [acme_util.CHALLENGES["dvsni"]],
                          acme_util.get_challenges(),
                          acme_util.get_dv_challenges(),
                          acme_util.get_challenges()]

        # Combos doesn't matter since I am overriding the gen_path function
        for i in xrange(5):
            dom = str(i)
            paths.append(gen_path(chosen_chall[i], challenge_list[i]))
            self.handler.add_chall_msg(
                dom,
                messages.Challenge(
                    session_id=dom, nonce="nonce%d" % i,
                    challenges=challenge_list[i], combinations=[]),
                "dummy_key")

        mock_chall_path.side_effect = paths

        self.handler._satisfy_challenges()  # pylint: disable=protected-access

        self.assertEqual(len(self.handler.responses), 5)
        self.assertEqual(len(self.handler.dv_c), 5)
        self.assertEqual(len(self.handler.client_c), 5)

        for i in xrange(5):
            dom = str(i)
            resp = self._get_exp_response(i, paths[i], challenge_list[i])
            self.assertEqual(self.handler.responses[dom], resp)
            self.assertEqual(len(self.handler.dv_c[dom]), 1)
            self.assertEqual(
                len(self.handler.client_c[dom]), len(chosen_chall[i]) - 1)

        self.assertTrue(isinstance(self.handler.dv_c["0"][0].chall,
                                   challenge_util.DnsChall))
        self.assertTrue(isinstance(self.handler.dv_c["1"][0].chall,
                                   challenge_util.DvsniChall))
        self.assertTrue(isinstance(self.handler.dv_c["2"][0].chall,
                                   challenge_util.SimpleHttpsChall))
        self.assertTrue(isinstance(self.handler.dv_c["3"][0].chall,
                                   challenge_util.SimpleHttpsChall))
        self.assertTrue(isinstance(self.handler.dv_c["4"][0].chall,
                                   challenge_util.DnsChall))

        self.assertTrue(isinstance(self.handler.client_c["2"][0].chall,
                                   challenge_util.PopChall))
        self.assertTrue(isinstance(self.handler.client_c["4"][0].chall,
                                   challenge_util.RecTokenChall))
    def test_name5_all(self, mock_chall_path):
        challenges = acme_util.get_challenges()
        combos = acme_util.gen_combos(challenges)
        for i in xrange(5):
            self.handler.add_chall_msg(
                str(i),
                messages.Challenge(
                    session_id=str(i), nonce="nonce%d" % i,
                    challenges=challenges, combinations=combos),
                "dummy_key")

        path = gen_path(["dvsni", "recoveryContact"], challenges)
        mock_chall_path.return_value = path

        self.handler._satisfy_challenges()  # pylint: disable=protected-access

        self.assertEqual(len(self.handler.responses), 5)
        for i in xrange(5):
            self.assertEqual(
                len(self.handler.responses[str(i)]), len(challenges))
        self.assertEqual(len(self.handler.dv_c), 5)
        self.assertEqual(len(self.handler.client_c), 5)

        for i in xrange(5):
            dom = str(i)
            self.assertEqual(
                self.handler.responses[dom],
                self._get_exp_response(dom, path, challenges))
            self.assertEqual(len(self.handler.dv_c[dom]), 1)
            self.assertEqual(len(self.handler.client_c[dom]), 1)

            self.assertTrue(isinstance(self.handler.dv_c[dom][0].chall,
                                       challenge_util.DvsniChall))
            self.assertTrue(isinstance(self.handler.client_c[dom][0].chall,
                                       challenge_util.RecContactChall))
    def test_name1_all(self, mock_chall_path):
        dom = "0"

        challenges = acme_util.get_challenges()
        combos = acme_util.gen_combos(challenges)
        self.handler.add_chall_msg(
            dom,
            messages.Challenge(session_id=dom,
                               nonce="nonce0",
                               challenges=challenges,
                               combinations=combos), "dummy_key")

        path = gen_path(["simpleHttps", "recoveryToken"], challenges)
        mock_chall_path.return_value = path

        self.handler._satisfy_challenges()  # pylint: disable=protected-access

        self.assertEqual(len(self.handler.responses), 1)
        self.assertEqual(len(self.handler.responses[dom]), len(challenges))
        self.assertEqual(len(self.handler.dv_c), 1)
        self.assertEqual(len(self.handler.client_c), 1)
        self.assertEqual(len(self.handler.dv_c[dom]), 1)
        self.assertEqual(len(self.handler.client_c[dom]), 1)

        self.assertEqual(self.handler.responses[dom],
                         self._get_exp_response(dom, path, challenges))
        self.assertTrue(
            isinstance(self.handler.dv_c[dom][0].chall,
                       challenge_util.SimpleHttpsChall))
        self.assertTrue(
            isinstance(self.handler.client_c[dom][0].chall,
                       challenge_util.RecTokenChall))
    def test_name1_all(self, mock_chall_path):
        dom = "0"

        challenges = acme_util.get_challenges()
        combos = acme_util.gen_combos(challenges)
        self.handler.add_chall_msg(
            dom,
            messages.Challenge(session_id=dom, nonce="nonce0",
                               challenges=challenges, combinations=combos),
            "dummy_key")

        path = gen_path(["simpleHttps", "recoveryToken"], challenges)
        mock_chall_path.return_value = path

        self.handler._satisfy_challenges()  # pylint: disable=protected-access

        self.assertEqual(len(self.handler.responses), 1)
        self.assertEqual(len(self.handler.responses[dom]), len(challenges))
        self.assertEqual(len(self.handler.dv_c), 1)
        self.assertEqual(len(self.handler.client_c), 1)
        self.assertEqual(len(self.handler.dv_c[dom]), 1)
        self.assertEqual(len(self.handler.client_c[dom]), 1)

        self.assertEqual(
            self.handler.responses[dom],
            self._get_exp_response(dom, path, challenges))
        self.assertTrue(isinstance(self.handler.dv_c[dom][0].chall,
                                   challenge_util.SimpleHttpsChall))
        self.assertTrue(isinstance(self.handler.client_c[dom][0].chall,
                                   challenge_util.RecTokenChall))
    def test_perform_exception_cleanup(self, mock_chall_path):
        """3 Challenge messages... fail perform... clean up."""
        # pylint: disable=protected-access
        self.mock_dv_auth.perform.side_effect = errors.LetsEncryptDvsniError

        challenges = acme_util.get_challenges()
        combos = acme_util.gen_combos(challenges)

        for i in xrange(3):
            self.handler.add_chall_msg(
                str(i),
                messages.Challenge(
                    session_id=str(i), nonce="nonce%d" % i,
                    challenges=challenges, combinations=combos),
                "dummy_key")

        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, 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
        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
        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 test_progress_failure(self):
        challenges = acme_util.get_challenges()
        self.handler.add_chall_msg(
            "0",
            messages.Challenge(session_id="0", nonce="nonce0",
                               challenges=challenges, combinations=[]),
            "dummy_key")

        # Don't do anything to satisfy challenges
        self.mock_sat_chall.side_effect = self._sat_failure

        self.assertRaises(
            errors.LetsEncryptAuthHandlerError, self.handler.get_authorizations)

        # Check to make sure program didn't loop
        self.assertEqual(self.mock_sat_chall.call_count, 1)
    def test_progress_failure(self):
        challenges = acme_util.get_challenges()
        self.handler.add_chall_msg(
            "0",
            messages.Challenge(session_id="0",
                               nonce="nonce0",
                               challenges=challenges,
                               combinations=[]), "dummy_key")

        # Don't do anything to satisfy challenges
        self.mock_sat_chall.side_effect = self._sat_failure

        self.assertRaises(errors.LetsEncryptAuthHandlerError,
                          self.handler.get_authorizations)

        # Check to make sure program didn't loop
        self.assertEqual(self.mock_sat_chall.call_count, 1)
    def test_perform_exception_cleanup(self, mock_chall_path):
        """3 Challenge messages... fail perform... clean up."""
        # pylint: disable=protected-access
        self.mock_dv_auth.perform.side_effect = errors.LetsEncryptDvsniError

        challenges = acme_util.get_challenges()
        combos = acme_util.gen_combos(challenges)

        for i in xrange(3):
            self.handler.add_chall_msg(
                str(i),
                messages.Challenge(session_id=str(i),
                                   nonce="nonce%d" % i,
                                   challenges=challenges,
                                   combinations=combos), "dummy_key")

        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, 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
        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
        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 test_incremental_progress(self):
        challs = []
        challs.append(acme_util.get_challenges())
        challs.append(acme_util.get_dv_challenges())
        for i in xrange(2):
            dom = str(i)
            self.handler.add_chall_msg(
                dom,
                messages.Challenge(session_id=dom, nonce="nonce%d" % i,
                                   challenges=challs[i], combinations=[]),
                "dummy_key")

        self.mock_sat_chall.side_effect = self._sat_incremental

        self.handler.get_authorizations()

        self._test_finished()
        self.assertEqual(self.mock_acme_auth.call_args_list,
                         [mock.call("1"), mock.call("0")])
    def test_incremental_progress(self):
        challs = []
        challs.append(acme_util.get_challenges())
        challs.append(acme_util.get_dv_challenges())
        for i in xrange(2):
            dom = str(i)
            self.handler.add_chall_msg(
                dom,
                messages.Challenge(session_id=dom,
                                   nonce="nonce%d" % i,
                                   challenges=challs[i],
                                   combinations=[]), "dummy_key")

        self.mock_sat_chall.side_effect = self._sat_incremental

        self.handler.get_authorizations()

        self._test_finished()
        self.assertEqual(self.mock_acme_auth.call_args_list,
                         [mock.call("1"), mock.call("0")])
    def test_name5_all(self, mock_chall_path):
        challenges = acme_util.get_challenges()
        combos = acme_util.gen_combos(challenges)
        for i in xrange(5):
            self.handler.add_chall_msg(
                str(i),
                messages.Challenge(session_id=str(i),
                                   nonce="nonce%d" % i,
                                   challenges=challenges,
                                   combinations=combos), "dummy_key")

        path = gen_path(["dvsni", "recoveryContact"], challenges)
        mock_chall_path.return_value = path

        self.handler._satisfy_challenges()  # pylint: disable=protected-access

        self.assertEqual(len(self.handler.responses), 5)
        for i in xrange(5):
            self.assertEqual(len(self.handler.responses[str(i)]),
                             len(challenges))
        self.assertEqual(len(self.handler.dv_c), 5)
        self.assertEqual(len(self.handler.client_c), 5)

        for i in xrange(5):
            dom = str(i)
            self.assertEqual(self.handler.responses[dom],
                             self._get_exp_response(dom, path, challenges))
            self.assertEqual(len(self.handler.dv_c[dom]), 1)
            self.assertEqual(len(self.handler.client_c[dom]), 1)

            self.assertTrue(
                isinstance(self.handler.dv_c[dom][0].chall,
                           challenge_util.DvsniChall))
            self.assertTrue(
                isinstance(self.handler.client_c[dom][0].chall,
                           challenge_util.RecContactChall))
    def test_name5_mix(self, mock_chall_path):
        paths = []
        chosen_chall = [["dns"], ["dvsni"],
                        ["simpleHttps", "proofOfPossession"], ["simpleHttps"],
                        ["dns", "recoveryToken"]]
        challenge_list = [
            acme_util.get_dv_challenges(), [acme_util.CHALLENGES["dvsni"]],
            acme_util.get_challenges(),
            acme_util.get_dv_challenges(),
            acme_util.get_challenges()
        ]

        # Combos doesn't matter since I am overriding the gen_path function
        for i in xrange(5):
            dom = str(i)
            paths.append(gen_path(chosen_chall[i], challenge_list[i]))
            self.handler.add_chall_msg(
                dom,
                messages.Challenge(session_id=dom,
                                   nonce="nonce%d" % i,
                                   challenges=challenge_list[i],
                                   combinations=[]), "dummy_key")

        mock_chall_path.side_effect = paths

        self.handler._satisfy_challenges()  # pylint: disable=protected-access

        self.assertEqual(len(self.handler.responses), 5)
        self.assertEqual(len(self.handler.dv_c), 5)
        self.assertEqual(len(self.handler.client_c), 5)

        for i in xrange(5):
            dom = str(i)
            resp = self._get_exp_response(i, paths[i], challenge_list[i])
            self.assertEqual(self.handler.responses[dom], resp)
            self.assertEqual(len(self.handler.dv_c[dom]), 1)
            self.assertEqual(len(self.handler.client_c[dom]),
                             len(chosen_chall[i]) - 1)

        self.assertTrue(
            isinstance(self.handler.dv_c["0"][0].chall,
                       challenge_util.DnsChall))
        self.assertTrue(
            isinstance(self.handler.dv_c["1"][0].chall,
                       challenge_util.DvsniChall))
        self.assertTrue(
            isinstance(self.handler.dv_c["2"][0].chall,
                       challenge_util.SimpleHttpsChall))
        self.assertTrue(
            isinstance(self.handler.dv_c["3"][0].chall,
                       challenge_util.SimpleHttpsChall))
        self.assertTrue(
            isinstance(self.handler.dv_c["4"][0].chall,
                       challenge_util.DnsChall))

        self.assertTrue(
            isinstance(self.handler.client_c["2"][0].chall,
                       challenge_util.PopChall))
        self.assertTrue(
            isinstance(self.handler.client_c["4"][0].chall,
                       challenge_util.RecTokenChall))