package openssh import ( "bytes" "testing" sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer" ) var _ sshfx.PacketMarshaller = &StatVFSExtendedPacket{} func init() { RegisterExtensionStatVFS() } func TestStatVFSExtendedPacket(t *testing.T) { const ( id = 42 path = "/foo" ) ep := &StatVFSExtendedPacket{ Path: path, } data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 36, 200, 0x00, 0x00, 0x00, 42, 0x00, 0x00, 0x00, 19, 's', 't', 'a', 't', 'v', 'f', 's', '@', 'o', 'p', 'e', 'n', 's', 's', 'h', '.', 'c', 'o', 'm', 0x00, 0x00, 0x00, 4, '/', 'f', 'o', 'o', } if !bytes.Equal(data, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want) } var p sshfx.ExtendedPacket // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil { t.Fatal("unexpected error:", err) } if p.ExtendedRequest != extensionStatVFS { t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extensionStatVFS) } ep, ok := p.Data.(*StatVFSExtendedPacket) if !ok { t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *StatVFSExtendedPacket", p.Data) } if ep.Path != path { t.Errorf("UnmarshalPacketBody(): Path was %q, but expected %q", ep.Path, path) } } var _ sshfx.PacketMarshaller = &FStatVFSExtendedPacket{} func init() { RegisterExtensionFStatVFS() } func TestFStatVFSExtendedPacket(t *testing.T) { const ( id = 42 path = "/foo" ) ep := &FStatVFSExtendedPacket{ Path: path, } data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 37, 200, 0x00, 0x00, 0x00, 42, 0x00, 0x00, 0x00, 20, 'f', 's', 't', 'a', 't', 'v', 'f', 's', '@', 'o', 'p', 'e', 'n', 's', 's', 'h', '.', 'c', 'o', 'm', 0x00, 0x00, 0x00, 4, '/', 'f', 'o', 'o', } if !bytes.Equal(data, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want) } var p sshfx.ExtendedPacket // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil { t.Fatal("unexpected error:", err) } if p.ExtendedRequest != extensionFStatVFS { t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extensionFStatVFS) } ep, ok := p.Data.(*FStatVFSExtendedPacket) if !ok { t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *FStatVFSExtendedPacket", p.Data) } if ep.Path != path { t.Errorf("UnmarshalPacketBody(): Path was %q, but expected %q", ep.Path, path) } } var _ sshfx.Packet = &StatVFSExtendedReplyPacket{} func TestStatVFSExtendedReplyPacket(t *testing.T) { const ( id = 42 path = "/foo" ) const ( BlockSize = uint64(iota + 13) FragmentSize Blocks BlocksFree BlocksAvail Files FilesFree FilesAvail FilesystemID MountFlags MaxNameLength ) ep := &StatVFSExtendedReplyPacket{ BlockSize: BlockSize, FragmentSize: FragmentSize, Blocks: Blocks, BlocksFree: BlocksFree, BlocksAvail: BlocksAvail, Files: Files, FilesFree: FilesFree, FilesAvail: FilesAvail, FilesystemID: FilesystemID, MountFlags: MountFlags, MaxNameLength: MaxNameLength, } data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil)) if err != nil { t.Fatal("unexpected error:", err) } want := []byte{ 0x00, 0x00, 0x00, 93, 201, 0x00, 0x00, 0x00, 42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23, } if !bytes.Equal(data, want) { t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want) } *ep = StatVFSExtendedReplyPacket{} p := sshfx.ExtendedReplyPacket{ Data: ep, } // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil { t.Fatal("unexpected error:", err) } ep, ok := p.Data.(*StatVFSExtendedReplyPacket) if !ok { t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *StatVFSExtendedReplyPacket", p.Data) } if ep.BlockSize != BlockSize { t.Errorf("UnmarshalPacketBody(): BlockSize was %d, but expected %d", ep.BlockSize, BlockSize) } if ep.FragmentSize != FragmentSize { t.Errorf("UnmarshalPacketBody(): FragmentSize was %d, but expected %d", ep.FragmentSize, FragmentSize) } if ep.Blocks != Blocks { t.Errorf("UnmarshalPacketBody(): Blocks was %d, but expected %d", ep.Blocks, Blocks) } if ep.BlocksFree != BlocksFree { t.Errorf("UnmarshalPacketBody(): BlocksFree was %d, but expected %d", ep.BlocksFree, BlocksFree) } if ep.BlocksAvail != BlocksAvail { t.Errorf("UnmarshalPacketBody(): BlocksAvail was %d, but expected %d", ep.BlocksAvail, BlocksAvail) } if ep.Files != Files { t.Errorf("UnmarshalPacketBody(): Files was %d, but expected %d", ep.Files, Files) } if ep.FilesFree != FilesFree { t.Errorf("UnmarshalPacketBody(): FilesFree was %d, but expected %d", ep.FilesFree, FilesFree) } if ep.FilesAvail != FilesAvail { t.Errorf("UnmarshalPacketBody(): FilesAvail was %d, but expected %d", ep.FilesAvail, FilesAvail) } if ep.FilesystemID != FilesystemID { t.Errorf("UnmarshalPacketBody(): FilesystemID was %d, but expected %d", ep.FilesystemID, FilesystemID) } if ep.MountFlags != MountFlags { t.Errorf("UnmarshalPacketBody(): MountFlags was %d, but expected %d", ep.MountFlags, MountFlags) } if ep.MaxNameLength != MaxNameLength { t.Errorf("UnmarshalPacketBody(): MaxNameLength was %d, but expected %d", ep.MaxNameLength, MaxNameLength) } }