01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek/*
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek Copyright (C) 2015 Red Hat
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek SSSD tests: Kerberos wait queue tests
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek This program is free software; you can redistribute it and/or modify
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek it under the terms of the GNU General Public License as published by
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek the Free Software Foundation; either version 3 of the License, or
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek (at your option) any later version.
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek This program is distributed in the hope that it will be useful,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek GNU General Public License for more details.
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek You should have received a copy of the GNU General Public License
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek along with this program. If not, see <http://www.gnu.org/licenses/>.
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek*/
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include <talloc.h>
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include <tevent.h>
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include <errno.h>
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include <popt.h>
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include <stdlib.h>
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include <security/pam_modules.h>
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include "util/util.h"
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include "providers/krb5/krb5_common.h"
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include "providers/krb5/krb5_auth.h"
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include "tests/cmocka/common_mock.h"
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek#include "tests/cmocka/common_mock_be.h"
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstruct krb5_mocked_auth_state {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek const char *user;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek time_t us_delay;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int pam_status;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int dp_err;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek};
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void krb5_mocked_auth_done(struct tevent_context *ev,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_timer *tt,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct timeval tv,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek void *pvt);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstruct tevent_req *krb5_auth_send(TALLOC_CTX *mem_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_context *ev,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct be_ctx *be_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct pam_data *pd,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct krb5_ctx *krb5_ctx)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_req *req;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct krb5_mocked_auth_state *state;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_timer *tt;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct timeval tv;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek req = tevent_req_create(mem_ctx, &state, struct krb5_mocked_auth_state);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (req == NULL) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create failed.\n");
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return NULL;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state->user = sss_mock_ptr_type(const char *);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state->us_delay = sss_mock_type(time_t);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state->ret = sss_mock_type(int);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state->pam_status = sss_mock_type(int);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state->dp_err = sss_mock_type(int);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tv = tevent_timeval_current_ofs(0, state->us_delay);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tt = tevent_add_timer(ev, req, tv, krb5_mocked_auth_done, req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (tt == NULL) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return NULL;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return req;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void krb5_mocked_auth_done(struct tevent_context *ev,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_timer *tt,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct timeval tv,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek void *pvt)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_req *req;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct krb5_mocked_auth_state *state;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek req = talloc_get_type(pvt, struct tevent_req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state = tevent_req_data(req, struct krb5_mocked_auth_state);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek DEBUG(SSSDBG_TRACE_LIBS, "Finished auth request of %s\n", state->user);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (state->ret == 0) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_done(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek } else {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_error(req, state->ret);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekint krb5_auth_recv(struct tevent_req *req,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int *_pam_status,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int *_dp_err)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct krb5_mocked_auth_state *state;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek state = tevent_req_data(req, struct krb5_mocked_auth_state);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (_pam_status != NULL) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek *_pam_status = state->pam_status;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (_dp_err != NULL) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek *_dp_err = state->dp_err;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return EOK;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstruct test_krb5_wait_queue {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct sss_test_ctx *tctx;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int num_auths;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int num_finished_auths;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct be_ctx *be_ctx;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct pam_data *pd;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct krb5_ctx *krb5_ctx;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek};
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic int test_krb5_wait_queue_setup(void **state)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx = talloc_zero(global_talloc_context,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->tctx = create_ev_test_ctx(test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->be_ctx = mock_be_ctx(test_ctx, test_ctx->tctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(test_ctx->be_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->pd = talloc_zero(test_ctx, struct pam_data);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(test_ctx->pd);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->krb5_ctx = talloc_zero(test_ctx, struct krb5_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(test_ctx->krb5_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek *state = test_ctx;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return 0;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic int test_krb5_wait_queue_teardown(void **state)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx =
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_get_type(*state, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_free(test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return 0;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_mock(struct test_krb5_wait_queue *test_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek const char *username,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek time_t us_delay,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int ret,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int pam_status,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int dp_err)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->pd->user = discard_const(username);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek will_return(krb5_auth_send, username);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek will_return(krb5_auth_send, us_delay);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek will_return(krb5_auth_send, ret);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek will_return(krb5_auth_send, pam_status);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek will_return(krb5_auth_send, dp_err);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_mock_success(struct test_krb5_wait_queue *test_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek const char *username)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return test_krb5_wait_mock(test_ctx, username, 200, 0, 0, 0);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_single_done(struct tevent_req *req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_single(void **state)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek errno_t ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_req *req;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx =
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_get_type(*state, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_mock_success(test_ctx, "krb5_user");
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek req = krb5_auth_queue_send(test_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->tctx->ev,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->be_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->pd,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->krb5_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_set_callback(req, test_krb5_wait_queue_single_done, test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = test_ev_loop(test_ctx->tctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_int_equal(ret, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_single_done(struct tevent_req *req)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx = \
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_callback_data(req, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek errno_t ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int pam_status;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int dp_err;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = krb5_auth_queue_recv(req, &pam_status, &dp_err);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_free(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_int_equal(ret, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ev_done(test_ctx->tctx, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_multi_done(struct tevent_req *req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_multi(void **state)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int i;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek errno_t ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_req *req;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx =
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_get_type(*state, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->num_auths = 1000;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek for (i=0; i < test_ctx->num_auths; i++) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_mock_success(test_ctx, "krb5_user");
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek req = krb5_auth_queue_send(test_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->tctx->ev,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->be_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->pd,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->krb5_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_set_callback(req, test_krb5_wait_queue_multi_done, test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = test_ev_loop(test_ctx->tctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_int_equal(ret, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_multi_done(struct tevent_req *req)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx = \
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_callback_data(req, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek errno_t ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int pam_status;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int dp_err;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = krb5_auth_queue_recv(req, &pam_status, &dp_err);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_free(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_int_equal(ret, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->num_finished_auths++;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (test_ctx->num_finished_auths == test_ctx->num_auths) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ev_done(test_ctx->tctx, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_fail_odd_done(struct tevent_req *req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_fail_odd(void **state)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int i;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek errno_t ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct tevent_req *req;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx =
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_get_type(*state, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->num_auths = 10;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek for (i=0; i < test_ctx->num_auths; i++) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_mock(test_ctx, "krb5_user", 0, i+1 % 2, PAM_SUCCESS, 0);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek req = krb5_auth_queue_send(test_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->tctx->ev,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->be_ctx,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->pd,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->krb5_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_non_null(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_set_callback(req, test_krb5_wait_queue_fail_odd_done, test_ctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = test_ev_loop(test_ctx->tctx);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_int_equal(ret, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekstatic void test_krb5_wait_queue_fail_odd_done(struct tevent_req *req)
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct test_krb5_wait_queue *test_ctx = \
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tevent_req_callback_data(req, struct test_krb5_wait_queue);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek errno_t ret;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int pam_status;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int dp_err;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek ret = krb5_auth_queue_recv(req, &pam_status, &dp_err);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek talloc_free(req);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek assert_int_equal(ret, test_ctx->num_finished_auths+1 % 2);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ctx->num_finished_auths++;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek if (test_ctx->num_finished_auths == test_ctx->num_auths) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_ev_done(test_ctx->tctx, EOK);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozekint main(int argc, const char *argv[])
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek{
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek poptContext pc;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek int opt;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek struct poptOption long_options[] = {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek POPT_AUTOHELP
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek SSSD_DEBUG_OPTS
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek POPT_TABLEEND
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek };
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek const struct CMUnitTest tests[] = {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek /* Run a single auth request */
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek cmocka_unit_test_setup_teardown(test_krb5_wait_queue_single,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_queue_setup,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_queue_teardown),
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek /* Run multiple auth requests */
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek cmocka_unit_test_setup_teardown(test_krb5_wait_queue_multi,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_queue_setup,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_queue_teardown),
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek /* Make sure that all requests in queue run even if some fail */
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek cmocka_unit_test_setup_teardown(test_krb5_wait_queue_fail_odd,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_queue_setup,
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek test_krb5_wait_queue_teardown),
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek };
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek /* Set debug level to invalid value so we can deside if -d 0 was used. */
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek debug_level = SSSDBG_INVALID;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek pc = poptGetContext(argv[0], argc, argv, long_options, 0);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek while((opt = poptGetNextOpt(pc)) != -1) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek switch(opt) {
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek default:
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek fprintf(stderr, "\nInvalid option %s: %s\n\n",
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek poptBadOption(pc, 0), poptStrerror(opt));
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek poptPrintUsage(pc, stderr, 0);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return 1;
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek }
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek poptFreeContext(pc);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek DEBUG_CLI_INIT(debug_level);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek /* Even though normally the tests should clean up after themselves
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek * they might not after a failed run. Remove the old db to be sure */
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek tests_set_cwd();
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek return cmocka_run_group_tests(tests, NULL, NULL);
01ec08efd0e166ac6f390f8627c6d08dcc63ccc4Jakub Hrozek}