151 lines
3.7 KiB
Go
151 lines
3.7 KiB
Go
package unit
|
|
|
|
import (
|
|
"net"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
// IPMatcherTestSuite IP 匹配器测试套件
|
|
type IPMatcherTestSuite struct {
|
|
suite.Suite
|
|
}
|
|
|
|
func TestIPMatcherTestSuite(t *testing.T) {
|
|
suite.Run(t, new(IPMatcherTestSuite))
|
|
}
|
|
|
|
func (s *IPMatcherTestSuite) SetupTest() {
|
|
}
|
|
|
|
func (s *IPMatcherTestSuite) TearDownTest() {
|
|
}
|
|
|
|
// isIPInRange 检查 IP 是否在指定范围内
|
|
func isIPInRange(ip, startIP, endIP net.IP) bool {
|
|
ipBytes := ip.To4()
|
|
startBytes := startIP.To4()
|
|
endBytes := endIP.To4()
|
|
|
|
if ipBytes == nil || startBytes == nil || endBytes == nil {
|
|
return false
|
|
}
|
|
|
|
ipInt := uint32(ipBytes[0])<<24 | uint32(ipBytes[1])<<16 | uint32(ipBytes[2])<<8 | uint32(ipBytes[3])
|
|
startInt := uint32(startBytes[0])<<24 | uint32(startBytes[1])<<16 | uint32(startBytes[2])<<8 | uint32(startBytes[3])
|
|
endInt := uint32(endBytes[0])<<24 | uint32(endBytes[1])<<16 | uint32(endBytes[2])<<8 | uint32(endBytes[3])
|
|
|
|
return ipInt >= startInt && ipInt <= endInt
|
|
}
|
|
|
|
// TestIsIPInRange_InRange 测试 IP 在范围内
|
|
func (s *IPMatcherTestSuite) TestIsIPInRange_InRange() {
|
|
ip := net.ParseIP("192.168.1.50")
|
|
startIP := net.ParseIP("192.168.1.1")
|
|
endIP := net.ParseIP("192.168.1.100")
|
|
|
|
s.True(isIPInRange(ip, startIP, endIP))
|
|
}
|
|
|
|
// TestIsIPInRange_AtStart 测试 IP 在范围起点
|
|
func (s *IPMatcherTestSuite) TestIsIPInRange_AtStart() {
|
|
ip := net.ParseIP("192.168.1.1")
|
|
startIP := net.ParseIP("192.168.1.1")
|
|
endIP := net.ParseIP("192.168.1.100")
|
|
|
|
s.True(isIPInRange(ip, startIP, endIP))
|
|
}
|
|
|
|
// TestIsIPInRange_AtEnd 测试 IP 在范围终点
|
|
func (s *IPMatcherTestSuite) TestIsIPInRange_AtEnd() {
|
|
ip := net.ParseIP("192.168.1.100")
|
|
startIP := net.ParseIP("192.168.1.1")
|
|
endIP := net.ParseIP("192.168.1.100")
|
|
|
|
s.True(isIPInRange(ip, startIP, endIP))
|
|
}
|
|
|
|
// TestIsIPInRange_OutOfRange 测试 IP 超出范围
|
|
func (s *IPMatcherTestSuite) TestIsIPInRange_OutOfRange() {
|
|
ip := net.ParseIP("192.168.1.101")
|
|
startIP := net.ParseIP("192.168.1.1")
|
|
endIP := net.ParseIP("192.168.1.100")
|
|
|
|
s.False(isIPInRange(ip, startIP, endIP))
|
|
}
|
|
|
|
// TestIsIPInRange_BeforeRange 测试 IP 在范围之前
|
|
func (s *IPMatcherTestSuite) TestIsIPInRange_BeforeRange() {
|
|
ip := net.ParseIP("192.168.0.255")
|
|
startIP := net.ParseIP("192.168.1.1")
|
|
endIP := net.ParseIP("192.168.1.100")
|
|
|
|
s.False(isIPInRange(ip, startIP, endIP))
|
|
}
|
|
|
|
// TestIsIPInRange_InvalidIP 测试无效 IP
|
|
func (s *IPMatcherTestSuite) TestIsIPInRange_InvalidIP() {
|
|
startIP := net.ParseIP("192.168.1.1")
|
|
endIP := net.ParseIP("192.168.1.100")
|
|
|
|
s.False(isIPInRange(nil, startIP, endIP))
|
|
}
|
|
|
|
// TestCIDRMatch 测试 CIDR 匹配
|
|
func (s *IPMatcherTestSuite) TestCIDRMatch() {
|
|
tests := []struct {
|
|
name string
|
|
ip string
|
|
cidr string
|
|
match bool
|
|
}{
|
|
{"匹配 /24", "192.168.1.100", "192.168.1.0/24", true},
|
|
{"不匹配 /24", "192.168.2.1", "192.168.1.0/24", false},
|
|
{"/32 精确匹配", "192.168.1.1", "192.168.1.1/32", true},
|
|
{"/32 不匹配", "192.168.1.2", "192.168.1.1/32", false},
|
|
{"/16 匹配", "192.168.100.50", "192.168.0.0/16", true},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
s.Run(tt.name, func() {
|
|
ip := net.ParseIP(tt.ip)
|
|
_, ipNet, _ := net.ParseCIDR(tt.cidr)
|
|
|
|
if tt.match {
|
|
s.True(ipNet.Contains(ip))
|
|
} else {
|
|
s.False(ipNet.Contains(ip))
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestIPParsing 测试 IP 解析
|
|
func (s *IPMatcherTestSuite) TestIPParsing() {
|
|
tests := []struct {
|
|
name string
|
|
ip string
|
|
valid bool
|
|
}{
|
|
{"有效 IPv4", "192.168.1.1", true},
|
|
{"有效 IPv4 边界", "255.255.255.255", true},
|
|
{"有效 IPv4 零", "0.0.0.0", true},
|
|
{"无效 IP", "invalid-ip", false},
|
|
{"空字符串", "", false},
|
|
{"超出范围", "256.1.1.1", false},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
s.Run(tt.name, func() {
|
|
ip := net.ParseIP(tt.ip)
|
|
if tt.valid {
|
|
s.NotNil(ip)
|
|
} else {
|
|
s.Nil(ip)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|