Path: blob/main/lib/libc/tests/gen/fts_options_test.c
39534 views
/*-1* Copyright (c) 2025 Klara, Inc.2*3* SPDX-License-Identifier: BSD-2-Clause4*/56#include <sys/stat.h>78#include <fcntl.h>9#include <fts.h>10#include <stdbool.h>11#include <stdio.h>12#include <stdlib.h>13#include <unistd.h>1415#include <atf-c.h>1617#include "fts_test.h"1819static char *all_paths[] = {20"dir",21"dirl",22"file",23"filel",24"dead",25"noent",26NULL27};2829/*30* Prepare the files and directories we will be inspecting.31*/32static void33fts_options_prepare(const struct atf_tc *tc)34{35ATF_REQUIRE_EQ(0, mkdir("dir", 0755));36ATF_REQUIRE_EQ(0, close(creat("file", 0644)));37ATF_REQUIRE_EQ(0, close(creat("dir/file", 0644)));38ATF_REQUIRE_EQ(0, symlink("..", "dir/up"));39ATF_REQUIRE_EQ(0, symlink("dir", "dirl"));40ATF_REQUIRE_EQ(0, symlink("file", "filel"));41ATF_REQUIRE_EQ(0, symlink("noent", "dead"));42}4344ATF_TC(fts_options_logical);45ATF_TC_HEAD(fts_options_logical, tc)46{47atf_tc_set_md_var(tc, "descr", "FTS_LOGICAL");48}49ATF_TC_BODY(fts_options_logical, tc)50{51fts_options_prepare(tc);52fts_test(tc, &(struct fts_testcase){53all_paths,54FTS_LOGICAL,55(struct fts_expect[]){56{ FTS_DL, "dead", "dead" },57{ FTS_D, "dir", "dir" },58{ FTS_F, "file", "dir/file" },59{ FTS_D, "up", "dir/up" },60{ FTS_DL, "dead", "dir/up/dead" },61{ FTS_DC, "dir", "dir/up/dir" },62{ FTS_DC, "dirl", "dir/up/dirl" },63{ FTS_F, "file", "dir/up/file" },64{ FTS_F, "filel", "dir/up/filel" },65{ FTS_DP, "up", "dir/up" },66{ FTS_DP, "dir", "dir" },67{ FTS_D, "dirl", "dirl" },68{ FTS_F, "file", "dirl/file" },69{ FTS_D, "up", "dirl/up" },70{ FTS_DL, "dead", "dirl/up/dead" },71{ FTS_DC, "dir", "dirl/up/dir" },72{ FTS_DC, "dirl", "dirl/up/dirl" },73{ FTS_F, "file", "dirl/up/file" },74{ FTS_F, "filel", "dirl/up/filel" },75{ FTS_DP, "up", "dirl/up" },76{ FTS_DP, "dirl", "dirl" },77{ FTS_F, "file", "file" },78{ FTS_F, "filel", "filel" },79{ FTS_NS, "noent", "noent" },80{ 0 }81},82});83}8485ATF_TC(fts_options_logical_nostat);86ATF_TC_HEAD(fts_options_logical_nostat, tc)87{88atf_tc_set_md_var(tc, "descr", "FTS_LOGICAL | FTS_NOSTAT");89}90ATF_TC_BODY(fts_options_logical_nostat, tc)91{92/*93* While FTS_LOGICAL is not documented as being incompatible with94* FTS_NOSTAT, and FTS does not clear FTS_NOSTAT if FTS_LOGICAL is95* set, FTS_LOGICAL effectively nullifies FTS_NOSTAT by overriding96* the follow check in fts_stat(). In theory, FTS could easily be97* changed to only stat links (to check what they point to) in the98* FTS_LOGICAL | FTS_NOSTAT case, which would produce a different99* result here, so keep the test around in case that ever happens.100*/101atf_tc_expect_fail("FTS_LOGICAL nullifies FTS_NOSTAT");102fts_options_prepare(tc);103fts_test(tc, &(struct fts_testcase){104all_paths,105FTS_LOGICAL | FTS_NOSTAT,106(struct fts_expect[]){107{ FTS_DL, "dead", "dead" },108{ FTS_D, "dir", "dir" },109{ FTS_NSOK, "file", "dir/file" },110{ FTS_D, "up", "dir/up" },111{ FTS_DL, "dead", "dir/up/dead" },112{ FTS_DC, "dir", "dir/up/dir" },113{ FTS_DC, "dirl", "dir/up/dirl" },114{ FTS_NSOK, "file", "dir/up/file" },115{ FTS_NSOK, "filel", "dir/up/filel" },116{ FTS_DP, "up", "dir/up" },117{ FTS_DP, "dir", "dir" },118{ FTS_D, "dirl", "dirl" },119{ FTS_NSOK, "file", "dirl/file" },120{ FTS_D, "up", "dirl/up" },121{ FTS_DL, "dead", "dirl/up/dead" },122{ FTS_DC, "dir", "dirl/up/dir" },123{ FTS_DC, "dirl", "dirl/up/dirl" },124{ FTS_NSOK, "file", "dirl/up/file" },125{ FTS_NSOK, "filel", "dirl/up/filel" },126{ FTS_DP, "up", "dirl/up" },127{ FTS_DP, "dirl", "dirl" },128{ FTS_F, "file", "file" },129{ FTS_F, "filel", "filel" },130{ FTS_NS, "noent", "noent" },131{ 0 }132},133});134}135136ATF_TC(fts_options_logical_seedot);137ATF_TC_HEAD(fts_options_logical_seedot, tc)138{139atf_tc_set_md_var(tc, "descr", "FTS_LOGICAL | FTS_SEEDOT");140}141ATF_TC_BODY(fts_options_logical_seedot, tc)142{143fts_options_prepare(tc);144fts_test(tc, &(struct fts_testcase){145all_paths,146FTS_LOGICAL | FTS_SEEDOT,147(struct fts_expect[]){148{ FTS_DL, "dead", "dead" },149{ FTS_D, "dir", "dir" },150{ FTS_DOT, ".", "dir/." },151{ FTS_DOT, "..", "dir/.." },152{ FTS_F, "file", "dir/file" },153{ FTS_D, "up", "dir/up" },154{ FTS_DOT, ".", "dir/up/." },155{ FTS_DOT, "..", "dir/up/.." },156{ FTS_DL, "dead", "dir/up/dead" },157{ FTS_DC, "dir", "dir/up/dir" },158{ FTS_DC, "dirl", "dir/up/dirl" },159{ FTS_F, "file", "dir/up/file" },160{ FTS_F, "filel", "dir/up/filel" },161{ FTS_DP, "up", "dir/up" },162{ FTS_DP, "dir", "dir" },163{ FTS_D, "dirl", "dirl" },164{ FTS_DOT, ".", "dirl/." },165{ FTS_DOT, "..", "dirl/.." },166{ FTS_F, "file", "dirl/file" },167{ FTS_D, "up", "dirl/up" },168{ FTS_DOT, ".", "dirl/up/." },169{ FTS_DOT, "..", "dirl/up/.." },170{ FTS_DL, "dead", "dirl/up/dead" },171{ FTS_DC, "dir", "dirl/up/dir" },172{ FTS_DC, "dirl", "dirl/up/dirl" },173{ FTS_F, "file", "dirl/up/file" },174{ FTS_F, "filel", "dirl/up/filel" },175{ FTS_DP, "up", "dirl/up" },176{ FTS_DP, "dirl", "dirl" },177{ FTS_F, "file", "file" },178{ FTS_F, "filel", "filel" },179{ FTS_NS, "noent", "noent" },180{ 0 }181},182});183}184185ATF_TC(fts_options_physical);186ATF_TC_HEAD(fts_options_physical, tc)187{188atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL");189}190ATF_TC_BODY(fts_options_physical, tc)191{192fts_options_prepare(tc);193fts_test(tc, &(struct fts_testcase){194all_paths,195FTS_PHYSICAL,196(struct fts_expect[]){197{ FTS_SL, "dead", "dead" },198{ FTS_D, "dir", "dir" },199{ FTS_F, "file", "file" },200{ FTS_SL, "up", "up" },201{ FTS_DP, "dir", "dir" },202{ FTS_SL, "dirl", "dirl" },203{ FTS_F, "file", "file" },204{ FTS_SL, "filel", "filel" },205{ FTS_NS, "noent", "noent" },206{ 0 }207},208});209}210211ATF_TC(fts_options_physical_nochdir);212ATF_TC_HEAD(fts_options_physical_nochdir, tc)213{214atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL | FTS_NOCHDIR");215}216ATF_TC_BODY(fts_options_physical_nochdir, tc)217{218fts_options_prepare(tc);219fts_test(tc, &(struct fts_testcase){220all_paths,221FTS_PHYSICAL | FTS_NOCHDIR,222(struct fts_expect[]){223{ FTS_SL, "dead", "dead" },224{ FTS_D, "dir", "dir" },225{ FTS_F, "file", "dir/file" },226{ FTS_SL, "up", "dir/up" },227{ FTS_DP, "dir", "dir" },228{ FTS_SL, "dirl", "dirl" },229{ FTS_F, "file", "file" },230{ FTS_SL, "filel", "filel" },231{ FTS_NS, "noent", "noent" },232{ 0 }233},234});235}236237ATF_TC(fts_options_physical_comfollow);238ATF_TC_HEAD(fts_options_physical_comfollow, tc)239{240atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL | FTS_COMFOLLOW");241}242ATF_TC_BODY(fts_options_physical_comfollow, tc)243{244fts_options_prepare(tc);245fts_test(tc, &(struct fts_testcase){246all_paths,247FTS_PHYSICAL | FTS_COMFOLLOW,248(struct fts_expect[]){249{ FTS_DL, "dead", "dead" },250{ FTS_D, "dir", "dir" },251{ FTS_F, "file", "file" },252{ FTS_SL, "up", "up" },253{ FTS_DP, "dir", "dir" },254{ FTS_D, "dirl", "dirl" },255{ FTS_F, "file", "file" },256{ FTS_SL, "up", "up" },257{ FTS_DP, "dirl", "dirl" },258{ FTS_F, "file", "file" },259{ FTS_F, "filel", "filel" },260{ FTS_NS, "noent", "noent" },261{ 0 }262},263});264}265266ATF_TC(fts_options_physical_comfollowdir);267ATF_TC_HEAD(fts_options_physical_comfollowdir, tc)268{269atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL | FTS_COMFOLLOWDIR");270}271ATF_TC_BODY(fts_options_physical_comfollowdir, tc)272{273fts_options_prepare(tc);274fts_test(tc, &(struct fts_testcase){275all_paths,276FTS_PHYSICAL | FTS_COMFOLLOWDIR,277(struct fts_expect[]){278{ FTS_DL, "dead", "dead" },279{ FTS_D, "dir", "dir" },280{ FTS_F, "file", "file" },281{ FTS_SL, "up", "up" },282{ FTS_DP, "dir", "dir" },283{ FTS_D, "dirl", "dirl" },284{ FTS_F, "file", "file" },285{ FTS_SL, "up", "up" },286{ FTS_DP, "dirl", "dirl" },287{ FTS_F, "file", "file" },288{ FTS_SL, "filel", "filel" },289{ FTS_NS, "noent", "noent" },290{ 0 }291},292});293}294295ATF_TC(fts_options_physical_nostat);296ATF_TC_HEAD(fts_options_physical_nostat, tc)297{298atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL | FTS_NOSTAT");299}300ATF_TC_BODY(fts_options_physical_nostat, tc)301{302fts_options_prepare(tc);303fts_test(tc, &(struct fts_testcase){304all_paths,305FTS_PHYSICAL | FTS_NOSTAT,306(struct fts_expect[]){307{ FTS_SL, "dead", "dead" },308{ FTS_D, "dir", "dir" },309{ FTS_NSOK, "file", "file" },310{ FTS_NSOK, "up", "up" },311{ FTS_DP, "dir", "dir" },312{ FTS_SL, "dirl", "dirl" },313{ FTS_F, "file", "file" },314{ FTS_SL, "filel", "filel" },315{ FTS_NS, "noent", "noent" },316{ 0 }317},318});319}320321ATF_TC(fts_options_physical_nostat_type);322ATF_TC_HEAD(fts_options_physical_nostat_type, tc)323{324atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL | FTS_NOSTAT_TYPE");325}326ATF_TC_BODY(fts_options_physical_nostat_type, tc)327{328fts_options_prepare(tc);329fts_test(tc, &(struct fts_testcase){330all_paths,331FTS_PHYSICAL | FTS_NOSTAT_TYPE,332(struct fts_expect[]){333{ FTS_SL, "dead", "dead" },334{ FTS_D, "dir", "dir" },335{ FTS_F, "file", "file" },336{ FTS_SL, "up", "up" },337{ FTS_DP, "dir", "dir" },338{ FTS_SL, "dirl", "dirl" },339{ FTS_F, "file", "file" },340{ FTS_SL, "filel", "filel" },341{ FTS_NS, "noent", "noent" },342{ 0 }343},344});345}346347ATF_TC(fts_options_physical_seedot);348ATF_TC_HEAD(fts_options_physical_seedot, tc)349{350atf_tc_set_md_var(tc, "descr", "FTS_PHYSICAL | FTS_SEEDOT");351}352ATF_TC_BODY(fts_options_physical_seedot, tc)353{354fts_options_prepare(tc);355fts_test(tc, &(struct fts_testcase){356all_paths,357FTS_PHYSICAL | FTS_SEEDOT,358(struct fts_expect[]){359{ FTS_SL, "dead", "dead" },360{ FTS_D, "dir", "dir" },361{ FTS_DOT, ".", "." },362{ FTS_DOT, "..", ".." },363{ FTS_F, "file", "file" },364{ FTS_SL, "up", "up" },365{ FTS_DP, "dir", "dir" },366{ FTS_SL, "dirl", "dirl" },367{ FTS_F, "file", "file" },368{ FTS_SL, "filel", "filel" },369{ FTS_NS, "noent", "noent" },370{ 0 }371},372});373}374375/*376* TODO: Add tests for FTS_XDEV and FTS_WHITEOUT377*/378379ATF_TP_ADD_TCS(tp)380{381fts_check_debug();382ATF_TP_ADD_TC(tp, fts_options_logical);383ATF_TP_ADD_TC(tp, fts_options_logical_nostat);384ATF_TP_ADD_TC(tp, fts_options_logical_seedot);385ATF_TP_ADD_TC(tp, fts_options_physical);386ATF_TP_ADD_TC(tp, fts_options_physical_nochdir);387ATF_TP_ADD_TC(tp, fts_options_physical_comfollow);388ATF_TP_ADD_TC(tp, fts_options_physical_comfollowdir);389ATF_TP_ADD_TC(tp, fts_options_physical_nostat);390ATF_TP_ADD_TC(tp, fts_options_physical_nostat_type);391ATF_TP_ADD_TC(tp, fts_options_physical_seedot);392return (atf_no_error());393}394395396