github.com/pkg/sftp@v1.13.6/internal/encoding/ssh/filexfer/handle_packets_test.go (about) 1 package sshfx 2 3 import ( 4 "bytes" 5 "testing" 6 ) 7 8 var _ Packet = &ClosePacket{} 9 10 func TestClosePacket(t *testing.T) { 11 const ( 12 id = 42 13 handle = "somehandle" 14 ) 15 16 p := &ClosePacket{ 17 Handle: "somehandle", 18 } 19 20 buf, err := ComposePacket(p.MarshalPacket(id, nil)) 21 if err != nil { 22 t.Fatal("unexpected error:", err) 23 } 24 25 want := []byte{ 26 0x00, 0x00, 0x00, 19, 27 4, 28 0x00, 0x00, 0x00, 42, 29 0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e', 30 } 31 32 if !bytes.Equal(buf, want) { 33 t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) 34 } 35 36 *p = ClosePacket{} 37 38 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 39 if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { 40 t.Fatal("unexpected error:", err) 41 } 42 43 if p.Handle != handle { 44 t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", p.Handle, handle) 45 } 46 } 47 48 var _ Packet = &ReadPacket{} 49 50 func TestReadPacket(t *testing.T) { 51 const ( 52 id = 42 53 handle = "somehandle" 54 offset uint64 = 0x123456789ABCDEF0 55 length uint32 = 0xFEDCBA98 56 ) 57 58 p := &ReadPacket{ 59 Handle: "somehandle", 60 Offset: offset, 61 Length: length, 62 } 63 64 buf, err := ComposePacket(p.MarshalPacket(id, nil)) 65 if err != nil { 66 t.Fatal("unexpected error:", err) 67 } 68 69 want := []byte{ 70 0x00, 0x00, 0x00, 31, 71 5, 72 0x00, 0x00, 0x00, 42, 73 0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e', 74 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 75 0xFE, 0xDC, 0xBA, 0x98, 76 } 77 78 if !bytes.Equal(buf, want) { 79 t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) 80 } 81 82 *p = ReadPacket{} 83 84 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 85 if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { 86 t.Fatal("unexpected error:", err) 87 } 88 89 if p.Handle != handle { 90 t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", p.Handle, handle) 91 } 92 93 if p.Offset != offset { 94 t.Errorf("UnmarshalPacketBody(): Offset was %x, but expected %x", p.Offset, offset) 95 } 96 97 if p.Length != length { 98 t.Errorf("UnmarshalPacketBody(): Length was %x, but expected %x", p.Length, length) 99 } 100 } 101 102 var _ Packet = &WritePacket{} 103 104 func TestWritePacket(t *testing.T) { 105 const ( 106 id = 42 107 handle = "somehandle" 108 offset uint64 = 0x123456789ABCDEF0 109 ) 110 111 var payload = []byte(`foobar`) 112 113 p := &WritePacket{ 114 Handle: "somehandle", 115 Offset: offset, 116 Data: payload, 117 } 118 119 buf, err := ComposePacket(p.MarshalPacket(id, nil)) 120 if err != nil { 121 t.Fatal("unexpected error:", err) 122 } 123 124 want := []byte{ 125 0x00, 0x00, 0x00, 37, 126 6, 127 0x00, 0x00, 0x00, 42, 128 0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e', 129 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0, 130 0x00, 0x00, 0x00, 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 131 } 132 133 if !bytes.Equal(buf, want) { 134 t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) 135 } 136 137 *p = WritePacket{} 138 139 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 140 if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { 141 t.Fatal("unexpected error:", err) 142 } 143 144 if p.Handle != handle { 145 t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", p.Handle, handle) 146 } 147 148 if p.Offset != offset { 149 t.Errorf("UnmarshalPacketBody(): Offset was %x, but expected %x", p.Offset, offset) 150 } 151 152 if !bytes.Equal(p.Data, payload) { 153 t.Errorf("UnmarshalPacketBody(): Data was %X, but expected %X", p.Data, payload) 154 } 155 } 156 157 var _ Packet = &FStatPacket{} 158 159 func TestFStatPacket(t *testing.T) { 160 const ( 161 id = 42 162 handle = "somehandle" 163 ) 164 165 p := &FStatPacket{ 166 Handle: "somehandle", 167 } 168 169 buf, err := ComposePacket(p.MarshalPacket(id, nil)) 170 if err != nil { 171 t.Fatal("unexpected error:", err) 172 } 173 174 want := []byte{ 175 0x00, 0x00, 0x00, 19, 176 8, 177 0x00, 0x00, 0x00, 42, 178 0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e', 179 } 180 181 if !bytes.Equal(buf, want) { 182 t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) 183 } 184 185 *p = FStatPacket{} 186 187 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 188 if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { 189 t.Fatal("unexpected error:", err) 190 } 191 192 if p.Handle != handle { 193 t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", p.Handle, handle) 194 } 195 } 196 197 var _ Packet = &FSetstatPacket{} 198 199 func TestFSetstatPacket(t *testing.T) { 200 const ( 201 id = 42 202 handle = "somehandle" 203 perms = 0x87654321 204 ) 205 206 p := &FSetstatPacket{ 207 Handle: "somehandle", 208 Attrs: Attributes{ 209 Flags: AttrPermissions, 210 Permissions: perms, 211 }, 212 } 213 214 buf, err := ComposePacket(p.MarshalPacket(id, nil)) 215 if err != nil { 216 t.Fatal("unexpected error:", err) 217 } 218 219 want := []byte{ 220 0x00, 0x00, 0x00, 27, 221 10, 222 0x00, 0x00, 0x00, 42, 223 0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e', 224 0x00, 0x00, 0x00, 0x04, 225 0x87, 0x65, 0x43, 0x21, 226 } 227 228 if !bytes.Equal(buf, want) { 229 t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) 230 } 231 232 *p = FSetstatPacket{} 233 234 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 235 if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { 236 t.Fatal("unexpected error:", err) 237 } 238 239 if p.Handle != handle { 240 t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", p.Handle, handle) 241 } 242 } 243 244 var _ Packet = &ReadDirPacket{} 245 246 func TestReadDirPacket(t *testing.T) { 247 const ( 248 id = 42 249 handle = "somehandle" 250 ) 251 252 p := &ReadDirPacket{ 253 Handle: "somehandle", 254 } 255 256 buf, err := ComposePacket(p.MarshalPacket(id, nil)) 257 if err != nil { 258 t.Fatal("unexpected error:", err) 259 } 260 261 want := []byte{ 262 0x00, 0x00, 0x00, 19, 263 12, 264 0x00, 0x00, 0x00, 42, 265 0x00, 0x00, 0x00, 10, 's', 'o', 'm', 'e', 'h', 'a', 'n', 'd', 'l', 'e', 266 } 267 268 if !bytes.Equal(buf, want) { 269 t.Fatalf("MarshalPacket() = %X, but wanted %X", buf, want) 270 } 271 272 *p = ReadDirPacket{} 273 274 // UnmarshalPacketBody assumes the (length, type, request-id) have already been consumed. 275 if err := p.UnmarshalPacketBody(NewBuffer(buf[9:])); err != nil { 276 t.Fatal("unexpected error:", err) 277 } 278 279 if p.Handle != handle { 280 t.Errorf("UnmarshalPacketBody(): Handle was %q, but expected %q", p.Handle, handle) 281 } 282 }