Skip to content

Commit

Permalink
Merge pull request #499 from drakkan/write-seq
Browse files Browse the repository at this point in the history
writeToSequential: improve tests for write errors
  • Loading branch information
drakkan committed Mar 3, 2022
2 parents 59b2472 + c7fdf5e commit dcfc1d5
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 3 deletions.
6 changes: 3 additions & 3 deletions client.go
Expand Up @@ -1176,11 +1176,11 @@ func (f *File) writeToSequential(w io.Writer) (written int64, err error) {
if n > 0 {
f.offset += int64(n)

m, err2 := w.Write(b[:n])
m, err := w.Write(b[:n])
written += int64(m)

if err == nil {
err = err2
if err != nil {
return written, err
}
}

Expand Down
47 changes: 47 additions & 0 deletions client_integration_test.go
Expand Up @@ -1249,6 +1249,53 @@ func TestClientReadSequential(t *testing.T) {
}
}

// this writer requires maxPacket = 3 and always returns an error for the second write call
type lastChunkErrSequentialWriter struct {
counter int
}

func (w *lastChunkErrSequentialWriter) Write(b []byte) (int, error) {
w.counter++
if w.counter == 1 {
if len(b) != 3 {
return 0, errors.New("this writer requires maxPacket = 3, please set MaxPacketChecked(3)")
}
return len(b), nil
}
return 1, errors.New("this writer fails after the first write")
}

func TestClientWriteSequentialWriterErr(t *testing.T) {
client, cmd := testClient(t, READONLY, NODELAY, MaxPacketChecked(3))
defer cmd.Wait()
defer client.Close()

d, err := ioutil.TempDir("", "sftptest-writesequential-writeerr")
require.NoError(t, err)

defer os.RemoveAll(d)

f, err := ioutil.TempFile(d, "write-sequential-writeerr-test")
require.NoError(t, err)
fname := f.Name()
_, err = f.Write([]byte("12345"))
require.NoError(t, err)
require.NoError(t, f.Close())

sftpFile, err := client.Open(fname)
require.NoError(t, err)
defer sftpFile.Close()

w := &lastChunkErrSequentialWriter{}
written, err := sftpFile.writeToSequential(w)
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) {
sftp1, cmd1 := testClient(t, READONLY, NODELAY)
sftp2, cmd2 := testClientGoSvr(t, READONLY, NODELAY)
Expand Down

0 comments on commit dcfc1d5

Please sign in to comment.