Files
Sanaei f727d04f65
CI / go-test (push) Canceled after 0s
CI / postgres-durable-first (push) Canceled after 0s
CI / codegen (push) Canceled after 0s
CI / govulncheck (push) Canceled after 0s
CI / race (push) Canceled after 0s
CI / fuzz-smoke (push) Canceled after 0s
CI / golangci (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CodeQL Advanced / Analyze (go) (push) Canceled after 0s
CodeQL Advanced / Analyze (actions) (push) Canceled after 0s
CodeQL Advanced / Analyze (javascript-typescript) (push) Canceled after 0s
Docs CI / build (push) Canceled after 0s
Docs Deploy (GitHub Pages) / build (push) Canceled after 0s
Release 3X-UI / build (386) (push) Canceled after 0s
Release 3X-UI / build (amd64) (push) Canceled after 0s
Release 3X-UI / build (arm64) (push) Canceled after 0s
Release 3X-UI / build (armv5) (push) Canceled after 0s
Release 3X-UI / build (armv6) (push) Canceled after 0s
Release 3X-UI / build (armv7) (push) Canceled after 0s
Release 3X-UI / build (s390x) (push) Canceled after 0s
Release 3X-UI / Build for Windows (amd64) (push) Canceled after 0s
Deploy Smoke Tests / noninteractive-install (ubuntu-24.04-arm) (push) Canceled after 0s
Deploy Smoke Tests / noninteractive-install (ubuntu-latest) (push) Canceled after 0s
Deploy Smoke Tests / release-tag-install (ubuntu-24.04-arm) (push) Canceled after 0s
Deploy Smoke Tests / release-tag-install (ubuntu-latest) (push) Canceled after 0s
Docs Deploy (GitHub Pages) / deploy (push) Canceled after 0s
Release 3X-UI / Publish rolling dev release (push) Canceled after 0s
v3.7.0
2026-08-24 15:07:15 +02:00

103 lines
2.9 KiB
Go

package amneziawg
import (
"fmt"
"reflect"
"strconv"
"strings"
"testing"
)
func TestForwardedPortsInclude(t *testing.T) {
cases := []struct {
spec string
port int
want bool
}{
{"80,443", 80, true},
{"80,443", 443, true},
{"80,443", 8080, false},
{"8000-8100", 8050, true},
{"8000-8100", 7999, false},
{"8000-8100", 8101, false},
{"", 80, false},
{"not-a-port", 80, false},
}
for _, c := range cases {
if got := ForwardedPortsInclude(c.spec, c.port); got != c.want {
t.Errorf("ForwardedPortsInclude(%q, %d) = %v, want %v", c.spec, c.port, got, c.want)
}
}
}
func TestExpandForwardedPorts(t *testing.T) {
cases := []struct {
name string
spec string
want []int
}{
{"empty", "", nil},
{"malformed", "not-a-port", nil},
{"single ports", "443,80", []int{80, 443}},
{"a range", "8000-8003", []int{8000, 8001, 8002, 8003}},
{
"overlapping-but-distinct ranges dedupe and merge",
"80-90,85-95",
[]int{80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95},
},
{"mixed single ports and a range, unsorted input", "443,80-82,80", []int{80, 81, 82, 443}},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got := ExpandForwardedPorts(c.spec)
if len(got) == 0 && len(c.want) == 0 {
return
}
if !reflect.DeepEqual(got, c.want) {
t.Errorf("ExpandForwardedPorts(%q) = %v, want %v", c.spec, got, c.want)
}
})
}
}
func TestExpandForwardedPortsCapsAtMaxForwardedPorts(t *testing.T) {
got := ExpandForwardedPorts("1-200")
if len(got) != MaxForwardedPorts {
t.Fatalf("len(ExpandForwardedPorts(\"1-200\")) = %d, want %d", len(got), MaxForwardedPorts)
}
for i, port := range got {
if want := i + 1; port != want {
t.Fatalf("ExpandForwardedPorts(\"1-200\")[%d] = %d, want %d (expansion must stop at the cap, not truncate after expanding fully)", i, port, want)
}
}
}
func TestExpandForwardedPortsCapAppliesAcrossMultipleSpecs(t *testing.T) {
// A spec whose total span far exceeds the cap, split across many
// individually-small tokens -- proves the cap is enforced cumulatively
// across specs, not reset (or bypassed) per spec.
tokens := make([]string, 150)
for i := range tokens {
tokens[i] = strconv.Itoa(10000 + i)
}
spec := strings.Join(tokens, ",")
got := ExpandForwardedPorts(spec)
if len(got) != MaxForwardedPorts {
t.Fatalf("len(ExpandForwardedPorts(150 distinct single ports)) = %d, want %d", len(got), MaxForwardedPorts)
}
}
func TestExceedsForwardedPortsCap(t *testing.T) {
atCap := fmt.Sprintf("1-%d", MaxForwardedPorts)
if ExceedsForwardedPortsCap(atCap) {
t.Fatalf("a spec covering exactly %d ports is AT the cap, not over it", MaxForwardedPorts)
}
overCap := fmt.Sprintf("1-%d", MaxForwardedPorts+1)
if !ExceedsForwardedPortsCap(overCap) {
t.Fatalf("a spec covering %d ports must be reported as exceeding the cap", MaxForwardedPorts+1)
}
if ExceedsForwardedPortsCap("1-10") {
t.Fatal("a small spec must not be reported as exceeding the cap")
}
}