mem: Make the File return io.ErrUnexpectedEOF

Instead of panic when reading beyond its borders.

This is in line with how the OS File works.

Fixes #152
This commit is contained in:
Bjørn Erik Pedersen 2017-12-28 12:02:27 +01:00
parent 8d919cbe7e
commit ec3a3111d1
No known key found for this signature in database
GPG Key ID: 330E6E2BD4859D8F
2 changed files with 33 additions and 0 deletions

View File

@ -176,6 +176,9 @@ func (f *File) Read(b []byte) (n int, err error) {
if len(b) > 0 && int(f.at) == len(f.fileData.data) {
return 0, io.EOF
}
if int(f.at) > len(f.fileData.data) {
return 0, io.ErrUnexpectedEOF
}
if len(f.fileData.data)-int(f.at) >= len(b) {
n = len(b)
} else {

View File

@ -2,6 +2,7 @@ package afero
import (
"fmt"
"io"
"os"
"path/filepath"
"runtime"
@ -419,3 +420,32 @@ func TestMemFsDirMode(t *testing.T) {
t.Error("FileMode is not directory")
}
}
func TestMemFsUnexpectedEOF(t *testing.T) {
t.Parallel()
fs := NewMemMapFs()
if err := WriteFile(fs, "file.txt", []byte("abc"), 0777); err != nil {
t.Fatal(err)
}
f, err := fs.Open("file.txt")
if err != nil {
t.Fatal(err)
}
defer f.Close()
// Seek beyond the end.
_, err = f.Seek(512, 0)
if err != nil {
t.Fatal(err)
}
buff := make([]byte, 256)
_, err = io.ReadAtLeast(f, buff, 256)
if err != io.ErrUnexpectedEOF {
t.Fatal("Expected ErrUnexpectedEOF")
}
}