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