1
0
Fork 0
shadow/tests/unit/test_chkname.c
Daniel Baumann 09a180ea01
Adding upstream version 1:4.17.4.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 05:06:56 +02:00

149 lines
3.9 KiB
C

/*
* SPDX-FileCopyrightText: 2023, Alejandro Colomar <alx@kernel.org>
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <stdbool.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h> // Required by <cmocka.h>
#include <stddef.h> // Required by <cmocka.h>
#include <setjmp.h> // Required by <cmocka.h>
#include <stdint.h> // Required by <cmocka.h>
#include <cmocka.h>
#include "alloc/malloc.h"
#include "chkname.h"
static void test_is_valid_user_name_ok(void **state);
static void test_is_valid_user_name_ok_dollar(void **state);
static void test_is_valid_user_name_nok_dash(void **state);
static void test_is_valid_user_name_nok_dir(void **state);
static void test_is_valid_user_name_nok_dollar(void **state);
static void test_is_valid_user_name_nok_empty(void **state);
static void test_is_valid_user_name_nok_numeric(void **state);
static void test_is_valid_user_name_nok_otherchars(void **state);
static void test_is_valid_user_name_long(void **state);
int
main(void)
{
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_is_valid_user_name_ok),
cmocka_unit_test(test_is_valid_user_name_ok_dollar),
cmocka_unit_test(test_is_valid_user_name_nok_dash),
cmocka_unit_test(test_is_valid_user_name_nok_dir),
cmocka_unit_test(test_is_valid_user_name_nok_dollar),
cmocka_unit_test(test_is_valid_user_name_nok_empty),
cmocka_unit_test(test_is_valid_user_name_nok_numeric),
cmocka_unit_test(test_is_valid_user_name_nok_otherchars),
cmocka_unit_test(test_is_valid_user_name_long),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}
static void
test_is_valid_user_name_ok(void **state)
{
assert_true(is_valid_user_name("alx"));
assert_true(is_valid_user_name("u-ser"));
assert_true(is_valid_user_name("u"));
assert_true(is_valid_user_name("I"));
assert_true(is_valid_user_name("_"));
assert_true(is_valid_user_name("_.-"));
assert_true(is_valid_user_name(".007"));
assert_true(is_valid_user_name("0_0"));
assert_true(is_valid_user_name("some_longish_user_name_sHould_also_be_valid.wHY_not"));
}
static void
test_is_valid_user_name_ok_dollar(void **state)
{
// Non-POSIX extension for Samba 3.x "add machine script".
assert_true(is_valid_user_name("dollar$"));
assert_true(is_valid_user_name("SSS$"));
}
static void
test_is_valid_user_name_nok_dash(void **state)
{
assert_true(false == is_valid_user_name("-"));
assert_true(false == is_valid_user_name("-not-valid"));
assert_true(false == is_valid_user_name("--C"));
}
static void
test_is_valid_user_name_nok_dir(void **state)
{
assert_true(false == is_valid_user_name("."));
assert_true(false == is_valid_user_name(".."));
}
static void
test_is_valid_user_name_nok_dollar(void **state)
{
assert_true(false == is_valid_user_name("$"));
assert_true(false == is_valid_user_name("$dollar"));
assert_true(false == is_valid_user_name("mo$ney"));
assert_true(false == is_valid_user_name("do$$ar"));
assert_true(false == is_valid_user_name("foo$bar$"));
}
static void
test_is_valid_user_name_nok_empty(void **state)
{
assert_true(false == is_valid_user_name(""));
}
static void
test_is_valid_user_name_nok_numeric(void **state)
{
assert_true(false == is_valid_user_name("6"));
assert_true(false == is_valid_user_name("42"));
}
static void
test_is_valid_user_name_nok_otherchars(void **state)
{
assert_true(false == is_valid_user_name("no spaces"));
assert_true(false == is_valid_user_name("no,"));
assert_true(false == is_valid_user_name("no;"));
assert_true(false == is_valid_user_name("no:"));
}
static void
test_is_valid_user_name_long(void **state)
{
size_t max;
char *name;
max = sysconf(_SC_LOGIN_NAME_MAX);
name = MALLOC(max + 1, char);
assert_true(name != NULL);
memset(name, '_', max);
stpcpy(&name[max], "");
assert_true(false == is_valid_user_name(name));
stpcpy(&name[max - 1], "");
assert_true(is_valid_user_name(name));
free(name);
}