xref: /freebsd/usr.bin/sockstat/tests/sockstat_test.c (revision d888317796190bec350aea3701b8aed3bfdad4c8)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2025 ConnectWise
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer
12  *    in this position and unchanged.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 #include <sys/param.h>
30 #include <sys/errno.h>
31 
32 #include <atf-c.h>
33 
34 #include "../sockstat.h"
35 
36 ATF_TC_WITHOUT_HEAD(backwards_range);
ATF_TC_BODY(backwards_range,tc)37 ATF_TC_BODY(backwards_range, tc)
38 {
39 	const char portspec[] = "22-21";
40 
41 	ATF_CHECK_EQ(ERANGE, parse_ports(portspec));
42 }
43 
44 ATF_TC_WITHOUT_HEAD(erange_low);
ATF_TC_BODY(erange_low,tc)45 ATF_TC_BODY(erange_low, tc)
46 {
47 	const char portspec[] = "-1";
48 
49 	ATF_CHECK_EQ(ERANGE, parse_ports(portspec));
50 }
51 
52 ATF_TC_WITHOUT_HEAD(erange_high);
ATF_TC_BODY(erange_high,tc)53 ATF_TC_BODY(erange_high, tc)
54 {
55 	const char portspec[] = "65536";
56 
57 	ATF_CHECK_EQ(ERANGE, parse_ports(portspec));
58 }
59 
60 ATF_TC_WITHOUT_HEAD(erange_on_range_end);
ATF_TC_BODY(erange_on_range_end,tc)61 ATF_TC_BODY(erange_on_range_end, tc)
62 {
63 	const char portspec[] = "22-65536";
64 
65 	ATF_CHECK_EQ(ERANGE, parse_ports(portspec));
66 }
67 
68 ATF_TC_WITHOUT_HEAD(multiple);
ATF_TC_BODY(multiple,tc)69 ATF_TC_BODY(multiple, tc)
70 {
71 	const char portspec[] = "80,443";
72 
73 	ATF_REQUIRE_EQ(0, parse_ports(portspec));
74 
75 	ATF_CHECK(!CHK_PORT(0));
76 
77 	ATF_CHECK(!CHK_PORT(79));
78 	ATF_CHECK(CHK_PORT(80));
79 	ATF_CHECK(!CHK_PORT(81));
80 
81 	ATF_CHECK(!CHK_PORT(442));
82 	ATF_CHECK(CHK_PORT(443));
83 	ATF_CHECK(!CHK_PORT(444));
84 }
85 
86 ATF_TC_WITHOUT_HEAD(multiple_plus_ranges);
ATF_TC_BODY(multiple_plus_ranges,tc)87 ATF_TC_BODY(multiple_plus_ranges, tc)
88 {
89 	const char portspec[] = "80,443,500-501,510,520,40000-40002";
90 
91 	ATF_REQUIRE_EQ(0, parse_ports(portspec));
92 
93 	ATF_CHECK(!CHK_PORT(0));
94 
95 	ATF_CHECK(!CHK_PORT(79));
96 	ATF_CHECK(CHK_PORT(80));
97 	ATF_CHECK(!CHK_PORT(81));
98 
99 	ATF_CHECK(!CHK_PORT(442));
100 	ATF_CHECK(CHK_PORT(443));
101 	ATF_CHECK(!CHK_PORT(444));
102 
103 	ATF_CHECK(!CHK_PORT(499));
104 	ATF_CHECK(CHK_PORT(500));
105 	ATF_CHECK(CHK_PORT(501));
106 	ATF_CHECK(!CHK_PORT(502));
107 
108 	ATF_CHECK(!CHK_PORT(519));
109 	ATF_CHECK(CHK_PORT(520));
110 	ATF_CHECK(!CHK_PORT(521));
111 
112 	ATF_CHECK(!CHK_PORT(39999));
113 	ATF_CHECK(CHK_PORT(40000));
114 	ATF_CHECK(CHK_PORT(40001));
115 	ATF_CHECK(CHK_PORT(40002));
116 	ATF_CHECK(!CHK_PORT(40003));
117 }
118 
119 ATF_TC_WITHOUT_HEAD(nonnumeric);
ATF_TC_BODY(nonnumeric,tc)120 ATF_TC_BODY(nonnumeric, tc)
121 {
122 	const char portspec[] = "foo";
123 
124 	ATF_CHECK_EQ(EINVAL, parse_ports(portspec));
125 }
126 
127 ATF_TC_WITHOUT_HEAD(null_range);
ATF_TC_BODY(null_range,tc)128 ATF_TC_BODY(null_range, tc)
129 {
130 	const char portspec[] = "22-22";
131 
132 	ATF_REQUIRE_EQ(0, parse_ports(portspec));
133 
134 	ATF_CHECK(!CHK_PORT(0));
135 	ATF_CHECK(CHK_PORT(22));
136 	ATF_CHECK(!CHK_PORT(23));
137 }
138 
139 ATF_TC_WITHOUT_HEAD(range);
ATF_TC_BODY(range,tc)140 ATF_TC_BODY(range, tc)
141 {
142 	const char portspec[] = "22-25";
143 
144 	ATF_REQUIRE_EQ(0, parse_ports(portspec));
145 
146 	ATF_CHECK(!CHK_PORT(0));
147 	ATF_CHECK(CHK_PORT(22));
148 	ATF_CHECK(CHK_PORT(23));
149 	ATF_CHECK(CHK_PORT(24));
150 	ATF_CHECK(CHK_PORT(25));
151 	ATF_CHECK(!CHK_PORT(26));
152 }
153 
154 ATF_TC_WITHOUT_HEAD(single);
ATF_TC_BODY(single,tc)155 ATF_TC_BODY(single, tc)
156 {
157 	const char portspec[] = "22";
158 
159 	ATF_REQUIRE_EQ(0, parse_ports(portspec));
160 
161 	ATF_CHECK(!CHK_PORT(0));
162 	ATF_CHECK(CHK_PORT(22));
163 }
164 
165 ATF_TC_WITHOUT_HEAD(zero);
ATF_TC_BODY(zero,tc)166 ATF_TC_BODY(zero, tc)
167 {
168 	const char portspec[] = "0";
169 
170 	ATF_REQUIRE_EQ(0, parse_ports(portspec));
171 
172 	ATF_CHECK(CHK_PORT(0));
173 }
174 
ATF_TP_ADD_TCS(tp)175 ATF_TP_ADD_TCS(tp)
176 {
177 	ATF_TP_ADD_TC(tp, backwards_range);
178 	ATF_TP_ADD_TC(tp, erange_low);
179 	ATF_TP_ADD_TC(tp, erange_high);
180 	ATF_TP_ADD_TC(tp, erange_on_range_end);
181 	ATF_TP_ADD_TC(tp, multiple);
182 	ATF_TP_ADD_TC(tp, multiple_plus_ranges);
183 	ATF_TP_ADD_TC(tp, nonnumeric);
184 	ATF_TP_ADD_TC(tp, null_range);
185 	ATF_TP_ADD_TC(tp, range);
186 	ATF_TP_ADD_TC(tp, single);
187 	ATF_TP_ADD_TC(tp, zero);
188 
189 	return (atf_no_error());
190 }
191