summaryrefslogtreecommitdiffstats
path: root/src/tests/cwrap/test_responder_common.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 05:31:45 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 05:31:45 +0000
commit74aa0bc6779af38018a03fd2cf4419fe85917904 (patch)
tree9cb0681aac9a94a49c153d5823e7a55d1513d91f /src/tests/cwrap/test_responder_common.c
parentInitial commit. (diff)
downloadsssd-74aa0bc6779af38018a03fd2cf4419fe85917904.tar.xz
sssd-74aa0bc6779af38018a03fd2cf4419fe85917904.zip
Adding upstream version 2.9.4.upstream/2.9.4
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/tests/cwrap/test_responder_common.c')
-rw-r--r--src/tests/cwrap/test_responder_common.c237
1 files changed, 237 insertions, 0 deletions
diff --git a/src/tests/cwrap/test_responder_common.c b/src/tests/cwrap/test_responder_common.c
new file mode 100644
index 0000000..5b825b3
--- /dev/null
+++ b/src/tests/cwrap/test_responder_common.c
@@ -0,0 +1,237 @@
+/*
+ Authors:
+ Jakub Hrozek <jhrozek@redhat.com>
+
+ Copyright (C) 2014 Red Hat
+
+ SSSD tests: User utilities
+
+ 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 <talloc.h>
+
+#include <popt.h>
+#include "util/util.h"
+#include "responder/common/responder.h"
+#include "tests/cmocka/common_mock.h"
+
+/* Just to satisfy dependencies */
+struct cli_protocol_version *register_cli_protocol_version(void)
+{
+ static struct cli_protocol_version responder_test_cli_protocol_version[] = {
+ {0, NULL, NULL}
+ };
+
+ return responder_test_cli_protocol_version;
+}
+
+void test_uid_csv_to_uid_list(void **state)
+{
+ TALLOC_CTX *tmp_ctx;
+ errno_t ret;
+ size_t count;
+ uid_t *list;
+
+ tmp_ctx = talloc_new(global_talloc_context);
+ assert_non_null(tmp_ctx);
+
+ check_leaks_push(tmp_ctx);
+
+ ret = csv_string_to_uid_array(tmp_ctx, "1, 2, 3", &count, &list);
+ assert_int_equal(ret, EOK);
+ assert_int_equal(count, 3);
+ assert_int_equal(list[0], 1);
+ assert_int_equal(list[1], 2);
+ assert_int_equal(list[2], 3);
+
+ talloc_free(list);
+ assert_true(check_leaks_pop(tmp_ctx));
+ talloc_free(tmp_ctx);
+}
+
+void test_name_csv_to_uid_list(void **state)
+{
+ TALLOC_CTX *tmp_ctx;
+ errno_t ret;
+ size_t count;
+ uid_t *list;
+
+ tmp_ctx = talloc_new(global_talloc_context);
+ assert_non_null(tmp_ctx);
+
+ check_leaks_push(tmp_ctx);
+
+ ret = csv_string_to_uid_array(tmp_ctx, "sssd, foobar", &count, &list);
+ assert_int_equal(ret, EOK);
+ assert_int_equal(count, 2);
+ assert_int_equal(list[0], 123);
+ assert_int_equal(list[1], 10001);
+
+ talloc_free(list);
+ assert_true(check_leaks_pop(tmp_ctx));
+ talloc_free(tmp_ctx);
+}
+
+void test_csv_to_uid_list_neg(void **state)
+{
+ TALLOC_CTX *tmp_ctx;
+ errno_t ret;
+ size_t count;
+ uid_t *list = NULL;
+
+ tmp_ctx = talloc_new(global_talloc_context);
+ assert_non_null(tmp_ctx);
+
+ check_leaks_push(tmp_ctx);
+
+ ret = csv_string_to_uid_array(tmp_ctx, "nosuchuser", &count, &list);
+ assert_int_not_equal(ret, EOK);
+
+ assert_true(check_leaks_pop(tmp_ctx));
+ talloc_free(tmp_ctx);
+}
+
+struct create_pipe_ctx {
+ int fd;
+ const char *sock_name;
+};
+
+static int test_create_pipe_fd_setup(void **state)
+{
+ struct create_pipe_ctx *ctx;
+
+ ctx = talloc(global_talloc_context, struct create_pipe_ctx);
+ assert_non_null(ctx);
+ ctx->fd = -1;
+
+ *state = ctx;
+ return 0;
+}
+
+void check_sock_properties(struct create_pipe_ctx *ctx, mode_t mode)
+{
+ int ret;
+ int optval;
+ socklen_t optlen;
+ struct stat sbuf;
+
+ /* Check existence of the file and the permissions */
+ ret = stat(ctx->sock_name, &sbuf);
+ assert_int_equal(ret, 0);
+ assert_true(S_ISSOCK(sbuf.st_mode));
+ assert_true((sbuf.st_mode & ~S_IFMT) == mode);
+
+ /* Check it's a UNIX socket */
+ optlen = sizeof(optval);
+ ret = getsockopt(ctx->fd, SOL_SOCKET, SO_DOMAIN, &optval, &optlen);
+ assert_int_equal(ret, 0);
+ assert_int_equal(optval, AF_UNIX);
+
+ optlen = sizeof(optval);
+ ret = getsockopt(ctx->fd, SOL_SOCKET, SO_TYPE, &optval, &optlen);
+ assert_int_equal(ret, 0);
+ assert_int_equal(optval, SOCK_STREAM);
+
+ /* Make sure this is a listening socket */
+ optlen = sizeof(optval);
+ ret = getsockopt(ctx->fd, SOL_SOCKET, SO_ACCEPTCONN, &optval, &optlen);
+ assert_int_equal(ret, 0);
+ assert_int_equal(optval, 1);
+
+ /* Check the right protocol */
+ optlen = sizeof(optval);
+ ret = getsockopt(ctx->fd, SOL_SOCKET, SO_PROTOCOL, &optval, &optlen);
+ assert_int_equal(ret, 0);
+ assert_int_equal(optval, 0);
+
+}
+
+void test_create_pipe_fd(void **state)
+{
+ int ret;
+ struct create_pipe_ctx *ctx;
+
+ ctx = talloc_get_type(*state, struct create_pipe_ctx);
+
+ ctx->sock_name = __FUNCTION__;
+
+ ret = create_pipe_fd(ctx->sock_name, &ctx->fd, 0111);
+ assert_int_equal(ret, EOK);
+ assert_int_not_equal(ctx->fd, -1);
+ check_sock_properties(ctx, 0666);
+
+ /* Make sure we can overwrite an existing socket */
+ ret = create_pipe_fd(ctx->sock_name, &ctx->fd, 0000);
+ assert_int_equal(ret, EOK);
+ assert_int_not_equal(ctx->fd, -1);
+ check_sock_properties(ctx, 0777);
+}
+
+static int test_create_pipe_fd_teardown(void **state)
+{
+ struct create_pipe_ctx *ctx;
+
+ ctx = talloc_get_type(*state, struct create_pipe_ctx);
+
+ if (ctx->fd != -1) {
+ unlink(ctx->sock_name);
+ close(ctx->fd);
+ }
+ return 0;
+}
+
+int main(int argc, const char *argv[])
+{
+ poptContext pc;
+ int opt;
+ struct poptOption long_options[] = {
+ POPT_AUTOHELP
+ SSSD_DEBUG_OPTS
+ POPT_TABLEEND
+ };
+
+ const struct CMUnitTest tests[] = {
+ cmocka_unit_test(test_uid_csv_to_uid_list),
+ cmocka_unit_test(test_name_csv_to_uid_list),
+ cmocka_unit_test(test_csv_to_uid_list_neg),
+ cmocka_unit_test_setup_teardown(test_create_pipe_fd,
+ test_create_pipe_fd_setup,
+ test_create_pipe_fd_teardown)
+ };
+
+ /* Set debug level to invalid value so we can decide 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);
+
+ tests_set_cwd();
+
+ return cmocka_run_group_tests(tests, NULL, NULL);
+}