util-tests.c revision 2aa96da5f3a9485d598e345e183a59a4b8e80abb
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen/*
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen SSSD
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen util-tests.c
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen Authors:
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen Stephen Gallagher <sgallagh@redhat.com>
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen Copyright (C) 2010 Red Hat
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen This program is free software; you can redistribute it and/or modify
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen it under the terms of the GNU General Public License as published by
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen the Free Software Foundation; either version 3 of the License, or
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen (at your option) any later version.
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen This program is distributed in the hope that it will be useful,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen GNU General Public License for more details.
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen You should have received a copy of the GNU General Public License
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen*/
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include <popt.h>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include <talloc.h>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include <check.h>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include <sys/types.h>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include <sys/stat.h>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include <fcntl.h>
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include "util/util.h"
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainen#include "util/sss_utf8.h"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen#include "util/murmurhash3.h"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen#include "tests/common_check.h"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen#define FILENAME_TEMPLATE "tests-atomicio-XXXXXX"
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenchar *filename;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainenint atio_fd;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenSTART_TEST(test_add_string_to_list)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen{
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen int ret;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **list = NULL;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ret = add_string_to_list(NULL, NULL, NULL);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EINVAL, "NULL input accepted");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ret = add_string_to_list(global_talloc_context, "ABC", &list);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EOK, "Adding string to non-existing list failed.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list != NULL, "No new list created.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list[0] != NULL, "String not added to new list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(list[0], "ABC") == 0,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "Wrong string added to newly created list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list[1] == NULL,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "Missing terminating NULL in newly created list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ret = add_string_to_list(global_talloc_context, "DEF", &list);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EOK, "Adding string to list failed.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list != NULL, "No list returned.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(list[0], "ABC") == 0, "Wrong first string in new list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(list[1], "DEF") == 0, "Wrong string added to list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list[2] == NULL, "Missing terminating NULL.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen list[0] = NULL;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ret = add_string_to_list(global_talloc_context, "ABC", &list);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EOK, "Adding string to empty list failed.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list != NULL, "No list returned.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list[0] != NULL, "String not added to empty list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(list[0], "ABC") == 0,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "Wrong string added to empty list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(list[1] == NULL,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "Missing terminating NULL in newly created list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_free(list);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen}
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenEND_TEST
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenSTART_TEST(test_string_in_list)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen{
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen bool is_in;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char *empty_list[] = {NULL};
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char *list[] = {discard_const("ABC"),
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen discard_const("DEF"),
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen discard_const("GHI"),
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen NULL};
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list(NULL, NULL, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "NULL string is in NULL list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list(NULL, empty_list, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "NULL string is in empty list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list(NULL, list, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "NULL string is in list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list("ABC", NULL, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "String is in NULL list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list("ABC", empty_list, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "String is in empty list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list("ABC", list, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(is_in, "String is not list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list("abc", list, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(is_in, "String is not case in-sensitive list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen is_in = string_in_list("abc", list, true);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "Wrong string found in case sensitive list.");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen is_in = string_in_list("123", list, false);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(!is_in, "Wrong string found in list.");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen}
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenEND_TEST
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenSTART_TEST(test_parse_args)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen{
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen struct pa_testcase {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *argstr;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen const char **parsed;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen TALLOC_CTX *test_ctx;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen int i, ii;
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen int ret;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen char **parsed;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen char **only_ret;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen char **only_exp;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **both;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen test_ctx = talloc_new(NULL);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen /* Positive tests */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed1[] = { "foo", NULL };
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen const char *parsed2[] = { "foo", "a", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed3[] = { "foo", "b", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed4[] = { "foo", "a c", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed5[] = { "foo", "a", "d", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed6[] = { "foo", "a", "e", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed7[] = { "foo", "a", "f", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen const char *parsed8[] = { "foo", "a\tg", NULL };
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen struct pa_testcase tc[] = {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen { "foo", parsed1 },
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen { "foo a", parsed2 },
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen { "foo b", parsed3 },
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen { "foo a\\ c", parsed4 },
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen { "foo a d ", parsed5 },
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen { "foo a e ", parsed6 },
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen { "foo a f ", parsed7 },
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen { "foo a\\\tg", parsed8 },
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen { NULL, NULL }
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen };
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen for (i=0; tc[i].argstr != NULL; i++) {
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen parsed = parse_args(tc[i].argstr);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_if(parsed == NULL && tc[i].parsed != NULL,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen "Could not parse correct argument string '%s'\n");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen ret = diff_string_lists(test_ctx, parsed, discard_const(tc[i].parsed),
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen &only_ret, &only_exp, &both);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_ret[0] == NULL, "The parser returned more data than expected\n");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_exp[0] == NULL, "The parser returned less data than expected\n");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen for (ii = 0; parsed[ii]; ii++) free(parsed[ii]);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen free(parsed);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen }
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_free(test_ctx);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen}
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenEND_TEST
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo SirainenSTART_TEST(test_diff_string_lists)
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen{
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen TALLOC_CTX *test_ctx;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **l1;
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen char **l2;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **l3;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **only_l1;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **only_l2;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen char **both;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen int ret;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen test_ctx = talloc_new(NULL);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen /* Test with all values returned */
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen l1 = talloc_array(test_ctx, char *, 4);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l1[0] = talloc_strdup(l1, "a");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l1[1] = talloc_strdup(l1, "b");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l1[2] = talloc_strdup(l1, "c");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l1[3] = NULL;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l2 = talloc_array(test_ctx, char *, 4);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l2[0] = talloc_strdup(l1, "d");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l2[1] = talloc_strdup(l1, "c");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l2[2] = talloc_strdup(l1, "b");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l2[3] = NULL;
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = diff_string_lists(test_ctx,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l1, l2,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen &only_l1, &only_l2, &both);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l1[0], "a") == 0, "Missing \"a\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l1[1] == NULL, "only_l1 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l2[0], "d") == 0, "Missing \"d\" from only_l2");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l2[1] == NULL, "only_l2 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(both[0], "c") == 0, "Missing \"c\" from both");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(both[1], "b") == 0, "Missing \"b\" from both");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(both[2] == NULL, "both not NULL-terminated");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(only_l1);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(only_l2);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(both);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen /* Test with restricted return values */
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = diff_string_lists(test_ctx,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l1, l2,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen &only_l1, &only_l2, NULL);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(only_l1[0], "a") == 0, "Missing \"a\" from only_l1");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(only_l1[1] == NULL, "only_l1 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l2[0], "d") == 0, "Missing \"d\" from only_l2");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(only_l2[1] == NULL, "only_l2 not NULL-terminated");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(both == NULL, "Nothing returned to both");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(only_l1);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(only_l2);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(both);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = diff_string_lists(test_ctx,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l1, l2,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen &only_l1, NULL, NULL);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l1[0], "a") == 0, "Missing \"a\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l1[1] == NULL, "only_l1 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l2 == NULL, "Nothing returned to only_l2");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(both == NULL, "Nothing returned to both");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(only_l1);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen talloc_zfree(only_l2);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(both);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = diff_string_lists(test_ctx,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l1, l2,
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen NULL, &only_l2, NULL);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(only_l2[0], "d") == 0, "Missing \"d\" from only_l2");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(only_l2[1] == NULL, "only_l2 not NULL-terminated");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(only_l1 == NULL, "Nothing returned to only_l1");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(both == NULL, "Nothing returned to both");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(only_l1);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(only_l2);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(both);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen /* Test with no overlap */
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l3 = talloc_array(test_ctx, char *, 4);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen l3[0] = talloc_strdup(l1, "d");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l3[1] = talloc_strdup(l1, "e");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l3[2] = talloc_strdup(l1, "f");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l3[3] = NULL;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen ret = diff_string_lists(test_ctx,
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen l1, l3,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen &only_l1, &only_l2, &both);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(only_l1[0], "a") == 0, "Missing \"a\" from only_l1");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(only_l1[1], "b") == 0, "Missing \"b\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l1[2], "c") == 0, "Missing \"c\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l1[3] == NULL, "only_l1 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l2[0], "d") == 0, "Missing \"f\" from only_l2");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l2[1], "e") == 0, "Missing \"e\" from only_l2");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l2[2], "f") == 0, "Missing \"d\" from only_l2");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l2[3] == NULL, "only_l2 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(both[0] == NULL, "both should have zero entries");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(only_l1);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(only_l2);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(both);
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen /* Test with 100% overlap */
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen ret = diff_string_lists(test_ctx,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen l1, l1,
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen &only_l1, &only_l2, &both);
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(only_l1[0] == NULL, "only_l1 should have zero entries");
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(only_l2[0] == NULL, "only_l2 should have zero entries");
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(strcmp(both[0], "a") == 0, "Missing \"a\" from both");
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(strcmp(both[1], "b") == 0, "Missing \"b\" from both");
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(strcmp(both[2], "c") == 0, "Missing \"c\" from both");
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen fail_unless(both[3] == NULL, "both is not NULL-terminated");
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_zfree(only_l1);
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen talloc_zfree(only_l2);
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen talloc_zfree(both);
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen /* Test with no second list */
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen ret = diff_string_lists(test_ctx,
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen l1, NULL,
41e1c7380edda701719d8ce1fb4d465d2ec4c84dTimo Sirainen &only_l1, &only_l2, &both);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(ret == EOK, "diff_string_lists returned error [%d]", ret);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l1[0], "a") == 0, "Missing \"a\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l1[1], "b") == 0, "Missing \"b\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(strcmp(only_l1[2], "c") == 0, "Missing \"c\" from only_l1");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l1[3] == NULL, "only_l1 not NULL-terminated");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(only_l2[0] == NULL, "only_l2 should have zero entries");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen fail_unless(both[0] == NULL, "both should have zero entries");
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen talloc_free(test_ctx);
16c89b1260c9d07c01c83a9219424d3727069b2eTimo Sirainen}
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenEND_TEST
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo SirainenSTART_TEST(test_sss_filter_sanitize)
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen{
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen errno_t ret;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen char *sanitized = NULL;
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen TALLOC_CTX *test_ctx = talloc_new(NULL);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_if (test_ctx == NULL, "Out of memory");
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen const char no_specials[] = "username";
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = sss_filter_sanitize(test_ctx, no_specials, &sanitized);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "no_specials error [%d][%s]",
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret, strerror(ret));
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(no_specials, sanitized)==0,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen "Expected [%s], got [%s]",
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen no_specials, sanitized);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
287ba82a8da3eaa473b5735d4eeac2fb4c5d8117Timo Sirainen const char has_asterisk[] = "*username";
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen const char has_asterisk_expected[] = "\\2ausername";
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = sss_filter_sanitize(test_ctx, has_asterisk, &sanitized);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "has_asterisk error [%d][%s]",
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret, strerror(ret));
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(has_asterisk_expected, sanitized)==0,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen "Expected [%s], got [%s]",
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen has_asterisk_expected, sanitized);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen const char has_lparen[] = "user(name";
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen const char has_lparen_expected[] = "user\\28name";
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret = sss_filter_sanitize(test_ctx, has_lparen, &sanitized);
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(ret == EOK, "has_lparen error [%d][%s]",
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen ret, strerror(ret));
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen fail_unless(strcmp(has_lparen_expected, sanitized)==0,
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen "Expected [%s], got [%s]",
faed8babca9914257f34fb2e603d74016d563b2dTimo Sirainen has_lparen_expected, sanitized);
const char has_rparen[] = "user)name";
const char has_rparen_expected[] = "user\\29name";
ret = sss_filter_sanitize(test_ctx, has_rparen, &sanitized);
fail_unless(ret == EOK, "has_rparen error [%d][%s]",
ret, strerror(ret));
fail_unless(strcmp(has_rparen_expected, sanitized)==0,
"Expected [%s], got [%s]",
has_rparen_expected, sanitized);
const char has_backslash[] = "username\\";
const char has_backslash_expected[] = "username\\5c";
ret = sss_filter_sanitize(test_ctx, has_backslash, &sanitized);
fail_unless(ret == EOK, "has_backslash error [%d][%s]",
ret, strerror(ret));
fail_unless(strcmp(has_backslash_expected, sanitized)==0,
"Expected [%s], got [%s]",
has_backslash_expected, sanitized);
const char has_all[] = "\\(user)*name";
const char has_all_expected[] = "\\5c\\28user\\29\\2aname";
ret = sss_filter_sanitize(test_ctx, has_all, &sanitized);
fail_unless(ret == EOK, "has_all error [%d][%s]",
ret, strerror(ret));
fail_unless(strcmp(has_all_expected, sanitized)==0,
"Expected [%s], got [%s]",
has_all_expected, sanitized);
talloc_free(test_ctx);
}
END_TEST
START_TEST(test_size_t_overflow)
{
fail_unless(!SIZE_T_OVERFLOW(1, 1), "unexpected overflow");
fail_unless(!SIZE_T_OVERFLOW(SIZE_MAX, 0), "unexpected overflow");
fail_unless(!SIZE_T_OVERFLOW(SIZE_MAX-10, 10), "unexpected overflow");
fail_unless(SIZE_T_OVERFLOW(SIZE_MAX, 1), "overflow not detected");
fail_unless(SIZE_T_OVERFLOW(SIZE_MAX, SIZE_MAX),
"overflow not detected");
fail_unless(SIZE_T_OVERFLOW(SIZE_MAX, ULLONG_MAX),
"overflow not detected");
fail_unless(SIZE_T_OVERFLOW(SIZE_MAX, -10), "overflow not detected");
}
END_TEST
START_TEST(test_utf8_lowercase)
{
const uint8_t munchen_utf8_upcase[] = { 'M', 0xC3, 0x9C, 'N', 'C', 'H', 'E', 'N', 0x0 };
const uint8_t munchen_utf8_lowcase[] = { 'm', 0xC3, 0xBC, 'n', 'c', 'h', 'e', 'n', 0x0 };
uint8_t *lcase;
size_t nlen;
lcase = sss_utf8_tolower(munchen_utf8_upcase,
strlen((const char *)munchen_utf8_upcase),
&nlen);
fail_if(strlen((const char *) munchen_utf8_upcase) != nlen); /* This is not true for utf8 strings in general */
fail_if(memcmp(lcase, munchen_utf8_lowcase, nlen));
sss_utf8_free(lcase);
}
END_TEST
START_TEST(test_utf8_talloc_lowercase)
{
const uint8_t munchen_utf8_upcase[] = { 'M', 0xC3, 0x9C, 'N', 'C', 'H', 'E', 'N', 0x0 };
const uint8_t munchen_utf8_lowcase[] = { 'm', 0xC3, 0xBC, 'n', 'c', 'h', 'e', 'n', 0x0 };
uint8_t *lcase;
size_t nsize;
TALLOC_CTX *test_ctx;
test_ctx = talloc_new(NULL);
fail_if(test_ctx == NULL);
lcase = sss_tc_utf8_tolower(test_ctx, munchen_utf8_upcase,
strlen((const char *) munchen_utf8_upcase),
&nsize);
fail_if(memcmp(lcase, munchen_utf8_lowcase, nsize));
talloc_free(test_ctx);
}
END_TEST
START_TEST(test_utf8_talloc_str_lowercase)
{
const uint8_t munchen_utf8_upcase[] = { 'M', 0xC3, 0x9C, 'N', 'C', 'H', 'E', 'N', 0x0 };
const uint8_t munchen_utf8_lowcase[] = { 'm', 0xC3, 0xBC, 'n', 'c', 'h', 'e', 'n', 0x0 };
char *lcase;
TALLOC_CTX *test_ctx;
test_ctx = talloc_new(NULL);
fail_if(test_ctx == NULL);
lcase = sss_tc_utf8_str_tolower(test_ctx, (const char *) munchen_utf8_upcase);
fail_if(memcmp(lcase, munchen_utf8_lowcase, strlen(lcase)));
talloc_free(test_ctx);
}
END_TEST
START_TEST(test_utf8_caseeq)
{
const uint8_t munchen_utf8_upcase[] = { 'M', 0xC3, 0x9C, 'N', 'C', 'H', 'E', 'N', 0x0 };
const uint8_t munchen_utf8_lowcase[] = { 'm', 0xC3, 0xBC, 'n', 'c', 'h', 'e', 'n', 0x0 };
const uint8_t czech_utf8_lowcase[] = { 0xC4, 0x8D, 'e', 'c', 'h', 0x0 };
const uint8_t czech_utf8_upcase[] = { 0xC4, 0x8C, 'e', 'c', 'h', 0x0 };
const uint8_t czech_utf8_lowcase_neg[] = { 0xC4, 0x8E, 'e', 'c', 'h', 0x0 };
errno_t ret;
ret = sss_utf8_case_eq(munchen_utf8_upcase, munchen_utf8_lowcase);
fail_unless(ret == EOK, "Latin 1 Supplement comparison failed\n");
ret = sss_utf8_case_eq(czech_utf8_upcase, czech_utf8_lowcase);
fail_unless(ret == EOK, "Latin Extended A comparison failed\n");
ret = sss_utf8_case_eq(czech_utf8_upcase, czech_utf8_lowcase_neg);
fail_if(ret == EOK, "Negative test succeeded\n");
}
END_TEST
START_TEST(test_utf8_check)
{
const char *invalid = "ad\351la\357d";
const uint8_t valid[] = { 'M', 0xC3, 0x9C, 'N', 'C', 'H', 'E', 'N', 0x0 };
bool ret;
ret = sss_utf8_check(valid, strlen((const char *) valid));
fail_unless(ret == true, "Positive test failed\n");
ret = sss_utf8_check((const uint8_t *) invalid, strlen(invalid));
fail_unless(ret == false, "Negative test succeeded\n");
}
END_TEST
START_TEST(test_murmurhash3_check)
{
const char *tests[6] = { "1052800007", "1052800008", "1052800000",
"abcdefghijk", "abcdefghili", "abcdefgh000" };
uint32_t results[6];
int i, j;
for (i = 0; i< 6; i++) {
results[i] = murmurhash3(tests[i],
strlen(tests[i]),
0xdeadbeef);
for (j = 0; j < i; j++) {
fail_if(results[i] == results[j]);
}
}
}
END_TEST
START_TEST(test_murmurhash3_random)
{
char test[16];
uint32_t result1;
uint32_t result2;
unsigned int init_seed;
unsigned int seed;
size_t len;
int i;
/* generate a random string so each time we test with different values */
init_seed = time(0);
seed = init_seed;
/* use also random length (min len = 1) */
len = 1 + rand_r(&seed) % 14;
for (i = 0; i < len; i++) {
test[i] = 1 + rand_r(&seed) % 254;
}
test[len] = '\0'; /* null terminate */
fprintf(stdout, "test_murmurhash3_random seed: %u\n", init_seed);
result1 = murmurhash3(test, len + 1, init_seed);
result2 = murmurhash3(test, len + 1, init_seed);
fail_if(result1 != result2);
}
END_TEST
void setup_atomicio(void)
{
int ret;
mode_t old_umask;
filename = strdup(FILENAME_TEMPLATE);
fail_unless(filename != NULL, "strdup failed");
atio_fd = -1;
old_umask = umask(077);
ret = mkstemp(filename);
umask(old_umask);
fail_unless(ret != -1, "mkstemp failed [%d][%s]", errno, strerror(errno));
atio_fd = ret;
}
void teardown_atomicio(void)
{
int ret;
if (atio_fd != -1) {
ret = close(atio_fd);
fail_unless(ret == 0, "close failed [%d][%s]", errno, strerror(errno));
}
fail_unless(filename != NULL, "unknown filename");
ret = unlink(filename);
free(filename);
fail_unless(ret == 0, "unlink failed [%d][%s]", errno, strerror(errno));
}
START_TEST(test_atomicio_read_from_file)
{
const ssize_t bufsize = 64;
char buf[64];
int fd;
ssize_t numread;
errno_t ret;
fd = open("/dev/zero", O_RDONLY);
fail_if(fd == -1, "Cannot open /dev/zero");
errno = 0;
numread = sss_atomic_read_s(fd, buf, bufsize);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
fail_unless(numread == bufsize,
"Read %d bytes expected %d\n", numread, bufsize);
close(fd);
}
END_TEST
START_TEST(test_atomicio_read_from_small_file)
{
char wbuf[] = "foobar";
ssize_t wsize = strlen(wbuf)+1;
ssize_t numwritten;
char rbuf[64];
ssize_t numread;
errno_t ret;
fail_if(atio_fd < 0, "No fd to test?\n");
errno = 0;
numwritten = sss_atomic_write_s(atio_fd, wbuf, wsize);
ret = errno;
fail_unless(ret == 0, "Error %d while writing\n", ret);
fail_unless(numwritten == wsize,
"Wrote %d bytes expected %d\n", numwritten, wsize);
fsync(atio_fd);
lseek(atio_fd, 0, SEEK_SET);
errno = 0;
numread = sss_atomic_read_s(atio_fd, rbuf, 64);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
fail_unless(numread == numwritten,
"Read %d bytes expected %d\n", numread, numwritten);
}
END_TEST
START_TEST(test_atomicio_read_from_large_file)
{
char wbuf[] = "123456781234567812345678";
ssize_t wsize = strlen(wbuf)+1;
ssize_t numwritten;
char rbuf[8];
ssize_t numread;
ssize_t total;
errno_t ret;
fail_if(atio_fd < 0, "No fd to test?\n");
errno = 0;
numwritten = sss_atomic_write_s(atio_fd, wbuf, wsize);
ret = errno;
fail_unless(ret == 0, "Error %d while writing\n", ret);
fail_unless(numwritten == wsize,
"Wrote %d bytes expected %d\n", numwritten, wsize);
fsync(atio_fd);
lseek(atio_fd, 0, SEEK_SET);
total = 0;
do {
errno = 0;
numread = sss_atomic_read_s(atio_fd, rbuf, 8);
ret = errno;
fail_if(numread == -1, "Read error %d: %s\n", ret, strerror(ret));
total += numread;
} while (numread != 0);
fail_unless(ret == 0, "Error %d while reading\n", ret);
fail_unless(total == numwritten,
"Read %d bytes expected %d\n", numread, numwritten);
}
END_TEST
START_TEST(test_atomicio_read_exact_sized_file)
{
char wbuf[] = "12345678";
ssize_t wsize = strlen(wbuf)+1;
ssize_t numwritten;
char rbuf[9];
ssize_t numread;
errno_t ret;
fail_if(atio_fd < 0, "No fd to test?\n");
errno = 0;
numwritten = sss_atomic_write_s(atio_fd, wbuf, wsize);
ret = errno;
fail_unless(ret == 0, "Error %d while writing\n", ret);
fail_unless(numwritten == wsize,
"Wrote %d bytes expected %d\n", numwritten, wsize);
fsync(atio_fd);
lseek(atio_fd, 0, SEEK_SET);
errno = 0;
numread = sss_atomic_read_s(atio_fd, rbuf, 9);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
fail_unless(numread == numwritten,
"Read %d bytes expected %d\n", numread, numwritten);
fail_unless(rbuf[8] == '\0', "String not NULL terminated?");
fail_unless(strcmp(wbuf, rbuf) == 0, "Read something else than wrote?");
/* We've reached end-of-file, next read must return 0 */
errno = 0;
numread = sss_atomic_read_s(atio_fd, rbuf, 9);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
fail_unless(numread == 0, "More data to read?");
}
END_TEST
START_TEST(test_atomicio_read_from_empty_file)
{
char buf[64];
int fd;
ssize_t numread;
errno_t ret;
fd = open("/dev/null", O_RDONLY);
fail_if(fd == -1, "Cannot open /dev/null");
errno = 0;
numread = sss_atomic_read_s(fd, buf, 64);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
fail_unless(numread == 0,
"Read %d bytes expected 0\n", numread);
close(fd);
}
END_TEST
struct split_data {
const char *input;
const char **expected_list;
bool trim;
bool skip_empty;
int expected_size;
int expected_ret;
};
START_TEST(test_split_on_separator)
{
TALLOC_CTX *mem = global_talloc_context;
errno_t ret;
char **list = NULL;
int size;
const char *str_ref;
const char *str_out;
int i;
int a;
int num_of_tests;
struct split_data sts[] = {
{
"one,two,three", /* input string */
(const char *[]){"one", "two", "three", NULL}, /* expec. output list */
false, false, /* trim, skip_empty */
3, 0 /* expec. size, expec. retval */
},
{
"one,two,three",
(const char *[]){"one", "two", "three", NULL},
true, true,
3, 0
},
{
" one, two ,three ",
(const char*[]){"one", "two", "three", NULL},
true, true,
3, 0
},
{
/* If skip empty is false, single comma means "empty,empty" */
",",
(const char*[]){"", "", NULL, NULL},
false, false,
2, 0
},
{
"one, ,",
(const char*[]){"one", " ", "NULL", "NULL"},
false, true,
2, 0
},
{
", ,,",
(const char*[]){NULL},
true, true,
0, 0
},
{
NULL,
NULL,
false, false,
0, EINVAL
},
};
num_of_tests = sizeof(sts) / sizeof(struct split_data);
for (a = 0; a < num_of_tests; a++) {
ret = split_on_separator(mem, sts[a].input, ',', sts[a].trim,
sts[a].skip_empty, &list, &size);
fail_unless(ret == sts[a].expected_ret,
"split_on_separator failed [%d]: %s\n", ret,
strerror(ret));
if (ret) {
continue;
}
fail_unless(size == sts[a].expected_size, "Returned wrong size %d "
"(expected %d).\n", size, sts[a].expected_size);
for (i = 0; str_ref = sts[a].expected_list[i], str_out = list[i]; i++) {
fail_unless(strcmp(str_ref, str_out) == 0,
"Expected:%s Got:%s\n", str_ref, str_out);
}
talloc_free(list);
list = NULL;
}
}
END_TEST
struct check_ip_test_data {
const char *str_ipaddr;
uint8_t flags;
bool expected_ret;
};
START_TEST(test_check_ipv4_addr)
{
int a;
int num_of_tests;
int ret;
bool bret;
struct in_addr addr;
struct check_ip_test_data tst_data[] = {
{
"192.168.100.1", /* input IPv4 address */
0, /* flags value */
true /* Expected return value */
},
{
"224.0.0.22", /* multicast address */
SSS_NO_MULTICAST,
false
},
{
"192.186.0.224",
SSS_NO_MULTICAST,
true
},
{
"127.0.0.1",
SSS_NO_LOOPBACK,
false
},
{
"169.254.0.11",
SSS_NO_LINKLOCAL,
false
},
{
"255.255.255.255",
SSS_NO_BROADCAST,
false
},
{
"255.255.255.255",
SSS_NO_SPECIAL,
false
},
{
"192.168.254.169",
SSS_NO_SPECIAL,
true
},
};
num_of_tests = sizeof(tst_data) / sizeof(struct check_ip_test_data);
for (a = 0; a < num_of_tests; a++) {
/* fill sockaddr_in structure */
ret = inet_pton(AF_INET, tst_data[a].str_ipaddr, &addr);
fail_if(ret != 1, "inet_pton failed.");
bret = check_ipv4_addr(&addr, tst_data[a].flags);
fail_unless(bret == tst_data[a].expected_ret,
"check_ipv4_addr failed (iteration %d)", a);
}
}
END_TEST
START_TEST(test_check_ipv6_addr)
{
int a;
int num_of_tests;
int ret;
bool bret;
struct in6_addr addr;
struct check_ip_test_data tst_data[] = {
{
"fde9:7e3f:1ed3:24a5::4", /* input IPv6 address */
0, /* flags value */
true /* Expected return value */
},
{
"fe80::f2de:f1ff:fefa:67f0",
SSS_NO_LINKLOCAL,
false
},
{
"::1",
SSS_NO_LOOPBACK,
false
},
{
"ff00::123",
SSS_NO_MULTICAST,
false
},
{
"ff00::321",
SSS_NO_SPECIAL,
false
},
};
num_of_tests = sizeof(tst_data) / sizeof(struct check_ip_test_data);
for (a = 0; a < num_of_tests; a++) {
/* fill sockaddr_in structure */
ret = inet_pton(AF_INET6, tst_data[a].str_ipaddr, &addr);
fail_if(ret != 1, "inet_pton failed.");
bret = check_ipv6_addr(&addr, tst_data[a].flags);
fail_unless(bret == tst_data[a].expected_ret,
"check_ipv6_addr failed (iteration %d)", a);
}
}
END_TEST
START_TEST(test_is_host_in_domain)
{
struct {
const char *host;
const char *domain;
bool expected;
} data[] = {{"example.com", "example.com", true},
{"client.example.com", "example.com", true},
{"client.child.example.com", "example.com", true},
{"example.com", "child.example.com", false},
{"client.example.com", "child.example.com", false},
{"client.child.example.com", "child.example.com", true},
{"my.com", "example.com", false},
{"myexample.com", "example.com", false},
{NULL, NULL, false}};
bool ret;
int i;
for (i = 0; data[i].host != NULL; i++) {
ret = is_host_in_domain(data[i].host, data[i].domain);
fail_if(ret != data[i].expected, "Host: %s, Domain: %s, Expected: %d, "
"Got: %d\n", data[i].host, data[i].domain,
data[i].expected, ret);
}
}
END_TEST
Suite *util_suite(void)
{
Suite *s = suite_create("util");
TCase *tc_util = tcase_create("util");
tcase_add_checked_fixture(tc_util,
ck_leak_check_setup,
ck_leak_check_teardown);
tcase_add_test (tc_util, test_diff_string_lists);
tcase_add_test (tc_util, test_sss_filter_sanitize);
tcase_add_test (tc_util, test_size_t_overflow);
tcase_add_test (tc_util, test_parse_args);
tcase_add_test (tc_util, test_add_string_to_list);
tcase_add_test (tc_util, test_string_in_list);
tcase_add_test (tc_util, test_split_on_separator);
tcase_add_test (tc_util, test_check_ipv4_addr);
tcase_add_test (tc_util, test_check_ipv6_addr);
tcase_add_test (tc_util, test_is_host_in_domain);
tcase_set_timeout(tc_util, 60);
TCase *tc_utf8 = tcase_create("utf8");
tcase_add_test (tc_utf8, test_utf8_lowercase);
tcase_add_test (tc_utf8, test_utf8_talloc_lowercase);
tcase_add_test (tc_utf8, test_utf8_talloc_str_lowercase);
tcase_add_test (tc_utf8, test_utf8_caseeq);
tcase_add_test (tc_utf8, test_utf8_check);
tcase_set_timeout(tc_utf8, 60);
TCase *tc_mh3 = tcase_create("murmurhash3");
tcase_add_test (tc_mh3, test_murmurhash3_check);
tcase_add_test (tc_mh3, test_murmurhash3_random);
tcase_set_timeout(tc_mh3, 60);
TCase *tc_atomicio = tcase_create("atomicio");
tcase_add_checked_fixture (tc_atomicio,
setup_atomicio,
teardown_atomicio);
tcase_add_test(tc_atomicio, test_atomicio_read_from_file);
tcase_add_test(tc_atomicio, test_atomicio_read_from_small_file);
tcase_add_test(tc_atomicio, test_atomicio_read_from_large_file);
tcase_add_test(tc_atomicio, test_atomicio_read_exact_sized_file);
tcase_add_test(tc_atomicio, test_atomicio_read_from_empty_file);
suite_add_tcase (s, tc_util);
suite_add_tcase (s, tc_utf8);
suite_add_tcase (s, tc_mh3);
suite_add_tcase (s, tc_atomicio);
return s;
}
int main(int argc, const char *argv[])
{
int opt;
int failure_count;
poptContext pc;
Suite *s = util_suite();
SRunner *sr = srunner_create (s);
struct poptOption long_options[] = {
POPT_AUTOHELP
SSSD_MAIN_OPTS
POPT_TABLEEND
};
/* 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_INIT(debug_level);
tests_set_cwd();
srunner_run_all(sr, CK_ENV);
failure_count = srunner_ntests_failed (sr);
srunner_free (sr);
if (failure_count == 0) {
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}