>From 8141a31dd41d1e370edda8f42ec51254690e9180 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Fri, 3 Oct 2014 16:12:01 +0200 Subject: [PATCH 4/4] TESTS: Unit tests for server_setup We changed server_setup, so we must make sure the function continues to work as expected. --- src/tests/cwrap/Makefile.am | 62 ++++++++++++- src/tests/cwrap/test_server.c | 208 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 269 insertions(+), 1 deletion(-) create mode 100644 src/tests/cwrap/test_server.c diff --git a/src/tests/cwrap/Makefile.am b/src/tests/cwrap/Makefile.am index 34aec92c197a60c47067c72df9c8f3644e1a3c45..8aa47125171304372923d931013730267509ce6a 100644 --- a/src/tests/cwrap/Makefile.am +++ b/src/tests/cwrap/Makefile.am @@ -2,7 +2,10 @@ AM_CPPFLAGS = \ -Wall \ -I$(top_srcdir)/src \ -I. \ + -DLOCALEDIR=\"$(localedir)\" \ + -DVARDIR=\"$(localstatedir)\" \ $(DBUS_CFLAGS) \ + $(GLIB2_CFLAGS) \ $(NULL) TESTS_ENVIRONMENT = \ @@ -15,6 +18,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 \ @@ -24,7 +41,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 @@ -44,4 +64,44 @@ 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 \ + $(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 0000000000000000000000000000000000000000..06e6b587230e3763f6f4e510d4d2fbb3048c13e0 --- /dev/null +++ b/src/tests/cwrap/test_server.c @@ -0,0 +1,208 @@ +/* + Authors: + Jakub Hrozek + + 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 . +*/ + +#include +#include +#include + +#include +#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; + struct passwd *sssd; + pid_t pid; + char *pidfile; + + /* Must root as root, real or fake */ + assert_int_equal(geteuid(), 0); + + sssd = getpwnam("sssd"); + assert_non_null(sssd); + + 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; +} -- 1.9.3