github.com/pkg/sftp@v1.13.6/internal/encoding/ssh/filexfer/openssh/statvfs_test.go (about) 1 package openssh 2 3 import ( 4 "bytes" 5 "testing" 6 7 sshfx "github.com/pkg/sftp/internal/encoding/ssh/filexfer" 8 ) 9 10 var _ sshfx.PacketMarshaller = &StatVFSExtendedPacket{} 11 12 func init() { 13 RegisterExtensionStatVFS() 14 } 15 16 func TestStatVFSExtendedPacket(t *testing.T) { 17 const ( 18 id = 42 19 path = "/foo" 20 ) 21 22 ep := &StatVFSExtendedPacket{ 23 Path: path, 24 } 25 26 data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil)) 27 if err != nil { 28 t.Fatal("unexpected error:", err) 29 } 30 31 want := []byte{ 32 0x00, 0x00, 0x00, 36, 33 200, 34 0x00, 0x00, 0x00, 42, 35 0x00, 0x00, 0x00, 19, 's', 't', 'a', 't', 'v', 'f', 's', '@', 'o', 'p', 'e', 'n', 's', 's', 'h', '.', 'c', 'o', 'm', 36 0x00, 0x00, 0x00, 4, '/', 'f', 'o', 'o', 37 } 38 39 if !bytes.Equal(data, want) { 40 t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want) 41 } 42 43 var p sshfx.ExtendedPacket 44 45 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 46 if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil { 47 t.Fatal("unexpected error:", err) 48 } 49 50 if p.ExtendedRequest != extensionStatVFS { 51 t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extensionStatVFS) 52 } 53 54 ep, ok := p.Data.(*StatVFSExtendedPacket) 55 if !ok { 56 t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *StatVFSExtendedPacket", p.Data) 57 } 58 59 if ep.Path != path { 60 t.Errorf("UnmarshalPacketBody(): Path was %q, but expected %q", ep.Path, path) 61 } 62 } 63 64 var _ sshfx.PacketMarshaller = &FStatVFSExtendedPacket{} 65 66 func init() { 67 RegisterExtensionFStatVFS() 68 } 69 70 func TestFStatVFSExtendedPacket(t *testing.T) { 71 const ( 72 id = 42 73 path = "/foo" 74 ) 75 76 ep := &FStatVFSExtendedPacket{ 77 Path: path, 78 } 79 80 data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil)) 81 if err != nil { 82 t.Fatal("unexpected error:", err) 83 } 84 85 want := []byte{ 86 0x00, 0x00, 0x00, 37, 87 200, 88 0x00, 0x00, 0x00, 42, 89 0x00, 0x00, 0x00, 20, 'f', 's', 't', 'a', 't', 'v', 'f', 's', '@', 'o', 'p', 'e', 'n', 's', 's', 'h', '.', 'c', 'o', 'm', 90 0x00, 0x00, 0x00, 4, '/', 'f', 'o', 'o', 91 } 92 93 if !bytes.Equal(data, want) { 94 t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want) 95 } 96 97 var p sshfx.ExtendedPacket 98 99 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 100 if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil { 101 t.Fatal("unexpected error:", err) 102 } 103 104 if p.ExtendedRequest != extensionFStatVFS { 105 t.Errorf("UnmarshalPacketBody(): ExtendedRequest was %q, but expected %q", p.ExtendedRequest, extensionFStatVFS) 106 } 107 108 ep, ok := p.Data.(*FStatVFSExtendedPacket) 109 if !ok { 110 t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *FStatVFSExtendedPacket", p.Data) 111 } 112 113 if ep.Path != path { 114 t.Errorf("UnmarshalPacketBody(): Path was %q, but expected %q", ep.Path, path) 115 } 116 } 117 118 var _ sshfx.Packet = &StatVFSExtendedReplyPacket{} 119 120 func TestStatVFSExtendedReplyPacket(t *testing.T) { 121 const ( 122 id = 42 123 path = "/foo" 124 ) 125 126 const ( 127 BlockSize = uint64(iota + 13) 128 FragmentSize 129 Blocks 130 BlocksFree 131 BlocksAvail 132 Files 133 FilesFree 134 FilesAvail 135 FilesystemID 136 MountFlags 137 MaxNameLength 138 ) 139 140 ep := &StatVFSExtendedReplyPacket{ 141 BlockSize: BlockSize, 142 FragmentSize: FragmentSize, 143 Blocks: Blocks, 144 BlocksFree: BlocksFree, 145 BlocksAvail: BlocksAvail, 146 Files: Files, 147 FilesFree: FilesFree, 148 FilesAvail: FilesAvail, 149 FilesystemID: FilesystemID, 150 MountFlags: MountFlags, 151 MaxNameLength: MaxNameLength, 152 } 153 154 data, err := sshfx.ComposePacket(ep.MarshalPacket(id, nil)) 155 if err != nil { 156 t.Fatal("unexpected error:", err) 157 } 158 159 want := []byte{ 160 0x00, 0x00, 0x00, 93, 161 201, 162 0x00, 0x00, 0x00, 42, 163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 13, 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 14, 165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 15, 166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 16, 167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 17, 168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 18, 169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 19, 170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20, 171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 21, 172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 22, 173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 23, 174 } 175 176 if !bytes.Equal(data, want) { 177 t.Fatalf("MarshalPacket() = %X, but wanted %X", data, want) 178 } 179 180 *ep = StatVFSExtendedReplyPacket{} 181 182 p := sshfx.ExtendedReplyPacket{ 183 Data: ep, 184 } 185 186 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 187 if err := p.UnmarshalPacketBody(sshfx.NewBuffer(data[9:])); err != nil { 188 t.Fatal("unexpected error:", err) 189 } 190 191 ep, ok := p.Data.(*StatVFSExtendedReplyPacket) 192 if !ok { 193 t.Fatalf("UnmarshaledPacketBody(): Data was type %T, but expected *StatVFSExtendedReplyPacket", p.Data) 194 } 195 196 if ep.BlockSize != BlockSize { 197 t.Errorf("UnmarshalPacketBody(): BlockSize was %d, but expected %d", ep.BlockSize, BlockSize) 198 } 199 200 if ep.FragmentSize != FragmentSize { 201 t.Errorf("UnmarshalPacketBody(): FragmentSize was %d, but expected %d", ep.FragmentSize, FragmentSize) 202 } 203 204 if ep.Blocks != Blocks { 205 t.Errorf("UnmarshalPacketBody(): Blocks was %d, but expected %d", ep.Blocks, Blocks) 206 } 207 208 if ep.BlocksFree != BlocksFree { 209 t.Errorf("UnmarshalPacketBody(): BlocksFree was %d, but expected %d", ep.BlocksFree, BlocksFree) 210 } 211 212 if ep.BlocksAvail != BlocksAvail { 213 t.Errorf("UnmarshalPacketBody(): BlocksAvail was %d, but expected %d", ep.BlocksAvail, BlocksAvail) 214 } 215 216 if ep.Files != Files { 217 t.Errorf("UnmarshalPacketBody(): Files was %d, but expected %d", ep.Files, Files) 218 } 219 220 if ep.FilesFree != FilesFree { 221 t.Errorf("UnmarshalPacketBody(): FilesFree was %d, but expected %d", ep.FilesFree, FilesFree) 222 } 223 224 if ep.FilesAvail != FilesAvail { 225 t.Errorf("UnmarshalPacketBody(): FilesAvail was %d, but expected %d", ep.FilesAvail, FilesAvail) 226 } 227 228 if ep.FilesystemID != FilesystemID { 229 t.Errorf("UnmarshalPacketBody(): FilesystemID was %d, but expected %d", ep.FilesystemID, FilesystemID) 230 } 231 232 if ep.MountFlags != MountFlags { 233 t.Errorf("UnmarshalPacketBody(): MountFlags was %d, but expected %d", ep.MountFlags, MountFlags) 234 } 235 236 if ep.MaxNameLength != MaxNameLength { 237 t.Errorf("UnmarshalPacketBody(): MaxNameLength was %d, but expected %d", ep.MaxNameLength, MaxNameLength) 238 } 239 }