Files
VeillaxandClaude Sonnet 5.5 ad56fa4e3a
CI / test (push) Successful in 1m8s
Release / release (push) Successful in 3m53s
A website on every address steps aside for websites that name an address on the same port
The wildcard then listens on the machine's other addresses only, in the built-in proxy and in Traefik,
and follows the machine when it gains or loses an address.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-26 22:48:13 -06:00

38 lines
1.3 KiB
Go

package blacktip
import (
"testing"
"git.veillax.com/Veillax/reef/model"
)
func TestWildcardWebsitesStepAsideForNamedAddresses(t *testing.T) {
all := []model.Mapping{
{ID: "a", Proto: model.ProtoHTTPS, BindIP: "0.0.0.0", Port: 443, Hostname: "a.test"},
{ID: "b", Proto: model.ProtoHTTPS, BindIP: "127.0.0.1", Port: 443, Hostname: "b.test"},
{ID: "c", Proto: model.ProtoHTTPS, BindIP: "0.0.0.0", Port: 8443, Hostname: "c.test"},
{ID: "d", Proto: model.ProtoTCP, BindIP: "0.0.0.0", Port: 443},
}
// the wildcard on 443 gives up the address that "b" names
for _, ip := range bindIPs(all[0], all) {
if ip == "127.0.0.1" {
t.Fatalf("wildcard still listens on 127.0.0.1: %v", bindIPs(all[0], all))
}
}
// the named address keeps its own listener
if got := bindIPs(all[1], all); len(got) != 1 || got[0] != "127.0.0.1" {
t.Fatalf("named mapping: %v", got)
}
// a different port, or a raw TCP port, is not affected
if got := bindIPs(all[2], all); len(got) != 1 || got[0] != "0.0.0.0" {
t.Fatalf("other port: %v", got)
}
if got := bindIPs(all[3], all); len(got) != 1 || got[0] != "0.0.0.0" {
t.Fatalf("raw tcp: %v", got)
}
// with nothing named on that port the wildcard stays a single wildcard listener
if got := bindIPs(all[0], all[:1]); len(got) != 1 || got[0] != "0.0.0.0" {
t.Fatalf("alone: %v", got)
}
}