package sftp import ( "errors" "io" "os" "testing" "github.com/kr/fs" ) // assert that *Client implements fs.FileSystem var _ fs.FileSystem = new(Client) // assert that *File implements io.ReadWriteCloser var _ io.ReadWriteCloser = new(File) func TestNormaliseError(t *testing.T) { var ( ok = &StatusError{Code: ssh_FX_OK} eof = &StatusError{Code: ssh_FX_EOF} fail = &StatusError{Code: ssh_FX_FAILURE} noSuchFile = &StatusError{Code: ssh_FX_NO_SUCH_FILE} foo = errors.New("foo") ) var tests = []struct { desc string err error want error }{ { desc: "nil error", }, { desc: "not *StatusError", err: foo, want: foo, }, { desc: "*StatusError with ssh_FX_EOF", err: eof, want: io.EOF, }, { desc: "*StatusError with ssh_FX_NO_SUCH_FILE", err: noSuchFile, want: os.ErrNotExist, }, { desc: "*StatusError with ssh_FX_OK", err: ok, }, { desc: "*StatusError with ssh_FX_FAILURE", err: fail, want: fail, }, } for _, tt := range tests { got := normaliseError(tt.err) if got != tt.want { t.Errorf("normaliseError(%#v), test %q\n- want: %#v\n- got: %#v", tt.err, tt.desc, tt.want, got) } } } var flagsTests = []struct { flags int want uint32 }{ {os.O_RDONLY, ssh_FXF_READ}, {os.O_WRONLY, ssh_FXF_WRITE}, {os.O_RDWR, ssh_FXF_READ | ssh_FXF_WRITE}, {os.O_RDWR | os.O_CREATE | os.O_TRUNC, ssh_FXF_READ | ssh_FXF_WRITE | ssh_FXF_CREAT | ssh_FXF_TRUNC}, {os.O_WRONLY | os.O_APPEND, ssh_FXF_WRITE | ssh_FXF_APPEND}, } func TestFlags(t *testing.T) { for i, tt := range flagsTests { got := flags(tt.flags) if got != tt.want { t.Errorf("test %v: flags(%x): want: %x, got: %x", i, tt.flags, tt.want, got) } } } func TestMissingLangTag(t *testing.T) { defer func() { if r := recover(); r != nil { t.Fail() } }() buf := marshalUint32([]byte{}, 0) buf = marshalStatus(buf, StatusError{}) _ = unmarshalStatus(0, buf[:len(buf)-4]) }