github.com/netdata/go.d.plugin@v0.58.1/pkg/iprange/range_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package iprange 4 5 import ( 6 "fmt" 7 "math/big" 8 "net" 9 "testing" 10 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestV4Range_String(t *testing.T) { 16 tests := map[string]struct { 17 input string 18 wantString string 19 }{ 20 "IP": {input: "192.0.2.0", wantString: "192.0.2.0-192.0.2.0"}, 21 "Range": {input: "192.0.2.0-192.0.2.10", wantString: "192.0.2.0-192.0.2.10"}, 22 "CIDR": {input: "192.0.2.0/24", wantString: "192.0.2.1-192.0.2.254"}, 23 "Mask": {input: "192.0.2.0/255.255.255.0", wantString: "192.0.2.1-192.0.2.254"}, 24 } 25 26 for name, test := range tests { 27 t.Run(name, func(t *testing.T) { 28 r, err := ParseRange(test.input) 29 require.NoError(t, err) 30 31 assert.Equal(t, test.wantString, r.String()) 32 }) 33 } 34 } 35 36 func TestV4Range_Family(t *testing.T) { 37 tests := map[string]struct { 38 input string 39 }{ 40 "IP": {input: "192.0.2.0"}, 41 "Range": {input: "192.0.2.0-192.0.2.10"}, 42 "CIDR": {input: "192.0.2.0/24"}, 43 "Mask": {input: "192.0.2.0/255.255.255.0"}, 44 } 45 46 for name, test := range tests { 47 t.Run(name, func(t *testing.T) { 48 r, err := ParseRange(test.input) 49 require.NoError(t, err) 50 51 assert.Equal(t, V4Family, r.Family()) 52 }) 53 } 54 } 55 56 func TestV4Range_Size(t *testing.T) { 57 tests := map[string]struct { 58 input string 59 wantSize *big.Int 60 }{ 61 "IP": {input: "192.0.2.0", wantSize: big.NewInt(1)}, 62 "Range": {input: "192.0.2.0-192.0.2.10", wantSize: big.NewInt(11)}, 63 "CIDR": {input: "192.0.2.0/24", wantSize: big.NewInt(254)}, 64 "CIDR 31": {input: "192.0.2.0/31", wantSize: big.NewInt(2)}, 65 "CIDR 32": {input: "192.0.2.0/32", wantSize: big.NewInt(1)}, 66 "Mask": {input: "192.0.2.0/255.255.255.0", wantSize: big.NewInt(254)}, 67 "Mask 31": {input: "192.0.2.0/255.255.255.254", wantSize: big.NewInt(2)}, 68 "Mask 32": {input: "192.0.2.0/255.255.255.255", wantSize: big.NewInt(1)}, 69 } 70 71 for name, test := range tests { 72 t.Run(name, func(t *testing.T) { 73 r, err := ParseRange(test.input) 74 require.NoError(t, err) 75 76 assert.Equal(t, test.wantSize, r.Size()) 77 }) 78 } 79 } 80 81 func TestV4Range_Contains(t *testing.T) { 82 tests := map[string]struct { 83 input string 84 ip string 85 wantFail bool 86 }{ 87 "inside": {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.5"}, 88 "outside": {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.55", wantFail: true}, 89 "eq start": {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.0"}, 90 "eq end": {input: "192.0.2.0-192.0.2.10", ip: "192.0.2.10"}, 91 "v6": {input: "192.0.2.0-192.0.2.10", ip: "2001:db8::", wantFail: true}, 92 } 93 94 for name, test := range tests { 95 name = fmt.Sprintf("%s (range: %s, ip: %s)", name, test.input, test.ip) 96 t.Run(name, func(t *testing.T) { 97 r, err := ParseRange(test.input) 98 require.NoError(t, err) 99 ip := net.ParseIP(test.ip) 100 require.NotNil(t, ip) 101 102 if test.wantFail { 103 assert.False(t, r.Contains(ip)) 104 } else { 105 assert.True(t, r.Contains(ip)) 106 } 107 }) 108 } 109 } 110 111 func TestV6Range_String(t *testing.T) { 112 tests := map[string]struct { 113 input string 114 wantString string 115 }{ 116 "IP": {input: "2001:db8::", wantString: "2001:db8::-2001:db8::"}, 117 "Range": {input: "2001:db8::-2001:db8::10", wantString: "2001:db8::-2001:db8::10"}, 118 "CIDR": {input: "2001:db8::/126", wantString: "2001:db8::1-2001:db8::2"}, 119 } 120 121 for name, test := range tests { 122 t.Run(name, func(t *testing.T) { 123 r, err := ParseRange(test.input) 124 require.NoError(t, err) 125 126 assert.Equal(t, test.wantString, r.String()) 127 }) 128 } 129 } 130 131 func TestV6Range_Family(t *testing.T) { 132 tests := map[string]struct { 133 input string 134 }{ 135 "IP": {input: "2001:db8::"}, 136 "Range": {input: "2001:db8::-2001:db8::10"}, 137 "CIDR": {input: "2001:db8::/126"}, 138 } 139 140 for name, test := range tests { 141 t.Run(name, func(t *testing.T) { 142 r, err := ParseRange(test.input) 143 require.NoError(t, err) 144 145 assert.Equal(t, V6Family, r.Family()) 146 }) 147 } 148 } 149 150 func TestV6Range_Size(t *testing.T) { 151 tests := map[string]struct { 152 input string 153 wantSize *big.Int 154 }{ 155 "IP": {input: "2001:db8::", wantSize: big.NewInt(1)}, 156 "Range": {input: "2001:db8::-2001:db8::10", wantSize: big.NewInt(17)}, 157 "CIDR": {input: "2001:db8::/120", wantSize: big.NewInt(254)}, 158 "CIDR 127": {input: "2001:db8::/127", wantSize: big.NewInt(2)}, 159 "CIDR 128": {input: "2001:db8::/128", wantSize: big.NewInt(1)}, 160 } 161 162 for name, test := range tests { 163 t.Run(name, func(t *testing.T) { 164 r, err := ParseRange(test.input) 165 require.NoError(t, err) 166 167 assert.Equal(t, test.wantSize, r.Size()) 168 }) 169 } 170 } 171 172 func TestV6Range_Contains(t *testing.T) { 173 tests := map[string]struct { 174 input string 175 ip string 176 wantFail bool 177 }{ 178 "inside": {input: "2001:db8::-2001:db8::10", ip: "2001:db8::5"}, 179 "outside": {input: "2001:db8::-2001:db8::10", ip: "2001:db8::ff", wantFail: true}, 180 "eq start": {input: "2001:db8::-2001:db8::10", ip: "2001:db8::"}, 181 "eq end": {input: "2001:db8::-2001:db8::10", ip: "2001:db8::10"}, 182 "v4": {input: "2001:db8::-2001:db8::10", ip: "192.0.2.0", wantFail: true}, 183 } 184 185 for name, test := range tests { 186 name = fmt.Sprintf("%s (range: %s, ip: %s)", name, test.input, test.ip) 187 t.Run(name, func(t *testing.T) { 188 r, err := ParseRange(test.input) 189 require.NoError(t, err) 190 ip := net.ParseIP(test.ip) 191 require.NotNil(t, ip) 192 193 if test.wantFail { 194 assert.False(t, r.Contains(ip)) 195 } else { 196 assert.True(t, r.Contains(ip)) 197 } 198 }) 199 } 200 }