2017-03-15 08:49:31 +08:00
|
|
|
package sftp
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding"
|
2017-07-20 10:25:49 +08:00
|
|
|
"fmt"
|
2017-03-15 08:49:31 +08:00
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
2017-04-24 02:32:22 +08:00
|
|
|
type _testSender struct {
|
2017-03-15 08:49:31 +08:00
|
|
|
sent chan encoding.BinaryMarshaler
|
|
|
|
}
|
|
|
|
|
2017-04-24 02:32:22 +08:00
|
|
|
func newTestSender() *_testSender {
|
|
|
|
return &_testSender{make(chan encoding.BinaryMarshaler)}
|
2017-03-15 08:49:31 +08:00
|
|
|
}
|
|
|
|
|
2017-04-24 02:32:22 +08:00
|
|
|
func (s _testSender) sendPacket(p encoding.BinaryMarshaler) error {
|
2017-03-15 08:49:31 +08:00
|
|
|
s.sent <- p
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2018-07-26 07:03:30 +08:00
|
|
|
type fakepacket struct {
|
|
|
|
reqid uint32
|
|
|
|
oid uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
func fake(rid, order uint32) fakepacket {
|
|
|
|
return fakepacket{reqid: rid, oid: order}
|
|
|
|
}
|
2017-03-15 08:49:31 +08:00
|
|
|
|
|
|
|
func (fakepacket) MarshalBinary() ([]byte, error) {
|
|
|
|
return []byte{}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (fakepacket) UnmarshalBinary([]byte) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (f fakepacket) id() uint32 {
|
2018-07-26 07:03:30 +08:00
|
|
|
return f.reqid
|
2017-03-15 08:49:31 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
type pair struct {
|
2018-07-26 07:03:30 +08:00
|
|
|
in, out fakepacket
|
|
|
|
}
|
|
|
|
|
2019-08-30 23:04:37 +08:00
|
|
|
type orderedPair struct {
|
2018-07-26 07:03:30 +08:00
|
|
|
in orderedRequest
|
|
|
|
out orderedResponse
|
2017-03-15 08:49:31 +08:00
|
|
|
}
|
|
|
|
|
2017-04-06 05:38:13 +08:00
|
|
|
// basic test
|
2017-03-15 08:49:31 +08:00
|
|
|
var ttable1 = []pair{
|
2018-07-26 07:03:30 +08:00
|
|
|
pair{fake(0, 0), fake(0, 0)},
|
|
|
|
pair{fake(1, 1), fake(1, 1)},
|
|
|
|
pair{fake(2, 2), fake(2, 2)},
|
|
|
|
pair{fake(3, 3), fake(3, 3)},
|
2017-03-15 08:49:31 +08:00
|
|
|
}
|
|
|
|
|
2017-04-06 05:38:13 +08:00
|
|
|
// outgoing packets out of order
|
2017-03-15 08:49:31 +08:00
|
|
|
var ttable2 = []pair{
|
2018-07-26 07:03:30 +08:00
|
|
|
pair{fake(10, 0), fake(12, 2)},
|
|
|
|
pair{fake(11, 1), fake(11, 1)},
|
|
|
|
pair{fake(12, 2), fake(13, 3)},
|
|
|
|
pair{fake(13, 3), fake(10, 0)},
|
2017-03-15 08:49:31 +08:00
|
|
|
}
|
|
|
|
|
2018-07-26 07:03:30 +08:00
|
|
|
// request ids are not incremental
|
2017-04-06 05:38:13 +08:00
|
|
|
var ttable3 = []pair{
|
2018-07-26 07:03:30 +08:00
|
|
|
pair{fake(7, 0), fake(7, 0)},
|
|
|
|
pair{fake(1, 1), fake(1, 1)},
|
|
|
|
pair{fake(9, 2), fake(3, 3)},
|
|
|
|
pair{fake(3, 3), fake(9, 2)},
|
2017-04-06 05:38:13 +08:00
|
|
|
}
|
|
|
|
|
2018-07-26 07:03:30 +08:00
|
|
|
// request ids are all the same
|
|
|
|
var ttable4 = []pair{
|
|
|
|
pair{fake(1, 0), fake(1, 0)},
|
|
|
|
pair{fake(1, 1), fake(1, 1)},
|
|
|
|
pair{fake(1, 2), fake(1, 3)},
|
|
|
|
pair{fake(1, 3), fake(1, 2)},
|
|
|
|
}
|
|
|
|
|
|
|
|
var tables = [][]pair{ttable1, ttable2, ttable3, ttable4}
|
2017-03-15 08:49:31 +08:00
|
|
|
|
|
|
|
func TestPacketManager(t *testing.T) {
|
2017-04-24 02:32:22 +08:00
|
|
|
sender := newTestSender()
|
2017-03-15 08:49:31 +08:00
|
|
|
s := newPktMgr(sender)
|
2017-04-06 05:38:13 +08:00
|
|
|
|
2017-03-15 08:49:31 +08:00
|
|
|
for i := range tables {
|
|
|
|
table := tables[i]
|
2019-08-30 23:04:37 +08:00
|
|
|
orderedPairs := make([]orderedPair, 0, len(table))
|
2017-03-15 08:49:31 +08:00
|
|
|
for _, p := range table {
|
2019-08-30 23:04:37 +08:00
|
|
|
orderedPairs = append(orderedPairs, orderedPair{
|
2018-07-26 07:03:30 +08:00
|
|
|
in: orderedRequest{p.in, p.in.oid},
|
|
|
|
out: orderedResponse{p.out, p.out.oid},
|
|
|
|
})
|
|
|
|
}
|
2019-08-30 23:04:37 +08:00
|
|
|
for _, p := range orderedPairs {
|
2017-03-15 08:49:31 +08:00
|
|
|
s.incomingPacket(p.in)
|
|
|
|
}
|
2019-08-30 23:04:37 +08:00
|
|
|
for _, p := range orderedPairs {
|
2017-03-15 08:49:31 +08:00
|
|
|
s.readyPacket(p.out)
|
|
|
|
}
|
2018-07-26 07:03:30 +08:00
|
|
|
for _, p := range table {
|
2017-03-15 08:49:31 +08:00
|
|
|
pkt := <-sender.sent
|
2018-07-26 07:03:30 +08:00
|
|
|
id := pkt.(orderedResponse).id()
|
|
|
|
assert.Equal(t, id, p.in.id())
|
2017-03-15 08:49:31 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
s.close()
|
|
|
|
}
|
2017-04-24 04:47:05 +08:00
|
|
|
|
2017-07-20 10:25:49 +08:00
|
|
|
func (p sshFxpRemovePacket) String() string {
|
2018-07-26 07:03:30 +08:00
|
|
|
return fmt.Sprintf("RmPkt:%d", p.ID)
|
2017-07-20 10:25:49 +08:00
|
|
|
}
|
|
|
|
func (p sshFxpOpenPacket) String() string {
|
2018-07-26 07:03:30 +08:00
|
|
|
return fmt.Sprintf("OpPkt:%d", p.ID)
|
2017-07-20 10:25:49 +08:00
|
|
|
}
|
|
|
|
func (p sshFxpWritePacket) String() string {
|
2018-07-26 07:03:30 +08:00
|
|
|
return fmt.Sprintf("WrPkt:%d", p.ID)
|
2017-07-20 10:25:49 +08:00
|
|
|
}
|
|
|
|
func (p sshFxpClosePacket) String() string {
|
2018-07-26 07:03:30 +08:00
|
|
|
return fmt.Sprintf("ClPkt:%d", p.ID)
|
2017-07-20 10:25:49 +08:00
|
|
|
}
|