From cd3c699f286663bc7df86cbc9eea81b0634160ee Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Fri, 27 Mar 2020 11:12:21 +0000 Subject: [PATCH] lib/readers: factor ErrorReader from multiple sources --- backend/crypt/cipher_test.go | 17 +++++------------ fs/operations/operations_test.go | 11 ++--------- fs/operations/reopen_test.go | 13 ++----------- fstest/fstests/fstests.go | 12 +----------- lib/readers/error.go | 11 +++++++++++ lib/readers/error_test.go | 18 ++++++++++++++++++ 6 files changed, 39 insertions(+), 43 deletions(-) create mode 100644 lib/readers/error.go create mode 100644 lib/readers/error_test.go diff --git a/backend/crypt/cipher_test.go b/backend/crypt/cipher_test.go index b46f2c5e7..f517dcdbd 100644 --- a/backend/crypt/cipher_test.go +++ b/backend/crypt/cipher_test.go @@ -12,6 +12,7 @@ import ( "github.com/pkg/errors" "github.com/rclone/rclone/backend/crypt/pkcs7" + "github.com/rclone/rclone/lib/readers" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -784,7 +785,7 @@ func TestNewEncrypterErrUnexpectedEOF(t *testing.T) { c, err := newCipher(NameEncryptionStandard, "", "", true) assert.NoError(t, err) - in := &errorReader{io.ErrUnexpectedEOF} + in := &readers.ErrorReader{Err: io.ErrUnexpectedEOF} fh, err := c.newEncrypter(in, nil) assert.NoError(t, err) @@ -793,14 +794,6 @@ func TestNewEncrypterErrUnexpectedEOF(t *testing.T) { assert.Equal(t, int64(32), n) } -type errorReader struct { - err error -} - -func (er errorReader) Read(p []byte) (n int, err error) { - return 0, er.err -} - type closeDetector struct { io.Reader closed int @@ -838,7 +831,7 @@ func TestNewDecrypter(t *testing.T) { assert.Equal(t, 1, cd.closed) } - er := &errorReader{errors.New("potato")} + er := &readers.ErrorReader{Err: errors.New("potato")} cd = newCloseDetector(er) fh, err = c.newDecrypter(cd) assert.Nil(t, fh) @@ -864,7 +857,7 @@ func TestNewDecrypterErrUnexpectedEOF(t *testing.T) { c, err := newCipher(NameEncryptionStandard, "", "", true) assert.NoError(t, err) - in2 := &errorReader{io.ErrUnexpectedEOF} + in2 := &readers.ErrorReader{Err: io.ErrUnexpectedEOF} in1 := bytes.NewBuffer(file16) in := ioutil.NopCloser(io.MultiReader(in1, in2)) @@ -1118,7 +1111,7 @@ func TestDecrypterRead(t *testing.T) { // Test producing an error on the file on Read the underlying file in1 := bytes.NewBuffer(file1) - in2 := &errorReader{errors.New("potato")} + in2 := &readers.ErrorReader{Err: errors.New("potato")} in := io.MultiReader(in1, in2) cd := newCloseDetector(in) fh, err := c.newDecrypter(cd) diff --git a/fs/operations/operations_test.go b/fs/operations/operations_test.go index 384c51a41..3616a8db0 100644 --- a/fs/operations/operations_test.go +++ b/fs/operations/operations_test.go @@ -45,6 +45,7 @@ import ( "github.com/rclone/rclone/fs/operations" "github.com/rclone/rclone/fstest" "github.com/rclone/rclone/lib/random" + "github.com/rclone/rclone/lib/readers" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -1156,14 +1157,6 @@ func TestOverlapping(t *testing.T) { } } -type errorReader struct { - err error -} - -func (er errorReader) Read(p []byte) (n int, err error) { - return 0, er.err -} - func TestCheckEqualReaders(t *testing.T) { b65a := make([]byte, 65*1024) b65b := make([]byte, 65*1024) @@ -1189,7 +1182,7 @@ func TestCheckEqualReaders(t *testing.T) { myErr := errors.New("sentinel") wrap := func(b []byte) io.Reader { r := bytes.NewBuffer(b) - e := errorReader{myErr} + e := readers.ErrorReader{Err: myErr} return io.MultiReader(r, e) } diff --git a/fs/operations/reopen_test.go b/fs/operations/reopen_test.go index 075cf13a5..17d773fa1 100644 --- a/fs/operations/reopen_test.go +++ b/fs/operations/reopen_test.go @@ -10,6 +10,7 @@ import ( "github.com/rclone/rclone/fs" "github.com/rclone/rclone/fs/hash" "github.com/rclone/rclone/fstest/mockobject" + "github.com/rclone/rclone/lib/readers" "github.com/stretchr/testify/assert" ) @@ -44,23 +45,13 @@ func (o *reOpenTestObject) Open(ctx context.Context, options ...fs.OpenOption) ( return nil, errorTestError } // Read N bytes then an error - r := io.MultiReader(&io.LimitedReader{R: rc, N: N}, errorReader{errorTestError}) + r := io.MultiReader(&io.LimitedReader{R: rc, N: N}, readers.ErrorReader{Err: errorTestError}) // Wrap with Close in a new readCloser rc = readCloser{Reader: r, Closer: rc} } return rc, nil } -// Return an error only -type errorReader struct { - err error -} - -// Read returning an error -func (er errorReader) Read(p []byte) (n int, err error) { - return 0, er.err -} - func TestReOpen(t *testing.T) { for testIndex, testName := range []string{"Seek", "Range"} { t.Run(testName, func(t *testing.T) { diff --git a/fstest/fstests/fstests.go b/fstest/fstests/fstests.go index 5d647dbb3..f5da52cc6 100644 --- a/fstest/fstests/fstests.go +++ b/fstest/fstests/fstests.go @@ -225,16 +225,6 @@ func TestPutLarge(ctx context.Context, t *testing.T, f fs.Fs, file *fstest.Item) require.NoError(t, obj.Remove(ctx)) } -// errorReader just returns an error on Read -type errorReader struct { - err error -} - -// Read returns an error immediately -func (er errorReader) Read(p []byte) (n int, err error) { - return 0, er.err -} - // read the contents of an object as a string func readObject(ctx context.Context, t *testing.T, obj fs.Object, limit int64, options ...fs.OpenOption) string { what := fmt.Sprintf("readObject(%q) limit=%d, options=%+v", obj, limit, options) @@ -637,7 +627,7 @@ func Run(t *testing.T, opt *Opt) { // Read N bytes then produce an error contents := random.String(int(N)) buf := bytes.NewBufferString(contents) - er := &errorReader{errors.New("potato")} + er := &readers.ErrorReader{Err: errors.New("potato")} in := io.MultiReader(buf, er) obji := object.NewStaticObjectInfo(file2.Path, file2.ModTime, 2*N, true, nil, nil) diff --git a/lib/readers/error.go b/lib/readers/error.go new file mode 100644 index 000000000..13d4f077b --- /dev/null +++ b/lib/readers/error.go @@ -0,0 +1,11 @@ +package readers + +// ErrorReader wraps an error to return on Read +type ErrorReader struct { + Err error +} + +// Read always returns the error +func (er ErrorReader) Read(p []byte) (n int, err error) { + return 0, er.Err +} diff --git a/lib/readers/error_test.go b/lib/readers/error_test.go new file mode 100644 index 000000000..0231618b9 --- /dev/null +++ b/lib/readers/error_test.go @@ -0,0 +1,18 @@ +package readers + +import ( + "testing" + + "github.com/pkg/errors" + "github.com/stretchr/testify/assert" +) + +func TestErrorReader(t *testing.T) { + errRead := errors.New("boom") + r := ErrorReader{errRead} + + buf := make([]byte, 16) + n, err := r.Read(buf) + assert.Equal(t, errRead, err) + assert.Equal(t, 0, n) +}