package match import ( "net/netip" "testing" ) func TestMatch(t *testing.T) { m, err := Compile([]string{`from port`, `client: ,`, `^conn $`}, []string{`trusted-scanner`}) if err != nil { t.Fatal(err) } cases := map[string]string{ "from 203.0.113.9 port 22": "203.0.113.9", "from 2001:db8::9 port 22": "2001:db8::9", "from ::ffff:203.0.113.9 port 22": "203.0.113.9", "from [2001:db8::9] port 22": "2001:db8::9", "from fe80::1%eth0 port 22": "fe80::1", "client: 203.0.113.9, server": "203.0.113.9", "conn 2001:db8:1:2:3:4:5:6": "2001:db8:1:2:3:4:5:6", "from 12:34:56 port 22": "", // a time, not an address "from 999.1.1.1 port 22": "", "from 203.0.113.9 port 22 trusted-scanner": "", // ignored "nothing here": "", } for line, want := range cases { a, ok := m.Match(line) if got := map[bool]string{true: a.String(), false: ""}[ok]; got != want { t.Errorf("%q: %q, want %q", line, got, want) } } if _, err := Compile([]string{" and "}, nil); err == nil { t.Error("two accepted") } if _, err := Compile([]string{" (unclosed"}, nil); err == nil { t.Error("a broken pattern accepted") } } func TestGroup(t *testing.T) { if g := Group(netip.MustParseAddr("2001:db8:1:2:aa::1"), 64); g.String() != "2001:db8:1:2::/64" { t.Errorf("/64: %s", g) } if g := Group(netip.MustParseAddr("203.0.113.9"), 64); g.String() != "203.0.113.9/32" { t.Errorf("IPv4: %s", g) } if g := Group(netip.MustParseAddr("2001:db8::1"), 128); g.String() != "2001:db8::1/128" { t.Errorf("/128: %s", g) } }