1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
package iprange_test
import (
"net"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/lxc/incus/v6/internal/iprange"
)
// parseRange is a custom parse function to not depend on other packages.
func parseRange(rangeString string) iprange.Range {
ips := strings.Split(rangeString, "-")
start := net.ParseIP(ips[0])
var end net.IP
if len(ips) == 2 {
end = net.ParseIP(ips[1])
}
return iprange.Range{
Start: start,
End: end,
}
}
func TestRange_ContainsIP(t *testing.T) {
type containsIPTest struct {
name string
rangeString string // a string of format <ip>-<ip> optionally just an <ip>
testIP string
expected bool
}
tests := []containsIPTest{
{
name: "ip below range",
rangeString: "10.10.0.0-10.16.0.0",
testIP: "10.0.0.1",
expected: false,
},
{
name: "ip is lower bound",
rangeString: "10.10.0.0-10.16.0.0",
testIP: "10.10.0.0",
expected: true,
},
{
name: "ip in range",
rangeString: "10.10.0.0-10.16.0.0",
testIP: "10.12.59.1",
expected: true,
},
{
name: "ip is upper bound",
rangeString: "10.10.0.0-10.16.0.0",
testIP: "10.16.0.0",
expected: true,
},
{
name: "ip above range",
rangeString: "10.10.0.0-10.16.0.0",
testIP: "10.23.59.1",
expected: false,
},
{
name: "range has no end and ip is below range",
rangeString: "10.10.0.1",
testIP: "10.2.59.1",
expected: false,
},
{
name: "range has no end and ip is in range",
rangeString: "10.10.0.1",
testIP: "10.10.0.1",
expected: true,
},
{
name: "range has no end and ip is above range",
rangeString: "10.10.0.1",
testIP: "10.23.59.1",
expected: false,
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
// arrange
r := parseRange(test.rangeString)
testIP := net.ParseIP(test.testIP)
// act
isContained := r.ContainsIP(testIP)
// assert
assert.Equal(t, test.expected, isContained)
})
}
}
func TestRange_String(t *testing.T) {
type stringTest struct {
name string
rangeString string // a string of format <ip>-<ip> optionally just an <ip>
expected string
}
tests := []stringTest{
{
name: "start and end",
rangeString: "10.10.0.0-10.16.0.5",
expected: "10.10.0.0-10.16.0.5",
},
{
name: "start only",
rangeString: "10.10.0.0",
expected: "10.10.0.0",
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
// arrange
r := parseRange(test.rangeString)
// act
s := r.String()
// assert
assert.Equal(t, test.expected, s)
})
}
}
|