diff --git a/random/random.go b/random/random.go index 15c1e55..f99d82e 100644 --- a/random/random.go +++ b/random/random.go @@ -152,6 +152,44 @@ func RandIPv4() net.IP { ) } +// RandIPv4Private Generates a random private IPv4 address. +func RandIPv4Private() net.IP { + n, _ := rand.Int(rand.Reader, big.NewInt(3)) + switch n.Int64() { + case 0: + return net.IPv4( + 10, + byte(RandIntRange(1, 256)), + byte(RandIntRange(1, 256)), + byte(RandIntRange(1, 256)), + ) + case 1: + return net.IPv4( + 172, + byte(RandIntRange(16, 32)), + byte(RandIntRange(1, 256)), + byte(RandIntRange(1, 256)), + ) + default: + return net.IPv4( + 192, + 168, + byte(RandIntRange(1, 256)), + byte(RandIntRange(1, 256)), + ) + } +} + +// RandomIPv4Loopback generates IPv4 Loopback address +func RandIPv4Loopback() net.IP { + return net.IPv4( + 127, + byte(RandIntRange(1, 256)), + byte(RandIntRange(1, 256)), + byte(RandIntRange(1, 256)), + ) +} + // RandIPv6 generates a random IPv6 address. func RandIPv6() net.IP { ip := make(net.IP, net.IPv6len) diff --git a/random/random_test.go b/random/random_test.go index 971708e..150bb91 100644 --- a/random/random_test.go +++ b/random/random_test.go @@ -192,3 +192,43 @@ func TestRandIPv6(t *testing.T) { } } } + +func TestRandIPv4Private(t *testing.T) { + for range 100 { + r := RandIPv4Private() + parsed := net.ParseIP(r.String()) + if parsed == nil { + t.Error("Generated IP is nil: " + r.String()) + } + if parsed.To4() == nil { + t.Error("Generated IP is not a valid IPv4 address: " + r.String()) + } + + // Check if the IP is private + isPrivate := r.IsPrivate() + + if !isPrivate { + t.Error("Generated IP is not in a private range: " + r.String()) + } + } +} + +func TestRandIPv4Loopback(t *testing.T) { + for range 5 { + r := RandIPv4Loopback() + parsed := net.ParseIP(r.String()) + if parsed == nil { + t.Error("Generated IP is nil: " + r.String()) + } + if parsed.To4() == nil { + t.Error("Generated IP is not a valid IPv4 address: " + r.String()) + } + + // Check if the IP is loopback + isLoopback := r.IsLoopback() + + if !isLoopback { + t.Error("Generated IP is not the expected loopback address:" + r.String()) + } + } +}