From 6a57d86bf9d7f8d6f5d339f57665dfb2e1d191c5 Mon Sep 17 00:00:00 2001 From: Unique-Usman Date: Sun, 10 Mar 2024 17:28:58 +0530 Subject: [PATCH] Added a test file for the dirent-util.c --- src/test/meson.build | 1 + src/test/test-dirent-util.c | 213 ++++++++++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+) create mode 100644 src/test/test-dirent-util.c diff --git a/src/test/meson.build b/src/test/meson.build index e9e94637909..96f934b2191 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -74,6 +74,7 @@ simple_tests += files( 'test-dev-setup.c', 'test-device-nodes.c', 'test-devnum-util.c', + 'test-dirent-util.c', 'test-dns-domain.c', 'test-ellipsize.c', 'test-env-file.c', diff --git a/src/test/test-dirent-util.c b/src/test/test-dirent-util.c new file mode 100644 index 00000000000..f9816973bfc --- /dev/null +++ b/src/test/test-dirent-util.c @@ -0,0 +1,213 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include +#include +#include +#include + +#include "alloc-util.h" +#include "dirent-util.h" +#include "fs-util.h" +#include "mkdir.h" +#include "path-util.h" +#include "rm-rf.h" +#include "stat-util.h" +#include "string-util.h" +#include "tmpfile-util.h" +#include "tests.h" + +TEST (test_dirent_ensure_type) { + int r, dir_fd; + static struct dirent de = { + .d_type = DT_UNKNOWN, + .d_name = "test", + }; + + assert_se(de.d_type == DT_UNKNOWN); + + dir_fd = 0; + dirent_ensure_type(dir_fd, &de); + + /* Test when d_name is "." or ".." */ + strcpy(de.d_name, "."); + r = dirent_ensure_type(dir_fd, &de); + assert_se(r == 0); + assert_se(de.d_type == DT_DIR); + + strcpy(de.d_name, ".."); + r = dirent_ensure_type(dir_fd, &de); + assert_se(r == 0); + assert_se(de.d_type == DT_DIR); +} + +TEST (test_dirent_is_file) { + _cleanup_(rm_rf_physical_and_freep) char *t = NULL; + const char *name, *dotfile, *name_alias, *bakfile, *tilda; + const struct dirent *de_reg, *de_lnk, *de_dot, *de_bak, *de_tilda; + DIR *dir; + + static const struct dirent de_unknown = { + .d_type = DT_UNKNOWN, + .d_name = "test_unknown", + }; + + assert_se(mkdtemp_malloc(NULL, &t) >= 0); + + name = strjoina(t, "/test.txt"); + dotfile = strjoina(t, "/.hidden_file"); + bakfile = strjoina(t, "/test.bak"); + tilda = strjoina(t, "/test~"); + name_alias = strjoina(t, "/test_link"); + + assert_se(touch(name) >= 0); + assert_se(touch(dotfile) >= 0); + assert_se(touch(bakfile) >= 0); + assert_se(touch(tilda) >= 0); + + if (symlink(name, name_alias) < 0) { + assert_se(IN_SET(errno, EINVAL, ENOSYS, ENOTTY, EPERM)); + log_tests_skipped_errno(errno, "symlink() not possible"); + } + + dir = opendir(t); + if (dir == NULL) { + log_error_errno(errno, "Failed to open directory '%s': %m", t); + exit(EXIT_FAILURE); + } + + rewinddir(dir); + while ((de_reg = readdir_ensure_type(dir)) != NULL) + if (strcmp(de_reg->d_name, "test.txt") == 0) + break; + + rewinddir(dir); + while ((de_lnk = readdir_ensure_type(dir)) != NULL) + if (strcmp(de_lnk->d_name, "test_link") == 0) + break; + + rewinddir(dir); + while ((de_dot = readdir_ensure_type(dir)) != NULL) + if (strcmp(de_dot->d_name, ".hidden_file") == 0) + break; + + rewinddir(dir); + while ((de_bak = readdir(dir)) != NULL) + if (strcmp(de_bak->d_name, "test.bak") == 0) + break; + + rewinddir(dir); + while ((de_tilda = readdir(dir)) != NULL) + if (strcmp(de_tilda->d_name, "test~") == 0) + break; + + /* Test when d_type is DT_REG, DT_LNK, or DT_UNKNOWN */ + assert_se(dirent_is_file(de_reg) == true); + if (de_lnk) + assert_se(dirent_is_file(de_lnk) == true); + else + log_tests_skipped("de_lnk is NULL, skipping test"); + assert_se(dirent_is_file(&de_unknown) == true); + + /* Test for hidden files */ + assert_se(dirent_is_file(de_dot) == false); + assert_se(dirent_is_file(de_bak) == false); + assert_se(dirent_is_file(de_tilda) == false); + + closedir(dir); +} + +TEST (test_dirent_is_file_with_suffix) { + _cleanup_(rm_rf_physical_and_freep) char *t = NULL; + const char *name, *dotfile, *name_alias, *dotdot, *chr; + const struct dirent *de_reg, *de_lnk, *de_dot, *de_dotdot, *de_chr; + DIR *dir; + + static const struct dirent de_unknown = { + .d_type = DT_UNKNOWN, + .d_name = "test_unknown", + }; + + assert_se(mkdtemp_malloc(NULL, &t) >= 0); + + name = strjoina(t, "/test.txt"); + dotfile = strjoina(t, "/.hidden_file"); + dotdot = strjoina(t, "/..dotdot"); + chr = strjoina(t, "/test_chr"); + name_alias = strjoina(t, "/test_link"); + + assert_se(touch(name) >= 0); + assert_se(touch(dotfile) >= 0); + assert_se(touch(dotdot) >= 0); + assert_se(mknod(chr, 0775 | S_IFCHR, makedev(0, 0)) >= 0); + + if (symlink(name, name_alias) < 0) { + assert_se(IN_SET(errno, EINVAL, ENOSYS, ENOTTY, EPERM)); + log_tests_skipped_errno(errno, "symlink() not possible"); + } + + dir = opendir(t); + if (dir == NULL) { + log_error_errno(errno, "Failed to open directory '%s': %m", t); + exit(EXIT_FAILURE); + } + + rewinddir(dir); + while ((de_reg = readdir_ensure_type(dir)) != NULL) + if (strcmp(de_reg->d_name, "test.txt") == 0) + break; + + rewinddir(dir); + while ((de_lnk = readdir_ensure_type(dir)) != NULL) + if (strcmp(de_lnk->d_name, "test_link") == 0) + break; + + rewinddir(dir); + while ((de_dot = readdir_ensure_type(dir)) != NULL) + if (strcmp(de_dot->d_name, ".hidden_file") == 0) + break; + + rewinddir(dir); + while ((de_dotdot = readdir(dir)) != NULL) + if (strcmp(de_dotdot->d_name, "..dotdot") == 0) + break; + + rewinddir(dir); + while ((de_chr = readdir(dir)) != NULL) + if (strcmp(de_chr->d_name, "test_chr") == 0) + break; + + /* Test when d_type is not DT_REG, DT_LNK, or DT_UNKNOWN */ + assert_se(!dirent_is_file_with_suffix(de_chr, NULL)); + + /* Test when suffix is NULL */ + assert_se(dirent_is_file_with_suffix(de_reg, NULL) == true); + if (de_lnk) + assert_se(dirent_is_file_with_suffix(de_lnk, NULL) == true); + else + log_tests_skipped("de_lnk is NULL, skipping test"); + assert_se(dirent_is_file_with_suffix(&de_unknown, NULL) == true); + + /* Test for present suffix */ + assert_se(dirent_is_file_with_suffix(de_reg, "txt") == true); + if (de_lnk) + assert_se(dirent_is_file_with_suffix(de_lnk, "link") == true); + else + log_tests_skipped("de_lnk is NULL, skipping test"); + assert_se(dirent_is_file_with_suffix(&de_unknown, "unknown") == true); + + /* Test for absent suffix */ + assert_se(dirent_is_file_with_suffix(de_reg, "svg") == false); + if (de_lnk) + assert_se(dirent_is_file_with_suffix(de_lnk, "pdf") == false); + else + log_tests_skipped("de_lnk is NULL, skipping test"); + assert_se(dirent_is_file_with_suffix(&de_unknown, "yes") == false); + + /* Test for dot and dot-dot */ + assert_se(dirent_is_file_with_suffix(de_dot, NULL) == false); + assert_se(dirent_is_file_with_suffix(de_dotdot, NULL) == false); + + closedir(dir); +} + +DEFINE_TEST_MAIN(LOG_INFO); -- 2.39.5