@@ -1255,6 +1255,7 @@ func TestGetObjectReadSeekFunctional(t *testing.T) {
1255
1255
1256
1256
// Generate data more than 32K
1257
1257
buf := bytes .Repeat ([]byte ("2" ), rand .Intn (1 << 20 )+ 32 * 1024 )
1258
+ bufSize := len (buf )
1258
1259
1259
1260
// Save the data
1260
1261
objectName := randString (60 , rand .NewSource (time .Now ().UnixNano ()), "" )
@@ -1263,10 +1264,21 @@ func TestGetObjectReadSeekFunctional(t *testing.T) {
1263
1264
t .Fatal ("Error:" , err , bucketName , objectName )
1264
1265
}
1265
1266
1266
- if n != int64 (len ( buf ) ) {
1267
+ if n != int64 (bufSize ) {
1267
1268
t .Fatalf ("Error: number of bytes does not match, want %v, got %v\n " , len (buf ), n )
1268
1269
}
1269
1270
1271
+ defer func () {
1272
+ err = c .RemoveObject (bucketName , objectName )
1273
+ if err != nil {
1274
+ t .Fatal ("Error: " , err )
1275
+ }
1276
+ err = c .RemoveBucket (bucketName )
1277
+ if err != nil {
1278
+ t .Fatal ("Error:" , err )
1279
+ }
1280
+ }()
1281
+
1270
1282
// Read the data back
1271
1283
r , err := c .GetObject (bucketName , objectName )
1272
1284
if err != nil {
@@ -1277,77 +1289,86 @@ func TestGetObjectReadSeekFunctional(t *testing.T) {
1277
1289
if err != nil {
1278
1290
t .Fatal ("Error:" , err , bucketName , objectName )
1279
1291
}
1280
- if st .Size != int64 (len ( buf ) ) {
1292
+ if st .Size != int64 (bufSize ) {
1281
1293
t .Fatalf ("Error: number of bytes in stat does not match, want %v, got %v\n " ,
1282
1294
len (buf ), st .Size )
1283
1295
}
1284
1296
1285
- offset := int64 (2048 )
1286
- n , err = r .Seek (offset , 0 )
1287
- if err != nil {
1288
- t .Fatal ("Error:" , err , offset )
1289
- }
1290
- if n != offset {
1291
- t .Fatalf ("Error: number of bytes seeked does not match, want %v, got %v\n " ,
1292
- offset , n )
1293
- }
1294
- n , err = r .Seek (0 , 1 )
1295
- if err != nil {
1296
- t .Fatal ("Error:" , err )
1297
- }
1298
- if n != offset {
1299
- t .Fatalf ("Error: number of current seek does not match, want %v, got %v\n " ,
1300
- offset , n )
1301
- }
1302
- _ , err = r .Seek (offset , 2 )
1303
- if err == nil {
1304
- t .Fatal ("Error: seek on positive offset for whence '2' should error out" )
1305
- }
1306
- n , err = r .Seek (- offset , 2 )
1307
- if err != nil {
1308
- t .Fatal ("Error:" , err )
1309
- }
1310
- if n != st .Size - offset {
1311
- t .Fatalf ("Error: number of bytes seeked back does not match, want %d, got %v\n " , st .Size - offset , n )
1312
- }
1313
-
1314
- var buffer1 bytes.Buffer
1315
- if _ , err = io .CopyN (& buffer1 , r , st .Size ); err != nil {
1316
- if err != io .EOF {
1317
- t .Fatal ("Error:" , err )
1297
+ // This following function helps us to compare data from the reader after seek
1298
+ // with the data from the original buffer
1299
+ cmpData := func (r io.Reader , start , end int ) {
1300
+ if end - start == 0 {
1301
+ return
1318
1302
}
1319
- }
1320
- if ! bytes .Equal (buf [len (buf )- int (offset ):], buffer1 .Bytes ()) {
1321
- t .Fatal ("Error: Incorrect read bytes v/s original buffer." )
1322
- }
1323
-
1324
- // Seek again and read again.
1325
- n , err = r .Seek (offset - 1 , 0 )
1326
- if err != nil {
1327
- t .Fatal ("Error:" , err )
1328
- }
1329
- if n != (offset - 1 ) {
1330
- t .Fatalf ("Error: number of bytes seeked back does not match, want %v, got %v\n " , offset - 1 , n )
1331
- }
1332
-
1333
- var buffer2 bytes.Buffer
1334
- if _ , err = io .CopyN (& buffer2 , r , st .Size ); err != nil {
1335
- if err != io .EOF {
1336
- t .Fatal ("Error:" , err )
1303
+ buffer := bytes .NewBuffer ([]byte {})
1304
+ if _ , err := io .CopyN (buffer , r , int64 (bufSize )); err != nil {
1305
+ if err != io .EOF {
1306
+ t .Fatal ("Error:" , err )
1307
+ }
1308
+ }
1309
+ if ! bytes .Equal (buf [start :end ], buffer .Bytes ()) {
1310
+ t .Fatal ("Error: Incorrect read bytes v/s original buffer." )
1337
1311
}
1338
- }
1339
- // Verify now lesser bytes.
1340
- if ! bytes .Equal (buf [2047 :], buffer2 .Bytes ()) {
1341
- t .Fatal ("Error: Incorrect read bytes v/s original buffer." )
1342
1312
}
1343
1313
1344
- err = c .RemoveObject (bucketName , objectName )
1345
- if err != nil {
1346
- t .Fatal ("Error: " , err )
1347
- }
1348
- err = c .RemoveBucket (bucketName )
1349
- if err != nil {
1350
- t .Fatal ("Error:" , err )
1314
+ // Generic seek error for errors other than io.EOF
1315
+ seekErr := errors .New ("seek error" )
1316
+
1317
+ testCases := []struct {
1318
+ offset int64
1319
+ whence int
1320
+ pos int64
1321
+ err error
1322
+ shouldCmp bool
1323
+ start int
1324
+ end int
1325
+ }{
1326
+ // Start from offset 0, fetch data and compare
1327
+ {0 , 0 , 0 , nil , true , 0 , 0 },
1328
+ // Start from offset 2048, fetch data and compare
1329
+ {2048 , 0 , 2048 , nil , true , 2048 , bufSize },
1330
+ // Start from offset larger than possible
1331
+ {int64 (bufSize ) + 1024 , 0 , 0 , seekErr , false , 0 , 0 },
1332
+ // Move to offset 0 without comparing
1333
+ {0 , 0 , 0 , nil , false , 0 , 0 },
1334
+ // Move one step forward and compare
1335
+ {1 , 1 , 1 , nil , true , 1 , bufSize },
1336
+ // Move larger than possible
1337
+ {int64 (bufSize ), 1 , 0 , seekErr , false , 0 , 0 },
1338
+ // Provide negative offset with CUR_SEEK
1339
+ {int64 (- 1 ), 1 , 0 , seekErr , false , 0 , 0 },
1340
+ // Test with whence SEEK_END and with positive offset
1341
+ {1024 , 2 , int64 (bufSize ) - 1024 , io .EOF , true , 0 , 0 },
1342
+ // Test with whence SEEK_END and with negative offset
1343
+ {- 1024 , 2 , int64 (bufSize ) - 1024 , nil , true , bufSize - 1024 , bufSize },
1344
+ // Test with whence SEEK_END and with large negative offset
1345
+ {- int64 (bufSize ) * 2 , 2 , 0 , seekErr , true , 0 , 0 },
1346
+ }
1347
+
1348
+ for i , testCase := range testCases {
1349
+ // Perform seek operation
1350
+ n , err := r .Seek (testCase .offset , testCase .whence )
1351
+ // We expect an error
1352
+ if testCase .err == seekErr && err == nil {
1353
+ t .Fatalf ("Test %d, unexpected err value: expected: %v, found: %v" , i + 1 , testCase .err , err )
1354
+ }
1355
+ // We expect a specific error
1356
+ if testCase .err != seekErr && testCase .err != err {
1357
+ t .Fatalf ("Test %d, unexpected err value: expected: %v, found: %v" , i + 1 , testCase .err , err )
1358
+ }
1359
+ // If we expect an error go to the next loop
1360
+ if testCase .err != nil {
1361
+ continue
1362
+ }
1363
+ // Check the returned seek pos
1364
+ if n != testCase .pos {
1365
+ t .Fatalf ("Test %d, error: number of bytes seeked does not match, want %v, got %v\n " , i + 1 ,
1366
+ testCase .pos , n )
1367
+ }
1368
+ // Compare only if shouldCmp is activated
1369
+ if testCase .shouldCmp {
1370
+ cmpData (r , testCase .start , testCase .end )
1371
+ }
1351
1372
}
1352
1373
}
1353
1374
0 commit comments