2016-07-09 03:38:35 +08:00
|
|
|
package sftp
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"testing"
|
2016-07-20 03:52:43 +08:00
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2016-07-09 03:38:35 +08:00
|
|
|
)
|
|
|
|
|
2016-07-21 07:49:00 +08:00
|
|
|
type csPair struct {
|
|
|
|
cli *Client
|
|
|
|
svr *RequestServer
|
|
|
|
}
|
|
|
|
|
|
|
|
// these must be closed in order, else client.Close will hang
|
|
|
|
func (cs csPair) Close() {
|
|
|
|
cs.svr.Close()
|
|
|
|
cs.cli.Close()
|
|
|
|
}
|
|
|
|
|
|
|
|
func clientRequestServerPair(t *testing.T) *csPair {
|
2016-07-09 03:38:35 +08:00
|
|
|
cr, sw := io.Pipe()
|
|
|
|
sr, cw := io.Pipe()
|
2016-07-21 07:49:00 +08:00
|
|
|
handlers := InMemHandler()
|
2016-07-12 01:58:51 +08:00
|
|
|
server, err := NewRequestServer(struct {
|
2016-07-09 03:38:35 +08:00
|
|
|
io.Reader
|
|
|
|
io.WriteCloser
|
2016-07-21 07:49:00 +08:00
|
|
|
}{sr, sw}, handlers)
|
|
|
|
if err != nil { t.Fatal(err) }
|
2016-07-09 03:38:35 +08:00
|
|
|
go server.Serve()
|
|
|
|
client, err := NewClientPipe(cr, cw)
|
2016-07-21 07:49:00 +08:00
|
|
|
if err != nil { t.Fatalf("%+v\n", err) }
|
|
|
|
return &csPair{client, server}
|
2016-07-09 03:38:35 +08:00
|
|
|
}
|
|
|
|
|
2016-07-20 03:52:43 +08:00
|
|
|
func TestRequestCache(t *testing.T) {
|
2016-07-21 07:49:00 +08:00
|
|
|
p := clientRequestServerPair(t)
|
|
|
|
defer p.Close()
|
2016-07-09 03:38:35 +08:00
|
|
|
foo := &Request{Filepath: "foo"}
|
|
|
|
bar := &Request{Filepath: "bar"}
|
2016-07-21 07:49:00 +08:00
|
|
|
p.svr.nextRequest(foo)
|
|
|
|
p.svr.nextRequest(bar)
|
|
|
|
assert.Len(t, p.svr.openRequests, 2)
|
|
|
|
_foo, ok := p.svr.getRequest("foo")
|
2016-07-09 03:38:35 +08:00
|
|
|
assert.Equal(t, foo, _foo)
|
|
|
|
assert.True(t, ok)
|
2016-07-21 07:49:00 +08:00
|
|
|
_, ok = p.svr.getRequest("zed")
|
2016-07-09 03:38:35 +08:00
|
|
|
assert.False(t, ok)
|
2016-07-21 07:49:00 +08:00
|
|
|
p.svr.closeRequest("foo")
|
|
|
|
p.svr.closeRequest("bar")
|
|
|
|
assert.Len(t, p.svr.openRequests, 0)
|
|
|
|
}
|
|
|
|
|
|
|
|
func putTestFile(cli *Client, path, content string) (int, error) {
|
|
|
|
w, err := cli.Create(path)
|
|
|
|
if err == nil {
|
|
|
|
defer w.Close()
|
|
|
|
return w.Write([]byte(content))
|
|
|
|
}
|
|
|
|
return 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequestWrite(t *testing.T) {
|
|
|
|
p := clientRequestServerPair(t)
|
|
|
|
defer p.Close()
|
|
|
|
n, err := putTestFile(p.cli, "/foo", "hello")
|
|
|
|
if err != nil { t.Fatal(err) }
|
|
|
|
assert.Equal(t, 5, n)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRequestRead(t *testing.T) {
|
|
|
|
p := clientRequestServerPair(t)
|
|
|
|
defer p.Close()
|
|
|
|
_, err := putTestFile(p.cli, "/foo", "hello")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
rf, err := p.cli.Open("/foo")
|
|
|
|
assert.Nil(t, err)
|
|
|
|
defer rf.Close()
|
|
|
|
// defer rf.Close()
|
|
|
|
contents := make([]byte, 5)
|
|
|
|
n, err := rf.Read(contents)
|
|
|
|
if err != nil && err != io.EOF { t.Fatalf("err: %v", err) }
|
|
|
|
assert.Equal(t, 5, n)
|
|
|
|
assert.Equal(t, "hello", string(contents[0:5]))
|
2016-07-09 03:38:35 +08:00
|
|
|
}
|