package filexfer import ( "bytes" "testing" ) type testExtendedData struct { value uint8 } func (d *testExtendedData) MarshalBinary() ([]byte, error) { buf := NewBuffer(make([]byte, 0, 4)) buf.AppendUint8(d.value ^ 0x2a) return buf.Bytes(), nil } func (d *testExtendedData) UnmarshalBinary(data []byte) error { buf := NewBuffer(data) v, err := buf.ConsumeUint8() if err != nil { return err } d.value = v ^ 0x2a return nil } var _ Packet = &ExtendedPacket{} func TestExtendedPacketNoData(t *testing.T) { const ( id = 42 extendedRequest = "foo@example" ) p := &ExtendedPacket{ ExtendedRequest: extendedRequest, } buf, err := ComposePacket(p.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 20, 200, 0x00, 0x00, 0x00, 42, 0x00, 0x00, 0x00, 11, 'f', 'o', 'o', '@', 'e', 'x', 'a', 'm', 'p', 'l', 'e', } if !bytes.Equal(buf, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) } *p = ExtendedPacket{} // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { t.Fatal("unexpected error:", err) } if p.ExtendedRequest != extendedRequest { t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extendedRequest) } } func TestExtendedPacketTestData(t *testing.T) { const ( id = 42 extendedRequest = "foo@example" textValue = 13 ) const value = 13 p := &ExtendedPacket{ ExtendedRequest: extendedRequest, Data: &testExtendedData{ value: textValue, }, } buf, err := ComposePacket(p.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 21, 200, 0x00, 0x00, 0x00, 42, 0x00, 0x00, 0x00, 11, 'f', 'o', 'o', '@', 'e', 'x', 'a', 'm', 'p', 'l', 'e', 0x27, } if !bytes.Equal(buf, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) } *p = ExtendedPacket{ Data: new(testExtendedData), } // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { t.Fatal("unexpected error:", err) } if p.ExtendedRequest != extendedRequest { t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extendedRequest) } if buf, ok := p.Data.(*testExtendedData); !ok { t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf) } else if buf.value != value { t.Errorf("UnmarshalPacketBody(): Data.value was %#x, but expected %#x", buf.value, value) } *p = ExtendedPacket{} // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { t.Fatal("unexpected error:", err) } if p.ExtendedRequest != extendedRequest { t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extendedRequest) } wantBuffer := []byte{0x27} if buf, ok := p.Data.(*Buffer); !ok { t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf) } else if !bytes.Equal(buf.b, wantBuffer) { t.Errorf("UnmarshalPacketBody(): Data was %X, but expected %X", buf.b, wantBuffer) } } var _ Packet = &ExtendedReplyPacket{} func TestExtendedReplyNoData(t *testing.T) { const ( id = 42 ) p := &ExtendedReplyPacket{} buf, err := ComposePacket(p.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 5, 201, 0x00, 0x00, 0x00, 42, } if !bytes.Equal(buf, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) } *p = ExtendedReplyPacket{} // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { t.Fatal("unexpected error:", err) } } func TestExtendedReplyPacketTestData(t *testing.T) { const ( id = 42 textValue = 13 ) const value = 13 p := &ExtendedReplyPacket{ Data: &testExtendedData{ value: textValue, }, } buf, err := ComposePacket(p.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 6, 201, 0x00, 0x00, 0x00, 42, 0x27, } if !bytes.Equal(buf, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) } *p = ExtendedReplyPacket{ Data: new(testExtendedData), } // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { t.Fatal("unexpected error:", err) } if buf, ok := p.Data.(*testExtendedData); !ok { t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf) } else if buf.value != value { t.Errorf("UnmarshalPacketBody(): Data.value was %#x, but expected %#x", buf.value, value) } *p = ExtendedReplyPacket{} // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { t.Fatal("unexpected error:", err) } wantBuffer := []byte{0x27} if buf, ok := p.Data.(*Buffer); !ok { t.Errorf("UnmarshalPacketBody(): Data was type %T, but expected %T", p.Data, buf) } else if !bytes.Equal(buf.b, wantBuffer) { t.Errorf("UnmarshalPacketBody(): Data was %X, but expected %X", buf.b, wantBuffer) } }