Skip to content

Commit dcfc1d5

Browse files
authored
Merge pull request #499 from drakkan/write-seq
writeToSequential: improve tests for write errors
2 parents 59b2472 + c7fdf5e commit dcfc1d5

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,11 +1176,11 @@ func (f *File) writeToSequential(w io.Writer) (written int64, err error) {
11761176
if n > 0 {
11771177
f.offset += int64(n)
11781178

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

1182-
if err == nil {
1183-
err = err2
1182+
if err != nil {
1183+
return written, err
11841184
}
11851185
}
11861186

client_integration_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,53 @@ func TestClientReadSequential(t *testing.T) {
12491249
}
12501250
}
12511251

1252+
// this writer requires maxPacket = 3 and always returns an error for the second write call
1253+
type lastChunkErrSequentialWriter struct {
1254+
counter int
1255+
}
1256+
1257+
func (w *lastChunkErrSequentialWriter) Write(b []byte) (int, error) {
1258+
w.counter++
1259+
if w.counter == 1 {
1260+
if len(b) != 3 {
1261+
return 0, errors.New("this writer requires maxPacket = 3, please set MaxPacketChecked(3)")
1262+
}
1263+
return len(b), nil
1264+
}
1265+
return 1, errors.New("this writer fails after the first write")
1266+
}
1267+
1268+
func TestClientWriteSequentialWriterErr(t *testing.T) {
1269+
client, cmd := testClient(t, READONLY, NODELAY, MaxPacketChecked(3))
1270+
defer cmd.Wait()
1271+
defer client.Close()
1272+
1273+
d, err := ioutil.TempDir("", "sftptest-writesequential-writeerr")
1274+
require.NoError(t, err)
1275+
1276+
defer os.RemoveAll(d)
1277+
1278+
f, err := ioutil.TempFile(d, "write-sequential-writeerr-test")
1279+
require.NoError(t, err)
1280+
fname := f.Name()
1281+
_, err = f.Write([]byte("12345"))
1282+
require.NoError(t, err)
1283+
require.NoError(t, f.Close())
1284+
1285+
sftpFile, err := client.Open(fname)
1286+
require.NoError(t, err)
1287+
defer sftpFile.Close()
1288+
1289+
w := &lastChunkErrSequentialWriter{}
1290+
written, err := sftpFile.writeToSequential(w)
1291+
assert.Error(t, err)
1292+
expected := int64(4)
1293+
if written != expected {
1294+
t.Errorf("sftpFile.Write() = %d, but expected %d", written, expected)
1295+
}
1296+
assert.Equal(t, 2, w.counter)
1297+
}
1298+
12521299
func TestClientReadDir(t *testing.T) {
12531300
sftp1, cmd1 := testClient(t, READONLY, NODELAY)
12541301
sftp2, cmd2 := testClientGoSvr(t, READONLY, NODELAY)

0 commit comments

Comments
 (0)