@ -7,7 +7,6 @@ import (
"errors"
"errors"
"fmt"
"fmt"
"net/netip"
"net/netip"
"slices"
"testing"
"testing"
"go4.org/netipx"
"go4.org/netipx"
@ -33,20 +32,18 @@ func TestIPPoolExhaustion(t *testing.T) {
for i := 0 ; i < 5 ; i ++ {
for i := 0 ; i < 5 ; i ++ {
for _ , domain := range domains {
for _ , domain := range domains {
addr s , err := pool . IPForDomain ( from , domain )
addr , err := pool . IPForDomain ( from , domain )
if err != nil {
if err != nil {
errs = append ( errs , fmt . Errorf ( "failed to get IP for domain %q: %w" , domain , err ) )
errs = append ( errs , fmt . Errorf ( "failed to get IP for domain %q: %w" , domain , err ) )
continue
continue
}
}
for _ , addr := range addrs {
if d , ok := assignedIPs [ addr ] ; ok {
if d , ok := assignedIPs [ addr ] ; ok {
if d != domain {
if d != domain {
t . Errorf ( "IP %s reused for domain %q, previously assigned to %q" , addr , domain , d )
t . Errorf ( "IP %s reused for domain %q, previously assigned to %q" , addr , domain , d )
}
} else {
assignedIPs [ addr ] = domain
}
}
} else {
assignedIPs [ addr ] = domain
}
}
}
}
}
}
@ -80,50 +77,36 @@ func TestIPPool(t *testing.T) {
IPSet : addrPool ,
IPSet : addrPool ,
}
}
from := tailcfg . NodeID ( 12345 )
from := tailcfg . NodeID ( 12345 )
addr s , err := pool . IPForDomain ( from , "example.com" )
addr , err := pool . IPForDomain ( from , "example.com" )
if err != nil {
if err != nil {
t . Fatalf ( "ipForDomain() error = %v" , err )
t . Fatalf ( "ipForDomain() error = %v" , err )
}
}
if len ( addrs ) != 2 {
if ! addr . IsValid ( ) {
t . Fatal f( "ipForDomain() returned %d addresses, want 2" , len ( addrs ) )
t . Fatal ( "ipForDomain() returned an invalid address" )
}
}
v4 := addrs [ 0 ]
if ! addr . Is4 ( ) {
v6 := addrs [ 1 ]
t . Errorf ( "Address is not IPv4: %s" , addr )
if ! v4 . Is4 ( ) {
t . Errorf ( "First address is not IPv4: %s" , v4 )
}
if ! v6 . Is6 ( ) {
t . Errorf ( "Second address is not IPv6: %s" , v6 )
}
}
if ! addrPool . Contains ( v4 ) {
if ! addrPool . Contains ( addr ) {
t . Errorf ( "IPv4 address %s not in range %s" , v4 , addrPool )
t . Errorf ( "IPv4 address %s not in range %s" , addr , addrPool )
}
domain , ok := pool . DomainForIP ( from , v4 )
if ! ok {
t . Errorf ( "domainForIP(%s) not found" , v4 )
} else if domain != "example.com" {
t . Errorf ( "domainForIP(%s) = %s, want %s" , v4 , domain , "example.com" )
}
}
domain , ok = pool . DomainForIP ( from , v6 )
domain , ok := pool . DomainForIP ( from , addr )
if ! ok {
if ! ok {
t . Errorf ( "domainForIP(%s) not found" , v6 )
t . Errorf ( "domainForIP(%s) not found" , addr )
} else if domain != "example.com" {
} else if domain != "example.com" {
t . Errorf ( "domainForIP(%s) = %s, want %s" , v6 , domain , "example.com" )
t . Errorf ( "domainForIP(%s) = %s, want %s" , addr , domain , "example.com" )
}
}
addr s 2, err := pool . IPForDomain ( from , "example.com" )
addr 2, err := pool . IPForDomain ( from , "example.com" )
if err != nil {
if err != nil {
t . Fatalf ( "ipForDomain() second call error = %v" , err )
t . Fatalf ( "ipForDomain() second call error = %v" , err )
}
}
if ! slices . Equal ( addrs , addrs2 ) {
if addr . Compare ( addr2 ) != 0 {
t . Errorf ( "ipForDomain() second call = %v, want %v" , addr s 2, addr s )
t . Errorf ( "ipForDomain() second call = %v, want %v" , addr 2, addr )
}
}
}
}