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