diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2014-10-03 16:12:01 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2014-10-20 21:43:56 +0200 |
commit | 2689efa614826d45cab60ea1186d44b8bdd243ad (patch) | |
tree | cea846048597cf64cf8a40b3c37662ab07969761 /src/tests/cwrap | |
parent | 940c94bc9a29165987cb9d3f71c4a4ec76e7a1fc (diff) | |
download | sssd-2689efa614826d45cab60ea1186d44b8bdd243ad.tar.gz sssd-2689efa614826d45cab60ea1186d44b8bdd243ad.tar.xz sssd-2689efa614826d45cab60ea1186d44b8bdd243ad.zip |
TESTS: Unit tests for server_setup
We changed server_setup, so we must make sure the function continues to
work as expected.
Reviewed-by: Pavel Reichl <preichl@redhat.com>
Diffstat (limited to 'src/tests/cwrap')
-rw-r--r-- | src/tests/cwrap/Makefile.am | 63 | ||||
-rw-r--r-- | src/tests/cwrap/test_server.c | 204 |
2 files changed, 266 insertions, 1 deletions
diff --git a/src/tests/cwrap/Makefile.am b/src/tests/cwrap/Makefile.am index 96b9a5243..28d60e7f5 100644 --- a/src/tests/cwrap/Makefile.am +++ b/src/tests/cwrap/Makefile.am @@ -3,7 +3,10 @@ AM_CPPFLAGS = \ -Wall \ -I$(top_srcdir)/src \ -I. \ + -DLOCALEDIR=\"$(localedir)\" \ + -DVARDIR=\"$(localstatedir)\" \ $(DBUS_CFLAGS) \ + $(GLIB2_CFLAGS) \ $(NULL) TESTS_ENVIRONMENT = \ @@ -16,6 +19,20 @@ dist_noinst_SCRIPTS = \ cwrap_test_setup.sh \ $(NULL) +SSSD_LIBS = \ + $(TALLOC_LIBS) \ + $(TEVENT_LIBS) \ + $(POPT_LIBS) \ + $(LDB_LIBS) \ + $(DBUS_LIBS) \ + $(PCRE_LIBS) \ + $(INI_CONFIG_LIBS) \ + $(COLLECTION_LIBS) \ + $(DHASH_LIBS) \ + $(SSS_CRYPT_LIBS) \ + $(OPENLDAP_LIBS) \ + $(TDB_LIBS) + dist_noinst_DATA = \ group \ passwd \ @@ -25,7 +42,10 @@ check_PROGRAMS = if HAVE_CMOCKA if HAVE_NSS_WRAPPER if HAVE_UID_WRAPPER -check_PROGRAMS += become_user-tests +check_PROGRAMS = \ + become_user-tests \ + server-tests \ + $(NULL) endif # HAVE_UID_WRAPPER endif # HAVE_NSS_WRAPPER endif # HAVE_CMOCKA @@ -45,4 +65,45 @@ become_user_tests_LDADD = \ $(abs_top_builddir)/libsss_test_common.la \ $(NULL) +server_tests_SOURCES = \ + test_server.c \ + ../../../src/util/server.c \ + ../../../src/util/become_user.c \ + ../../../src/util/backup_file.c \ + ../../../src/util/domain_info_utils.c \ + ../../../src/util/atomic_io.c \ + ../../../src/util/signal.c \ + ../../../src/util/util.c \ + ../../../src/util/strtonum.c \ + ../../../src/util/util_errors.c \ + ../../../src/util/safe-format-string.c \ + ../../../src/util/sss_tc_utf8.c \ + ../../../src/util/sss_utf8.c \ + ../../../src/util/usertools.c \ + ../../../src/confdb/confdb.c \ + ../../../src/db/sysdb.c \ + ../../../src/db/sysdb_upgrade.c \ + ../../../src/db/sysdb_ops.c \ + ../../../src/db/sysdb_search.c \ + ../../../src/db/sysdb_autofs.c \ + ../../../src/db/sysdb_services.c \ + ../../../src/db/sysdb_views.c \ + $(NULL) +server_tests_CFLAGS = \ + $(AM_CFLAGS) \ + $(LIBCAPNG_CFLAGS) \ + -DTEST_DB_PATH=\"server_tests\" \ + -DTEST_PID_PATH=\"server_tests\" \ + -DUNIT_TESTING \ + $(NULL) +server_tests_LDADD = \ + $(CMOCKA_LIBS) \ + $(LIBCAPNG_LIBS) \ + $(UNICODE_LIBS) \ + $(SSSD_LIBS) \ + $(abs_top_builddir)/libsss_debug.la \ + $(abs_top_builddir)/libsss_crypt.la \ + $(abs_top_builddir)/libsss_test_common.la \ + $(NULL) + tests: $(check_PROGRAMS) diff --git a/src/tests/cwrap/test_server.c b/src/tests/cwrap/test_server.c new file mode 100644 index 000000000..26ecfee1e --- /dev/null +++ b/src/tests/cwrap/test_server.c @@ -0,0 +1,204 @@ +/* + Authors: + Jakub Hrozek <jhrozek@redhat.com> + + Copyright (C) 2014 Red Hat + + SSSD tests: Server instantiation + + 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 <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include <popt.h> +#include "util/util.h" +#include "tests/cmocka/common_mock.h" + +static void wait_for_fg_server(pid_t pid) +{ + pid_t wpid; + int status; + + assert_int_not_equal(pid, -1); + + wpid = waitpid(pid, &status, 0); + assert_int_equal(wpid, pid); + assert_true(WIFEXITED(status)); + assert_int_equal(WEXITSTATUS(status), 0); +} + +static void wait_for_bg_server(const char *pidfile) +{ + int fd; + long tmp; + char buf[16]; + pid_t pid; + int ret; + int count; + + count = 0; + do { + struct stat sb; + + count++; + if (count > 100) { + break; + } + + ret = stat(pidfile, &sb); + usleep(50); + } while (ret != 0); + + /* read the pidfile */ + fd = open(pidfile, O_RDONLY); + assert_false(fd < 0); + + ret = read(fd, buf, sizeof(buf)); + close(fd); + assert_false(ret <= 0); + + buf[sizeof(buf) - 1] = '\0'; + + tmp = strtol(buf, NULL, 10); + assert_false(tmp == 0 || tmp > 0xFFFF || errno == ERANGE); + + pid = (pid_t) (tmp & 0xFFFF); + + /* Make sure the daemon goes away! */ + ret = kill(pid, SIGTERM); + fprintf(stderr, "killing %u\n", pid); + assert_true(ret == 0); + + unlink(pidfile); +} + +void test_run_as_root_fg(void **state) +{ + int ret; + struct main_context *main_ctx; + pid_t pid; + + /* Must root as root, real or fake */ + assert_int_equal(geteuid(), 0); + + pid = fork(); + if (pid == 0) { + ret = server_setup(__FUNCTION__, 0, 0, 0, + __FUNCTION__, &main_ctx); + assert_int_equal(ret, 0); + exit(0); + } + wait_for_fg_server(pid); +} + +void test_run_as_sssd_fg(void **state) +{ + int ret; + struct main_context *main_ctx; + struct passwd *sssd; + pid_t pid; + + /* Must root as root, real or fake */ + assert_int_equal(geteuid(), 0); + + sssd = getpwnam("sssd"); + assert_non_null(sssd); + + pid = fork(); + if (pid == 0) { + ret = server_setup(__FUNCTION__, 0, sssd->pw_uid, sssd->pw_gid, + __FUNCTION__, &main_ctx); + assert_int_equal(ret, 0); + exit(0); + } + wait_for_fg_server(pid); +} + +void test_run_as_root_daemon(void **state) +{ + int ret; + struct main_context *main_ctx; + pid_t pid; + char *pidfile; + + /* Must root as root, real or fake */ + assert_int_equal(geteuid(), 0); + + pidfile = talloc_asprintf(NULL, "%s/%s.pid", TEST_PID_PATH, __FUNCTION__); + + /* Make sure there are no leftovers */ + unlink(pidfile); + + pid = fork(); + if (pid == 0) { + ret = server_setup(__FUNCTION__, FLAGS_PID_FILE, + 0, 0, __FUNCTION__, &main_ctx); + assert_int_equal(ret, 0); + + server_loop(main_ctx); + exit(0); + } + + wait_for_bg_server(pidfile); + talloc_free(pidfile); +} + +int main(int argc, const char *argv[]) +{ + poptContext pc; + int opt; + int rv; + struct poptOption long_options[] = { + POPT_AUTOHELP + SSSD_DEBUG_OPTS + POPT_TABLEEND + }; + + const UnitTest tests[] = { + unit_test(test_run_as_root_fg), + unit_test(test_run_as_sssd_fg), + unit_test(test_run_as_root_daemon), + }; + + /* Set debug level to invalid value so we can deside if -d 0 was used. */ + debug_level = SSSDBG_INVALID; + + pc = poptGetContext(argv[0], argc, argv, long_options, 0); + while((opt = poptGetNextOpt(pc)) != -1) { + switch(opt) { + default: + fprintf(stderr, "\nInvalid option %s: %s\n\n", + poptBadOption(pc, 0), poptStrerror(opt)); + poptPrintUsage(pc, stderr, 0); + return 1; + } + } + poptFreeContext(pc); + + DEBUG_CLI_INIT(debug_level); + + /* Even though normally the tests should clean up after themselves + * they might not after a failed run. Remove the old db to be sure */ + tests_set_cwd(); + test_dom_suite_cleanup(TEST_DB_PATH, CONFDB_FILE, NULL); + test_dom_suite_setup(TEST_DB_PATH); + + rv = run_tests(tests); + test_dom_suite_cleanup(TEST_DB_PATH, CONFDB_FILE, NULL); + + return rv; +} |