| package sftp |
| |
| import ( |
| "encoding" |
| "fmt" |
| "testing" |
| |
| "github.com/stretchr/testify/assert" |
| ) |
| |
| type _testSender struct { |
| sent chan encoding.BinaryMarshaler |
| } |
| |
| func newTestSender() *_testSender { |
| return &_testSender{make(chan encoding.BinaryMarshaler)} |
| } |
| |
| func (s _testSender) sendPacket(p encoding.BinaryMarshaler) error { |
| s.sent <- p |
| return nil |
| } |
| |
| type fakepacket uint32 |
| |
| func (fakepacket) MarshalBinary() ([]byte, error) { |
| return []byte{}, nil |
| } |
| |
| func (fakepacket) UnmarshalBinary([]byte) error { |
| return nil |
| } |
| |
| func (f fakepacket) id() uint32 { |
| return uint32(f) |
| } |
| |
| type pair struct { |
| in fakepacket |
| out fakepacket |
| } |
| |
| // basic test |
| var ttable1 = []pair{ |
| pair{fakepacket(0), fakepacket(0)}, |
| pair{fakepacket(1), fakepacket(1)}, |
| pair{fakepacket(2), fakepacket(2)}, |
| pair{fakepacket(3), fakepacket(3)}, |
| } |
| |
| // outgoing packets out of order |
| var ttable2 = []pair{ |
| pair{fakepacket(0), fakepacket(0)}, |
| pair{fakepacket(1), fakepacket(4)}, |
| pair{fakepacket(2), fakepacket(1)}, |
| pair{fakepacket(3), fakepacket(3)}, |
| pair{fakepacket(4), fakepacket(2)}, |
| } |
| |
| // incoming packets out of order |
| var ttable3 = []pair{ |
| pair{fakepacket(2), fakepacket(0)}, |
| pair{fakepacket(1), fakepacket(1)}, |
| pair{fakepacket(3), fakepacket(2)}, |
| pair{fakepacket(0), fakepacket(3)}, |
| } |
| |
| var tables = [][]pair{ttable1, ttable2, ttable3} |
| |
| func TestPacketManager(t *testing.T) { |
| sender := newTestSender() |
| s := newPktMgr(sender) |
| |
| for i := range tables { |
| table := tables[i] |
| for _, p := range table { |
| s.incomingPacket(p.in) |
| } |
| for _, p := range table { |
| s.readyPacket(p.out) |
| } |
| for i := 0; i < len(table); i++ { |
| pkt := <-sender.sent |
| id := pkt.(fakepacket).id() |
| assert.Equal(t, id, uint32(i)) |
| } |
| } |
| s.close() |
| } |
| |
| func (p sshFxpRemovePacket) String() string { |
| return fmt.Sprintf("RmPct:%d", p.ID) |
| } |
| func (p sshFxpOpenPacket) String() string { |
| return fmt.Sprintf("OpPct:%d", p.ID) |
| } |
| func (p sshFxpWritePacket) String() string { |
| return fmt.Sprintf("WrPct:%d", p.ID) |
| } |
| func (p sshFxpClosePacket) String() string { |
| return fmt.Sprintf("ClPct:%d", p.ID) |
| } |