diff --git a/bin/df/Makefile b/bin/df/Makefile --- a/bin/df/Makefile +++ b/bin/df/Makefile @@ -1,8 +1,12 @@ -PACKAGE=runtime +.include +PACKAGE=runtime PROG= df SRCS= df.c LIBADD= xo util +HAS_TESTS= +SUBDIR.${MK_TESTS}+= tests + .include diff --git a/bin/df/tests/Makefile b/bin/df/tests/Makefile new file mode 100644 --- /dev/null +++ b/bin/df/tests/Makefile @@ -0,0 +1,13 @@ +PACKAGE= tests + +ATF_TESTS_SH= t_df + +PROGS+= h_df +BINDIR.h_df= ${TESTSDIR} + +.PATH: ${SRCTOP}/bin/df +SRCS= df.c getmntinfo.c + +LIBADD= xo util + +.include diff --git a/bin/df/tests/Makefile.depend b/bin/df/tests/Makefile.depend new file mode 100644 --- /dev/null +++ b/bin/df/tests/Makefile.depend @@ -0,0 +1,10 @@ +# Autogenerated - do NOT edit! + +DIRDEPS = \ + + +.include + +.if ${DEP_RELDIR} == ${_DEP_RELDIR} +# local dependencies - needed for -jN in clean tree +.endif diff --git a/bin/df/tests/getmntinfo.c b/bin/df/tests/getmntinfo.c new file mode 100644 --- /dev/null +++ b/bin/df/tests/getmntinfo.c @@ -0,0 +1,187 @@ +/* + * Copyright (c) 2007 The NetBSD Foundation, Inc. + * All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +#include +#include +#include + +#define KB * 1024 +#define MB * 1024 KB +#define GB * 1024 MB + +static struct statfs *getnewstatfs(void); +static void other_variants(const struct statfs *, const int *, int, + const int *, int); +static void setup_filer(void); +static void setup_ld0g(void); +static void setup_strpct(void); + +static struct statfs *allstatfs; +static int sftotal, sfused; + +struct statfs * +getnewstatfs(void) +{ + if (sftotal == sfused) { + sftotal = sftotal ? sftotal * 2 : 1; + allstatfs = realloc(allstatfs, + sftotal * sizeof(struct statfs)); + if (allstatfs == NULL) + err(EXIT_FAILURE, "realloc"); + } + + return (&allstatfs[sfused++]); +} + +void +other_variants(const struct statfs *tmpl, const int *minfree, int minfreecnt, + const int *consumed, int consumedcnt) +{ + int64_t total, used; + struct statfs *sf; + int i, j; + + for (i = 0; i < minfreecnt; i++) + for (j = 0; j < consumedcnt; j++) { + sf = getnewstatfs(); + *sf = *tmpl; + total = (int64_t)(u_long)sf->f_blocks * sf->f_bsize; + used = total * consumed[j] / 100; + sf->f_bfree = (total - used) / sf->f_bsize; + sf->f_bavail = (total * (100 - minfree[i]) / 100 - + used) / (int)sf->f_bsize; + } +} + +/* + * Parameter taken from: + * http://mail-index.NetBSD.org/tech-userlevel/2004/03/24/0001.html + */ +void +setup_filer(void) +{ + static const struct statfs tmpl = { +#define BSIZE 512 +#define TOTAL 1147ULL GB +#define USED 132ULL MB + .f_bsize = BSIZE, + .f_blocks = TOTAL / BSIZE, + .f_bfree = (TOTAL - USED) / BSIZE, + .f_bavail = (TOTAL - USED) / BSIZE, + .f_mntfromname = "filer:/", + .f_mntonname = "/filer", +#undef USED +#undef TOTAL +#undef BSIZE + }; + static const int minfree[] = { 0, 5, 10, 15, }; + static const int consumed[] = { 0, 20, 60, 95, 100 }; + + *getnewstatfs() = tmpl; + other_variants(&tmpl, minfree, sizeof(minfree) / sizeof(minfree[0]), + consumed, sizeof(consumed) / sizeof(consumed[0])); +} + +/* + * Parameter taken from: + * http://mail-index.NetBSD.org/current-users/2004/03/01/0038.html + */ +void +setup_ld0g(void) +{ + static const struct statfs tmpl = { +#define BSIZE 4096 /* Guess */ +#define TOTAL 1308726116ULL KB +#define USED 17901268ULL KB +#define AVAIL 1225388540ULL KB + .f_bsize = BSIZE, + .f_blocks = TOTAL / BSIZE, + .f_bfree = (TOTAL - USED) / BSIZE, + .f_bavail = AVAIL / BSIZE, + .f_mntfromname = "/dev/ld0g", + .f_mntonname = "/anon-root", +#undef AVAIL +#undef USED +#undef TOTAL +#undef BSIZE + }; + static const int minfree[] = { 0, 5, 10, 15, }; + static const int consumed[] = { 0, 20, 60, 95, 100 }; + + *getnewstatfs() = tmpl; + other_variants(&tmpl, minfree, sizeof(minfree) / sizeof(minfree[0]), + consumed, sizeof(consumed) / sizeof(consumed[0])); +} + +/* + * Test of NetBSD's strpct(3) with huge number. + */ +void +setup_strpct(void) +{ + static const struct statfs tmpl = { +#define BSIZE 4096 /* Guess */ +#define TOTAL 0x4ffffffffULL KB +#define USED (TOTAL / 2) +#define AVAIL (TOTAL / 2) + .f_bsize = BSIZE, + .f_blocks = TOTAL / BSIZE, + .f_bfree = (TOTAL - USED) / BSIZE, + .f_bavail = AVAIL / BSIZE, + .f_mntfromname = "/dev/strpct", + .f_mntonname = "/strpct", +#undef AVAIL +#undef USED +#undef TOTAL +#undef BSIZE + }; + + *getnewstatfs() = tmpl; +} + +/* + * Parameter taken from: + * http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=23600 + */ +static void +setup_gnats_pr23600(void) +{ + static const struct statfs tmpl = { +#define BSIZE 512 +#define TOTAL 20971376ULL +#define USED 5719864ULL +#define AVAIL 15251512ULL + .f_bsize = BSIZE, + .f_blocks = TOTAL, + .f_bfree = TOTAL - USED, + .f_bavail = AVAIL, + .f_mntfromname = "/dev/wd0e", + .f_mntonname = "/mount/windows/C", +#undef AVAIL +#undef USED +#undef TOTAL +#undef BSIZE + }; + + *getnewstatfs() = tmpl; +} + +int +getmntinfo(struct statfs **mntbufp, __unused int mode) +{ + setup_filer(); + setup_ld0g(); + setup_strpct(); + setup_gnats_pr23600(); + + *mntbufp = allstatfs; + return (sfused); +} diff --git a/bin/df/tests/t_df.sh b/bin/df/tests/t_df.sh new file mode 100644 --- /dev/null +++ b/bin/df/tests/t_df.sh @@ -0,0 +1,135 @@ +# +# Copyright (c) 2007, 2008 The NetBSD Foundation, Inc. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause +# + +# Adapted from contrib/netbsd-tests/bin/df/t_df.sh +# $NetBSD: t_df.sh,v 1.4 2025/12/14 22:15:20 kre Exp $ + +atf_test_case normal +normal_head() +{ + atf_set "descr" "Checks that the output of df without flags is" \ + "correct according to some already-known, sane" \ + "output" +} +normal_body() +{ + cat >expout <expout <expout <expout <