diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index a2f13bff1..3e3144ded 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -4,6 +4,7 @@ if HAVE_CMOCKA TESTS = $(check_PROGRAMS) check_PROGRAMS = \ + test_chkname \ test_strncpy \ test_strtcpy \ test_xasprintf @@ -16,6 +17,19 @@ endif # ENABLE_LOGIND check_PROGRAMS += \ $(NULL) +test_chkname_SOURCES = \ + ../../lib/chkname.c \ + test_chkname.c \ + $(NULL) +test_chkname_CFLAGS = \ + $(AM_FLAGS) \ + $(NULL) +test_chkname_LDFLAGS = \ + $(NULL) +test_chkname_LDADD = \ + $(CMOCKA_LIBS) \ + $(NULL) + test_logind_SOURCES = \ ../../lib/logind.c \ test_logind.c \ diff --git a/tests/unit/test_chkname.c b/tests/unit/test_chkname.c new file mode 100644 index 000000000..af982940d --- /dev/null +++ b/tests/unit/test_chkname.c @@ -0,0 +1,149 @@ +/* + * SPDX-FileCopyrightText: 2023, Alejandro Colomar + * SPDX-License-Identifier: BSD-3-Clause + */ + + +#include +#include +#include +#include +#include + +#include // Required by +#include // Required by +#include // Required by +#include // Required by +#include + +#include "alloc.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 + 2, char); + assert_true(name != NULL); + + memset(name, '_', max + 1); + + name[max + 1] = '\0'; + assert_true(false == is_valid_user_name(name)); + + name[max] = '\0'; + assert_true(is_valid_user_name(name)); + + free(name); +}