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