Files
server/tests/unit/ip_matcher_test.go
T
2026-01-16 15:49:34 +08:00

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