44 lines
1 KiB
Go
44 lines
1 KiB
Go
|
|
package webrtc
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net"
|
||
|
|
"testing"
|
||
|
|
)
|
||
|
|
|
||
|
|
// TestAlloc_ReturnsRebindablePort exercises the alloc/close/rebind
|
||
|
|
// sequence 100 times. If a fast rebind race existed in normal
|
||
|
|
// conditions, this would surface it.
|
||
|
|
func TestAlloc_ReturnsRebindablePort(t *testing.T) {
|
||
|
|
for i := 0; i < 100; i++ {
|
||
|
|
p, err := Alloc()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("iter %d: Alloc: %v", i, err)
|
||
|
|
}
|
||
|
|
if p == 0 {
|
||
|
|
t.Fatalf("iter %d: expected non-zero port", i)
|
||
|
|
}
|
||
|
|
c, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: p})
|
||
|
|
if err != nil {
|
||
|
|
t.Fatalf("iter %d: rebind port %d: %v", i, p, err)
|
||
|
|
}
|
||
|
|
c.Close()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// TestAlloc_DistinctPorts confirms the OS doesn't hand us the same
|
||
|
|
// ephemeral port twice in quick succession (it shouldn't — the socket
|
||
|
|
// is briefly held in the bound state on close).
|
||
|
|
func TestAlloc_DistinctPorts(t *testing.T) {
|
||
|
|
seen := map[int]bool{}
|
||
|
|
for i := 0; i < 10; i++ {
|
||
|
|
p, err := Alloc()
|
||
|
|
if err != nil {
|
||
|
|
t.Fatal(err)
|
||
|
|
}
|
||
|
|
if seen[p] {
|
||
|
|
t.Fatalf("duplicate port %d", p)
|
||
|
|
}
|
||
|
|
seen[p] = true
|
||
|
|
}
|
||
|
|
}
|