summaryrefslogtreecommitdiffstats
path: root/src/tests
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2014-12-01 12:25:24 +0100
committerJakub Hrozek <jhrozek@redhat.com>2014-12-03 11:02:41 +0100
commitb4f87b42b18888c396e44e7359f7aafb092221bf (patch)
tree0a59730a50e310e7d5cc8aaaa6b8adc06841065f /src/tests
parente00c2b5ac4963de9521599c88597b7fb97339d0e (diff)
downloadsssd-b4f87b42b18888c396e44e7359f7aafb092221bf.tar.gz
sssd-b4f87b42b18888c396e44e7359f7aafb092221bf.tar.xz
sssd-b4f87b42b18888c396e44e7359f7aafb092221bf.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.c31
-rw-r--r--src/tests/cmocka/test_child_common.c47
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. */