package tablewatch import ( "encoding/binary" "testing" "golang.org/x/sys/unix" ) // msg is a netlink message of a type, with a few bytes of payload. func msg(typ uint16) []byte { b := make([]byte, unix.NLMSG_HDRLEN+4) binary.NativeEndian.PutUint32(b[0:4], uint32(len(b))) binary.NativeEndian.PutUint16(b[4:6], typ) return b } func TestDeletesTable(t *testing.T) { nft := func(m uint16) uint16 { return unix.NFNL_SUBSYS_NFTABLES<<8 | m } newRule, delTable, delChain := msg(nft(unix.NFT_MSG_NEWRULE)), msg(nft(unix.NFT_MSG_DELTABLE)), msg(nft(unix.NFT_MSG_DELCHAIN)) cases := []struct { b []byte want bool }{ {delTable, true}, {append(append([]byte{}, newRule...), delTable...), true}, {append(append([]byte{}, newRule...), delChain...), false}, {newRule, false}, {delTable[:10], false}, {nil, false}, } for i, c := range cases { if got := DeletesTable(c.b); got != c.want { t.Errorf("%d: %v", i, got) } } }