ModuloReader: handle zero reads from inner reader
This commit is contained in:
parent
47e3e47216
commit
8794b42459
|
@ -522,6 +522,15 @@ func (r *ModuloBufReader) Read(p []byte) (int, error) {
|
||||||
|
|
||||||
nr := nr1 + nr2
|
nr := nr1 + nr2
|
||||||
rem := nr % r.modSize
|
rem := nr % r.modSize
|
||||||
|
|
||||||
|
// if there was an error, return immediately.
|
||||||
|
if err == io.EOF {
|
||||||
|
return nr, err
|
||||||
|
} else if err != nil {
|
||||||
|
return nr - rem, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// write any remainder to the buffer
|
||||||
if rem != 0 {
|
if rem != 0 {
|
||||||
// err is always nil
|
// err is always nil
|
||||||
_, _ = r.buf.Write(p[nr-rem : nr])
|
_, _ = r.buf.Write(p[nr-rem : nr])
|
||||||
|
|
|
@ -27,9 +27,10 @@ func TestModuloBufReader(t *testing.T) {
|
||||||
data: [][]byte{
|
data: [][]byte{
|
||||||
{'a', 'b', 'c', 'd'},
|
{'a', 'b', 'c', 'd'},
|
||||||
{'e', 'f', 'g', 'h', 'i'},
|
{'e', 'f', 'g', 'h', 'i'},
|
||||||
|
{},
|
||||||
{'j', 'k', 'l', 'm'},
|
{'j', 'k', 'l', 'm'},
|
||||||
{'n', 'o', 'p'},
|
{'n', 'o', 'p'},
|
||||||
{'q', 'r', 's', 't'},
|
{'q', 'r', 's', 't', 'u'},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +48,11 @@ func TestModuloBufReader(t *testing.T) {
|
||||||
assert.Equal(t, 4, n)
|
assert.Equal(t, 4, n)
|
||||||
assert.Equal(t, []byte{'e', 'f', 'g', 'h'}, out[:n])
|
assert.Equal(t, []byte{'e', 'f', 'g', 'h'}, out[:n])
|
||||||
|
|
||||||
|
n, err = modReader.Read(out)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Zero(t, n)
|
||||||
|
assert.Empty(t, out[:n])
|
||||||
|
|
||||||
n, err = modReader.Read(out)
|
n, err = modReader.Read(out)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -63,6 +69,11 @@ func TestModuloBufReader(t *testing.T) {
|
||||||
assert.Equal(t, 4, n)
|
assert.Equal(t, 4, n)
|
||||||
assert.Equal(t, []byte{'q', 'r', 's', 't'}, out[:n])
|
assert.Equal(t, []byte{'q', 'r', 's', 't'}, out[:n])
|
||||||
|
|
||||||
|
n, err = modReader.Read(out)
|
||||||
|
assert.Equal(t, io.EOF, err)
|
||||||
|
assert.Equal(t, 1, n)
|
||||||
|
assert.Equal(t, []byte{'u'}, out[:n])
|
||||||
|
|
||||||
n, err = modReader.Read(out)
|
n, err = modReader.Read(out)
|
||||||
assert.Zero(t, n)
|
assert.Zero(t, n)
|
||||||
assert.Equal(t, io.EOF, err)
|
assert.Equal(t, io.EOF, err)
|
||||||
|
|
Loading…
Reference in New Issue