@@ -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+
12521299func TestClientReadDir (t * testing.T ) {
12531300 sftp1 , cmd1 := testClient (t , READONLY , NODELAY )
12541301 sftp2 , cmd2 := testClientGoSvr (t , READONLY , NODELAY )
0 commit comments