package discover import ( "bytes" "reflect" "testing" ) var testdata = []struct { data []byte packet *packet err error }{ { []byte{0x20, 0x12, 0x10, 0x25, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00}, &packet{ magic: 0x20121025, port: 0x1234, id: "hello", }, nil, }, { []byte{0x20, 0x12, 0x10, 0x25, 0x34, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x21, 0x21}, &packet{ magic: 0x20121025, port: 0x3456, id: "hello!!!", }, nil, }, { []byte{0x19, 0x76, 0x03, 0x09, 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x00, 0x00}, &packet{ magic: 0x19760309, id: "hello!", }, nil, }, { []byte{0x20, 0x12, 0x10, 0x25, 0x12, 0x34, 0x12, 0x34, // reserved bits not set to zero 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x00, 0x00}, nil, errFormat, }, { []byte{0x20, 0x12, 0x10, 0x25, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21}, // missing padding nil, errFormat, }, { []byte{0x19, 0x77, 0x03, 0x09, // incorrect magic 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x00, 0x00}, nil, errBadMagic, }, { []byte{0x19, 0x76, 0x03, 0x09, 0x6c, 0x6c, 0x6c, 0x6c, // length exceeds packet size 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x00, 0x00}, nil, errFormat, }, { []byte{0x19, 0x76, 0x03, 0x09, 0x00, 0x00, 0x00, 0x06, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x21, 0x00, 0x00, 0x23}, // extra data at the end nil, errFormat, }, } func TestDecodePacket(t *testing.T) { for i, test := range testdata { p, err := decodePacket(test.data) if err != test.err { t.Errorf("%d: unexpected error %v", i, err) } else { if !reflect.DeepEqual(p, test.packet) { t.Errorf("%d: incorrect packet\n%v\n%v", i, test.packet, p) } } } } func TestEncodePacket(t *testing.T) { for i, test := range testdata { if test.err != nil { continue } buf := encodePacket(*test.packet) if bytes.Compare(buf, test.data) != 0 { t.Errorf("%d: incorrect encoded packet\n% x\n% 0x", i, test.data, buf) } } }