Files
prx/internal/nft/nft_test.go
T

79 lines
2.0 KiB
Go

// SPDX-License-Identifier: MIT
package nft
import (
"strings"
"testing"
)
func TestScriptGolden(t *testing.T) {
got, err := Script(Params{
WANInterface: "wlan0",
Mark: 0x100,
Local4: []string{"192.168.1.100"},
})
if err != nil {
t.Fatalf("Script: %v", err)
}
want := `destroy table inet prx
table inet prx {
set wan_local4 {
type ipv4_addr;
elements = { 192.168.1.100 }
}
chain pre {
type filter hook prerouting priority mangle; policy accept;
iifname "wlan0" ct state new ct mark set 0x100
}
chain out {
type filter hook output priority mangle; policy accept;
ct mark 0x100 meta mark set 0x100
ct original ip daddr @wan_local4 meta mark set 0x100
}
}
`
if got != want {
t.Fatalf("unexpected script:\n--- got ---\n%s\n--- want ---\n%s", got, want)
}
}
func TestScriptIncludesIPv6(t *testing.T) {
got, err := Script(Params{
WANInterface: "eth0",
Mark: 0x200,
Local4: []string{"203.0.113.5"},
Local6: []string{"2001:db8::5"},
})
if err != nil {
t.Fatalf("Script: %v", err)
}
for _, needle := range []string{
"set wan_local6",
"elements = { 2001:db8::5 }",
"ct original ip6 daddr @wan_local6 meta mark set 0x200",
} {
if !strings.Contains(got, needle) {
t.Errorf("script missing %q", needle)
}
}
}
func TestScriptAlwaysDestroysFirst(t *testing.T) {
got, _ := Script(Params{WANInterface: "wlan0", Mark: 1, Local4: []string{"1.2.3.4"}})
if !strings.HasPrefix(got, "destroy table inet prx\n") {
t.Fatal("script must start with destroy table to stay idempotent")
}
}
func TestScriptRejectsInjection(t *testing.T) {
for _, bad := range []string{`wlan0" ; flush ruleset`, "wlan0;x", "", "this-name-is-way-too-long"} {
if _, err := Script(Params{WANInterface: bad, Mark: 1, Local4: []string{"1.2.3.4"}}); err == nil {
t.Errorf("expected error for interface %q", bad)
}
}
if _, err := Script(Params{WANInterface: "wlan0", Mark: 0}); err == nil {
t.Error("expected error for zero mark")
}
}