]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
tests/unit/test_chkname.c: Test is_valid_user_name()
authorAlejandro Colomar <alx@kernel.org>
Sun, 26 Nov 2023 22:21:44 +0000 (23:21 +0100)
committerIker Pedrosa <ikerpedrosam@gmail.com>
Tue, 28 Nov 2023 15:57:54 +0000 (16:57 +0100)
Suggested-by: Iker Pedrosa <ipedrosa@redhat.com>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
tests/unit/Makefile.am
tests/unit/test_chkname.c [new file with mode: 0644]

index a2f13bff18cde1522358fb217b09d559b84d1ae0..3e3144ded18de5791e09bb0138e1931ef51a9e6b 100644 (file)
@@ -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 (file)
index 0000000..af98294
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * 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.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);
+}