init
This commit is contained in:
@@ -0,0 +1,150 @@
|
||||
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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user