296 lines
6.9 KiB
Go
296 lines
6.9 KiB
Go
package filexfer
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"testing"
|
|
)
|
|
|
|
func TestStatusPacketIs(t *testing.T) {
|
|
status := &StatusPacket{
|
|
StatusCode: StatusFailure,
|
|
ErrorMessage: "error message",
|
|
LanguageTag: "language tag",
|
|
}
|
|
|
|
if !errors.Is(status, StatusFailure) {
|
|
t.Error("errors.Is(StatusFailure, StatusFailure) != true")
|
|
}
|
|
if !errors.Is(status, &StatusPacket{StatusCode: StatusFailure}) {
|
|
t.Error("errors.Is(StatusFailure, StatusPacket{StatusFailure}) != true")
|
|
}
|
|
if errors.Is(status, StatusOK) {
|
|
t.Error("errors.Is(StatusFailure, StatusFailure) == true")
|
|
}
|
|
if errors.Is(status, &StatusPacket{StatusCode: StatusOK}) {
|
|
t.Error("errors.Is(StatusFailure, StatusPacket{StatusFailure}) == true")
|
|
}
|
|
}
|
|
|
|
var _ Packet = &StatusPacket{}
|
|
|
|
func TestStatusPacket(t *testing.T) {
|
|
const (
|
|
id = 42
|
|
statusCode = StatusBadMessage
|
|
errorMessage = "foo"
|
|
languageTag = "x-example"
|
|
)
|
|
|
|
p := &StatusPacket{
|
|
StatusCode: statusCode,
|
|
ErrorMessage: errorMessage,
|
|
LanguageTag: languageTag,
|
|
}
|
|
|
|
buf, err := ComposePacket(p.MarshalPacket(id, nil))
|
|
if err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
want := []byte{
|
|
0x00, 0x00, 0x00, 29,
|
|
101,
|
|
0x00, 0x00, 0x00, 42,
|
|
0x00, 0x00, 0x00, 5,
|
|
0x00, 0x00, 0x00, 3, 'f', 'o', 'o',
|
|
0x00, 0x00, 0x00, 9, 'x', '-', 'e', 'x', 'a', 'm', 'p', 'l', 'e',
|
|
}
|
|
|
|
if !bytes.Equal(buf, want) {
|
|
t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
|
|
}
|
|
|
|
*p = StatusPacket{}
|
|
|
|
// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
|
|
if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
if p.StatusCode != statusCode {
|
|
t.Errorf("UnmarshalBinary(): StatusCode was %v, but expected %v", p.StatusCode, statusCode)
|
|
}
|
|
|
|
if p.ErrorMessage != errorMessage {
|
|
t.Errorf("UnmarshalBinary(): ErrorMessage was %q, but expected %q", p.ErrorMessage, errorMessage)
|
|
}
|
|
|
|
if p.LanguageTag != languageTag {
|
|
t.Errorf("UnmarshalBinary(): LanguageTag was %q, but expected %q", p.LanguageTag, languageTag)
|
|
}
|
|
}
|
|
|
|
var _ Packet = &HandlePacket{}
|
|
|
|
func TestHandlePacket(t *testing.T) {
|
|
const (
|
|
id = 42
|
|
handle = "somehandle"
|
|
)
|
|
|
|
p := &HandlePacket{
|
|
Handle: "somehandle",
|
|
}
|
|
|
|
buf, err := ComposePacket(p.MarshalPacket(id, nil))
|
|
if err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
want := []byte{
|
|
0x00, 0x00, 0x00, 19,
|
|
102,
|
|
0x00, 0x00, 0x00, 42,
|
|
0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e',
|
|
}
|
|
|
|
if !bytes.Equal(buf, want) {
|
|
t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
|
|
}
|
|
|
|
*p = HandlePacket{}
|
|
|
|
// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
|
|
if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
if p.Handle != handle {
|
|
t.Errorf("UnmarshalBinary(): Handle was %q, but expected %q", p.Handle, handle)
|
|
}
|
|
}
|
|
|
|
var _ Packet = &DataPacket{}
|
|
|
|
func TestDataPacket(t *testing.T) {
|
|
const (
|
|
id = 42
|
|
)
|
|
|
|
var payload = []byte(`foobar`)
|
|
|
|
p := &DataPacket{
|
|
Data: payload,
|
|
}
|
|
|
|
buf, err := ComposePacket(p.MarshalPacket(id, nil))
|
|
if err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
want := []byte{
|
|
0x00, 0x00, 0x00, 15,
|
|
103,
|
|
0x00, 0x00, 0x00, 42,
|
|
0x00, 0x00, 0x00, 6, 'f', 'o', 'o', 'b', 'a', 'r',
|
|
}
|
|
|
|
if !bytes.Equal(buf, want) {
|
|
t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
|
|
}
|
|
|
|
*p = DataPacket{}
|
|
|
|
// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
|
|
if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
if !bytes.Equal(p.Data, payload) {
|
|
t.Errorf("UnmarshalBinary(): Data was %X, but expected %X", p.Data, payload)
|
|
}
|
|
}
|
|
|
|
var _ Packet = &NamePacket{}
|
|
|
|
func TestNamePacket(t *testing.T) {
|
|
const (
|
|
id = 42
|
|
filename = "foo"
|
|
longname = "bar"
|
|
perms = 0x87654300
|
|
)
|
|
|
|
p := &NamePacket{
|
|
Entries: []*NameEntry{
|
|
&NameEntry{
|
|
Filename: filename + "1",
|
|
Longname: longname + "1",
|
|
Attrs: Attributes{
|
|
Flags: AttrPermissions | (1 << 8),
|
|
Permissions: perms | 1,
|
|
},
|
|
},
|
|
&NameEntry{
|
|
Filename: filename + "2",
|
|
Longname: longname + "2",
|
|
Attrs: Attributes{
|
|
Flags: AttrPermissions | (2 << 8),
|
|
Permissions: perms | 2,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
buf, err := ComposePacket(p.MarshalPacket(id, nil))
|
|
if err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
want := []byte{
|
|
0x00, 0x00, 0x00, 57,
|
|
104,
|
|
0x00, 0x00, 0x00, 42,
|
|
0x00, 0x00, 0x00, 0x02,
|
|
0x00, 0x00, 0x00, 4, 'f', 'o', 'o', '1',
|
|
0x00, 0x00, 0x00, 4, 'b', 'a', 'r', '1',
|
|
0x00, 0x00, 0x01, 0x04,
|
|
0x87, 0x65, 0x43, 0x01,
|
|
0x00, 0x00, 0x00, 4, 'f', 'o', 'o', '2',
|
|
0x00, 0x00, 0x00, 4, 'b', 'a', 'r', '2',
|
|
0x00, 0x00, 0x02, 0x04,
|
|
0x87, 0x65, 0x43, 0x02,
|
|
}
|
|
|
|
if !bytes.Equal(buf, want) {
|
|
t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
|
|
}
|
|
|
|
*p = NamePacket{}
|
|
|
|
// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
|
|
if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
if count := len(p.Entries); count != 2 {
|
|
t.Fatalf("UnmarshalBinary(): len(NameEntries) was %d, but expected %d", count, 2)
|
|
}
|
|
|
|
for i, e := range p.Entries {
|
|
if got, want := e.Filename, filename+string('1'+rune(i)); got != want {
|
|
t.Errorf("UnmarshalBinary(): Entries[%d].Filename was %q, but expected %q", i, got, want)
|
|
}
|
|
|
|
if got, want := e.Longname, longname+string('1'+rune(i)); got != want {
|
|
t.Errorf("UnmarshalBinary(): Entries[%d].Longname was %q, but expected %q", i, got, want)
|
|
}
|
|
|
|
if got, want := e.Attrs.Flags, AttrPermissions|((i+1)<<8); got != uint32(want) {
|
|
t.Errorf("UnmarshalBinary(): Entries[%d].Attrs.Flags was %#x, but expected %#x", i, got, want)
|
|
}
|
|
|
|
if got, want := e.Attrs.Permissions, FileMode(perms|(i+1)); got != want {
|
|
t.Errorf("UnmarshalBinary(): Entries[%d].Attrs.Permissions was %#v, but expected %#v", i, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
var _ Packet = &AttrsPacket{}
|
|
|
|
func TestAttrsPacket(t *testing.T) {
|
|
const (
|
|
id = 42
|
|
perms = 0x87654321
|
|
)
|
|
|
|
p := &AttrsPacket{
|
|
Attrs: Attributes{
|
|
Flags: AttrPermissions,
|
|
Permissions: perms,
|
|
},
|
|
}
|
|
|
|
buf, err := ComposePacket(p.MarshalPacket(id, nil))
|
|
if err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
want := []byte{
|
|
0x00, 0x00, 0x00, 13,
|
|
105,
|
|
0x00, 0x00, 0x00, 42,
|
|
0x00, 0x00, 0x00, 0x04,
|
|
0x87, 0x65, 0x43, 0x21,
|
|
}
|
|
|
|
if !bytes.Equal(buf, want) {
|
|
t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want)
|
|
}
|
|
|
|
*p = AttrsPacket{}
|
|
|
|
// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
|
|
if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil {
|
|
t.Fatal("unexpected error:", err)
|
|
}
|
|
|
|
if p.Attrs.Flags != AttrPermissions {
|
|
t.Errorf("UnmarshalBinary(): Attrs.Flags was %#x, but expected %#x", p.Attrs.Flags, AttrPermissions)
|
|
}
|
|
|
|
if p.Attrs.Permissions != perms {
|
|
t.Errorf("UnmarshalBinary(): Attrs.Permissions was %#v, but expected %#v", p.Attrs.Permissions, perms)
|
|
}
|
|
}
|