off by one error seeking to end of single block file
Jeromy committed
Jan 27, 2015 at 07:41 UTC
2eca66e6d212ecd8d68191e6d429a2b3a22e1f4e
2 files changed
+53
-1
importer/importer_test.go
+52
@@ -308,6 +308,58 @@ func TestSeekToAlmostBegin(t *testing.T) {
308
}
309
}
310
311
+func TestSeekEnd(t *testing.T) {
312
+ nbytes := int64(50 * 1024)
313
+ should := make([]byte, nbytes)
314
+ u.NewTimeSeededRand().Read(should)
315
+
316
+ read := bytes.NewReader(should)
317
+ dnp := getDagservAndPinner(t)
318
+ nd, err := BuildDagFromReader(read, dnp.ds, dnp.mp, &chunk.SizeSplitter{500})
319
+ if err != nil {
320
+ t.Fatal(err)
321
+ }
322
+
323
+ rs, err := uio.NewDagReader(context.Background(), nd, dnp.ds)
324
+ if err != nil {
325
+ t.Fatal(err)
326
+ }
327
+
328
+ seeked, err := rs.Seek(0, os.SEEK_END)
329
+ if err != nil {
330
+ t.Fatal(err)
331
+ }
332
+ if seeked != nbytes {
333
+ t.Fatal("Failed to seek to end")
334
+ }
335
+}
336
+
337
+func TestSeekEndSingleBlockFile(t *testing.T) {
338
+ nbytes := int64(100)
339
+ should := make([]byte, nbytes)
340
+ u.NewTimeSeededRand().Read(should)
341
+
342
+ read := bytes.NewReader(should)
343
+ dnp := getDagservAndPinner(t)
344
+ nd, err := BuildDagFromReader(read, dnp.ds, dnp.mp, &chunk.SizeSplitter{5000})
345
+ if err != nil {
346
+ t.Fatal(err)
347
+ }
348
+
349
+ rs, err := uio.NewDagReader(context.Background(), nd, dnp.ds)
350
+ if err != nil {
351
+ t.Fatal(err)
352
+ }
353
+
354
+ seeked, err := rs.Seek(0, os.SEEK_END)
355
+ if err != nil {
356
+ t.Fatal(err)
357
+ }
358
+ if seeked != nbytes {
359
+ t.Fatal("Failed to seek to end")
360
+ }
361
+}
362
+
363
func TestSeekingStress(t *testing.T) {
364
nbytes := int64(1024 * 1024)
365
should := make([]byte, nbytes)
unixfs/io/dagreader.go
+1
-1
@@ -171,7 +171,7 @@ func (dr *DagReader) Seek(offset int64, whence int) (int64, error) {
171
172
// left represents the number of bytes remaining to seek to (from beginning)
173
left := offset
174
- if int64(len(pb.Data)) > offset {
174
+ if int64(len(pb.Data)) >= offset {
175
// Close current buf to close potential child dagreader
176
dr.buf.Close()
177
dr.buf = NewRSNCFromBytes(pb.GetData()[offset:])