package fragment import ( "bytes" "io" "testing" ) type readSeekCloser struct { *bytes.Reader closed bool } func (r *readSeekCloser) Close() error { r.closed = true return nil } func TestReaderReadsFragmentsWithoutOwningEOF(t *testing.T) { reader := NewReader(bytes.NewReader([]byte("abcdef")), []Fragment{ {Offset: 1, Length: 2}, {Offset: 4, Length: 2}, }) buf := make([]byte, 4) n, err := reader.Read(buf) if err != nil { t.Fatalf("first read failed: %v", err) } if got := string(buf[:n]); got != "bc" { t.Fatalf("first read = %q, want %q", got, "bc") } n, err = reader.Read(buf) if err != nil { t.Fatalf("second read failed: %v", err) } if got := string(buf[:n]); got != "ef" { t.Fatalf("second read = %q, want %q", got, "ef") } n, err = reader.Read(buf) if err != io.EOF { t.Fatalf("third read error = %v, want %v", err, io.EOF) } if n != 0 { t.Fatalf("third read count = %d, want 0", n) } } func TestReaderCloseClosesUnderlyingCloser(t *testing.T) { src := &readSeekCloser{Reader: bytes.NewReader([]byte("abcdef"))} reader := NewReader(src, []Fragment{{Offset: 0, Length: 2}}) if err := reader.Close(); err != nil { t.Fatalf("Close failed: %v", err) } if !src.closed { t.Fatal("underlying closer was not closed") } }