>From 4c038e3bca18a0021edc0dd4506d5c709d80caa5 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Tue, 12 Feb 2013 13:18:00 +0100 Subject: [PATCH 2/4] Add utility functions for tests --- src/tests/common.h | 37 +++++++++ src/tests/common_dom.c | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+) create mode 100644 src/tests/common_dom.c diff --git a/src/tests/common.h b/src/tests/common.h index f13181b751fef517f609c6208977cc82a825014e..0c663eb457877306dd048046692a344d93f65415 100644 --- a/src/tests/common.h +++ b/src/tests/common.h @@ -47,6 +47,11 @@ void leak_check_teardown(void); void tests_set_cwd(void); +struct tevent_req *mock_request_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev); + +errno_t mock_request_recv(struct tevent_req *req); + + errno_t compare_dp_options(struct dp_option *map1, size_t size1, struct dp_option *map2); @@ -55,4 +60,36 @@ errno_t compare_sdap_attr_maps(struct sdap_attr_map *map1, size_t size1, struct sdap_attr_map *map2); +/* A common test structure for tests that require a domain to be set up. */ +struct sss_test_ctx { + struct sysdb_ctx *sysdb; + struct confdb_ctx *confdb; + struct tevent_context *ev; + struct sss_domain_info *dom; + + bool done; + int error; +}; + +struct sss_test_conf_param { + const char *key; + const char *value; +}; + +struct sss_test_ctx * +create_dom_test_ctx(TALLOC_CTX *mem_ctx, + const char *tests_path, + const char *confdb_path, + const char *sysdb_path, + const char *domain_name, + const char *id_provider, + struct sss_test_conf_param *params); + +void test_dom_suite_setup(const char *tests_path); + +void test_dom_suite_cleanup(const char *tests_path, + const char *confdb_path, + const char *sysdb_path); + +int test_dom_loop(struct sss_test_ctx *tctx); #endif /* !__TESTS_COMMON_H__ */ diff --git a/src/tests/common_dom.c b/src/tests/common_dom.c new file mode 100644 index 0000000000000000000000000000000000000000..a55072c34da6aa31fd28ed83ac99aa5078611add --- /dev/null +++ b/src/tests/common_dom.c @@ -0,0 +1,199 @@ +/* + Authors: + Jakub Hrozek + + Copyright (C) 2013 Red Hat + + SSSD tests: Common utilities for tests that exercise domains + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include + +#include "tests/common.h" +#include "util/util.h" + +struct tevent_req * +mock_request_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev) +{ + struct tevent_req *req; + int state; + + req = tevent_req_create(mem_ctx, &state, int); + if (!req) return NULL; + + tevent_req_done(req); + tevent_req_post(req, ev); + return req; +} + +errno_t mock_request_recv(struct tevent_req *req) +{ + TEVENT_REQ_RETURN_ON_ERROR(req); + + return EOK; +} + +struct sss_test_ctx * +create_dom_test_ctx(TALLOC_CTX *mem_ctx, + const char *tests_path, + const char *confdb_path, + const char *sysdb_path, + const char *domain_name, + const char *id_provider, + struct sss_test_conf_param *params) +{ + struct sss_test_ctx *test_ctx; + char *conf_db; + size_t i; + const char *val[2]; + val[1] = NULL; + errno_t ret; + char *dompath; + + test_ctx = talloc_zero(mem_ctx, struct sss_test_ctx); + if (test_ctx == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_zero failed\n")); + goto fail; + } + + /* Create an event context */ + test_ctx->ev = tevent_context_init(test_ctx); + if (test_ctx->ev == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("tevent_context_init failed\n")); + goto fail; + } + + conf_db = talloc_asprintf(test_ctx, "%s/%s", tests_path, confdb_path); + if (conf_db == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_asprintf failed\n")); + goto fail; + } + + /* Connect to the conf db */ + ret = confdb_init(test_ctx, &test_ctx->confdb, conf_db); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, ("confdb_init failed: %d\n", ret)); + goto fail; + } + + val[0] = domain_name; + ret = confdb_add_param(test_ctx->confdb, true, + "config/sssd", "domains", val); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, ("cannot add domain: %d\n", ret)); + goto fail; + } + + dompath = talloc_asprintf(test_ctx, "config/domain/%s", domain_name); + if (dompath == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("talloc_asprintf failed\n")); + goto fail; + } + + val[0] = id_provider; + ret = confdb_add_param(test_ctx->confdb, true, + dompath, "id_provider", val); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, ("cannot add id_provider: %d\n", ret)); + goto fail; + } + + if (params) { + for (i=0; params[i].key; i++) { + val[0] = params[i].key; + ret = confdb_add_param(test_ctx->confdb, true, + dompath, params[i].value, val); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("cannot add parameter %s: %d\n", params[i].key, ret)); + goto fail; + } + } + } + + ret = sssd_domain_init(test_ctx, test_ctx->confdb, domain_name, + tests_path, &test_ctx->dom); + if (ret != EOK) { + DEBUG(SSSDBG_CRIT_FAILURE, ("cannot add id_provider: %d\n", ret)); + goto fail; + } + test_ctx->sysdb = test_ctx->dom->sysdb; + + return test_ctx; + +fail: + talloc_free(test_ctx); + return NULL; +} + +void test_dom_suite_setup(const char *tests_path) +{ + errno_t ret; + + /* Create tests directory if it doesn't exist */ + /* (relative to current dir) */ + ret = mkdir(tests_path, 0775); + if (ret != 0 && errno != EEXIST) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Could not create test directory\n")); + } +} + +void test_dom_suite_cleanup(const char *tests_path, + const char *confdb_path, + const char *sysdb_path) +{ + errno_t ret; + char *conf_db; + char *sys_db; + + conf_db = talloc_asprintf(NULL, "%s/%s", tests_path, confdb_path); + sys_db = talloc_asprintf(NULL, "%s/%s", tests_path, sysdb_path); + if (!conf_db || !sys_db) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Could not construct db paths\n")); + } + + errno = 0; + ret = unlink(conf_db); + if (ret != 0 && errno != ENOENT) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Could not delete the test config ldb file (%d) (%s)\n", + errno, strerror(errno))); + } + + errno = 0; + ret = unlink(sys_db); + if (ret != 0 && errno != ENOENT) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Could not delete the test ldb file (%d) (%s)\n", + errno, strerror(errno))); + } + + talloc_free(conf_db); + talloc_free(sys_db); +} + +int test_dom_loop(struct sss_test_ctx *tctx) +{ + while (!tctx->done) + tevent_loop_once(tctx->ev); + + return tctx->error; +} + -- 1.8.1.2