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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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); 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 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