summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tests/common.h40
-rw-r--r--src/tests/common_dom.c167
-rw-r--r--src/tests/common_tev.c60
3 files changed, 267 insertions, 0 deletions
diff --git a/src/tests/common.h b/src/tests/common.h
index f13181b7..b7eee46e 100644
--- a/src/tests/common.h
+++ b/src/tests/common.h
@@ -55,4 +55,44 @@ 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);
+
+struct tevent_req *
+test_request_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, errno_t err);
+
+#define test_req_succeed_send(mem_ctx, ev) test_request_send(mem_ctx, ev, 0)
+
+errno_t test_request_recv(struct tevent_req *req);
+
+int test_ev_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 00000000..f8356210
--- /dev/null
+++ b/src/tests/common_dom.c
@@ -0,0 +1,167 @@
+/*
+ Authors:
+ Jakub Hrozek <jhrozek@redhat.com>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <talloc.h>
+#include <errno.h>
+
+#include "tests/common.h"
+
+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);
+}
diff --git a/src/tests/common_tev.c b/src/tests/common_tev.c
new file mode 100644
index 00000000..83ba9fd7
--- /dev/null
+++ b/src/tests/common_tev.c
@@ -0,0 +1,60 @@
+/*
+ Authors:
+ Jakub Hrozek <jhrozek@redhat.com>
+
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+#include <tevent.h>
+#include <talloc.h>
+#include <errno.h>
+
+#include "tests/common.h"
+
+struct tevent_req *
+test_request_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, errno_t err)
+{
+ struct tevent_req *req;
+ int state;
+
+ req = tevent_req_create(mem_ctx, &state, int);
+ if (!req) return NULL;
+
+ if (err == EOK) {
+ tevent_req_done(req);
+ } else {
+ tevent_req_error(req, err);
+ }
+ tevent_req_post(req, ev);
+ return req;
+}
+
+errno_t test_request_recv(struct tevent_req *req)
+{
+ TEVENT_REQ_RETURN_ON_ERROR(req);
+
+ return EOK;
+}
+
+int test_ev_loop(struct sss_test_ctx *tctx)
+{
+ while (!tctx->done)
+ tevent_loop_once(tctx->ev);
+
+ return tctx->error;
+}