xref: /freebsd/usr.sbin/pw/tests/pw_unit_test.c (revision 92e8a76b87862aa2ee7e6c3f637034e60ffbc2e6)
1*92e8a76bSBaptiste Daroussin /*
2*92e8a76bSBaptiste Daroussin  * Copyright (c) 2026 Baptiste Daroussin <bapt@FreeBSD.org>
3*92e8a76bSBaptiste Daroussin  *
4*92e8a76bSBaptiste Daroussin  * SPDX-License-Identifier: BSD-2-Clause
5*92e8a76bSBaptiste Daroussin  */
6*92e8a76bSBaptiste Daroussin 
7*92e8a76bSBaptiste Daroussin #include <sys/types.h>
8*92e8a76bSBaptiste Daroussin 
9*92e8a76bSBaptiste Daroussin #include <atf-c.h>
10*92e8a76bSBaptiste Daroussin #include <limits.h>
11*92e8a76bSBaptiste Daroussin #include <stdlib.h>
12*92e8a76bSBaptiste Daroussin #include <string.h>
13*92e8a76bSBaptiste Daroussin #include <sysexits.h>
14*92e8a76bSBaptiste Daroussin 
15*92e8a76bSBaptiste Daroussin #include "pw.h"
16*92e8a76bSBaptiste Daroussin #include "pwupd.h"
17*92e8a76bSBaptiste Daroussin 
18*92e8a76bSBaptiste Daroussin struct pwconf conf;
19*92e8a76bSBaptiste Daroussin 
20*92e8a76bSBaptiste Daroussin /* stub */
21*92e8a76bSBaptiste Daroussin struct userconf *
read_userconfig(char const * file __unused)22*92e8a76bSBaptiste Daroussin read_userconfig(char const *file __unused)
23*92e8a76bSBaptiste Daroussin {
24*92e8a76bSBaptiste Daroussin 
25*92e8a76bSBaptiste Daroussin 	return (NULL);
26*92e8a76bSBaptiste Daroussin }
27*92e8a76bSBaptiste Daroussin 
28*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_dash);
ATF_TC_BODY(checkfd_dash,tc)29*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_dash, tc)
30*92e8a76bSBaptiste Daroussin {
31*92e8a76bSBaptiste Daroussin 	char dash[] = "-";
32*92e8a76bSBaptiste Daroussin 
33*92e8a76bSBaptiste Daroussin 	ATF_CHECK_EQ(pw_checkfd(dash), _PWDASH);
34*92e8a76bSBaptiste Daroussin }
35*92e8a76bSBaptiste Daroussin 
36*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_zero);
ATF_TC_BODY(checkfd_zero,tc)37*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_zero, tc)
38*92e8a76bSBaptiste Daroussin {
39*92e8a76bSBaptiste Daroussin 	char zero[] = "0";
40*92e8a76bSBaptiste Daroussin 
41*92e8a76bSBaptiste Daroussin 	ATF_CHECK_EQ(pw_checkfd(zero), 0);
42*92e8a76bSBaptiste Daroussin }
43*92e8a76bSBaptiste Daroussin 
44*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_valid);
ATF_TC_BODY(checkfd_valid,tc)45*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_valid, tc)
46*92e8a76bSBaptiste Daroussin {
47*92e8a76bSBaptiste Daroussin 	char five[] = "5";
48*92e8a76bSBaptiste Daroussin 
49*92e8a76bSBaptiste Daroussin 	ATF_CHECK_EQ(pw_checkfd(five), 5);
50*92e8a76bSBaptiste Daroussin }
51*92e8a76bSBaptiste Daroussin 
52*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_max);
ATF_TC_BODY(checkfd_max,tc)53*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_max, tc)
54*92e8a76bSBaptiste Daroussin {
55*92e8a76bSBaptiste Daroussin 	char max[] = "2147483647";
56*92e8a76bSBaptiste Daroussin 
57*92e8a76bSBaptiste Daroussin 	ATF_CHECK_EQ(pw_checkfd(max), INT_MAX);
58*92e8a76bSBaptiste Daroussin }
59*92e8a76bSBaptiste Daroussin 
60*92e8a76bSBaptiste Daroussin static void
checkfd_invalid(const char * value,const char * errstr)61*92e8a76bSBaptiste Daroussin checkfd_invalid(const char *value, const char *errstr)
62*92e8a76bSBaptiste Daroussin {
63*92e8a76bSBaptiste Daroussin 	pid_t pid;
64*92e8a76bSBaptiste Daroussin 	char buf[32];
65*92e8a76bSBaptiste Daroussin 	char experr[128];
66*92e8a76bSBaptiste Daroussin 
67*92e8a76bSBaptiste Daroussin 	strlcpy(buf, value, sizeof(buf));
68*92e8a76bSBaptiste Daroussin 	snprintf(experr, sizeof(experr),
69*92e8a76bSBaptiste Daroussin 	    "pw_unit_test: Bad file descriptor '%s': %s\n", value, errstr);
70*92e8a76bSBaptiste Daroussin 	pid = atf_utils_fork();
71*92e8a76bSBaptiste Daroussin 	if (pid == 0) {
72*92e8a76bSBaptiste Daroussin 		pw_checkfd(buf);
73*92e8a76bSBaptiste Daroussin 		exit(1);
74*92e8a76bSBaptiste Daroussin 	}
75*92e8a76bSBaptiste Daroussin 	atf_utils_wait(pid, EX_USAGE, "", experr);
76*92e8a76bSBaptiste Daroussin }
77*92e8a76bSBaptiste Daroussin 
78*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_invalid);
ATF_TC_BODY(checkfd_invalid,tc)79*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_invalid, tc)
80*92e8a76bSBaptiste Daroussin {
81*92e8a76bSBaptiste Daroussin 	checkfd_invalid("abc", "invalid");
82*92e8a76bSBaptiste Daroussin }
83*92e8a76bSBaptiste Daroussin 
84*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_negative);
ATF_TC_BODY(checkfd_negative,tc)85*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_negative, tc)
86*92e8a76bSBaptiste Daroussin {
87*92e8a76bSBaptiste Daroussin 	checkfd_invalid("-1", "too small");
88*92e8a76bSBaptiste Daroussin }
89*92e8a76bSBaptiste Daroussin 
90*92e8a76bSBaptiste Daroussin ATF_TC_WITHOUT_HEAD(checkfd_overflow);
ATF_TC_BODY(checkfd_overflow,tc)91*92e8a76bSBaptiste Daroussin ATF_TC_BODY(checkfd_overflow, tc)
92*92e8a76bSBaptiste Daroussin {
93*92e8a76bSBaptiste Daroussin 	checkfd_invalid("999999999999", "too large");
94*92e8a76bSBaptiste Daroussin }
95*92e8a76bSBaptiste Daroussin 
ATF_TP_ADD_TCS(tp)96*92e8a76bSBaptiste Daroussin ATF_TP_ADD_TCS(tp)
97*92e8a76bSBaptiste Daroussin {
98*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_dash);
99*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_zero);
100*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_valid);
101*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_max);
102*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_invalid);
103*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_negative);
104*92e8a76bSBaptiste Daroussin 	ATF_TP_ADD_TC(tp, checkfd_overflow);
105*92e8a76bSBaptiste Daroussin 
106*92e8a76bSBaptiste Daroussin 	return (atf_no_error());
107*92e8a76bSBaptiste Daroussin }
108