diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2014-12-01 12:25:24 +0100 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2014-12-03 14:28:21 +0100 |
commit | 6468d9f2bb30147967a724075c504afb3481d465 (patch) | |
tree | 21239cd12f04617364b30ba932e1a0b6c1fd0b8c /src/tests | |
parent | 9d501b05b47a63e29c586c6dd3d40ac615a98886 (diff) | |
download | sssd-6468d9f2bb30147967a724075c504afb3481d465.tar.gz sssd-6468d9f2bb30147967a724075c504afb3481d465.tar.xz sssd-6468d9f2bb30147967a724075c504afb3481d465.zip |
Add extra_args to exec_child()
Related:
https://fedorahosted.org/sssd/ticket/2503
Currently all child processes use the same arguments, the construction
of argv[] is even hardcoded in exec_child(). Add an extra_args[] array
that extends the common set of argvs so that we can have child-specific
arguments. Also adds a unit test.
Reviewed-by: Sumit Bose <sbose@redhat.com>
Diffstat (limited to 'src/tests')
-rw-r--r-- | src/tests/cmocka/test_child.c | 31 | ||||
-rw-r--r-- | src/tests/cmocka/test_child_common.c | 47 |
2 files changed, 63 insertions, 15 deletions
diff --git a/src/tests/cmocka/test_child.c b/src/tests/cmocka/test_child.c index a857afce1..0bb50a4e0 100644 --- a/src/tests/cmocka/test_child.c +++ b/src/tests/cmocka/test_child.c @@ -35,13 +35,9 @@ int main(int argc, const char *argv[]) int opt; int debug_fd = -1; poptContext pc; - const char *action; - ssize_t len = 0; - ssize_t written; - errno_t ret; - uint8_t *buf[IN_BUF_SIZE]; - uid_t uid; - gid_t gid; + const char *action = NULL; + const char *guitar; + const char *drums; struct poptOption long_options[] = { POPT_AUTOHELP @@ -54,8 +50,9 @@ int main(int argc, const char *argv[]) {"debug-fd", 0, POPT_ARG_INT, &debug_fd, 0, _("An open file descriptor for the debug logs"), NULL}, {"debug-to-stderr", 0, POPT_ARG_NONE | POPT_ARGFLAG_DOC_HIDDEN, &debug_to_stderr, 0, \ - _("Send the debug output to stderr directly."), NULL }, \ - SSSD_SERVER_OPTS(uid, gid) + _("Send the debug output to stderr directly."), NULL }, + {"guitar", 0, POPT_ARG_STRING, &guitar, 0, _("Who plays guitar"), NULL }, + {"drums", 0, POPT_ARG_STRING, &drums, 0, _("Who plays drums"), NULL }, POPT_TABLEEND }; @@ -73,11 +70,17 @@ int main(int argc, const char *argv[]) } } - DEBUG(SSSDBG_TRACE_FUNC, "test_child completed successfully\n"); - _exit(0); + action = getenv("TEST_CHILD_ACTION"); + if (action) { + if (strcasecmp(action, "check_extra_args") == 0) { + if (!(strcmp(guitar, "george") == 0 \ + && strcmp(drums, "ringo") == 0)) { + DEBUG(SSSDBG_CRIT_FAILURE, "This band sounds weird\n"); + _exit(1); + } + } + } -fail: DEBUG(SSSDBG_TRACE_FUNC, "test_child completed successfully\n"); - close(STDOUT_FILENO); - _exit(-1); + _exit(0); } diff --git a/src/tests/cmocka/test_child_common.c b/src/tests/cmocka/test_child_common.c index f2cd8c008..112ed0ad9 100644 --- a/src/tests/cmocka/test_child_common.c +++ b/src/tests/cmocka/test_child_common.c @@ -89,7 +89,49 @@ void test_exec_child(void **state) ret = exec_child(child_tctx, child_tctx->pipefd_to_child, child_tctx->pipefd_from_child, - CHILD_DIR"/"TEST_BIN, 2); + CHILD_DIR"/"TEST_BIN, 2, NULL); + assert_int_equal(ret, EOK); + } else { + do { + errno = 0; + ret = waitpid(child_pid, &status, 0); + } while (ret == -1 && errno == EINTR); + + if (ret > 0) { + ret = EIO; + if (WIFEXITED(status)) { + ret = WEXITSTATUS(status); + assert_int_equal(ret, 0); + } + } else { + DEBUG(SSSDBG_FUNC_DATA, + "Failed to wait for children %d\n", child_pid); + ret = EIO; + } + } +} + +/* Just make sure the exec works. The child does nothing but exits */ +void test_exec_child_extra_args(void **state) +{ + errno_t ret; + pid_t child_pid; + int status; + struct child_test_ctx *child_tctx = talloc_get_type(*state, + struct child_test_ctx); + const char *extra_args[] = { "--guitar=george", + "--drums=ringo", + NULL }; + + setenv("TEST_CHILD_ACTION", "check_extra_args", 1); + + child_pid = fork(); + assert_int_not_equal(child_pid, -1); + if (child_pid == 0) { + ret = exec_child(child_tctx, + child_tctx->pipefd_to_child, + child_tctx->pipefd_from_child, + CHILD_DIR"/"TEST_BIN, 2, extra_args); assert_int_equal(ret, EOK); } else { do { @@ -126,6 +168,9 @@ int main(int argc, const char *argv[]) unit_test_setup_teardown(test_exec_child, child_test_setup, child_test_teardown), + unit_test_setup_teardown(test_exec_child_extra_args, + child_test_setup, + child_test_teardown), }; /* Set debug level to invalid value so we can deside if -d 0 was used. */ |