chore: refactor log limit in rest (#3572)
This commit is contained in:
12
core/iox/nopcloser_test.go
Normal file
12
core/iox/nopcloser_test.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package iox
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNopCloser(t *testing.T) {
|
||||||
|
closer := NopCloser(nil)
|
||||||
|
assert.NoError(t, closer.Close())
|
||||||
|
}
|
||||||
@@ -28,6 +28,13 @@ func DupReadCloser(reader io.ReadCloser) (io.ReadCloser, io.ReadCloser) {
|
|||||||
return io.NopCloser(tee), io.NopCloser(&buf)
|
return io.NopCloser(tee), io.NopCloser(&buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// KeepSpace customizes the reading functions to keep leading and tailing spaces.
|
||||||
|
func KeepSpace() TextReadOption {
|
||||||
|
return func(o *textReadOptions) {
|
||||||
|
o.keepSpace = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// LimitDupReadCloser returns two io.ReadCloser that read from the first will be written to the second.
|
// LimitDupReadCloser returns two io.ReadCloser that read from the first will be written to the second.
|
||||||
// But the second io.ReadCloser is limited to up to n bytes.
|
// But the second io.ReadCloser is limited to up to n bytes.
|
||||||
// The first returned reader needs to be read first, because the content
|
// The first returned reader needs to be read first, because the content
|
||||||
@@ -38,13 +45,6 @@ func LimitDupReadCloser(reader io.ReadCloser, n int64) (io.ReadCloser, io.ReadCl
|
|||||||
return io.NopCloser(tee), io.NopCloser(&buf)
|
return io.NopCloser(tee), io.NopCloser(&buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeepSpace customizes the reading functions to keep leading and tailing spaces.
|
|
||||||
func KeepSpace() TextReadOption {
|
|
||||||
return func(o *textReadOptions) {
|
|
||||||
o.keepSpace = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ReadBytes reads exactly the bytes with the length of len(buf)
|
// ReadBytes reads exactly the bytes with the length of len(buf)
|
||||||
func ReadBytes(reader io.Reader, buf []byte) error {
|
func ReadBytes(reader io.Reader, buf []byte) error {
|
||||||
var got int
|
var got int
|
||||||
|
|||||||
@@ -51,6 +51,11 @@ b`,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReadTextError(t *testing.T) {
|
||||||
|
_, err := ReadText("not-exist")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestReadTextLines(t *testing.T) {
|
func TestReadTextLines(t *testing.T) {
|
||||||
text := `1
|
text := `1
|
||||||
|
|
||||||
@@ -94,6 +99,11 @@ func TestReadTextLines(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReadTextLinesError(t *testing.T) {
|
||||||
|
_, err := ReadTextLines("not-exist")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestDupReadCloser(t *testing.T) {
|
func TestDupReadCloser(t *testing.T) {
|
||||||
input := "hello"
|
input := "hello"
|
||||||
reader := io.NopCloser(bytes.NewBufferString(input))
|
reader := io.NopCloser(bytes.NewBufferString(input))
|
||||||
|
|||||||
@@ -27,7 +27,9 @@ func (t *limitTeeReader) Read(p []byte) (n int, err error) {
|
|||||||
if n, err := t.w.Write(p[:limit]); err != nil {
|
if n, err := t.w.Write(p[:limit]); err != nil {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
t.n -= limit
|
t.n -= limit
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"io"
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestLimitTeeReader(t *testing.T) {
|
func TestLimitTeeReader(t *testing.T) {
|
||||||
@@ -22,14 +24,17 @@ func TestLimitTeeReader(t *testing.T) {
|
|||||||
if !bytes.Equal(wb.Bytes(), src[:limit]) {
|
if !bytes.Equal(wb.Bytes(), src[:limit]) {
|
||||||
t.Errorf("bytes written = %q want %q", wb.Bytes(), src)
|
t.Errorf("bytes written = %q want %q", wb.Bytes(), src)
|
||||||
}
|
}
|
||||||
if n, err := r.Read(dst); n != 0 || err != io.EOF {
|
|
||||||
t.Errorf("r.Read at EOF = %d, %v want 0, EOF", n, err)
|
n, err := r.Read(dst)
|
||||||
}
|
assert.Equal(t, 0, n)
|
||||||
|
assert.Equal(t, io.EOF, err)
|
||||||
|
|
||||||
rb = bytes.NewBuffer(src)
|
rb = bytes.NewBuffer(src)
|
||||||
pr, pw := io.Pipe()
|
pr, pw := io.Pipe()
|
||||||
pr.Close()
|
if assert.NoError(t, pr.Close()) {
|
||||||
r = LimitTeeReader(rb, pw, limit)
|
r = LimitTeeReader(rb, pw, limit)
|
||||||
if n, err := io.ReadFull(r, dst); n != 0 || err != io.ErrClosedPipe {
|
n, err := io.ReadFull(r, dst)
|
||||||
t.Errorf("closed tee: ReadFull(r, dst) = %d, %v; want 0, EPIPE", n, err)
|
assert.Equal(t, 0, n)
|
||||||
|
assert.Equal(t, io.ErrClosedPipe, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package iox
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
@@ -26,7 +27,7 @@ func CountLines(file string) (int, error) {
|
|||||||
count += bytes.Count(buf[:c], lineSep)
|
count += bytes.Count(buf[:c], lineSep)
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case err == io.EOF:
|
case errors.Is(err, io.EOF):
|
||||||
if noEol {
|
if noEol {
|
||||||
count++
|
count++
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,3 +24,8 @@ func TestCountLines(t *testing.T) {
|
|||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, 4, lines)
|
assert.Equal(t, 4, lines)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCountLinesError(t *testing.T) {
|
||||||
|
_, err := CountLines("not-exist")
|
||||||
|
assert.NotNil(t, err)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user