package app import "testing" func TestParseTransportConntrackLockLine(t *testing.T) { line := "tcp 6 431999 ESTABLISHED src=10.0.0.2 dst=10.1.0.11 sport=12345 dport=443 src=10.1.0.11 dst=10.0.0.2 sport=443 dport=12345 [ASSURED] mark=0x120 use=1" dst, mark, proto, ok := parseTransportConntrackLockLine(line) if !ok { t.Fatalf("expected line to parse") } if dst.String() != "10.1.0.11" { t.Fatalf("unexpected dst: %s", dst.String()) } if mark != 0x120 { t.Fatalf("unexpected mark: %#x", mark) } if proto != "tcp" { t.Fatalf("unexpected proto: %s", proto) } } func TestParseTransportOwnerLocksFromConntrack(t *testing.T) { raw := "" + "tcp 6 431999 ESTABLISHED src=10.0.0.2 dst=10.1.0.11 sport=1 dport=2 mark=0x120 use=1\n" + "udp 17 60 src=10.0.0.2 dst=10.1.0.12 sport=1 dport=2 mark=288 use=1\n" + "udp 17 60 src=10.0.0.2 dst=10.9.0.12 sport=1 dport=2 mark=0x222 use=1\n" markOwner := map[uint32]transportPolicyMarkOwner{ 0x120: { ClientID: "c1", ClientKind: "singbox", IfaceID: "edge-a", MarkHex: "0x120", }, } st := parseTransportOwnerLocksFromConntrack(raw, markOwner, 13) if st.PolicyRevision != 13 { t.Fatalf("unexpected revision: %d", st.PolicyRevision) } if len(st.Items) != 2 { t.Fatalf("expected 2 locks, got %d (%#v)", len(st.Items), st.Items) } for _, item := range st.Items { if item.ClientID != "c1" { t.Fatalf("unexpected client id: %q", item.ClientID) } if item.MarkHex != "0x120" { t.Fatalf("unexpected mark hex: %q", item.MarkHex) } } } func TestParseTransportConntrackMark(t *testing.T) { if v, ok := parseTransportConntrackMark("0x120"); !ok || v != 0x120 { t.Fatalf("hex mark parse failed: %v %v", v, ok) } if v, ok := parseTransportConntrackMark("288"); !ok || v != 288 { t.Fatalf("dec mark parse failed: %v %v", v, ok) } if _, ok := parseTransportConntrackMark("bad"); ok { t.Fatalf("expected parse error") } }