writeToSequential: improve tests for write errors

This commit is contained in:
Nicola Murino 2022-03-03 12:30:24 +01:00
parent 65f24bcee4
commit c7fdf5e5c6
2 changed files with 25 additions and 29 deletions

View File

@ -1176,11 +1176,11 @@ func (f *File) writeToSequential(w io.Writer) (written int64, err error) {
if n > 0 { if n > 0 {
f.offset += int64(n) f.offset += int64(n)
m, wErr := w.Write(b[:n]) m, err := w.Write(b[:n])
written += int64(m) written += int64(m)
if wErr != nil { if err != nil {
return written, wErr return written, err
} }
} }

View File

@ -1249,55 +1249,51 @@ func TestClientReadSequential(t *testing.T) {
} }
} }
// this writer requires maxPacket = 3 and always returns an error for the second write call
type lastChunkErrSequentialWriter struct { type lastChunkErrSequentialWriter struct {
expected int counter int
written int
writtenReturn int
} }
func (w *lastChunkErrSequentialWriter) Write(b []byte) (int, error) { func (w *lastChunkErrSequentialWriter) Write(b []byte) (int, error) {
chunkSize := len(b) w.counter++
w.written += chunkSize if w.counter == 1 {
if w.written == w.expected { if len(b) != 3 {
return w.writtenReturn, errors.New("test error") return 0, errors.New("this writer requires maxPacket = 3, please set MaxPacketChecked(3)")
}
return len(b), nil
} }
return chunkSize, nil return 1, errors.New("this writer fails after the first write")
} }
func TestClientWriteSequential_WriterErr(t *testing.T) { func TestClientWriteSequentialWriterErr(t *testing.T) {
sftp, cmd := testClient(t, READONLY, NODELAY) client, cmd := testClient(t, READONLY, NODELAY, MaxPacketChecked(3))
defer cmd.Wait() defer cmd.Wait()
defer sftp.Close() defer client.Close()
d, err := ioutil.TempDir("", "sftptest-writesequential-writeerr") d, err := ioutil.TempDir("", "sftptest-writesequential-writeerr")
require.NoError(t, err) require.NoError(t, err)
defer os.RemoveAll(d) defer os.RemoveAll(d)
var (
content = []byte("hello world")
shortWrite = 2
)
w := lastChunkErrSequentialWriter{
expected: len(content),
writtenReturn: shortWrite,
}
f, err := ioutil.TempFile(d, "write-sequential-writeerr-test") f, err := ioutil.TempFile(d, "write-sequential-writeerr-test")
require.NoError(t, err) require.NoError(t, err)
fname := f.Name() fname := f.Name()
n, err := f.Write(content) _, err = f.Write([]byte("12345"))
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, n, len(content))
require.NoError(t, f.Close()) require.NoError(t, f.Close())
sftpFile, err := sftp.Open(fname) sftpFile, err := client.Open(fname)
require.NoError(t, err) require.NoError(t, err)
defer sftpFile.Close() defer sftpFile.Close()
gotWritten, gotErr := sftpFile.writeToSequential(&w) w := &lastChunkErrSequentialWriter{}
require.NotErrorIs(t, io.EOF, gotErr) written, err := sftpFile.writeToSequential(w)
require.Equal(t, int64(shortWrite), gotWritten) assert.Error(t, err)
expected := int64(4)
if written != expected {
t.Errorf("sftpFile.Write() = %d, but expected %d", written, expected)
}
assert.Equal(t, 2, w.counter)
} }
func TestClientReadDir(t *testing.T) { func TestClientReadDir(t *testing.T) {